7

我们的 make 文件使用如下静态模式规则编译 .c 源文件:

OBJECTS = foo.o bar.o baz.o

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

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

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

谢谢

4

3 回答 3

7

我们可以将这种非此即彼的行为添加到 Make 应该能够轻松完成的事情列表中,但事实并非如此。这是一种方法,使用“eval”为每个对象创建单独的规则。

定义 RULE_template
$(1): $(通配符 $(basename $(1)).[cm])
endef

对象 = foo.o bar.o baz.o

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

$(对象):
    $(CC) $< $(C_OPTIONS) -c -o $@

请注意,这取决于运行 Make 之前已经存在的源文件(foo.c 或 foo.m,但不能同时使用两者)。如果您在同一步骤中生成这些源,这将不起作用。

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

CPP_OBJECTS = foo.o bar.o
OBJECTIVE_OBJECTS = baz.o
对象 = $(CPP_OBJECTS) $(OBJECTIVE_OBJECTS)

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

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

$(对象):
    $(CC) $< $(C_OPTIONS) -c -o $@

编辑:更正了 OBJECTS 分配,感谢 Jonathan Leffler。

于 2009-10-22T17:55:41.933 回答
1

不只是复制到

$(OBJECTS): %.o: %.m
  $(CC) $< $(C_OPTIONS) -c -o $@
于 2009-10-21T21:26:12.833 回答
-1

调用同一个编译器只是一个快乐的时刻。通常你不会用$(CC). 就是觉得很奇怪。

但是,由于您采取了严厉的方式,因此我不会发布正确的解决方案,在该解决方案中,您将 Objective-C 目标与 C 目标分离为两个不同$(OBJECTS)的类似变量并制定两个规则(您确实应该这样做)。太无聊。相反,采取黑客行动!

OBJC_FILES:=$(subst $(wildcard *.m))

real_name = `(test -h $(1) && readlink $(1) ) || echo $(1)`

$(OBJECTS): %.o: %.c
  $(GCC) $< $(C_OPTIONS) -c -o $(call real_name,$@)

$(OBJC_FILES): %.c: %.m
  ln -s $< $@

上帝帮助那些维护它的人!

顺便说一句,如果生成了您的 m 文件,这显然不起作用。

于 2009-10-21T21:28:56.493 回答