我正忙着将我的构建过程从msbuild移植到cmake,以便能够更好地处理gcc工具链(它为我正在做的一些数字生成更快的代码)。
现在,我想让cmake生成几个版本的输出,例如一个版本的sse2,另一个版本的x64,等等。但是,如果你只是拥有一堆标志(例如“sse2_enable”和“platform”),然后根据这些平台生成一个输出,cmake似乎最自然地工作。
使用这样的多种输出配置的最佳方法是什么?直观地说,我想迭代大量的标志组合并为每个组合重新运行相同的CMakeLists.txt文件 - 当然,你不能在 CMakeLists.txt文件中表达 (AFAIK)。
答案 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
生成)必须具有唯一的名称。
这对我来说很好。