我有下面的项目结构。
[22:58:45] BasicProject$ tree -l
.
├── Makefile
└── SourceCode
├── Controllers
│ ├── MenuPage.cpp
│ ├── MenuPage.hpp
│ └── Unused.cpp
├── main.cpp
├── main.hpp
└── Visuals -> ../AnotherProject/SourceCode/Visuals
├── Components
│ └── Text.hpp
├── MenuPage.cpp
└── MenuPage.hpp
在
BasicProject/SourceCode/Controllers
文件夹内,有一个未使用的源文件,名为Unused.cpp
。它没有被任何其他源文件引用。有没有办法从编译过程中排除类似的文件?未使用的文件根据一组编译参数(例如目标架构、库选择等)而变化。
我使用以下简化的 Makefile 来构建我的项目。
PRJ_NAME := BasicProject
### Paths ###
PRJ_ROOT := ./
PRJ_SOURCE_CODE := ${PRJ_ROOT}/SourceCode
PRJ_OUTPUT_DIR := ${PRJ_ROOT}/Outputs
PRJ_OBJECTS_DIR := ${PRJ_OUTPUT_DIR}/Objects
INCLUDES += -I${PRJ_SOURCE_CODE}
### Derived Variables ###
CPP_SRC_FILES := $(shell find -L $(PRJ_SOURCE_CODE) -type f -name "*.cpp" -print)
CPP_OBJECTS := $(patsubst $(PRJ_SOURCE_CODE)/%.cpp,$(PRJ_OBJECTS_DIR)/%.o, $(CPP_SRC_FILES))
### Targets ###
all: $(CPP_OBJECTS)
@g++ -o ${PRJ_OUTPUT_DIR}/${PRJ_NAME}.elf $(CPP_OBJECTS)
clean:
rm -rf ${PRJ_OBJECTS_DIR}
${PRJ_OBJECTS_DIR}/%.o : $(PRJ_SOURCE_CODE)/%.cpp
@mkdir -p $(@D)
@g++ $(INCLUDES) -c $< -o $@
您可以在 Makefile 中从编译过程中排除特定文件。要排除“Unused.cpp”文件被编译,您可以按如下方式修改 Makefile:
PRJ_NAME := BasicProject
### Paths ###
PRJ_ROOT := ./
PRJ_SOURCE_CODE := ${PRJ_ROOT}/SourceCode
PRJ_OUTPUT_DIR := ${PRJ_ROOT}/Outputs
PRJ_OBJECTS_DIR := ${PRJ_OUTPUT_DIR}/Objects
INCLUDES += -I${PRJ_SOURCE_CODE}
### Derived Variables ###
CPP_SRC_FILES := $(shell find -L $(PRJ_SOURCE_CODE) -type f -name "*.cpp" -not -name "Unused.cpp" -print)
CPP_OBJECTS := $(patsubst $(PRJ_SOURCE_CODE)/%.cpp,$(PRJ_OBJECTS_DIR)/%.o, $(CPP_SRC_FILES))
### Targets ###
all: $(CPP_OBJECTS)
@g++ -o ${PRJ_OUTPUT_DIR}/${PRJ_NAME}.elf $(CPP_OBJECTS)
clean:
rm -rf ${PRJ_OBJECTS_DIR}
${PRJ_OBJECTS_DIR}/%.o : $(PRJ_SOURCE_CODE)/%.cpp
@mkdir -p $(@D)
@g++ $(INCLUDES) -c $< -o $@
通过修改 CPP_SRC_FILES 行,我们使用带有 -not -name "Unused.cpp" 选项的 find 命令,从要编译的源文件列表中排除 "Unused.cpp" 文件。
现在,当您运行 make all 时,“Unused.cpp”文件将从编译过程中排除,并且生成的二进制文件将不包含它。
简短的回答是没有自动的方法来省略“未使用的”源文件。构建系统如何了解哪些源文件被使用,哪些没有?如果您可以提供一种做出该决定的算法(无论如何都不涉及实际编译所有文件以查看是否需要其中的任何符号!)那么也许我们可以建议一种实现该算法的方法。
如果没有,您将不得不对未使用的文件列表进行硬编码。你可以这样做:
UNUSED := $(PRJ_SOURCE_CODE)/UnusedOne.cpp $(PRJ_SOURCE_CODE)/UnusedTwo.cpp
ALL_SRC_FILES := $(shell find -L $(PRJ_SOURCE_CODE) -type f -name "*.cpp" -print)
CPP_SRC_FILES := $(filter-out $(UNUSED),$(ALL_SRC_FILES)
在您的问题文本中,您说有多种架构具有不同的要求,但在您的示例 makefile 中没有指示构建多种架构或选择标志,因此我们无法向您展示如何集成它。但您可以使用构造变量名称;例如,如果您有一个变量
ARCH
,其中包含要为您构建的架构,则可能会具有以下内容:
ARCH := x86
x86_UNUSED := $(PRJ_SOURCE_CODE)/This_arm64.cpp
arm64_UNUSED := $(PRJ_SOURCE_CODE)/That_x86.cpp
ALL_SRC_FILES := $(shell find -L $(PRJ_SOURCE_CODE) -type f -name "*.cpp" -print)
CPP_SRC_FILES := $(filter-out $($(ARCH)_UNUSED),$(ALL_SRC_FILES)