摘要:我正在处理一个make脚本,它生成(并且可选地'make')一个makefile。从历史上看,它使用了make make
“虚假目标”来实现这一目标。我想将其更改为make makefile
,因为它似乎更加连贯并代表正在发生的事情。但是当我改变它并切换到.FORCE惯用语以便它将依赖于一个人工虚假目标生成时,似乎makefile被另外创建了4次,原因我不明白。
详细信息:脚本的工作方式是您可以编写:
make -f makefile.boot
或:
make -f makefile.boot make
在第一种情况下,它假定您要使用makefile.boot
中的规则生成特定于平台的makefile
,然后对该文件运行make
。在第二种情况下,它假定您只想创建makefile但不执行它。
这是make make
条款中的 makefile.boot 的精简版本:
top: make
$(MAKE)
make:
@echo "Pretending to generate makefile..."
cp makefile.fake makefile
我们“生成”的makefile想成为makefile.boot的超集。它希望能够执行make make
生成过程,但其top
目标是实际构建。所以 makefile.fake 包含
top: product
make:
@echo "Pretending to generate makefile..."
cp makefile.fake makefile
product:
@echo "Pretending to make build product..."
echo "Build Product" >> product
它有效,但我有一个想法:
“make make”令人困惑阅读,如果是“make makefile”则会更清楚
一个直接的问题是当你有一个真正的目标而不是虚假目标时,如果文件存在且没有依赖关系,它就不会重建。我希望每次执行make makefile
或make -f makefile.boot makefile
时都会创建此makefile。所以我在假目标上使用了.FORCE习语来依赖。更新了 makefile.boot :
.FORCE
top: makefile
$(MAKE)
makefile: .FORCE
@echo "Pretending to generate makefile..."
cp makefile.fake makefile
更新的 makefile.fake :
.FORCE:
top: product
makefile: .FORCE
@echo "Pretending to generate makefile..."
cp makefile.fake makefile
product:
@echo "Pretending to make build product..."
echo "Build Product" >> product
这似乎一切都很好,但它现在运行makefile生成五次:
/test$ make -f makefile.boot
Pretending to generate makefile...
cp makefile.fake makefile
make
make[1]: Entering directory '/test'
Pretending to generate makefile...
cp makefile.fake makefile
Pretending to generate makefile...
cp makefile.fake makefile
Pretending to generate makefile...
cp makefile.fake makefile
Pretending to generate makefile...
cp makefile.fake makefile
Pretending to make build product...
echo "Build Product" >> product
make[1]: Leaving directory '/test'
我想要的第一个,似乎是我要求的唯一一个。所有其他电话来自哪里?是什么触发了makefile
的四个额外请求?或者在没有理解的情况下,是否有另一种方法来实现我的意图?
答案 0 :(得分:2)
请记住,makefile
是make
个实施including GNU Make中的神奇目标。
如果目标makefile
存在,那么make
将在执行任何其他操作之前重新创建makefile ,当它完成时,它将使用新的makefile重新启动处理。这意味着即使您没有要求,也可以运行makefile
目标。
由于执行make -f makefile.boot
时的默认操作是运行make
,那么至少两个潜在运行makefile
目标的操作就在那里,在它甚至看到product
目标之前。我不能完全把它加起来五次,但是我会挣钱,这种特殊行为引起了意想不到的重复。