我需要一个文件来使用特殊标志的专用规则。 现在我用
$(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。似乎路径未知,但当我评论我的特殊规则并让所有文件,文件编译正常。
如何仅针对一个文件转移制作规则?
非常感谢,
答案 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中泄漏目标格式化语法的需要,从我的超级神奇的通用规则定义中逃脱,使我无法使用特定于目标的变量。