我在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,或者您可以说这是目标特定变量。
那么我该如何使它成为全局变量?
答案 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
该怎么办?