gnu-make - 为什么 GNU Make jar 头食谱不起作用?

标签 gnu-make

我期待看到由下面的 makefile 创建的文件 foo1 和 foo3。但是只创建了一个文件 foo3。在我看来, jar 头食谱 make-foo 似乎被 make 忽略了。目标 foo1 和 foo2(空配方)的调试结果是相同的。

# why canned recipe doesn't work ?
# http://www.gnu.org/software/make/manual/make.html#Canned-Recipes
define make-foo =
echo making $@
touch $@
endef

.PHONY: all
all: foo1 foo2 foo3

# foo1 is not created, but why ?
.PHONY: foo1
foo1:
    $(make-foo)

# debug output similar to foo1
.PHONY: foo2
foo2:

# this works
.PHONY: foo3
foo3:
    echo making $@
    touch $@

运行制作:
xxxx@xxxx:/dev/shm$ make -dRr
GNU Make 3.81
Copyright (C) 2006  Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.

This program built for i686-pc-linux-gnu
Reading makefiles...
Reading makefile `makefile'...
Updating makefiles....
 Considering target file `makefile'.
  Looking for an implicit rule for `makefile'.
  No implicit rule found for `makefile'.
  Finished prerequisites of target file `makefile'.
 No need to remake target `makefile'.
Updating goal targets....
Considering target file `all'.
 File `all' does not exist.
  Considering target file `foo1'.
   File `foo1' does not exist.
   Finished prerequisites of target file `foo1'.
  Must remake target `foo1'.
  Successfully remade target file `foo1'.
  Considering target file `foo2'.
   File `foo2' does not exist.
   Finished prerequisites of target file `foo2'.
  Must remake target `foo2'.
  Successfully remade target file `foo2'.
  Considering target file `foo3'.
   File `foo3' does not exist.
   Finished prerequisites of target file `foo3'.
  Must remake target `foo3'.
echo making foo3
Putting child 0x0914c5f0 (foo3) PID 3132 on the chain.
Live child 0x0914c5f0 (foo3) PID 3132 
making foo3
Reaping winning child 0x0914c5f0 PID 3132 
touch foo3
Live child 0x0914c5f0 (foo3) PID 3133 
Reaping winning child 0x0914c5f0 PID 3133 
Removing child 0x0914c5f0 PID 3133 from chain.
  Successfully remade target file `foo3'.
 Finished prerequisites of target file `all'.
Must remake target `all'.
Successfully remade target file `all'.

缺少 foo1:
xxxx@xxxx:/dev/shm$ ll foo*
-rw-r--r-- 1 xxxx xxxx 0 2011-02-17 20:04 foo3

最佳答案

我想你不想要 =define 的末尾线。这个makefile在这里为我工作:

define make-foo
echo making $@
touch $@
endef

.PHONY: foo1
foo1:
    $(make-foo)
例子:
$ make
echo making foo1
making foo1
touch foo1
$ ls
Makefile  foo1
GNU make manual似乎表明 =应该没问题,但像你一样,如果我有它,我会得到不同的行为。
编辑:我只是问:
GNU make differences in multiline variable declarations
为了澄清这里发生的事情......

关于gnu-make - 为什么 GNU Make jar 头食谱不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5032935/

相关文章:

bash - 'gmake' 和 'gmake clean' 之间的区别

makefile - GNU make - 强制 PHONY 目标的依赖顺序

makefile - 如何在Makefile中获取名称列表的笛卡尔积(组合扩展)

gnu-make - Makefile 模式规则失败?

linux - 如何将命令应用于 GNU Make 中所有已更改的依赖项?

linux - 如何验证 makefile 中非空行和非注释行的文件

linux - 如何将变量传递给 Makefile 中的 foreach 函数调用的子 make?

go - 在 `go install package` 期间创建一些二进制文件

makefile - GNU make 通配符不再提供排序输出。有控制开关吗?