c-仅当执行Makefile规则时,才打印句子



我正在为学校项目自定义Makefile。

我想打印下面的句子,但只有当我的SRCS_DIR中的.c文件实际编译完成时。

所有.c文件都已成功编译!

如果我将您在下面代码块的第3行中看到的printf移到最后一行,它会在编译每个.c文件后打印消息。。。因此,我创建了一个COMPILED变量,在Makefile的开头将其设置为0,然后在编译过程中将其值更改为1(下面代码块中的第11行(。我试着使用ifeq条件(下面代码块中的第2行(,但当我这样做时,句子不会打印出来。

$(NAME): $(LIBFT_AR) $(OBJS)
ifeq ($(COMPILED), 1)
printf "$(GREEN)> All the .c files have been compiled successfully !$(END)n"
endif
printf "$(BLUE)> Creating the executable file :$(END) $@n"
$(CC) $(OBJS) $(LIBFT_AR) -lreadline -o $(NAME)
printf "$(GREEN)> Executable file has been created successfully !$(END)n"
$(OBJS_DIR):
mkdir -p $(addprefix $(OBJS_DIR)/, $(SUBDIRS_LST))
$(OBJS_DIR)/%.o: $(SRCS_DIR)/%.c $(INCS) Makefile | $(OBJS_DIR)
override COMPILED=1
$(CC) $(CFLAGS) -I $(INCS_DIR) -c $< -o $@
printf "$(BLUE)> Compiling :$(END) $<n"

你对这个问题有什么解释和/或可以帮助我解决这个问题的解决方案吗?

谢谢!

Makefile不是脚本语言。Make不读取makefile,并在读取时运行每个规则。Make将(1(解析整个makefile(以及任何包含的文件(,并构建所有先决条件的内部图,而不是(2(为过时的目标运行配方。不在配方中的内容总是在第一步进行评估。配方中的内容总是在第二步中进行评估。

用TAB缩进的而非的行,在配方中是(因此在第一步中进行评估(。用TAB缩进的行在配方中(因此在第二步中会进行评估,也就是说,交给shell执行(。

也许你现在可以明白为什么你的尝试不能奏效了:在make决定是否应该构建任何目标之前,在第一步中,总是会评估if语句和COMPILED的变量赋值。

我真的不确定我是否理解你的目标。如果您的可执行文件的配方被调用,那么这意味着您的所有源文件都已编译:这就是makefile所做的。也许您正试图区分编译了至少一个源文件的构建和不必重新编译源文件但目标(可执行文件(已过期的构建?

如果这就是你想要的,那么解决问题的简单方法就是使用自动变量;例如CCD_ 2自动变量扩展到过期的先决条件列表。你可以做一些类似的事情:

$(NAME): $(LIBFT_AR) $(OBJS)
test -z '$(filter %.o,$?)' || printf "$(GREEN)> All the .c files have been compiled successfully !$(END)n"
printf "$(BLUE)> Creating the executable file :$(END) $@n"
$(CC) $(OBJS) $(LIBFT_AR) -lreadline -o $(NAME)
printf "$(GREEN)> Executable file has been created successfully !$(END)n"

$(filter ...)函数将扩展到$?变量中的.o文件列表;如果为空,则不会重建.o文件。