Eam*_*nne 8 build-process cmake
我正忙着将我的构建过程从msbuild移植到cmake,以便能够更好地处理gcc工具链(它为我正在做的一些数字生成更快的代码).
现在,我想让cmake生成几个版本的输出,比如一个版本的sse2,另一个版本的x64,等等.但是,如果您只是拥有一堆标志(例如,"sse2_enable"和"platform"),然后根据这些平台生成一个输出,则cmake似乎最自然地工作.
使用这样的多种输出配置的最佳方法是什么?直观地说,我想迭代大量的标志组合并为每个组合重新运行相同的CMakeLists.txt文件 - 当然,你不能在 CMakeLists.txt文件(AFAIK)中表达它.
建议的方法是只使用多个构建目录.您只需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
Run Code Online (Sandbox Code Playgroud)
这样,每个构建目录都完全相互分离.
这允许您有一个用于Debug的目录,另一个用于Release,另一个用于交叉编译.
这里没有太多活动,所以我自己想出了一个可行的解决方案。可能不太理想,如果您有更好的想法,请补充!
现在,很难在 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")
Run Code Online (Sandbox Code Playgroud)
然后,正常的项目目录包含一个CMakeLists.txt文件,其中包含用于在给定项目中设置的全局变量的情况下设置适当的包含和编译器选项的代码FooAllConfigs,并且它还确定附加到所有构建输出的构建后缀 - 任何甚至间接包含的输出(例如由add_executable) 生成的必须具有唯一的名称。
这对我来说效果很好。
| 归档时间: |
|
| 查看次数: |
3525 次 |
| 最近记录: |