GNU 在多行变量声明中做出了差异

发布于 2024-10-17 22:22:15 字数 1417 浏览 2 评论 0原文

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

Why GNU Make罐头食谱不起作用?

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

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 手册 似乎表明这两个变量声明应该是同样-我在这里缺少什么?

编辑:

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

3.7 make 如何读取 Makefile

定义立即数
  推迟的
恩德夫

定义立即=
  推迟的
恩德夫

5.8 定义罐装食谱< /strong>

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

 定义 run-yacc =
 yacc $(第一个单词 $^)
 mv y.tab.c $@
 恩德夫

6.8 定义多行变量< /strong>

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

如您所见,罐头食谱部分显式使用= 大小写。我正在使用 GNU Make 3.81。

I read this question, and I was surprised it wasn't working:

Why GNU Make canned recipe doesn't work?

So I tried it myself and got the same results. Here's an example makefile:

define foo
bar
baz
endef

define bar = 
foo
baz
endef

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

all:

And here's the output from running it:

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

What's happening here? The GNU make manual seems to indicate that these two variable declarations should be the same - what am I missing here?

Edit:

Some quotations from the manual that I was referring to:

3.7 How make Reads a Makefile

define immediate
  deferred
endef

define immediate =
  deferred
endef

5.8 Defining Canned Recipes

Here is an example of defining a canned recipe:

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

6.8 Defining Multi-Line Variables

... You may omit the variable assignment operator if you prefer. If omitted, make assumes it to be ‘=’ and creates a recursively-expanded variable...

As you can see, the canned recipes section explicitly uses the = case. I'm using GNU Make 3.81.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

素年丶 2024-10-24 22:22:15

从 3.82 中的 CHANGELOG 来看:

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

似乎在 define 语句中不支持使用“=”

From the CHANGELOG in 3.82:

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

It seems like using '=' isn't supported prior to that in define statements

旧时光的容颜 2024-10-24 22:22:15

这可能是您的 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。

It's probably your make version. I tested that makefile on my machine using make 3.81 in Cygwin and got:

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

I tested the same makefile using make 3.82 (native Windows build) and got:

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

I believe the online make manual is for v3.82.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文