Makefile PHONY 在大文件中的使用

Makefile PHONY usage in large file

我有使用 .Phony 的 Makefile,它工作正常 我的问题是有更简洁的方式来编写它而不是在每个目标之前

all: app1 app2 

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

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

我有很多其他目标(看起来都一样),有没有一种更简洁的方法可以在每个目标之前一遍又一遍地编写它?

您可以在目标中使用all

.PHONY: all

这甚至在 documentation:

中的示例之一中显示
all : prog1 prog2 prog3
.PHONY : all

prog1 : prog1.o utils.o
        cc -o prog1 prog1.o utils.o

prog2 : prog2.o
        cc -o prog2 prog2.o

prog3 : prog3.o sort.o utils.o
        cc -o prog3 prog3.o sort.o utils.o

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

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