2012-03-03 86 views
18

看起来CMake在其认为应该只有一个且只有一个CMAKE_CXX_COMPILER适用于所有C++源文件的情况下是相当根深蒂固的。我无法找到一种方法来覆盖每个目标的基础上。这使得内置CMake工具在单个CMakeLists.txt中进行主机和交叉编译非常困难。在同一种语言中使用CMake和多个编译器

所以,我的问题是:对同一种语言(即C++)使用多个编译器的最佳方式是什么?

回答

12

用CMake做到这一点是不可能的。

CMake只保留一组由CMakeLists.txt文件中的所有目标共享的编译器属性。如果你想使用两个编译器,你需要运行CMake两次。甚至对于例如从相同的编译器工具链构建32位和64位二进制文​​件。

这种快速而肮脏的方法是使用自定义命令。但是,最后你会得到什么基本上是美化的shell脚本,这可能不是你想要的。

干净的解决方案是:不要把它们放在同一个CMakeLists.txt中!无论如何,你不能在不同的体系结构之间进行链接,所以不需要它们在同一个文件中。您可以通过将CMake脚本的公共部分重构为单独的文件和include()来减少冗余。

这里的主要缺点是你失去了使用单一命令构建的能力,但是你可以通过编写一个你最喜欢的脚本语言的封装器来解决这个问题,这个脚本语言负责调用不同的CMake-makefiles。

+2

看起来像add_directory(other_build_kind_folder)也是一种可能性,而不是制作自定义包装,因为这就是我一直在做的事情,它似乎工作。 :-) – cdleary 2012-03-04 17:51:59

+2

@caryary你能否澄清这是如何工作的? 'add_subdirectory'(或者你真的指'add_directory'?)如何让你切换工具链? – 2015-04-27 21:56:21

+1

哇,这真的是一些非常糟糕的设计...... – 2016-06-29 16:32:42

0

为了延长@Bill霍夫曼的回答是: 生成项目作为超的身材,通过使用某种模板喜欢这里的一个https://github.com/Sarcasm/cmake-superbuild 将配置作为ExternalProject(独立cmake配置/构建/安装环境)的依赖项和项目。