【问题标题】:How are CMake execute_process commands run?CMake execute_process 命令如何运行?
【发布时间】:2016-10-11 19:07:39
【问题描述】:

我的 CMakeLists.txt 文件中有以下几行。我在 Windows 7 上运行 CMake 3.5.2,并使用 Visual Studio 12 2013 作为生成器,并在 gui 中选中“使用默认本机编译器”。

find_path(FORTRAN_DIR NAMES cdll.cpp fdll.f90 Makefile PATHS ../source)
execute_process(COMMAND make
                WORKING_DIRECTORY ${FORTRAN_DIR})

这运行得很好。

但它究竟是如何运行的?它在 Windows 上!

我之前在 Windows 上通过 MSYS2 (MinGW) 编译过 Makefile,但如果 CMake 使用的是这个,那么我不确定它是如何知道这样做的。

编辑:我将execute_process(COMMAND uname -a) 放入CMakeLists.txt 文件并得到MSYS_NT-6.1 MYCOMPUTERNAMEHERE 2.5.2(0.297/5/3) 2016-07-15 08:31 x86_64 Msys。所以我想这回答了它正在通过 MSYS 运行......但是 CMake 怎么知道这样做呢?

The documentation 说:

“CMake 直接使用操作系统 API 执行子进程。所有参数都逐字传递给子进程。不使用中间 shell,因此将 > 等 shell 运算符视为普通参数。”

但我不明白这意味着什么,特别是考虑到如果我使用以下行,我会得到 /usr/bin/make 作为输出:

execute_process(COMMAND which make)

发生了什么,和/或我如何才能确定运行这些命令的环境/shell/什么?

【问题讨论】:

  • 看起来你在 MinGW 或类似的环境下运行 cmake。
  • 这是有道理的,因为我以前就是这样编译的(实际上是使用 MSYS2),但是 CMake 怎么知道使用它呢?
  • 可能是你在MSYS2下运行cmake,或者安装在那个环境下。
  • 不,@Tsyvarev,没有在 MSYS2 下运行 CMake。在 Windows 下运行它。
  • 我在安装 MSYS2 之前也安装了 CMake。

标签: shell cmake environment


【解决方案1】:

CMake 自带 Kitware 的操作系统抽象/检测库kwsys

KWSys 为许多通用系统提供了一个独立于平台的 API 在每个平台上实现不同的功能。

execute_process() 魔术正在 ProcessWin32.c 中使用 CreateProcessW()ProcessUNIX.c 使用 execvp(),具体取决于您使用的 CMake 版本。

所以 - 正如@Tsyvarev 所评论的 - 您的行为可能是在 PATH 环境中使用 MinGW/MSYS 的 Win32/64 版本的 CMake(查找给出的 Unix 特定命令)或 MinGW32/64从 MSYS 运行的 CMake 版本。

您也可以考虑使用 FindUnixCommands 之类的东西来获取相关 Unix 工具的绝对路径。

参考

【讨论】:

    猜你喜欢
    • 2016-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-30
    相关资源
    最近更新 更多