我在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,或者你可以说这是目标特定变量。那么我如何使它成为一个全局变量??
make中所有与目标无关的变量都是"全局的"。因此,如果你想要一个全局变量,你只需要删除目标部分(例如,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
;如果您想在coverage
目标之外的其他目标中使用PERL_RUNNER
,该怎么办?