我CMakeLists.txt
在我的项目的根目录中有一个CMAKE_EXPORT_COMPILE_COMMANDS
打开的。
我正在文件夹中构建目标并通过add_subdirectory
. 该文件夹有自己的CMakeLists.txt
文件。
compile_commands.json
建在二进制目录的根目录下,我想在运行cmake命令后将其复制到源目录的根目录。
我尝试了两种方法。
add_custom_target
和add_custom_command
。我创建了一个虚拟目标。我使用这个目标add_custom_command
来复制文件,但它不会在add_custom_command
.
file(COPY ...)
第一次触发命令时,compile_commands.json
不是通过 cmake 创建的。我不想两次运行 cmake 命令来复制compile_commands.json
到源文件夹的根目录。
CMAKE_MINIMUM_REQUIRED(VERSION 3.8)
project(exec LANGUAGES CXX)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
add_subdirectory("DirectoyWithTarget")
add_custom_target(copy_compile_commands
DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/compile_commands.json)
add_custom_command(
TARGET copy_compile_commands
PRE_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
${CMAKE_CURRENT_BINARY_DIR}/compile_commands.json
${CMAKE_CURRENT_SOURCE_DIR}/compile_commands.json
)
Run Code Online (Sandbox Code Playgroud)
该compile_commands.json
文件不会复制到${CMAKE_CURRENT_SOURCE_DIR}
. 这意味着add_custom_command
未触发。
如果您使用vscode和vscode-cmake-tools ,则可以使用cmake.copyCompileCommands。
例子:
"cmake.copyCompileCommands": "${workspaceFolder}/compile_commands.json"
Run Code Online (Sandbox Code Playgroud)
还没有测试过这么多,但这里有两个我想出的基于 cmake 的解决方案。
代码较少,但始终运行。
add_custom_target(
copy-compile-commands ALL
${CMAKE_COMMAND} -E copy_if_different
${CMAKE_BINARY_DIR}/compile_commands.json
${CMAKE_CURRENT_LIST_DIR}
)
Run Code Online (Sandbox Code Playgroud)
更多代码,但设置了依赖关系,因此除非需要,否则不会运行。可以处理删除二进制目录中的compile_commands.json的情况。
# Copy to source directory
add_custom_target(
copy-compile-commands ALL
DEPENDS
${CMAKE_CURRENT_LIST_DIR}/compile_commands.json
)
add_custom_command(
OUTPUT ${CMAKE_CURRENT_LIST_DIR}/compile_commands.json
COMMAND ${CMAKE_COMMAND} -E copy_if_different
${CMAKE_BINARY_DIR}/compile_commands.json
${CMAKE_CURRENT_LIST_DIR}/compile_commands.json
DEPENDS
# Unlike "proper" targets like executables and libraries,
# custom command / target pairs will not set up source
# file dependencies, so we need to list file explicitly here
generate-compile-commands
${CMAKE_BINARY_DIR}/compile_commands.json
)
# Generate the compilation commands. Necessary so cmake knows where it came
# from and if for some reason you delete it.
add_custom_target(generate-compile-commands
DEPENDS
${CMAKE_BINARY_DIR}/compile_commands.json
)
add_custom_command(
OUTPUT ${CMAKE_BINARY_DIR}/compile_commands.json
COMMAND ${CMAKE_COMMAND} -B${CMAKE_BINARY_DIR} -S${CMAKE_SOURCE_DIR}
)
Run Code Online (Sandbox Code Playgroud)