在compile_commands.json中使用CMake find_package时,请使用-I而不是-isystem

时间:2019-08-03 10:22:42

标签: cmake cppcheck

我的问题基本上是该问题的反义词-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,但不能在导入的目标上设置。{p>

例如您可以这样做:

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/17348https://gitlab.kitware.com/cmake/cmake/issues/17364此处查看有关此内容的更多信息

我想我现在只需要生活在-I

1 个答案:

答案 0 :(得分:2)

您可以在使用方目标上设置目标属性NO_SYSTEM_FROM_IMPORTED来删除该行为。