makefile – 在gnu make中,静态模式规则中的先决条件可以具有不同的后缀

我们的make文件使用静态模式规则编译.c源文件,如下所示:
OBJECTS = foo.o bar.o baz.o

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

我需要将其中一个.c文件更改为Objective-C .m文件.对两种源类型调用编译器是相同的,所以我想使用相同的规则并调整它以使其更灵活.我宁愿不更改OPTIONS变量,因为它也用于链接步骤等.

有没有办法使上面的规则更灵活,以适应.c和.m文件

谢谢

解决方法

我们可以将这个或者行为添加到事物列表中,Make应该能够轻松完成,但事实并非如此.这是一种方法,使用“eval”为每个对象创建一个单独的规则.
define RULE_template
$(1): $(wildcard $(basename $(1)).[cm])
endef

OBJECTS = foo.o bar.o baz.o

$(foreach obj,$(OBJECTS),$(eval $(call RULE_template,$(obj))))

$(OBJECTS):
    $(CC) $&lt $(C_OPTIONS) -c -o $@ 

请注意,这取决于运行Make之前已存在的源文件(foo.c或foo.m,但不是两者).如果您在同一步骤中生成这些源,则无效.

这是一种不太聪明,更健壮的方法.

CPP_OBJECTS = foo.o bar.o
OBJECTIVE_OBJECTS = baz.o
OBJECTS = $(CPP_OBJECTS) $(OBJECTIVE_OBJECTS)

$(CPP_OBJECTS): %.o: %.c 

$(OBJECTIVE_OBJECTS): %.o: %.m 

$(OBJECTS):
    $(CC) $&lt $(C_OPTIONS) -c -o $@ 

编辑:纠正了OBJECTS任务,感谢Jonathan Leffler.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...