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(uname -a命令)到的CMakeLists.txt文件,并得到了MSYS_NT-6.1 MYCOMPUTERNAMEHERE 2.5.2(0.297 / 5/3)2016年7月15日08:31 x86_64的MSYS.所以我猜这是通过MSYS运行的答案……但CMake如何知道这样做?
“CMake直接使用操作系统API执行子进程.所有参数都通过VERBATIM传递给子进程.没有使用中间shell,所以shell操作符如>被视为普通参数.”
但我不明白这意味着什么,特别是考虑到如果我使用以下行,我将/usr/bin/make作为输出:
execute_process(COMMAND which make)
发生了什么,和/或我怎样才能弄清楚这些命令运行的环境/ shell /是什么?
KWSys provides a platform-independent API to many common system
features that are implemented differently on every platform.
execute_process()魔法在ProcessWin32.c
使用CreateProcessW()或ProcessUNIX.c
使用execvp()发生,具体取决于您使用的是哪个版本的CMake.
所以 – 正如@Tsyvarev所评论的那样 – 您的行为可能是在PATH环境中使用MinGW / MSYS的Win32 / 64版本的CMake(查找给定的Unix特定命令)或从MSYS运行的MinakeWW32 / 64版本的CMake.
您也可以考虑使用像FindUnixCommands
这样的东西来获取有问题的Unix工具的绝对路径.
参考