我正在尝试编写一个GNU make Makefile,它有一些类似的目标,其中构建命令在它们之间略有不同.我正在尝试使用特定于目标的变量来表示这些变化.其中一些变量值指的是我想用作先决条件的文件.例如:
target_1:special_filename=target1_prereq
target_2:special_filename=target2_prereq
target_1 target_2: common_filename $(special_filename)
do_something common_filename --a-weird-option=$(special_filename)
Run Code Online (Sandbox Code Playgroud)
当我调用'make target_1'时,如果它不存在,我想让它成为target1_prereq.目前,即使使用正确的参数调用构建命令(do_something),它似乎也不使用target1_prereq作为先决条件.
我正在使用GNU Make 3.80.
编辑:真实系统的一些复杂问题.一些变量本身基于其他变量的值.手动指定先决条件将无法扩展.一个稍微复杂的例子:
target_1:special_filename_base=target1_prereq
target_2:special_filename_base=target2_prereq
some_filename_a = $(special_filename_base).exta
some_filename_b = $(special_filename_base).extb
target_1 target_2: common_filename $(special_filename_b) $(special_filename_a)
do_something common_filename --a-weird-option=$(special_filename_a) --second=$(special_filename_b)
Run Code Online (Sandbox Code Playgroud) 我在GNU make中看到了目标特定变量的意外结果.
我想要的是设置一个影响依赖项的特定于目标的变量.我可以.SECONDEXPANSION
用来实现这一目标.
some-target: DEP := debug-dep
debug: some-target
.SECONDEXPANSION:
some-target: $$(DEP)
@echo $^
debug-dep:
Run Code Online (Sandbox Code Playgroud)
make debug
打印debug-dep
.
现在我读到make为后代规则定义了特定于目标的变量:
定义特定于目标的变量时,变量值对此目标的所有先决条件及其所有先决条件等也有效.
但是当我更改我的makefile以在"父"目标上设置变量时:
debug: DEP := debug-dep
debug: some-target
.SECONDEXPANSION:
some-target: $$(DEP)
@echo $^
debug-dep:
Run Code Online (Sandbox Code Playgroud)
并且做make debug
我得到一个空行.
这似乎与目标特定变量的记录行为相矛盾.有什么东西我错过了吗?
这有点类似于make:在先决条件中使用目标特定变量,但我正在做的是不起作用.