在Makefile中处理多个扩展的优雅方法

时间:2017-11-07 03:04:32

标签: c++ c makefile

我有一个小的C ++语言项目,包含几个源头文件,我使用Makefile来构建我的项目。

最近我在项目中添加了一个最初只有.cpp文件的.c文件。为了构建包括.c文件在内的整个项目,我将Makefile修改为:

SRC_DIR     := src
INC_DIR     := include
BUILD_DIR   := build

C_EXT       := c
CPP_EXT     := cpp
SOURCES     := $(shell find $(SRC_DIR) -type f -name *.$(CPP_EXT))
               $(shell find $(SRC_DIR) -type f -name *.$(C_EXT))       # Added!

...

$(BUILD_DIR)/%.o: $(SRC_DIR)/%.$(CPP_EXT) $(INC_DIR)/%.h
    @mkdir -p $(BUILD_DIR)
                    $(CXX) $(CFLAGS) -I $(INC_DIR) -c -o $@ $<

$(BUILD_DIR)/%.o: $(SRC_DIR)/%.$(C_EXT) $(INC_DIR)/%.h                 # Added!
    @mkdir -p $(BUILD_DIR)                                             # Added!
                    $(CXX) $(CFLAGS) -I $(INC_DIR) -c -o $@ $<         # Added!

但我觉得它有点难看,因为有重复的命令。有没有办法删除重复并改进这个Makefile命令?

1 个答案:

答案 0 :(得分:2)

Make附带了构建C和C ++的默认规则,因此对于基本用法,您不必担心这一点。由于您正在更改规则以创建更复杂的构建工具,因此您可能只想咬一点副本(在您的示例中它并不是那么多)。你可以将这样的东西放在一个普通的make include文件中,并将它用于你所有类似的项目 - 这样就不会混淆你的项目特定的makefile。

...然而

GNU make确实有definingcalling函数的规定,尽管它们可能很模糊。

define do_compile
    @mkdir -p $(BUILD_DIR)
                    $(CXX) $(CFLAGS) -I $(INC_DIR) -c -o $@ $<
endef

$(BUILD_DIR)/%.o: $(SRC_DIR)/%.$(CPP_EXT) $(INC_DIR)/%.h
    $(call do_compile)

$(BUILD_DIR)/%.o: $(SRC_DIR)/%.$(C_EXT) $(INC_DIR)/%.h                 # Added!
    $(call do_compile)                                                 # Added!

相关:functions in makefiles?