我正在构建一个使用 CMake 的开源项目(kst,v2.0.8)。我使用 CMake v2.8.12.2 和 MSVC 2008 作为编译器,并生成 NMake makefile 以在命令行上构建它。我可以通过此设置成功构建它。这些版本是强制性的,因此我目前无法使用更高版本的 CMake 或 MSVC。
我需要能够使用 HP 的 Fortify 对 kst 进行源代码分析,并能够从命令行使用它,它可以通过以下两种方式之一工作:
无接触模式,它创建自己的“cl.exe”,在真正的 cl.exe 路径之前设置它的路径,因此在构建期间启动。
将 makefile 中的编译器设置为 Fortify 命令行,例如sourceanalyzer -b build_id cl
代替cl
.
无论哪种方式,我都需要强制 cmake 生成到其 makefile 中的编译器是 cmake 不会自动检测到的东西。
我尝试在运行 cmake 时按照相同的方法设置编译器这个问题 https://stackoverflow.com/questions/23477379/how-does-cmake-find-cxx-compiler但cmake仍然坚持将MSVC cl.exe的完整路径放入makefile中。
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
我可能可以搜索并替换 makefile 中的所有编译器调用,但我必须记住在每次 cmake 之后执行此操作,并且由于存在多个项目/makefile/对 cl 的调用(而不是定义 CC makefile 中的变量)。我宁愿有一种方法让 cmake 从偏移量开始使用所需的编译器。
UPDATED:测试表明最初建议的方法至少在某些平台上无法按预期工作。看来使用包装脚本可能是可行的方法。
如果您确实想强制使用特定编译器并绕过 CMake 的编译器检查,则CMakeForceCompiler module https://cmake.org/cmake/help/latest/module/CMakeForceCompiler.html可能就是您正在寻找的。指向 CMake 文档的链接包含一个简单的工具链文件示例,该示例展示了如何使用作为没有路径的简单命令调用的特定编译器。不幸的是,CMake 仍然将其转换为绝对路径,因此它本身并不能解决您的问题。但是,您可以使用工具链文件指向包装器脚本并使用CMakeForceCompiler
绕过编译器检查。这种组合应该会产生您所要求的行为,但请注意CMakeForceCompiler
现已弃用。
请注意,使用时CMakeForceCompiler
模块中,您承担了更多的责任来告诉 CMake 信息,特别是您想要强制使用的特定编译器的编译器 ID,但是来自CMake 文档 https://cmake.org/cmake/help/latest/variable/CMAKE_LANG_COMPILER_ID.html看起来很清楚这只是MSVC
在你的情况下。
要使用工具链文件,请使用以下命令调用 CMake-DCMAKE_TOOLCHAIN_FILE=path/to/file
指向您自己的自定义工具链文件的选项。 CMake 文档有一个具体部分 https://cmake.org/cmake/help/latest/manual/cmake-toolchains.7.html涵盖了工具链的使用,尽管它确实掩盖了一些重要的细节。
正如@Tsyvarev 的评论中提到的,使用包装脚本可能是处理这个问题的最佳方法。该包装器脚本只需将调用转发到常用的编译器命令,而不指定路径。然后,您负责确保在进行构建时该命令位于您的 PATH 中。像下面这样简单的东西应该足以作为 Windows 上的包装批处理文件(未经测试):
cl %*
现在,您可以控制是否纯粹通过构建看到的 PATH 来调用 Visual Studio 编译器或 Fortify。就我个人而言,我认为这有点脆弱,但这正是您所要求的。 ;)
作为更强大的替代方案,是否可以使用两个完全独立的构建?如果是这样,那么我建议将其作为更好的选择。像平常一样使用默认的 Visual Studio 编译器构建一个,而对于另一个构建,使用工具链文件指向 Fortify 编译器以使 CMake 绕过其编译器检查。这样您就不会依赖于以特定方式设置的构建环境。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)