如何在makefile中定义全局变量

时间:2015-08-10 05:03:10

标签: makefile gnu-make

我在make文件中声明了一个变量 -

var_COVERAGE_FLAGS?=   

我为名为coverage

的目标中的变量分配了一个值
coverage:var_COVERAGE_FLAGS = -MDevel::Cover=-silent,on,+select,/home/scratch.ataur_gpu/run_steps/client/dev1/dev/inf/run/mainline/lib,+ignore,^\\w+
coverage:var_COVERAGE_POST=2>&1 | grep -v "Can't";
coverage:var_COVERAGE_PRE = @echo "Running coverage for $@";
coverage:clean_coverage
    $(call run_with_perl,$*) $(var_COVERAGE_FLAGS) $(var_COVERAGE_TEST_NAMES) $(var_COVERAGE_POST)
    @echo "$*"
    @echo "$(var_COVERAGE_FLAGS)"
    @echo "====================="
    $(exec_COVER)

我定义了

define run_with_perl
$(PERL_RUNNER) $1 $(TEST_ARGS)
endef

并且变量PERL_RUNNER定义如下

PERL_RUNNER                             := $(exec_PERL) $(PERL_ARGS) $(env_PERLINCLUDE) $(var_COVERAGE_FLAGS)

并且正确定义了变量的其余部分 问题在于,每当我调用run_with_perl时,$(var_COVERAGE_FLAGS)的值都会重置为null,或者您可以说这是目标特定变量。 那么我该如何使它成为全局变量?

1 个答案:

答案 0 :(得分:1)

make中不是特定于目标的所有变量都是" global"。因此,如果您想要一个全局变量,只需删除目标部分(例如coverage:)并在没有它的情况下设置变量。

但是,你真的不需要这样做。您的问题是您正在使用PERL_RUNNER的简单作业。这意味着在解析makefile时会立即扩展赋值的右侧。这发生在任何目标上下文之外,因此没有特定于目标的值。

如果您将PERL_RUNNER的分配更改为使用=而不是:=,那么您的问题将会消失而无需更改任何其他内容(使用全局变量):

PERL_RUNNER = $(exec_PERL) $(PERL_ARGS) $(env_PERLINCLUDE) $(var_COVERAGE_FLAGS)

现在,在coverage的配方中,左侧的扩展将推迟到使用变量,其中特定于目标的变量在范围内。

但是,我甚至不知道你为什么要在这里添加它。您已经将此作为配方的一部分添加,这实际上是正确的方法,而不是将内容添加到PERL_RUNNER本身。这个食谱行:

$(call run_with_perl,$*) $(var_COVERAGE_FLAGS) $(var_COVERAGE_TEST_NAMES) $(var_COVERAGE_POST)

扩展到:

$(PERL_RUNNER) $* $(TEST_ARGS) $(var_COVERAGE_FLAGS) $(var_COVERAGE_TEST_NAMES) $(var_COVERAGE_POST)

扩展到这个:

$(exec_PERL) $(PERL_ARGS) $(env_PERLINCLUDE) $(var_COVERAGE_FLAGS) $* $(TEST_ARGS) $(var_COVERAGE_FLAGS) $(var_COVERAGE_TEST_NAMES) $(var_COVERAGE_POST)

您可以看到var_COVERAGE_FLAGS已存在。是不是因为旗帜坏了?您可以通过修改call函数的参数来更改顺序;例如:

$(call run_with_perl,$(var_COVERAGE_FLAGS) $*) $(var_COVERAGE_TEST_NAMES) $(var_COVERAGE_POST)

将按正确顺序排列,这比尝试将特定于目标的标志添加到PERL_RUNNER等通用变量更好;如果您想在PERL_RUNNER目标之外的其他目标中使用coverage该怎么办?