【发布时间】:2017-11-08 15:36:26
【问题描述】:
我有一个具有以下结构的 C++ 项目:
/Project
Makefile
/src (.cpp source files)
...
/include (.h header files)
...
/libs
...
/build (.o object files)
...
/tests (target .cpp files I want to compile)
test1.cpp
test2.cpp
test3.cpp
...
/bin (output directory for compiled files)
...
对于我的测试文件中的测试,我希望能够
单独编译它们,例如“制作 test1”、“制作 test2”
一次全部编译
但我希望能够做到这一点不需要为每个新的测试文件定义新变量(例如 TARGET1、TARGET2...),也不需要添加一堆新行每个新测试文件的生成文件。
例如,现在我有类似的东西:
CXX = g++
SRC_DIR = ./src
BUILD_DIR = ./build
LIB = -I libs
INC = -I include
SRCS = $(shell find $(SRC_DIR) -type f -name *.cpp)
OBJS = $(patsubst $(SRC_DIR)/%, $(BUILD_DIR)/%, $(SRCS:.cpp=.o))
TARGET1 ?= test1.cpp
TARGET2 ?= test2.cpp
TARGET3 ?= test3.cpp
all: $(OBJS)
$(CXX) ./tests/$(TARGET1).cpp $(LIB) $(INC) $^ -o ./bin/$(TARGET1)
$(CXX) ./tests/$(TARGET2).cpp $(LIB) $(INC) $^ -o ./bin/$(TARGET2)
$(CXX) ./tests/$(TARGET3).cpp $(LIB) $(INC) $^ -o ./bin/$(TARGET3)
$(TARGET1): $(OBJS)
$(CXX) ./tests/$(TARGET1).cpp $(LIB) $(INC) $^ -o ./bin/$(TARGET1)
$(TARGET2): $(OBJS)
$(CXX) ./tests/$(TARGET2).cpp $(LIB) $(INC) $^ -o ./bin/$(TARGET2)
$(TARGET3): $(OBJS)
$(CXX) ./tests/$(TARGET3).cpp $(LIB) $(INC) $^ -o ./bin/$(TARGET3)
$(BUILD_DIR)/%.o: $(SRC_DIR)/%.cpp
$(CXX) $(INC) -c -o $@ $<
它可以完成这项工作,但不是很可扩展。我怎样才能以可扩展的方式做到这一点?
【问题讨论】:
-
你可以使用define/endef定义一个多行宏,然后eval()它。结合 patsubst,使用这种方法,您可以自动为每个目标自动生成所有规则。当我做了类似的事情时,我花了一些时间来浏览 GNU make 文档,所以我无法完全回忆起我脑海中的所有细节,但这绝对是可行的。只需花时间阅读和重新阅读 GNU make 的信息,直到您完全了解它。