【发布时间】:2016-04-26 15:38:50
【问题描述】:
我正在构建一个使用 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 时按照 this question 中的相同方法设置编译器,但 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 的调用(而不是在 makefile 中定义一个 CC 变量)。我宁愿有办法让 cmake 直接从偏移量使用所需的编译器。
【问题讨论】:
-
据我所知,CMake 总是倾向于生成带有程序绝对路径的 makefile。至于您的情况,您可以创建 wrapper 脚本,并告诉 CMake 将其用作编译器。在脚本中,您可以使用编译器的相对路径(由
PATH变量调度),或使用其他机制来选择实际的编译器。
标签: c++ cmake nmake fortify cl