能否在不修改BINARY_DIR的情况下设置EXPORT_COMPILE_COMMANDS的输出目录?
问题描述
CMake会在构建目录(build/)中生成compile_commands.json文件,但我的YouCompleteMe(简称YCM)无法找到该文件。我需要将它移动到项目顶层目录,同时不想修改构建目录(BINARY_DIR)的位置,请问是否可以设置CMAKE_EXPORT_COMPILE_COMMANDS的输出目录?
项目结构
Project |- CMakeLists.txt |- compile_commands.json (期望位置) |- build (项目构建目录) |-- compile_commands.json (当前生成位置) |-- OtherCmakeGenerateStuff |- src |-- CMakeLists.txt |-- main.cc (包含项目外的库) |-lib |-- CMakeLists.txt |-- math |--- CMakeLists.txt |--- math.cc |--- math.hh |-include |-- globals.hh |-- definitions.hh
相关CMake文件内容
顶层CMakeLists.txt
cmake_minimum_require(VERSION 3.8) project(just_some_project LANGUAGES CXX VERSION 1.0) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) add_subdirectory(src) add_subdirectory(lib) include_directories(include)
src/CMakeLists.txt
cmake_minimum_require(VERSION 3.8) project(just_some_project LANGUAGES CXX VERSION 1.0) find_project(someotherlibrary REQUIRED) add_executable(main main.cc) target_include_directories(main PUBLIC math someotherlibraryfound)
lib/CMakeLists.txt
cmake_minimum_require(VERSION 3.8) file(GLOB Headers "*.hh") file(GLOB Sources "*.cc") add_library(math STATIC $Sources $Headers)
解决方案
CMake本身没有直接指定compile_commands.json输出目录的配置项,但可以通过添加自定义构建步骤,实现自动将文件复制到项目顶层,无需修改构建目录位置。
在顶层CMakeLists.txt中,替换原有的set(CMAKE_EXPORT_COMPILE_COMMANDS ON)部分,添加以下代码:
set(CMAKE_EXPORT_COMPILE_COMMANDS ON) # 自动同步compile_commands.json到项目顶层 if(CMAKE_EXPORT_COMPILE_COMMANDS) add_custom_target( copy_compile_commands ALL COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_BINARY_DIR}/compile_commands.json ${CMAKE_SOURCE_DIR}/compile_commands.json DEPENDS ${CMAKE_BINARY_DIR}/compile_commands.json ) endif()
关键说明
copy_if_different仅在文件内容发生变化时执行复制,避免无意义的重复操作ALL关键字让该目标随默认构建流程自动执行,每次构建都会同步最新的文件DEPENDS确保只有当构建目录中的compile_commands.json更新后,才触发复制动作
另外,建议修正现有CMake文件中的几个语法错误:
- 所有
cmake_minimum_require需改为cmake_minimum_required(缺少末尾的d) lib/CMakeLists.txt中的$Sources、$Headers要改为${Sources}、${Headers}src/CMakeLists.txt无需重复调用project,顶层已定义项目信息find_project是拼写错误,正确指令为find_package
内容的提问来源于stack exchange,提问作者Brothaman
相关产品推荐
相关产品推荐

