如何通过只调用一个命令来构建多个目标?

时间:2011-05-10 15:05:57

标签: makefile

我得到了如下的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.2create_2 bbb.2

我尝试在“所有”目标中使用create_2 $?食谱,但没有成功。

我正在寻找一种兼容gmake和clearmake的解决方案(在gnu兼容模式下)。

2 个答案:

答案 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.2bbb.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,创建work1work2文件而不是仅work,并使用更复杂的if条件来重建需要重建的内容。至少与GNU Make一起使用。