在makefile中使用多个源文件扩展名

use*_*100 7 file-extension makefile rules

我有一个c ++项目,其中包含源文件(.cpp,.c,.cc)的各种扩展以及头文件的各种扩展(.hpp,.h,.hh).源文件位于名为SRC的目录中,并且头文件可预测地位于名为INC的目录中.

我想用像这样的规则编译源代码

vpath %.c $(SRC)

%.o: %.c
    $(COMPILER) $(FLAGS) $< $(INCFLAG)$(INC)
Run Code Online (Sandbox Code Playgroud)

这当然有效,如果我知道源文件的格式为%.c,但在多个可能的文件扩展名的情况下,我还需要为%.cpp和%.cc构建类似的规则.当然,编写三个规则并不是什么大不了的事情,但是能够将这个makefile用作任何项目的拖放,即使是在不同的语言中也是如此,而不必重新编写规则.

那么如何编写一个规则(或其他一些实现相同目标的构造),其工作方式如下:

SRC_EXT = cpp c cc
vpath %.$(SRC_EXT) $(SRC)

%.o: %.$(SRC_EXT)
    $(COMPILER) $(FLAGS) $< $(INCFLAG)$(INC)
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助.

Mad*_*ist 4

你不能在标准 POSIX make 中。不过,既然你提到了 vpath,我就假设你正在使用 GNU make。如果您有足够新的版本(3.81 或更高版本),您可以使用 call 和 eval 轻松完成此操作:

SRC_EXT = cpp c cc

define compile_rule
%.o : %.$1
        $$(COMPILER) $$(FLAGS) $$< $$(INCFLAG)$$(INC)
endef    
$(foreach EXT,$(SRC_EXT),$(eval $(call compile_rule,$(EXT))))
Run Code Online (Sandbox Code Playgroud)

如果您没有足够新的 GNU make,或者更喜欢替代解决方案,则可以使用生成的 makefile 执行相同的操作。