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

An elegant way to handle multiple extensions in Makefile

本文关键字:方法 扩展 Makefile 处理      更新时间:2023-10-16

我有一个由几个源代码和头文件组成的小型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 命令?

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


然而。。。

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

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!

相关:生成文件中的函数?