我得到了如下的Makefile:
.PHONY: all
all: aaa.2 bbb.2
aaa.2 : aaa.1 common.1
create_2 $@
bbb.2 : bbb.1 common.1
create_2 $@
程序create_2需要很长时间才能启动,但是能够一次创建几个%。2文件,因此我只想调用create_2一次。
例如,如果common.1已更改,我希望调用create_2 aaa.2 bbb.2
而不是create_2 aaa.2
和create_2 bbb.2
。
我尝试在“所有”目标中使用create_2 $?
食谱,但没有成功。
我正在寻找一种兼容gmake和clearmake的解决方案(在gnu兼容模式下)。
答案 0 :(得分:2)
Make基本上是面向文件的,你想要的是面向流程的东西,所以...也许这可以为这个可怕的kludge提供借口:
.PHONY: all
all: marker
aaa.2 : aaa.1 common.1
@touch $@
bbb.2 : bbb.1 common.1
@touch $@
marker: aaa.2 bbb.2
create_2 $?
@touch $@
请注意,marker
是一个虚拟文件,aaa.2
和bbb.2
的规则会触及这些目标,但不会真正重建它们。这很丑陋,但它确实起到了作用。
答案 1 :(得分:0)
这个黑客可能会帮助你:
.PHONY: all
all: file1 file2
>---@if [ -f work ]; then \
>--->---touch file1 file2; \
>--->---echo "touch file1 file 2"; \
>---fi
>---rm -f work
file1:
>---touch work
file2:
>---touch work
如果任何文件需要重建,则会导致重建这两个文件。您可以使用此hack,创建work1
和work2
文件而不是仅work
,并使用更复杂的if
条件来重建需要重建的内容。至少与GNU Make一起使用。