代码之家  ›  专栏  ›  技术社区  ›  tinman

如何强制cmake在没有完整路径的情况下使用cl.exe?

  •  3
  • tinman  · 技术社区  · 10 年前

    我正在构建一个使用CMake的开源项目(kst,v2.0.8)。我使用CMake v2.8.12.2和MSVC 2008作为编译器,并生成NMake生成文件以在命令行上构建它。我可以用这个设置成功构建它。这些版本是强制性的,所以我目前不能使用CMake或MSVC的更高版本。

    我需要能够使用HP的Fortify执行kst的源代码分析,并且能够从命令行使用它,它以两种方式之一工作:

    1. 无接触模式,它创建自己的“cl.exe”,在真正的cl.exe路径之前设置其路径,因此在构建期间启动。

    2. 将makefile中的编译器设置为Fortify命令行,例如。 sourceanalyzer -b build_id cl 而不是 cl .

    无论哪种方式,我都需要强制cmake生成到makefiles中的编译器成为cmake无法自动检测到的编译器。

    我尝试过在运行cmake时按照中的相同方法设置编译器 this question 但cmake仍然坚持将MSVC cl.exe的完整路径放在makefiles中。

    cmake -DCMAKE_C_COMPILER=cl -DCMAKE_C_COMPILER_FORCED=ON -DCMAKE_CXX_COMPILER=cl -DCMAKE_CXX_COMPILER_FORCED=ON -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=%CFITSIO_DIR% -G"NMake Makefiles" ..\cfit3250
    

    我还尝试将编译器设置为调用Fortify,但当cmake测试编译器时,它失败了,表示找不到编译器。(我也尝试过不使用FORCED=ON参数的情况,在这种情况下,它会说编译器失败。)

    cmake -DCMAKE_C_COMPILER="sourceanalyzer -b %BUILDID% cl" -DCMAKE_C_COMPILER_FORCED=ON -DCMAKE_CXX_COMPILER="sourceanalyzer -b %BUILDID% cl" -DCMAKE_CXX_COMPILER_FORCED=ON -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=%CFITSIO_DIR% -G"NMake Makefiles" ..\cfit3250
    

    我可能可以搜索并替换makefiles中的所有编译器调用,但我必须记住在每次cmake之后都要这样做,而且如果看到有多个项目/makefiles/对cl的调用(而不是在makefile中定义CC变量),这会很乏味。我宁愿有一种方法让cmake从偏移量开始使用所需的编译器。

    1 回复  |  直到 9 年前
        1
  •  3
  •   Craig Scott    8 年前

    更新时间: 测试表明,最初建议的方法至少在某些平台上没有达到预期效果。使用包装脚本似乎是一种可行的方法。

    如果您确实想强制特定编译器并绕过CMake的编译器检查 CMakeForceCompiler module 可能就是你要找的。指向CMake文档的链接包含一个简单的工具链文件示例,该示例演示了如何使用作为没有路径的简单命令调用的特定编译器。 不幸的是,CMake仍然将其转换为绝对路径,因此仅凭其自身,这并不能解决您的问题 然而,您可以使用工具链文件指向包装脚本并使用 CMakeForce编译器 以绕过编译器检查。这种组合应该产生你所要求的行为,但请注意 CMakeForce编译器 现在已弃用。

    请注意,当使用 CMakeForce编译器 模块,您需要承担更多的责任来告知CMake信息,特别是您要强制使用的特定编译器的编译器ID CMake docs 很明显,这将是 MSVC 在你的情况下。

    要使用工具链文件,请使用 -DCMAKE_TOOLCHAIN_FILE=path/to/file 选项指向您自己的自定义工具链文件。CMake文档有一个 specific section 涵盖了工具链的使用,尽管它确实掩盖了一些重要的细节。

    正如@Tsyvarev的评论中提到的那样,使用包装脚本可能是处理此问题的最佳方法。包装器脚本只需要将调用转发到通常的编译器命令,而不需要指定路径。然后,您负责确保在进行构建时命令将位于您的PATH上。在Windows上,像以下这样简单的东西应该足以作为包装批处理文件(未经测试):

    cl %*
    

    现在,您可以控制VisualStudio编译器或Fortify是否完全由构建看到的PATH调用。就我个人而言,我认为这有点脆弱,但这正是你所要求的。;)

    作为一个更健壮的替代方案,是否可以使用两个完全独立的构建?如果是这样的话,那么我建议你把它作为一个更好的选择。使用默认的Visual Studio编译器正常构建一个,对于另一个构建,使用工具链文件指向Fortify编译器,以使CMake绕过其编译器检查。这样,您就不会依赖于构建环境的特定设置方式。