在Msys环境中使用CMake execute_process

时间:2015-04-24 11:37:42

标签: bash cmake mingw msysgit

我在CMake环境中构建库后,尝试从msysgit执行脚本,以便更新PATH

有问题的代码行:

set(SCRIPT_DIR "${CMAKE_SOURCE_DIR}/script")
if(MINGW)
  set(COMMAND "source ${SCRIPT_DIR}/mingwpath")
else()
  # Other script. In this case, CMake won't enter here.
endif()

set(PATH_DIRS ${CMAKE_BINARY_DIR})

execute_process(COMMAND ${COMMAND} ${PATH_DIRS}
                RESULT_VARIABLE r
                OUTPUT_VARIABLE o
                ERROR_VARIABLE e
)

message(STATUS ${COMMAND})
message(STATUS ${PATH_DIRS})
message(STATUS "RESULT: ${r}")
message(STATUS "OUTPUT: ${o}")
message(STATUS "ERROR: ${e}")

和脚本:

#!/bin/bash

export PATH=$1:$PATH

但我总是以这个结果结束:

source D:/test/src/script/mingwpath
D:/test/build/

RESULT: System can't find the specified file.
OUTPUT: 
ERROR: 

问题是如果我在终端中输入那个确切的命令,它就可以工作。

如果不是运行脚本,我会尝试运行ls

execute_process(COMMAND ls
              RESULT_VARIABLE r
              OUTPUT_VARIABLE o
              ERROR_VARIABLE e
)

我得到与以前相同的输出信息。

我还删除了命令调用中的source,最后收到了此result消息:

%1 is not a valid Win32 application

直接从终端执行脚本。

1 个答案:

答案 0 :(得分:0)

来自execute_command()上的CMake docs

  

CMake直接使用操作系统API执行子进程。所有参数都将VERBATIM传递给子进程。没有使用中间壳[...]

由于source是一个内置的shell(并且cmake没有启动shell),因此无法在文件系统上找到它作为命令。所以删除"来源"声明,而是直接调用您的脚本:

set(COMMAND "${SCRIPT_DIR}/mingwpath")

警告:我在Linux上测试了这个,而不是MinGW,但是说初始症状至少是相同的。