【问题标题】:GNU make differences in multiline variable declarationsGNU 在多行变量声明中有所不同
【发布时间】:2011-06-29 07:47:11
【问题描述】:

我读了这个问题,很惊讶它不起作用:

Why GNU Make canned recipe doesn't work?

所以我自己尝试了一下,得到了同样的结果。这是一个示例生成文件:

define foo
bar
baz
endef

define bar = 
foo
baz
endef

$(info foo: $(foo))
$(info bar: $(bar))

all:

这是运行它的输出:

$ make
foo: bar
baz
bar: 
make: Nothing to be done for `all'.

这里发生了什么? GNU make manual 似乎表明这两个变量声明应该相同 - 我在这里缺少什么?

编辑:

我所指的手册中的一些引文:

3.7 How make Reads a Makefile

define immediate
  deferred
endef

define immediate =
  deferred
endef

5.8 Defining Canned Recipes

以下是定义罐头食谱的示例:

 define run-yacc =
 yacc $(firstword $^)
 mv y.tab.c $@
 endef

6.8 Defining Multi-Line Variables

... 如果您愿意,可以省略变量赋值运算符。如果省略,make 假定它是“=”并创建一个递归扩展变量...

如您所见,罐头食谱部分明确使用= 案例。我正在使用 GNU Make 3.81。

【问题讨论】:

  • 刚刚遇到了同样的问题,apt-get upgrade ; apt-get install make 告诉我 v3.81 是最新的,所以我变得越来越愤怒......非常感谢!

标签: variables makefile


【解决方案1】:

来自 3.82 中的变更日志:

* read.c (do_define): Modify to allow assignment tokens (=, :=, etc.)
after a define, to create variables with those flavors.

define 语句中似乎不支持在此之前使用 '='

【讨论】:

  • 最佳答案!来自权威来源的简明引用,准确地解释了观察到的行为。这正是我想要的。
【解决方案2】:

这可能是您的make 版本。我在 Cygwin 中使用 make 3.81 在我的机器上测试了该 makefile 并得到:

$ make
foo: bar
baz
bar: 
make: Nothing to be done for `all'.

我使用 make 3.82(本机 Windows 构建)测试了相同的 makefile,并得到:

C:\>C:\make\make.exe
foo: bar
baz
bar: foo
baz
make: Nothing to be done for `all'.

我相信在线make 手册适用于v3.82。

【讨论】:

  • 嗯,这是一个简单的解决方案 - 感谢您指出我的错误!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多