首页 > 解决方案 > CMake 和 PC-Lint Plus - 如何将 CMake 的包含目录列表传递给 Lint?

问题描述

我正在尝试将 PC-Lint Plus 合并到我的 cmake 项目中,主要是每个PC-Lint 需要一个包含要扫描文件的所有包含路径的列表。如何获取 CMake 中目标递归所需的所有包含路径的列表?.

PC-Lint 正在被调用,但由于并非所有包含都在 PC-Lint 调用中而最终死亡。

我将上面的链接转储到 Lint.cmake 中,并将其包含在我的顶级 CMake 文件中。在我的项目文件中,我添加了:

if(COMMAND add_pc_lint)
add_pc_lint(moded ${SRC_FILES})
endif(COMMAND add_pc_lint)

所以我希望这些线路:

function(add_pc_lint target)
    get_directory_property(lint_include_directories INCLUDE_DIRECTORIES)
    # let's get those elephants across the alps
    # prepend each include directory with "-i"; also quotes the directory
    set(lint_include_directories_transformed)
    foreach(include_dir ${lint_include_directories})
        list(APPEND lint_include_directories_transformed -i"${include_dir}")
    endforeach(include_dir)

将包含目录列表拉出INCLUDE_DIRECTORIES.

如果我添加:

message(STATUS "********************************************")
message(STATUS "Include directories - ${lint_include_directories}")
message(STATUS "********************************************")
message(STATUS "********************************************")
message(STATUS "INCLUDE_DIRECTORIES - ${INCLUDE_DIRECTORIES}")
message(STATUS "********************************************")

在 foreach 循环的正上方,lint_include_directories两者INCLUDE_DIRECTORIES似乎都是空的。

我需要做什么才能从 CMake 获取包含目录的完整列表,包括 fromtarget_link_librariestarget_include_directories,以提供给 PC-Lint Plus?

标签: cmakelintpc-lint

解决方案


编辑:我已经更新了CMake PC-Lint 脚本,以解决我在此处的回复中描述的问题。


有关 PC-Lint 使用的文档似乎是针对旧 CMake 的,而不是基于目标的现代 CMake。该add_pc_lint函数从 CMake 目录属性中获取包含目录编译定义。如果您的项目有如下调用,这些目录属性将被填充:

  • include_directories()
  • add_definitions()

如果没有这些命令(在现代 CMake 中确实不应该使用),该add_pc_lint函数可能无法找到您期望的所有包含目录和编译定义。

在现代 CMake 中,当您使用以下命令时,包含目录编译定义被存储为目标的属性:

  • target_include_directories()
  • target_compile_definitions()

在这种情况下,您必须修改add_pc_lint函数以从目标而不是目录中获取属性。add_pc_lint因此,从这里更改函数的顶部:

function(add_pc_lint target)
    get_directory_property(lint_include_directories INCLUDE_DIRECTORIES)
    get_directory_property(lint_defines COMPILE_DEFINITIONS)

对此:

function(add_pc_lint target)
    get_target_property(lint_include_directories ${target} INCLUDE_DIRECTORIES)
    get_target_property(lint_defines ${target} COMPILE_DEFINITIONS)

推荐阅读