如何强制使用cl.exe而不是完整路径的cmake?

3
我正在构建一个使用CMake的开源项目(kst,v2.0.8),我正在使用CMake v2.8.12.2和MSVC 2008作为编译器,并生成NMake makefiles以在命令行上构建它。我可以成功地使用这个设置来构建它。目前我不能使用更高版本的CMake或MSVC,因为这些版本是强制要求的。
我需要能够使用HP的Fortify对kst进行源代码分析,并且能够从命令行中使用它,它有两种工作方式:
1.无触摸模式,在此模式下,它会创建自己的"cl.exe",在真正的cl.exe路径之前设置路径,因此在构建期间启动。
2.将编译器设置在makefile中为Fortify命令行,例如sourceanalyzer -b build_id cl而不是cl
无论哪种方式,我都需要强制CMake生成的编译器进入其makefile中,使其成为CMake无法自动检测到的内容。
我尝试了在运行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使用所需的编译器。


1
据我所知,CMake通常倾向于生成带有程序绝对路径的makefile。至于您的情况,您可以创建包装器脚本,并告诉CMake将其用作编译器。在脚本内部,您可以使用相对路径来调用编译器(通过PATH变量分发),或使用其他机制来选择实际的编译器。 - Tsyvarev
1个回答

3

更新:测试表明,在一些平台上,原始建议的方法并没有按预期工作。看来使用包装器脚本可能是可行的方法。

如果您真的想强制使用特定的编译器并绕过CMake的编译器检查,则CMakeForceCompiler模块可能是您要寻找的。该链接到CMake文档包含一个简单的工具链文件示例,其中显示如何使用特定编译器调用为简单命令而无需路径。 不幸的是,CMake仍会将其转换为绝对路径,因此单独使用它无法解决您的问题。但是,您可以使用工具链文件指向包装器脚本,并使用CMakeForceCompiler绕过编译器检查。这种组合应该能够产生您要求的行为,但请注意,CMakeForceCompiler现已被弃用。

请注意,在使用CMakeForceCompiler模块时,您需要承担更多告诉CMake信息的责任,特别是要强制使用的特定编译器的编译器ID,但从CMake文档中可以看出,在您的情况下,这只会是MSVC

要使用工具链文件,请使用-DCMAKE_TOOLCHAIN_FILE=path/to/file选项调用CMake,指向自己的自定义工具链文件。 CMake文档有一个特定部分介绍了工具链的使用,但它忽略了一些重要的细节。

正如@Tsyvarev的评论中提到的,使用包装器脚本可能是处理这种情况的最佳方法。该包装器脚本只需要将调用转发到通常的编译器命令,而无需指定路径。然后,您需要确保在构建时该命令在您的PATH上。对于Windows上的批处理包装器文件,以下内容应该足够简单(未经测试):

cl %*

现在,你可以仅通过构建所见的PATH来控制Visual Studio编译器或Fortify的调用。个人认为这有点脆弱,但这正是您所要求的。;)
作为更稳健的替代方案,是否可能使用两个完全独立的构建?如果可以的话,那么我建议将其作为更好的替代方案。通过默认的Visual Studio编译器正常构建一个,对于另一个构建,则使用工具链文件指向Fortify编译器,以使CMake绕过其编译器检查。这样,您不会依赖于特定方式设置构建环境。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接