代码之家  ›  专栏  ›  技术社区  ›  Eamon Nerbonne

CMAKE:使用多个输出配置

  •  8
  • Eamon Nerbonne  · 技术社区  · 15 年前

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

    现在,我希望cmake生成多个版本的输出,比如一个版本带有SSE2,另一个版本带有X64,等等。但是,如果您只是拥有一组标志(比如“SSE2_启用”和“平台”),然后基于这些平台生成一个输出,那么CMAKE似乎最自然地工作。

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

    2 回复  |  直到 15 年前
        1
  •  6
  •   Milliams    15 年前

    推荐的方法是简单地拥有多个构建目录。从每一个你简单的呼叫 cmake 使用所需设置。

    例如,可以从基本源目录开始(使用Linuxshell语法,但其思想相同):

    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
    

    通过这种方式,每个构建目录彼此完全分离。

    这允许您拥有一个用于调试的目录,另一个用于发布,另一个用于交叉编译。

        2
  •  4
  •   Eamon Nerbonne    15 年前

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

    现在,很难在cmake中迭代构建配置,因为cmake的关键变量不在函数范围内——例如,这意味着 include_directories(X) 即使函数退出,x目录也将保留在include列表中。

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

    所以,我的解决方案如下:

    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 文件,其中包含设置适当的include和compiler选项的代码,这些选项是在 FooAllConfigs 项目,它还确定附加到所有生成输出的生成后缀-任何甚至间接包含的输出(例如由 add_executable )必须具有唯一的名称。

    这对我来说很好。