我正在构建一个使用CMake的开源项目(kst,v2.0.8)。我使用CMake v2.8.12.2和MSVC 2008作为编译器,并生成NMake makefile以在命令行上构建它。我可以使用此设置成功构建它。这些版本是强制性的,因此我目前无法使用更高版本的CMake或MSVC。
我需要能够使用HP的Fortify执行kst的源代码分析,并且能够从命令行使用它以两种方式之一工作:
无触摸模式,它创建自己的&#34; cl.exe&#34;,在实际cl.exe的路径之前设置它的路径,因此在构建期间启动。< / p>
将makefile中的编译器设置为Fortify命令行,例如: sourceanalyzer -b build_id cl
代替cl
。
无论哪种方式,我都需要强制cmake生成到其makefile中的编译器成为cmake不会自动检测的东西。
我在this question中按照相同的方法运行cmake时尝试设置编译器,但是cmake仍然坚持在makefile中放置MSVC cl.exe的完整路径。
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,这将是乏味的(而不是在makefile中定义CC变量。我宁愿让cmake从偏移量中使用所需的编译器。
答案 0 :(得分:3)
更新:测试显示原始建议的方法在至少某些平台上无法正常工作。似乎使用包装器脚本可能是要走的路。
如果你真的想强制使用特定的编译器并绕过CMake的编译器检查,那么CMakeForceCompiler
module可能正是你要找的。这个指向CMake文档的链接包含一个简单的工具链文件示例,该示例演示如何使用作为没有路径的简单命令调用的特定编译器。 不幸的是,CMake仍然会将其转换为绝对路径,因此就其本身而言,这无法解决您的问题。但是,您可以使用工具链文件指向包装器脚本并使用CMakeForceCompiler
来绕过编译器检查。此组合应该产生您要求的行为,但请注意CMakeForceCompiler
现已弃用。
请注意,在使用CMakeForceCompiler
模块时,您需要承担更多责任来告知CMake信息,特别是您要强制使用的特定编译器的编译器ID,但是来自CMake docs它似乎非常清楚,在你的情况下这只是MSVC
。
要使用工具链文件,请使用指向您自己的自定义工具链文件的-DCMAKE_TOOLCHAIN_FILE=path/to/file
选项调用CMake。 CMake文档有specific section涵盖了工具链的使用,尽管它确实掩盖了一些重要的细节。
正如@Tsyvarev的评论中所提到的,使用包装器脚本可能是处理此问题的最佳方式。该包装脚本只需要将调用转发到通常的编译器命令而不指定路径。然后,您负责确保在执行构建时命令将在PATH上。以下简单的内容应该足以作为Windows上的包装批处理文件(未经测试):
cl %*
现在,您可以控制Visual Studio编译器或Fortify是否纯粹由构建所见的PATH调用。就个人而言,我认为这有点脆弱,但这就是你所要求的。 ;)
作为一种更强大的替代方案,是否可以使用两个完全独立的构建?如果是这样,那么我建议作为一个更好的选择。使用默认的Visual Studio编译器正常构建一个,对于其他构建,使用工具链文件指向Fortify编译器以使CMake绕过其编译器检查。这样,您就不会依赖于以特定方式设置的构建环境。