【问题标题】:How to detect if the CMake script is being run in MSYS2 environment?如何检测 CMake 脚本是否在 MSYS2 环境中运行?
【发布时间】:2020-07-02 19:01:20
【问题描述】:

我想检测 CMakeLists.txt 是否在 MSYS2 环境/shell 中被调用:

$ uname
MSYS_NT-10.0-18363

来自here我试过了:

cmake_minimum_required(VERSION 3.10)

project(test_cmake)

if(MSYS) # yes I have also tried MSYS2 with the same result!
    message("This is MSYS")
else()
    message("This is not MSYS")
endif()

在 Windows cmd 和 MSYS2 shell 中返回相同的结果This is not MSYS。我实际上并不感到惊讶,因为 MSYS2 和 MSYS 是两种不同的野兽!同样来自here,我试过了:

message(${CMAKE_SYSTEM_NAME})

在 cmd 和 MSYS2 中都返回 Windows!如果您能帮助我了解如何检测 cmake 命令是否从 MSYS2 shell 内部运行,我将不胜感激。提前感谢您的支持。

P.S.1. 作为我个人的笔记,thisthis 似乎是值得研究的好来源。

P.S.2 奇怪的是命令

message(${CMAKE_HOST_SYSTEM_NAME})

在我的MSYS2上也返回Windows,根据the docuemntation,它必须返回uname -s的结果!

【问题讨论】:

    标签: cmake msys2


    【解决方案1】:

    好的,我想我知道问题出在哪里了。因为我之前也有other issues,所以mingw64/mingw-w64-x86_64-cmake 导致了这个问题。所以我卸载了它并安装了msys/cmake 包。现在:

    • if(MSYS) 重新运行TRUE
    • message(${CMAKE_SYSTEM_NAME}) --> MSYS
    • message(${CMAKE_SYSTEM}) --> MSYS-3.0.7-338.x86_64
    • message(${CMAKE_HOST_SYSTEM_NAME}) --> MSYS

    需要注意的是,现在您必须通过 -D CMAKE_MAKE_PROGRAM:path=mingw32-make 指定 make 工具的路径

    【讨论】:

      【解决方案2】:

      我认为应该有更好的答案,但您可以使用您提供的uname 的输出:

      execute_process(COMMAND uname OUTPUT_VARIABLE uname)
      if (uname MATCHES "^MSYS")
      

      【讨论】:

      • 仍然没有检测到uname MATCHES "^MSYS" 似乎返回false。你能扩展你的if语句吗?我怀疑我不知道如何写那部分。
      • 鉴于uname 结果并没有说明是 MSYS2,我还担心我们是否可以区分 MSYS 和 MSYS2。我们可能需要解析整个返回值。
      • 它对我有用,就像uname 输出Linux 一样,我用"^MSYS" 替换"^Lin" 并且匹配成功。所以解析整个输出。您将如何检测您是在 MSYS 上还是在 MSYS2 上?
      • uname 在 MSYS2 上实际上给出了 MINGW64_NT-10.0-19043!
      【解决方案3】:

      考虑到到目前为止的所有答案和 cmets,我发现最可靠的方法是使用

      execute_process(COMMAND uname OUTPUT_VARIABLE uname)
      if (uname MATCHES "^MSYS" OR uname MATCHES "^MINGW")
          message("This is MSYS")
      else()
          message("This is not MSYS")
      endif()
      

      在我的 msys2 中,这是我在 cmake 中看到的内容

      message("a ${MSYS}")                    --> prints a, MSYS does not exist 
      message("a ${CMAKE_SYSTEM_NAME}")       --> prints a, CMAKE_SYSTEM_NAME does not exist 
      message("a ${CMAKE_SYSTEM}")            --> prints a, CMAKE_SYSTEM does not exist 
      message("a ${CMAKE_HOST_SYSTEM_NAME}")  --> prints a MSYS_NT-10.0-19044-WOW64, could be used
      

      $ uname
      MSYS_NT-10.0-19044-WOW64
      

      【讨论】:

        【解决方案4】:

        使用 MSYS2 默认安装,在运行 MSYS2 MinGW x64 时,我有:

        $ uname
        MINGW64_NT-10.0-19042
        

        所以我们可以简单地使用https://cmake.org/cmake/help/latest/variable/MINGW.html

        if (MINGW)
           message("This is MSYS2")
        else()
            message("This is not MSYS2")
        endif()
        

        【讨论】:

          猜你喜欢
          • 2018-12-18
          • 2018-12-11
          • 2021-09-22
          • 2019-03-21
          • 1970-01-01
          • 2011-05-04
          • 2011-05-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多