【问题标题】:make, variables depend on targetmake,变量取决于目标
【发布时间】:2012-12-13 01:29:21
【问题描述】:

生成文件

abc:
TEST=$@ /* TEST=abc */

def:
TEST=$@ /* TEST=def */

xxx:
        @echo $(TEST)

如果我运行make abc xxx,我 期望输出abc

如果我运行make def xxx,我 期望输出def

但它不是那样工作的。似乎make 不允许我在目标中定义变量。我的问题是如何定义取决于构建目标的变量及其值?

【问题讨论】:

  • Passing arguments to "make run" 的可能重复项
  • 正如所写,两个TEST 宏分配在文件被读取时被处理,第二个'wins'。请注意,宏包含 C 注释;当我运行make abc xxx 时,输出以xxx 开头,包括我的根目录中的所有名称TEST=def*/。在构建abc 时,没有要执行的命令。同上def。构建xxx 时,$@ 的值为xxx。您不能轻易地使 xxx 输出一个值,该值取决于在同一运行 make 之前构建的其他内容。
  • @WaleedKhan:建议的重复问题似乎与此问题非常不同(如果我了解此问题)。
  • 谢谢乔纳森,很抱歉我忘了提到删除 c cmets。你说的对。但是如何使定义变量取决于目标?我希望在构建目标时处理 TEST,而不是读取文件。

标签: makefile gnu


【解决方案1】:

使用 GNU Make,您可以复制 Makefile 的预期结果,如下所示:

echo.%:
    @echo $*

或者简单地说:

%:
    @echo $*

这些将允许您分别指定make echo.abcmake abc,并将abc 视为输出。

这一切都很好,但听起来您会对特定于目标的变量更感兴趣。如果变量值依赖于目标名称,但不是目标名称的子字符串,则可以执行以下操作:

%:
    @echo $(TEST)

abc: TEST=xyzzy

def: TEST=plugh

这允许您指定make abc 并将xyzzy 视为输出。


如果您想超越这一点,以便目标的行为根据命令行上指定的其他目标而改变,我们有两个选择:或者让 .PHONY 目标更新您的主要使用的文件目标,或者对MAKECMDGOALS变量做一些处理:

选项 1:

xxx: xxx.temp
    @cat xxx.temp
    @rm xxx.temp

abc def:
    @echo $@ > xxx.temp

.PHONY: xxx abc def

这依赖于命令行目标是按顺序处理的事实(如果您指定多个目标,请按照您命名它们的顺序依次生成每个目标。 -GNU Make Manual ,第 9.2 节),因此您必须指定 make abc xxx 而不是 make xxx abc

选项 2:

ifneq (,$(findstring abc,$(MAKECMDGOALS)))
    VAR=abc
else ifneq (,$(findstring def,$(MAKECMDGOALS)))
    VAR=def
endif

xxx:
    @echo $(VAR)

abc def:
    @echo -n > /dev/null

.PHONY: xxx abc def

@echo -n > /dev/null 抑制 make: Nothing to be done for 'abc'. 消息。这对我来说似乎更笨拙,如果您可以容忍临时文件,我会推荐选项 1。

【讨论】:

  • 谢谢你。我越来越近了。
  • foo: @echo $(TEST) abc: TEST=xxx def: TEST=yyy
  • foo: @echo $(TEST) abc: TEST=xxx def: TEST=yyy 使 abc foo 期望看到 xxx,但不会。如何让 foo 目标看到 abc:TEST?
  • 目标特定变量仅在运行相应目标的规则时才在范围内(即,它在 abc 规则的范围内,但不在 foo 规则的范围内。如果您如果希望一个目标的操作依赖于正在构建的其他目标,您需要修改一个文件(我会看看我是否可以用一个示例进行编辑),或者对$(MAKECMDGOALS) 进行一些检查在this answer
猜你喜欢
  • 1970-01-01
  • 2013-12-19
  • 2012-10-03
  • 2012-03-07
  • 2011-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多