cmake:使用多种输出配置

时间:2010-02-19 15:44:38

标签: build-process cmake

我正忙着将我的构建过程从msbuild移植到cmake,以便能够更好地处理gcc工具链(它为我正在做的一些数字生成更快的代码)。

现在,我想让cmake生成几个版本的输出,例如一个版本的sse2,另一个版本的x64,等等。但是,如果你只是拥有一堆标志(例如“sse2_enable”和“platform”),然后根据这些平台生成一个输出,cmake似乎最自然地工作。

使用这样的多种输出配置的最佳方法是什么?直观地说,我想迭代大量的标志组合并为每个组合重新运行相同的CMakeLists.txt文件 - 当然,你不能在 CMakeLists.txt文件中表达 (AFAIK)。

2 个答案:

答案 0 :(得分:6)

建议的方法是简单地拥有多个构建目录。您只需使用所需设置调用cmake即可。

例如,您可以从基本源目录开始(使用Linux shell语法,但想法是相同的):

mkdir build-sse2 && cd build-sse2
cmake .. -DENABLE_SSE2 # or whatever to enable it in your CMakeLists.txt
make

cd ..

mkdir build-x64 && cd build-x64
cmake .. -DENABLE_X64 # or whatever again...
make

这样,每个构建目录都完全相互分离。

这允许您有一个用于Debug的目录,另一个用于Release,另一个用于交叉编译。

答案 1 :(得分:4)

这里活动不多,所以我自己想出了一个可行的解决方案。这可能不太理想,所以如果你有更好的想法,请添加它!

现在,很难在cmake中迭代构建配置,因为cmake的关键变量不在函数范围内 - 例如,这意味着如果你执行include_directories(X) X目录将保留在包含列表中即使在函数退出后也是如此。

目录确实有范围 - 虽然通常每个输入目录对应一个输出目录,但可以有多个输出目录。

所以,我的解决方案看起来像这样:

project(FooAllConfigs)

set(FooVar 2)
set(FooAnotherVar b)
add_subdirectory("project_dir" "out-2b")
set(FooVar 5)
set(FooAnotherVar c)
add_subdirectory("project_dir" "out-5c")
set(FooVar 3)
set(FooAnotherVar b)
add_subdirectory("project_dir" "out-3b")
set(FooVar 3)
set(FooAnotherVar c)
add_subdirectory("project_dir" "out-3c")

然后,正常的项目目录包含一个CMakeLists.txt文件,其中包含代码,用于在FooAllConfigs项目中设置全局变量的情况下设置相应的包含和编译器选项,并且还确定附加的构建后缀对所有构建输出 - 任何甚至间接包含的输出(例如由add_executable生成)必须具有唯一的名称。

这对我来说很好。