【问题标题】:In gnu make, can the prerequisites in a static pattern rule have different suffixes在gnu make中,静态模式规则中的先决条件可以有不同的后缀吗
【发布时间】:2009-10-21 21:04:59
【问题描述】:

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

OBJECTS = foo.o bar.o baz.o

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

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

有没有办法让上述规则更灵活地同时容纳 .c 和 .m 文件?

谢谢

【问题讨论】:

    标签: makefile gnu-make


    【解决方案1】:

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

    定义 RULE_template $(1): $(通配符 $(basename $(1)).[cm]) endef 对象 = foo.o bar.o baz.o $(foreach obj,$(OBJECTS),$(eval $(call RULE_template,$(obj)))) $(对象): $(CC) $&lt $(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) $&lt $(C_OPTIONS) -c -o $@

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

    【讨论】:

    • 我同意更强大的方法 - 我会使用它。但是 OBJECTS = 宏在 RHS 上需要一些 $(...)。
    • 制作你的例子(第二个)只有第一个文件 foo.o 正在生成。什么问题?
    • 我认为是因为没有all: $(OBJECTS) 行。
    • @BogdanSikach:是的,如果您希望它成为默认规则,则必须拥有该规则。
    【解决方案2】:

    不只是复制到

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

    【讨论】:

    • 它会产生错误。对于第一个实例,将找不到 %.m 文件(错误!),对于第二个实例,将找不到 %.c(另一个错误!)
    • 抱歉 make 只查看没有 .c 文件的情况,那么它不会调用 %.c 规则
    【解决方案3】:

    调用同一个编译器只是一个快乐的时刻。通常你不会用$(CC) 编译objective-c 代码。只是感觉很奇怪。

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

    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 文件,这显然不起作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-18
      • 1970-01-01
      • 2015-08-28
      • 1970-01-01
      • 1970-01-01
      • 2019-11-05
      • 1970-01-01
      相关资源
      最近更新 更多