在目标主体内更改Makefile变量值

pau*_*ray 52 makefile target

有没有办法在目标体内重新分配Makefile变量值?

我想要做的是为调试编译添加一些额外的标志:

%.erl: %.beam
    $(ERLC) $(ERLFLAGS) -o ebin $<

test: clean debug_compile_flag compile compile_test

debug_compile:
    $(ERLCFLAGS) += -DTEST
Run Code Online (Sandbox Code Playgroud)

因此,如果我调用测试目标,我想清理我的环境,添加一些新标志(比如现有的-DTEST),再次编译整个代码(第一个源,然后是测试模块).

我不想复制/粘贴用于编译的代码,因为有很多逻辑放在这里和那里.

有没有一些简单的方法来重新定义变量值,以便我可以重用现有的代码?

Bet*_*eta 78

是的,有一种简单的方法可以做到这一点,而无需重新运行Make.使用特定目标的变量值:

test: clean debug_compile

debug_compile: ERLCFLAGS += -DTEST
debug_compile: compile compile_test;
Run Code Online (Sandbox Code Playgroud)

  • [Docs](http://www.gnu.org/software/make/manual/make.html#Target_002dspecific):"请注意,每次调用make时,最多只会生成一个给定的先决条件.如果相同file是多个目标的先决条件,并且每个目标对于同一个特定于目标的变量具有不同的值,然后要构建的第一个目标将导致构建该先决条件,并且先决条件将从以下内容继承特定于目标的值第一个目标.它将忽略来自任何其他目标的特定目标值." (3认同)
  • 这里的执行顺序是否得到保证?或者可以让-j2搞砸了吗? (2认同)

Ian*_*Ooi 45

另一个答案是:在规则执行时定义make变量.

对于懒惰,您可以使用以下规则(FLAG并且DEBUG是我的变量):

.DBG:
    $(eval FLAG += $(DEBUG))
Run Code Online (Sandbox Code Playgroud)


Cso*_*mai 7

这是我使用的解决方案:

PASSWORD = abc123

main: sub
    @echo "in main" $(PASSWORD)

sub:
    @echo "in sub" $(PASSWORD)
    $(eval PASSWORD=qwerty)
    @echo "in sub" $(PASSWORD)
Run Code Online (Sandbox Code Playgroud)

如果运行make main则输出为:

in sub abc123
in sub qwerty
in main qwerty
Run Code Online (Sandbox Code Playgroud)

您可以看到原始值"abc123"被覆盖,sub并且新值"qwerty"在该级别可见main


Did*_*set -9

编辑:正如 Beta 在另一个答案中所解释的那样,这是可能的。


不可以。在 Makefile 中没有办法做到这一点。但是,您可以在命令行上更改变量的值make。如果您按如下方式重写 Makefile:

ERLCFLAGS += $(ERLCFLAGSADDED)

%.erl: %.beam
    $(ERLC) $(ERLCFLAGS) -o ebin $<

test: clean compile compile_test
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用以下命令调用 make 来执行测试:

make ERLCFLAGSADDED=-DTEST test
Run Code Online (Sandbox Code Playgroud)