如何在CMake中基于文件名自动配置GCC编译选项?
在CMake中实现基于文件名自动生成依赖文件(.d)和列表文件(.lst)
你可以通过CMake生成器表达式实现类似Makefile的自动文件名匹配配置,无需逐个手动为源文件设置编译选项。以下是满足需求的CMake代码实现:
# 假设BUILD_DIR为你的构建目录,TARGET_NAME是目标可执行/库名称 target_compile_options(${TARGET_NAME} PRIVATE ${CC_FLAGS} # 生成汇编列表文件:自动将源文件的.c扩展名替换为.lst,输出到BUILD_DIR -Wa,-a,-ad,-alms="${BUILD_DIR}/$<SOURCE_FILE_BASE_NAME>.lst" # 生成依赖文件:自动将源文件的.c扩展名替换为.d,输出到BUILD_DIR -MMD -MP -MF="${BUILD_DIR}/$<SOURCE_FILE_BASE_NAME>.d" )
代码说明
$<SOURCE_FILE_BASE_NAME>是CMake的生成器表达式,会在生成构建系统时自动替换为当前编译的源文件的基础名称(比如编译src/foo.c时,会展开为foo),完美复刻Makefile中$<:.c=.lst>的替换逻辑。-Wa,-a,-ad,-alms=...告诉GCC生成汇编列表文件,指定输出到BUILD_DIR目录下;-MMD -MP -MF=...则用于生成依赖文件,确保构建系统能正确追踪头文件依赖。
对比Makefile实现
你提供的Makefile规则:
%.o: %.c $(CC) -c $(CC_FLAGS) \ -Wa,-a,-ad,-alms="$(BUILD_DIR)/$<:.c=.lst" \ -MMD -MP -MF"$(BUILD_DIR)/$<:.c=.d" \ $< -o $@
上述CMake代码实现了完全等价的效果:所有C源文件编译时,都会自动在BUILD_DIR下生成对应的.lst和.d文件,无需手动遍历或逐个配置源文件属性。
内容的提问来源于stack exchange,提问作者N. I.
相关产品推荐
相关产品推荐

