If statement Makefile在规则内只执行一次echo

If statement Makefile在规则内只执行一次echo,if-statement,makefile,rules,If Statement,Makefile,Rules,我有这个Makefile $(MAIN) : $(OBJECTS) $(OBJECTS) : %.c compile file 我想使用printf来打印类似于“编译”的内容,只要文件需要编译,如果在每次编译结束时都编译了文件,则使用“完成”,例如: Compiling file1.c file2.c file3.c Done 我试过使用shell中的if或makefile中的ifeq这样的句子 但是我需要一个变量,如果我不知道为什么,makefile不允许我更改变量中变量的值。

我有这个Makefile

$(MAIN) : $(OBJECTS)

$(OBJECTS) : %.c
     compile file
我想使用
printf
来打印类似于“编译”的内容,只要文件需要编译,如果在每次编译结束时都编译了文件,则使用“完成”,例如:

Compiling
file1.c
file2.c
file3.c
Done
我试过使用shell中的
if
或makefile中的
ifeq
这样的句子
但是我需要一个变量,如果我不知道为什么,makefile不允许我更改变量中变量的值。如何将其存档?

我想这正是您想要的:

 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 $<
OBJECTS:=file1.o file2.o file3.o
.冒牌货:全部
全部:$(对象)
@回音完成
汇编:
@回声编译
$(对象):文件%.o:文件%.c
@回音$<
@编撰$<

我解决了将变量
模式
初始化为0并将生成文件分为两部分的问题,一部分检查是否修改了某些内容,在这种情况下,我打印消息失败,然后执行
$(MAKE)模式=1
,其中我执行一个正常的生成文件,更新所有需要的内容


多亏了问题中的Renauld Pacalet

我在开始构建一组PDF文件时也需要打印一条消息,然后跳转生成另一组PNG文件。我使用了两个.INTERMEDIATE目标来防止
使
对.PHONY目标文件感到“饥饿”(期待更新)

消息将只打印一次

 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"
CC=gcc
对象:=file1.o file2.o file3.o
冒牌货:全部
全部:$(对象)消息\u
$(对象):文件%.o:文件%.c msg\u
$(CC)-c-o$@$<
.中级:msg_
msg_编译:
@printf“\n正在编译\n”

这在GNU make手册中有解释,它或多或少起作用,因为为了解释我的问题,我只说了很少的信息。我的真实情况是,我没有编译对象,我正在创建一个库,然后我使用
.PHONY
规则创建我的库,以便在每次我做任何修改时检查,如果库中的任何源已被修改,那么我想要的是,“compiling”和“Done”消息仅在库正在编译(或更新)时出现而不是在库已经更新时