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



我有一个c++项目,它的源文件有各种扩展名(.cpp、.c、.cc),头文件有各种不同扩展名(.hpp、.h、.hh)。源文件位于一个名为SRC的目录中,头文件可预测地位于一个称为INC.的目录中

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

vpath %.c $(SRC)
%.o: %.c
    $(COMPILER) $(FLAGS) $< $(INCFLAG)$(INC)

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

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

SRC_EXT = cpp c cc
vpath %.$(SRC_EXT) $(SRC)
%.o: %.$(SRC_EXT)
    $(COMPILER) $(FLAGS) $< $(INCFLAG)$(INC)

谢谢你的帮助。

您不能使用标准POSIX制造。但是,既然您提到了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))))

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

最新更新