【问题标题】:Why GNU Make canned recipe doesn't work?为什么 GNU Make 罐头食谱不起作用?
【发布时间】:2023-04-04 13:45:01
【问题描述】:

我希望看到由下面的 makefile 创建的文件 foo1foo3。然而,只创建了一个文件 foo3。在我看来,罐头食谱 make-foo 似乎被 make 忽略了。目标 foo1foo2(空配方)的调试结果是相同的。

# 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 $@

运行make:

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

【问题讨论】:

    标签: gnu-make


    【解决方案1】:

    我认为您不希望 = 位于 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

    为了澄清这里发生的事情......

    【讨论】:

    • 我可以确认删除= 也为我解决了这个问题。这是我自己可能从未发现过的问题。谢谢 !我也非常感兴趣地关注后续问题。
    • @user272735,很高兴听到它解决了您的问题。我问的后续问题似乎没有得到太多的爱...
    猜你喜欢
    • 2023-01-23
    • 2014-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-29
    • 2015-01-18
    相关资源
    最近更新 更多