在 compile_commands.json 中使用 CMake find_package 时使用 -I 而不是 -isystem
Use -I instead of -isystem when using CMake find_package in compile_commands.json
我的问题基本上是这个 SO 问题的反面 - Use -isystem instead of -I with CMake
我有一个正在测试的库,测试应用程序通过 CMake 的 find_package
引入该库
# CMakeLists.txt
...
find_package(as REQUIRED)
add_executable(as-tests tests.cpp ...)
target_link_libraries(as-tests as::as)
...
一切正常,但问题是 CMake 似乎将 -isystem
添加到以这种方式引入的所有包含路径,而不是 target_include_directories
。这是我在生成 compile_commands.json
文件时看到的内容。
# compile_commands.json
...
{
"directory": ...
"command": ... -isystem <full/path/to/as/include/>" ...
"file": ...
},
...
我想知道是否可以传递一个标志或设置为 find_package
让 CMake 知道这不是一个 system
库而是一个 local
库(特别是如果我'已经使用 CMAKE_INSTALL_PREFIX
和后来的 CMAKE_PREFIX_PATH
.
将其安装到不是默认安装位置的某个位置
这让我痛苦的原因是我想使用 cppcheck
来分析这些文件,但它(明智地)忽略了它认为是 system
的所有文件。
$ cppcheck --project=compile_commands.json --language=c++ --std=c++17 --enable=all
# will not analyse any includes with -isystem prefix
所以总而言之,我可以做类似 find_package(as REQUIRED NOT_SYSTEM)
的事情来让正常的 -I
出现在 compile_commands.json
中吗?
谢谢! :)
更新:
@mathstuf 100% 正确(谢谢你的回答!)我想稍微扩展一下,因为目前的情况并不完全是我想要的...
可以在您正在构建的目标上设置 NO_SYSTEM_FROM_IMPORTED
,但不能在导入的目标上设置..
例如你可以这样做:
project(app LANGUAGES CXX)
add_executable(
${PROJECT_NAME} main.cpp)
set_target_properties(
${PROJECT_NAME} PROPERTIES
NO_SYSTEM_FROM_IMPORTED true)
但是你不能这样做:
find_package(lib REQUIRED)
set_target_properties(
lib::lib PROPERTIES
NO_SYSTEM_FROM_IMPORTED true)
没关系,但这意味着如果您有多个导入的目标,您不能选择一个特定的库作为 -I
而另一个保持 -isystem
(-isystem
是所有导入目标的默认值)。
您可以在此处查看更多相关信息 https://gitlab.kitware.com/cmake/cmake/issues/17348 and here https://gitlab.kitware.com/cmake/cmake/issues/17364
我想我现在只能忍受一切 -I
您可以在消费目标上设置目标 属性 NO_SYSTEM_FROM_IMPORTED
以消除该行为。
我的问题基本上是这个 SO 问题的反面 - Use -isystem instead of -I with CMake
我有一个正在测试的库,测试应用程序通过 CMake 的 find_package
# CMakeLists.txt
...
find_package(as REQUIRED)
add_executable(as-tests tests.cpp ...)
target_link_libraries(as-tests as::as)
...
一切正常,但问题是 CMake 似乎将 -isystem
添加到以这种方式引入的所有包含路径,而不是 target_include_directories
。这是我在生成 compile_commands.json
文件时看到的内容。
# compile_commands.json
...
{
"directory": ...
"command": ... -isystem <full/path/to/as/include/>" ...
"file": ...
},
...
我想知道是否可以传递一个标志或设置为 find_package
让 CMake 知道这不是一个 system
库而是一个 local
库(特别是如果我'已经使用 CMAKE_INSTALL_PREFIX
和后来的 CMAKE_PREFIX_PATH
.
这让我痛苦的原因是我想使用 cppcheck
来分析这些文件,但它(明智地)忽略了它认为是 system
的所有文件。
$ cppcheck --project=compile_commands.json --language=c++ --std=c++17 --enable=all
# will not analyse any includes with -isystem prefix
所以总而言之,我可以做类似 find_package(as REQUIRED NOT_SYSTEM)
的事情来让正常的 -I
出现在 compile_commands.json
中吗?
谢谢! :)
更新:
@mathstuf 100% 正确(谢谢你的回答!)我想稍微扩展一下,因为目前的情况并不完全是我想要的...
可以在您正在构建的目标上设置 NO_SYSTEM_FROM_IMPORTED
,但不能在导入的目标上设置..
例如你可以这样做:
project(app LANGUAGES CXX)
add_executable(
${PROJECT_NAME} main.cpp)
set_target_properties(
${PROJECT_NAME} PROPERTIES
NO_SYSTEM_FROM_IMPORTED true)
但是你不能这样做:
find_package(lib REQUIRED)
set_target_properties(
lib::lib PROPERTIES
NO_SYSTEM_FROM_IMPORTED true)
没关系,但这意味着如果您有多个导入的目标,您不能选择一个特定的库作为 -I
而另一个保持 -isystem
(-isystem
是所有导入目标的默认值)。
您可以在此处查看更多相关信息 https://gitlab.kitware.com/cmake/cmake/issues/17348 and here https://gitlab.kitware.com/cmake/cmake/issues/17364
我想我现在只能忍受一切 -I
您可以在消费目标上设置目标 属性 NO_SYSTEM_FROM_IMPORTED
以消除该行为。