如何在makefile中定义全局变量



我在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,该怎么办?

最新更新