制作,为单个文件编写规则

时间:2013-07-31 15:06:28

标签: makefile

我需要一个文件来使用特殊标志的专用规则。 现在我用

$(OBJDIR)/%.$(OE): special_file.c
    $(ECHO) "Compiling file $< => $@" 
    $(CC)  $(CFLAGS) $(CFLAGS_SPECIAL) $(DEFINES) $(INCLUDE) $< -o $@

$(OBJDIR)/%.$(OE): %.c $(OBJDIR)
    $(ECHO) "Compiling file $< => $@" 
    $(CC)  $(CFLAGS) $(DEFINES) $(INCLUDE) $< -o $@

但是不适用于special_file.c。似乎路径未知,但当我评论我的特殊规则并让所有文件,文件编译正常。

如何仅针对一个文件转移制作规则?

非常感谢,

2 个答案:

答案 0 :(得分:3)

您应该使用Target-specific Variable Values

$(OBJDIR)/special_file.$(OE): CFLAGS += --specific_flags
$(OBJDIR)/special_file.$(OE): special_file.c

$(OBJDIR)/%.$(OE): %.c $(OBJDIR)
    $(ECHO) "Compiling file $< => $@" 
    $(CC)  $(CFLAGS) $(DEFINES) $(INCLUDE) $< -o $@

答案 1 :(得分:1)

如果你想这样做,你必须把它写成一个静态规则:

$(OBJDIR)/special_file.$(OE): special_file.c
        $(ECHO) "Compiling file $< => $@" 
        $(CC)  $(CFLAGS) $(CFLAGS_SPECIAL) $(DEFINES) $(INCLUDE) $< -o $@

然而,更简单和更灵活的是使用递归变量命名。做这样的事情:

special_file_FLAGS = $(CFLAGS_SPECIAL)

$(OBJDIR)/%.$(OE): %.c
        $(ECHO) "Compiling file $< => $@" 
        $(CC)  $(CFLAGS) $($*_FLAGS) $(DEFINES) $(INCLUDE) $< -o $@

自动变量$*扩展为词干(匹配%的部分)。现在,当您构建special_file.c以外的任何内容时,请说other_file.c,make会展开$(other_file_FLAGS),这是空的。在构建special_file.c时,make会展开$(special_file_FLAGS)

顺便说一句,你应该(几乎)从不列出一个目录作为目标的先决条件。搜索其他答案以找出原因并确保创建目标目录的正确方法。

ETA:

特定于目标的变量绝对是一个很酷的功能。不过,我倾向于不使用它们。为什么?因为我更喜欢将数据规则分开。

如果使用特定于目标的变量,则将规则语法(目标)与数据语法(变量赋值)混合在一起。使用递归变量名称方法,我将规则语法和数据赋值分开。如果我决定需要更改模式规则以使目标名称更改,该怎么办?使用特定于目标的变量,我必须遍历所有文件并更改目标名称。使用递归变量命名,我只需更改模式规则并使其正常工作。

在我的构建环境中,我通常只有包含数据(变量赋值)的makefile,以及声明我所有规则的公共makefile的include。避免在我的通用数据驱动的makefile中泄漏目标格式化语法的需要,从我的超级神奇的通用规则定义中逃脱,使我无法使用特定于目标的变量。