【问题标题】:cmake: Selecting a generator within CMakeLists.txtcmake:在 CMakeLists.txt 中选择生成器
【发布时间】:2012-07-01 11:02:36
【问题描述】:

我想强制 CMake 使用 CMakeLists.txt 中的“Unix Makefiles”生成器

这是我现在使用的命令。

cmake -G "Unix Makefiles" .

我希望是这样。

cmake .

在安装了 VC 和自定义工具链的 Windows 上运行时。

我希望能够在CMakeLists.txt 文件中设置生成器。

可能是这样的。

set(CMAKE_GENERATOR "Unix Makefiles")

【问题讨论】:

    标签: cmake


    【解决方案1】:

    这对我有用 - 在您的项目目录中创建一个名为 PreLoad.cmake 的文件,其中包含以下内容:

    set (CMAKE_GENERATOR "Unix Makefiles" CACHE INTERNAL "" FORCE)

    【讨论】:

    • 看起来Preload.cmake 的行为没有记录在“官方”cmake 文档中;见ticket 17231——但很高兴知道!
    • 2020 / cmake 3.17有没有更好的方法?这似乎与 -GNinja 的工作方式不同
    【解决方案2】:

    在我看来,如果在CMakeLists.txt 中设置变量CMAKE_GENERATOR,则设置得太晚了。如果你使用(即使在CMakeLists.txt的开头)

    set(CMAKE_GENERATOR "Ninja")
    message("generator is set to ${CMAKE_GENERATOR}")
    

    你可以在输出中看到类似

    % cmake ../source
    -- The C compiler identification is GNU 4.9.2
    ...
    -- Detecting CXX compile features - done
    generator is set to Ninja
    -- Configuring done
    -- Generating done
    -- Build files have been written to: /tmp/build
    

    所以变量只在生成过程的最后设置。如果你使用类似的东西

    set(CMAKE_GENERATOR "Ninja" CACHE INTERNAL "" FORCE)
    

    CMakeLists.txt 中,然后在cmake ../source(没有-G)的第一次运行中使用默认 生成器。不过,变量CMAKE_GENERATOR 存储在缓存中。所以如果你之后重新运行cmake ../source,它将使用缓存中CMAKE_GENERATOR变量中指定的生成器。

    不过,这肯定不是最优雅的解决方案;-) 也许使用一个批处理文件来为用户实际执行 cmake -G generator...

    【讨论】:

    • 我希望他们能让用户在CMakeLists.txt 中设置所有配置。如果你需要一个.bat ,那有什么意义呢?
    • 看起来 Ivan's answer 做了一些非常接近此的事情——该变量是在一个 cmake 配置文件中配置的,该文件是在实际的 CMakeLists.txt 加载之前获取的。
    【解决方案3】:

    这不是我得到的,当我运行相同的命令时,cmake 会寻找 gcc 编译器/make 实用程序。如果 PATH 设置不正确,它将失败,如下所示:

    D:\Development\build>cmake -G "Unix Makefiles" ..\source CMake 错误:CMake 无法找到与“Unix Makefiles”对应的构建程序。 CMAKE_MAKE_PROGRAM 未设置。 您可能需要选择不同的构建工具。 CMake 错误:错误需要内部 CMake 变量未设置,cmake 可能未正确构建。 缺少的变量是: CMAKE_C_COMPILER_ENV_VAR CMake 错误:错误需要内部 CMake 变量未设置,cmake 可能未正确构建。 缺少的变量是: CMAKE_C_COMPILER CMake 错误:找不到 cmake 模块文件:D:/Development/build/CMakeFiles/CMakeCCompiler.cmake CMake 错误:错误需要内部 CMake 变量未设置,cmake 可能未正确构建。 缺少的变量是: CMAKE_CXX_COMPILER_ENV_VAR CMake 错误:错误需要内部 CMake 变量未设置,cmake 可能未正确构建。 缺少的变量是: CMAKE_CXX_COMPILER CMake 错误:找不到 cmake 模块文件:D:/Development/build/CMakeFiles/CMakeCXXCompiler.cmake CMake 错误:在 EnableLanguage 之后未设置 CMAKE_C_COMPILER CMake 错误:在 EnableLanguage 之后未设置 CMAKE_CXX_COMPILER -- 配置不完整,出现错误!

    当 gcc / mingw 在路径中时,一切正常。那么您能否提供有关您的 PATH 变量或 CMAKE 版本的更多信息?

    【讨论】:

    • 因为我使用的是自定义工具链,并且安装了 VC++,所以我不能依赖 CMake 选择生成器。我也没有在命令行中指定一个,以便用户轻松克隆和构建项目。
    • 好的......对不起,我误解了你的问题。在这种情况下,我建议将 CMakeCache.txt 放入目录中,该目录大部分为空,但用于 CMAKE_GENERATOR 变量。或者,您可以在源存储库中拥有该缓存文件并使用 -C cmake 选项将其传递。
    【解决方案4】:

    您需要在 Generate 阶段设置生成器,以便将其写入缓存。 第一次配置只需要运行一次该命令

    cmake .. -DCMAKE_GENERATOR:INTERNAL=Ninja

    这会将 Ninja 配置为默认生成器。

    稍后你可以简单地运行

    cmake ..

    它会默认使用 Ninja 生成器

    您可以在Running CMake from the command line 下阅读更多相关信息

    从命令行运行 cmake 时,可以为 cmake 指定命令行选项,以在缓存中设置值。这是通过命令行上的 -DVARIABLE:TYPE=VALUE 语法完成的。这对于非交互式夜间测试构建很有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-15
      • 2018-09-20
      • 1970-01-01
      • 2011-10-18
      • 1970-01-01
      • 1970-01-01
      • 2013-06-29
      相关资源
      最近更新 更多