如何让cmake解压我的编译器

6
为了确保我的Linux构建在使用不同发行版的构建主机时都是相同的,我将编译器和sysroot文件打包成可移植的tar文件并将其检入源代码控制。因此,在任何构建中(或者至少在任何编译步骤之前必须执行的步骤)都必须提取此tar文件。如果我使用makefile,这将很容易实现。但是,该项目正在使用cmake,我无法找到任何用cmake实现此操作的方法。甚至可能需要在cmake开始检测编译器之前调用此提取步骤:我可以硬编码编译器名称,但是如果cmake无法找到编译器,则需要在测试之前进行解压缩。请问,使用cmake是否可行?

为什么有理智的人会想要从未知来源安装编译器?这似乎是一个重大的安全问题。在你的CMakelist.txt中正确指定编译器版本/库版本,并在安装错误版本时抛出错误。 - Bort
我不理解你的评论。编译器并非来自未知来源:它们是我从源代码构建的。我不想强制每个人使用相同的发行版和发行版版本,每次我们更改产品编译器时都要让每个开发系统同步升级,直到这种情况发生之前都不升级任何东西等等。相反,我捆绑了一个已知的编译器+库+头文件,并始终使用该编译器进行构建。这消除了我的构建与托管构建的系统的任何版本依赖关系。 - MadScientist
1个回答

10

您可以使用execute_process来调用cmake的跨平台命令模式(cmake -E tar)。命令应该类似于:

execute_process(COMMAND ${CMAKE_COMMAND} -E tar xvf MyCompiler.bz2)

检查有效编译器的CMake命令是project,只要在project调用之前使用execute_process调用,就可以在编译器检查之前完成解压缩。


谢谢,非常有帮助。不幸的是,我们要为多个系统构建,包括Windows、OSX、Solaris以及Linux,并不是所有这些系统都支持捆绑编译器(但是...?)所以我需要仅在某些系统上解压缩。然而,似乎标准变量如CMAKE_HOST_SYSTEM和CMAKE_SYSTEM_NAME直到项目调用之后才被定义......陷入困境了? :-( - MadScientist
我认为在project调用之前,变量WIN32UNIXAPPLE可能是可用的,但这可能不够细致。所以,在这方面存在困境。然而,您可以在project之前添加类似于execute_process(COMMAND ${CMAKE_COMMAND} -E environment OUTPUT_VARIABLE ThisEnv)的内容,将当前环境捕获到变量ThisEnv中,然后使用string(REGEX MATCH ...)进行评估。 - Fraser
谢谢你,Fraser。看起来我得想些巧妙的方法了。我听说cmake非常好用,而且它似乎能够完美地为各种目标生成输出,这很棒。但是我对它在某些方面的不灵活和有限感到惊讶(也有点沮丧),特别是在处理更高级的环境,比如交叉编译等方面。感谢你在这里的回复! - MadScientist

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