如何让cmake解包我的编译器

如何让cmake解包我的编译器,cmake,Cmake,为了确保我的Linux构建是相同的,而不管构建主机使用的是哪个发行版,我已经将我的编译器和sysroot文件打包到一个可重新定位的tar文件中,并将其检查到源代码管理中 因此,任何构建的第一步(或者至少是在任何编译步骤之前必须调用的步骤)必须是提取这个tar文件 如果我使用的是makefile,这将很简单。然而,这个项目使用的是cmake,我想不出用cmake做什么。甚至可能我需要在cmake开始检测编译器之前调用这个提取步骤:我可以硬编码编译器名称,但是如果cmake失败,如果它找不到编译器,

为了确保我的Linux构建是相同的,而不管构建主机使用的是哪个发行版,我已经将我的编译器和sysroot文件打包到一个可重新定位的tar文件中,并将其检查到源代码管理中

因此,任何构建的第一步(或者至少是在任何编译步骤之前必须调用的步骤)必须是提取这个tar文件

如果我使用的是makefile,这将很简单。然而,这个项目使用的是cmake,我想不出用cmake做什么。甚至可能我需要在cmake开始检测编译器之前调用这个提取步骤:我可以硬编码编译器名称,但是如果cmake失败,如果它找不到编译器,那么我需要在测试之前进行解包

这在cmake中可能吗?

您可以使用调用cmake的跨平台命令模式()。该命令类似于:

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

导致CMake检查有效编译器的命令是,只要在
项目
调用之前有
execute\u进程
调用,解包将在编译器检查之前完成。

为什么有人想从未知源安装编译器?这似乎是一个重大的安全问题。在CMakelist.txt中正确指定编译器版本/库版本,如果安装了错误的版本,则会引发错误。我不理解您的评论。编译器并非来自未知的源代码:我自己从源代码构建它们。我不想强迫每个人都使用相同的发行版和发行版版本,让每个开发系统在每次更改产品编译器时都能同步升级,并且在这之前从不升级任何东西,等等。相反,我捆绑了一个已知的编译器+库+头,并始终使用该编译器进行构建。这将从承载构建的系统中删除所有构建的版本依赖关系。谢谢,这非常有用。不幸的是,我们为多个系统(包括Windows、OSX、Solaris以及Linux)构建,并且并非所有这些系统都支持捆绑编译器(但…?),因此我只需要在某些系统上解包。然而,似乎在项目调用之后才定义标准变量,如CMAKE_HOST_SYSTEM和CMAKE_SYSTEM_NAME。。。第二十二条军规:-(我认为在调用
项目
之前,
WIN32
UNIX
APPLE
变量可能是可用的,但这对您来说可能不够精细。因此,是的,在这方面,catch 22。但是,您始终可以添加类似
execute\u进程(COMMAND${CMAKE\u COMMAND}-E环境输出(变量ThisEnv)
项目之前
将当前环境捕获到变量
ThisEnv
中,然后使用进行评估。谢谢Fraser。看起来我需要做一些棘手的事情。我听说了cmake非常好的事情,它似乎能够完美地为其各种目标生成输出,这很好。但我很惊讶(有点沮丧)它在某些方面是多么的不灵活和有限,特别是在处理更高级的环境,如交叉编译等。感谢您的回复!