Recursion PC Lint需要一个所有包含路径的列表,以便扫描文件。如何获得CMake中目标递归需要的所有包含路径的列表?
我在一个项目中,CMake用于管理构建过程。在项目中,有几个依赖于组件的可执行文件,这些组件构建为静态库。这些组件之间也存在依赖关系。对于每个可执行文件或组件,只指定它们自己的本地包含,并使用Recursion PC Lint需要一个所有包含路径的列表,以便扫描文件。如何获得CMake中目标递归需要的所有包含路径的列表?,recursion,cmake,include,pc-lint,Recursion,Cmake,Include,Pc Lint,我在一个项目中,CMake用于管理构建过程。在项目中,有几个依赖于组件的可执行文件,这些组件构建为静态库。这些组件之间也存在依赖关系。对于每个可执行文件或组件,只指定它们自己的本地包含,并使用target\u link\u库()解析依赖项中的包含 到目前为止还不错。问题在于PC线头何时应集成到环境中。对于每个组件,我们都设置了一个PC Lint目标,它对该组件的头文件/源文件运行静态代码分析。问题在于PC Lint需要一个文件作为输入,该文件应包含所分析文件所需的所有包含路径。由于该组件依赖于其
target\u link\u库()
解析依赖项中的包含
到目前为止还不错。问题在于PC线头何时应集成到环境中。对于每个组件,我们都设置了一个PC Lint目标,它对该组件的头文件/源文件运行静态代码分析。问题在于PC Lint需要一个文件作为输入,该文件应包含所分析文件所需的所有包含路径。由于该组件依赖于其他组件,因此我们必须以某种方式递归检索所有包含路径,以获得所需的所有包含。我们希望使用与target_link_库用于解析PC Lint的include路径相同的机制。可能吗
因为我们有每个组件的依赖项列表,所以我们可以从这些依赖项中获取包含路径,并将它们包含在PC Lint文件中。但真正的问题是,当component1中的source_file1.cpp包含component2中的header_file2.h,而header_file2.h又包含Component3中的header_file3.h时。在该示例中,PC lint将抱怨头文件_file3.h,因为提供给PC lint的文件中不包括component3的包含路径,原因是component1中没有对component3的依赖关系(target_link_library()通常解决这些递归依赖关系)
从一开始,我们就认为创建一个包含项目中所有include路径的文件就可以了。这种情况下的问题是,有几个文件具有相同的名称(例如:main.h),PC Lint将选择错误的文件
CMake中是否有方法递归检索所有包含路径,或者递归检索所有依赖项?或者有人知道这个问题的另一种解决方案吗
谢谢大家! 这里是总体思路:
GET_DIRECTORY_PROPERTY(_inc_dirs INCLUDE_DIRECTORIES)
foreach(_one_inc_dir ${_inc_dirs})
list(APPEND PROJECT_INCLUDE_DIRS "-i\"${_one_inc_dir}\"")
endforeach(_one_inc_dir)
然后在PC Lint调用中使用PROJECT\u INCLUDE\u DIRS
在这里,您可以找到用于构建项目的方法。
只需在CMakeLists.txt中添加以下行
find_package(Lint)
... define your targets
add_pc_lint( target_name ${variable with list of your source files to check} )
以下是总体思路:
GET_DIRECTORY_PROPERTY(_inc_dirs INCLUDE_DIRECTORIES)
foreach(_one_inc_dir ${_inc_dirs})
list(APPEND PROJECT_INCLUDE_DIRS "-i\"${_one_inc_dir}\"")
endforeach(_one_inc_dir)
然后在PC Lint调用中使用PROJECT\u INCLUDE\u DIRS
在这里,您可以找到用于构建项目的方法。
只需在CMakeLists.txt中添加以下行
find_package(Lint)
... define your targets
add_pc_lint( target_name ${variable with list of your source files to check} )
我自己找到了解决这个问题的办法。使用“NMake Makefiles”作为生成器时,在CMake生成的文件中,每个目标都有一个名为“DependInfo.CMake”的文件。对于每个目标,该文件位于CMakeFiles/.dir/DependInfo.cmake中。在该文件中有一个名为“CMAKE_CXX_TARGET_INCLUDE_PATH”的变量,该变量包含目标所需的所有INCLUDE路径。我最后做的是一个powershell脚本解析该文件,然后在该变量中选择这些路径,并以PC Lint想要的格式输出到一个文件中 Powershell脚本:
$projectRoot = $args[0]
$dependInfoFile = $args[1]
$output = $args[2]
if (Test-Path $dependInfoFile)
{
$lines = Get-Content $dependInfoFile
Remove-Item $output -Force -ErrorAction SilentlyContinue
foreach ($line in $lines)
{
if ($line -eq "set(CMAKE_CXX_TARGET_INCLUDE_PATH")
{
$printToFile = $TRUE
}
elseif ($printToFile -and ($line -eq " )"))
{
$printToFile = $FALSE
break
}
elseif ($printToFile)
{
$line = $line.trim()
$line = $line.Substring(1,$line.length-2)
while ($line.Substring(0,3) -eq "../")
{
$line = $line.SubString(3)
}
$outLine = "-i`"$projectRoot`/$line`""
Add-Content $output $outLine
}
}
}
对于PC lint,我添加了一个自定义的_目标,它使用正确的DependInfo.cmake文件和输出文件名运行这个powershell脚本。此自定义_目标作为一个依赖项添加到普通lint目标,这导致在lint之前生成输出文件。(请注意,可能需要更改某些路径)
FindLint.cmake(由cmake提供,但已修改)
我自己找到了解决这个问题的办法。使用“NMake Makefiles”作为生成器时,在CMake生成的文件中,每个目标都有一个名为“DependInfo.CMake”的文件。对于每个目标,该文件位于CMakeFiles/.dir/DependInfo.cmake中。在该文件中有一个名为“CMAKE_CXX_TARGET_INCLUDE_PATH”的变量,该变量包含目标所需的所有INCLUDE路径。我最后做的是一个powershell脚本解析该文件,然后在该变量中选择这些路径,并以PC Lint想要的格式输出到一个文件中 Powershell脚本:
$projectRoot = $args[0]
$dependInfoFile = $args[1]
$output = $args[2]
if (Test-Path $dependInfoFile)
{
$lines = Get-Content $dependInfoFile
Remove-Item $output -Force -ErrorAction SilentlyContinue
foreach ($line in $lines)
{
if ($line -eq "set(CMAKE_CXX_TARGET_INCLUDE_PATH")
{
$printToFile = $TRUE
}
elseif ($printToFile -and ($line -eq " )"))
{
$printToFile = $FALSE
break
}
elseif ($printToFile)
{
$line = $line.trim()
$line = $line.Substring(1,$line.length-2)
while ($line.Substring(0,3) -eq "../")
{
$line = $line.SubString(3)
}
$outLine = "-i`"$projectRoot`/$line`""
Add-Content $output $outLine
}
}
}
对于PC lint,我添加了一个自定义的_目标,它使用正确的DependInfo.cmake文件和输出文件名运行这个powershell脚本。此自定义_目标作为一个依赖项添加到普通lint目标,这导致在lint之前生成输出文件。(请注意,可能需要更改某些路径)
FindLint.cmake(由cmake提供,但已修改)
相关:。问题帖子说,可以从目标的
include\u目录
属性中读取包含目录的完整列表。询问您的编译器!有关更多详细信息,请参阅谢谢您的回答。但无法使其中任何一个正常工作。相关:。问题帖子说,可以从目标的include\u目录
属性中读取包含目录的完整列表。询问您的编译器!有关更多详细信息,请参阅谢谢您的回答。但是这些都无法正常工作。此处的FindLint.cmake
文件与更基于目标的现代cmake不兼容。有关如何修改add_pc_lint
函数以与现代CMake目标配合使用的信息,请参阅响应。此处的FindLint.CMake
文件无法与现代CMake配合使用,因为现代CMake更以目标为基础。有关如何修改add_pc_lint
功能以使用现代CMake目标的信息,请参阅响应。