gpt4 book ai didi

makefile - 覆盖父 makefile 中子 make 分配的变量

转载 作者:行者123 更新时间:2023-12-02 22:01:21 28 4
gpt4 key购买 nike

我正在使用 Make,并且有一个 makefile,它设置了一个变量,该变量的值需要我从父 makefile 覆盖。我尝试在父 makefile 中设置变量并使用 export 将其传递给子 make,但该变量没有使用传递下来的值,而是使用在子 makefile 中显式设置的值生成文件。

我知道在命令行上指定的变量会覆盖 makefile 中的任何普通分配(除非使用 override),但是有没有一种方法可以为子制作实现此目的,而无需在命令上指定它每次调用 submake 的行(因为有很多,我喜欢保持 DRY)?

更新

我应该提到我无法修改 submake 文件,因为它来 self 们跟踪的外部存储库,并且我无权修改它,因此我需要在父 makefile 级别工作以影响 submake .

示例

这是父 makefile 中调用子 make 的代表性目标:

$.PHONY (external_lib)
$(external_lib):
$(MAKE) -C $(source_dir)/project/component $(PROJECTVARS) make_a
$(MAKE) -C $(source_dir)/project/component $(PROJECTVARS) make_b
$(MAKE) -C $(source_dir)/project/component $(PROJECTVARS) make_c
$(MAKE) -C $(source_dir)/project/component $(PROJECTVARS) make_d
$(MAKE) -C $(source_dir)/project/component $(PROJECTVARS) make_e
$(MAKE) -C $(source_dir)/project/component $(PROJECTVARS) make_f
$(MAKE) -C $(source_dir)/project/component $(PROJECTVARS) make_g
$(MAKE) -C $(source_dir)/project/component $(PROJECTVARS) make_h
$(MAKE) -C $(source_dir)/project/component $(PROJECTVARS) make_i
$(MAKE) -C $(source_dir)/project/component $(PROJECTVARS) library

最佳答案

(您似乎使用的是 GNUMake 以外的其他东西,这是我唯一知道的,所以对此持保留态度。)

首先,您可以通过将组件设为单独的目标来使 Makefile 更加整洁:

COMPONENTS =  make_a make_b make_c make_d make_e make_f make_g make_h make_i \
library

.PHONY: external_lib $(COMPONENTS)
$(external_lib): $(COMPONENTS)

$(COMPONENTS):
@$(MAKE) -s -C $(source_dir)/project/component $(PROJECTVARS) $@

(如果您担心名称冲突,有一些简单的方法可以解决这个问题。)

现在,如果您想覆盖一个名为 VAR 的变量,您可以在一个地方完成所有操作:

COMPONENTS =  make_a make_b make_c make_d make_e make_f make_g make_h make_i \
library

.PHONY: external_lib $(COMPONENTS)
$(external_lib): $(COMPONENTS)

$(COMPONENTS):
@$(MAKE) -s -C $(source_dir)/project/component $(PROJECTVARS) VAR=$(VAR) $@

这假设您想要覆盖所有组件的相同变量,这就是我阅读问题的方式。如果您想为某些目标覆盖不同的变量,这很简单:

COMPONENTS =  make_a make_b make_c make_d make_e make_f make_g make_h make_i \
library

.PHONY: external_lib $(COMPONENTS)
$(external_lib): $(COMPONENTS)

VARNAME = VAR
$(COMPONENTS):
@$(MAKE) -s -C $(source_dir)/project/component $(PROJECTVARS) \
$(VARNAME)=$($(VARNAME)) $@

make_c: VARNAME=OtherVar
make_h: VARNAME=YetAnotherVar

如果您想覆盖某些目标的几个变量,这有点棘手......

关于makefile - 覆盖父 makefile 中子 make 分配的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3103464/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com