Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Recursion PC Lint需要一个所有包含路径的列表,以便扫描文件。如何获得CMake中目标递归需要的所有包含路径的列表?_Recursion_Cmake_Include_Pc Lint - Fatal编程技术网

Recursion PC Lint需要一个所有包含路径的列表,以便扫描文件。如何获得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需要一个文件作为输入,该文件应包含所分析文件所需的所有包含路径。由于该组件依赖于其

我在一个项目中,CMake用于管理构建过程。在项目中,有几个依赖于组件的可执行文件,这些组件构建为静态库。这些组件之间也存在依赖关系。对于每个可执行文件或组件,只指定它们自己的本地包含,并使用
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目标的信息,请参阅响应。