Makefile 在一条规则内只执行一次 echo

Makefile execute echo only one time inside a rule

我有这个 Makefile

$(MAIN) : $(OBJECTS)

$(OBJECTS) : %.c
     compile file

我想使用 printf 打印类似 "compiling" 的文件,只要文件需要编译,如果文件在每次编译结束时都已编译,则 "done" 例如:

Compiling
file1.c
file2.c
file3.c
Done

我尝试使用 shell 中的 if 或 makefile 中的 ifeq 这样的句子 但我需要一个变量,如果我不知道为什么,makefile 不允许我更改 a 中变量的值。我该如何存档?

我想这就是你想要的:

 OBJECTS := file1.o file2.o file3.o

.PHONY: all compiling

all : $(OBJECTS)
    @echo Done

compiling:
    @echo Compiling

$(OBJECTS): file%.o : file%.c compiling
    @echo $<
    @compile $<

我解决了将变量 MODE 初始化为 0 并将我的 makefile 分为两部分的问题,一部分检查是否已修改某些内容,在这种情况下,而不是更新失败,我打印我的消息,然后做 $(MAKE) MODE=1 我执行一个普通的 makefile 来更新所有需要的东西

感谢 Renauld Pacalet 提出的问题

我有同样的需求,在开始构建一堆 PDF 文件时打印一条消息,然后跳转到生成另一堆 PNG 文件。我使用了两个 .INTERMEDIATE 目标来防止 make 成为 .PHONY 目标文件的 "hungry"(期待更新)。

该消息将只打印一次。

 CC=gcc
 OBJECTS := file1.o file2.o file3.o

.PHONY: all 
 all:  $(OBJECTS) msg_compiling

$(OBJECTS): file%.o : file%.c msg_compiling
    $(CC) -c -o $@ $< 

.INTERMEDIATE: msg_compiling
 msg_compiling:
    @printf "\n Compiling \n"

这在 GNU make 手册中有解释https://www.gnu.org/software/make/manual/html_node/Special-Targets.html