大文件中的Makefile PHONY用法

时间:2018-07-25 07:13:52

标签: linux bash shell makefile gnu-make

我有使用.Phony的Makefile,可以正常工作         我的问题是有一种更干净的方法来编写它,而不是在每个目标之前写出

all: app1 app2 

.PHONY: app1
app1:
    echo "from app 1"

.PHONY: app2
app2:
    echo "from app 2"

我还有许多其他目标(看起来相同),是否有一种更干净的方法来代替它在每个目标之间反复编写?

2 个答案:

答案 0 :(得分:0)

您可以在目标中使用Key

all

甚至在documentation中的一个示例中也显示了这一点:

.PHONY: all

答案 1 :(得分:0)

.PHONY可以具有任意多个先决条件:

.PHONY: all app1 app2

您可以将其放置在Makefile中的任何位置,不仅只是在伪造目标的规则之前:

.PHONY: all app1 app2

all: app1 app2

app1:
    echo "from app 1"

app2:
    echo "from app 2"

请注意,如果您拥有“ 许多看起来相同的其他目标”,make可能具有一些不错的功能,可以用来分解相似性:

APPS := app1 app2

.PHONY: all $(APPS)

all: $(APPS)

$(APPS): app%:
    echo "from app $*"

(在食谱中,{$*被扩展为app%模式的主干)。

Make非常聪明,您甚至可以让它自动神奇地检测潜在目标,而不必显式列出它们(APPS := app1 app2...)。但是在这里,我们需要更多地了解您的真实项目组织。例如,假设每个appX都有一个对应的appX.todo文件,并且构建命令类似于buildapp appX.todo appX。然后,以下Makefile将自动执行所有操作:

TODO := $(wildcard *.todo)
APPS := $(patsubst %.todo,%,$(TODO))

.PHONY: all $(APPS)

all: $(APPS)

$(APPS):
    buildapp $@.todo $@

({$@被扩展为规则的目标)。