瀏覽代碼

ENH: Added cmake function ctkFunctionExecuteProcess

This later one behaves as EXECUTE_PROCESS expect it's also possible
to pass an extra argument PATH_LIST allowing to specify which
path should be added to either:
 PATH on windows
 LD_LIBRARY_PATH on unix-like
 DYLD_LIBRARY_PATH on apple
Jean-Christophe Fillion-Robin 15 年之前
父節點
當前提交
19e6cfaf6e
共有 4 個文件被更改,包括 138 次插入3 次删除
  1. 53 0
      CMake/ctkExecuteProcess.cmake.in
  2. 79 0
      CMake/ctkFunctionExecuteProcess.cmake
  3. 2 1
      CMake/ctkMacroValidateBuildOptions.cmake
  4. 4 2
      CMakeLists.txt

+ 53 - 0
CMake/ctkExecuteProcess.cmake.in

@@ -0,0 +1,53 @@
+#
+# This script is configured and executed by ctkFunctionExecuteProcess
+#
+
+SET(PATH_LIST @CONFIG_PATH_LIST@)
+
+FOREACH(p ${PATH_LIST})
+  IF(WIN32)
+    SET(ENV{PATH} ${p};$ENV{PATH})
+  ELSEIF(APPLE)
+    SET(ENV{DYLD_LIBRARY_PATH} ${p}:$ENV{DYLD_LIBRARY_PATH})
+  ELSE()
+    SET(ENV{LD_LIBRARY_PATH} ${p}:$ENV{LD_LIBRARY_PATH})
+  ENDIF()
+ENDFOREACH()
+
+EXECUTE_PROCESS(
+  @CONFIG_COMMAND@
+  @CONFIG_WORKING_DIRECTORY@
+  @CONFIG_TIMEOUT@
+  @CONFIG_RESULT_VARIABLE@
+  @CONFIG_OUTPUT_VARIABLE@
+  @CONFIG_ERROR_VARIABLE@
+  @CONFIG_INPUT_FILE@
+  @CONFIG_OUTPUT_FILE@
+  @CONFIG_ERROR_FILE@
+  @CONFIG_OUTPUT_QUIET@
+  @CONFIG_ERROR_QUIET@
+  @CONFIG_OUTPUT_STRIP_TRAILING_WHITESPACE@
+  @CONFIG_ERROR_STRIP_TRAILING_WHITESPACE@
+  )
+
+IF (NOT "@VARNAME_RESULT_VARIABLE@" STREQUAL "")
+  SET(SETTER_RESULT_VARIABLE "SET(@VARNAME_RESULT_VARIABLE@ ${@VARNAME_RESULT_VARIABLE@} PARENT_SCOPE)")
+ENDIF()
+
+IF (NOT "@VARNAME_OUTPUT_VARIABLE@" STREQUAL "")
+  SET(SETTER_OUTPUT_VARIABLE "SET(@VARNAME_OUTPUT_VARIABLE@ ${@VARNAME_OUTPUT_VARIABLE@} PARENT_SCOPE)")
+ENDIF()
+
+IF (NOT "@VARNAME_ERROR_VARIABLE@" STREQUAL "")
+  SET(SETTER_ERROR_VARIABLE "SET(@VARNAME_ERROR_VARIABLE@ ${@VARNAME_ERROR_VARIABLE@} PARENT_SCOPE)")
+ENDIF()
+
+file(WRITE "@CMAKE_CURRENT_BINARY_DIR@/CMake/ctkExecuteProcess-@EXECUTABLE_NAME@-output.cmake" "
+#
+# File auto-generated by @CMAKE_CURRENT_BINARY_DIR@/CMake/ctkExecuteProcess-@EXECUTABLE_NAME@-output.cmake
+#
+
+${SETTER_RESULT_VARIABLE}
+${SETTER_OUTPUT_VARIABLE}
+${SETTER_ERROR_VARIABLE}
+")

+ 79 - 0
CMake/ctkFunctionExecuteProcess.cmake

@@ -0,0 +1,79 @@
+#
+#
+#
+
+FUNCTION(ctkFunctionExecuteProcess)
+  CtkMacroParseArguments(MY
+    "COMMAND;PATH_LIST;WORKING_DIRECTORY;TIMEOUT;RESULT_VARIABLE;OUTPUT_VARIABLE;ERROR_VARIABLE;INPUT_FILE;OUTPUT_FILE;ERROR_FILE"
+    "OUTPUT_QUIET;ERROR_QUIET;OUTPUT_STRIP_TRAILING_WHITESPACE;ERROR_STRIP_TRAILING_WHITESPACE"
+    ${ARGN}
+    )
+
+  # Sanity checks
+  IF(NOT DEFINED MY_COMMAND)
+    MESSAGE(SEND_ERROR "COMMAND is mandatory")
+  ENDIF()
+
+  # Extract executable
+  LIST(LENGTH MY_COMMAND command_length)
+  LIST(GET MY_COMMAND 0 MY_EXECUTABLE)
+  GET_FILENAME_COMPONENT(EXECUTABLE_NAME ${MY_EXECUTABLE} NAME_WE)
+  #MESSAGE("EXECUTABLE_NAME:${EXECUTABLE_NAME}")
+  
+  IF(NOT EXISTS ${MY_EXECUTABLE})
+    MESSAGE(FATAL_ERROR "Exectuable ${MY_EXECUTABLE} doesn't exist !")
+  ENDIF()
+  
+  # Command
+  SET(CONFIG_COMMAND COMMAND)
+  FOREACH(command_part ${MY_COMMAND})
+    SET(CONFIG_COMMAND "${CONFIG_COMMAND} \"${command_part}\"")
+  ENDFOREACH()
+  #MESSAGE(STATUS CONFIG_COMMAND:"${CONFIG_COMMAND}")
+
+  # Arguments list
+  SET(arg_names WORKING_DIRECTORY TIMEOUT RESULT_VARIABLE OUTPUT_VARIABLE ERROR_VARIABLE INPUT_FILE OUTPUT_FILE ERROR_FILE)
+  FOREACH(arg_name ${arg_names})
+    IF(DEFINED MY_${arg_name})
+      SET(CONFIG_${arg_name} "${arg_name} \"${MY_${arg_name}}\"")
+    ENDIF()
+  ENDFOREACH()
+
+  # Options list
+  SET(option_names OUTPUT_QUIET ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_STRIP_TRAILING_WHITESPACE)
+  FOREACH(option_name ${option_names})
+    IF(${MY_${option_name}})
+      SET(CONFIG_${option_name} ${option_name})
+    ENDIF()
+  ENDFOREACH()
+
+  SET(CONFIG_PATH_LIST ${PATH_LIST})
+  SET(VARNAME_RESULT_VARIABLE ${MY_RESULT_VARIABLE})
+  SET(VARNAME_OUTPUT_VARIABLE ${MY_OUTPUT_VARIABLE})
+  SET(VARNAME_ERROR_VARIABLE ${MY_ERROR_VARIABLE})
+
+  SET(cmd ${CMAKE_CURRENT_BINARY_DIR}/CMake/ctkExecuteProcess-${EXECUTABLE_NAME}.cmake)
+  CONFIGURE_FILE(
+    ${CMAKE_CURRENT_SOURCE_DIR}/CMake/ctkExecuteProcess.cmake.in
+    ${cmd}
+    @ONLY)
+
+  # Execute process
+  EXECUTE_PROCESS(
+    COMMAND ${CMAKE_COMMAND} -P "${cmd}"
+    RESULT_VARIABLE error_code
+    )
+
+  IF(error_code)
+    MESSAGE(FATAL_ERROR "Failed to execute ${cmd}")
+  ENDIF()
+  
+
+  SET(output_file "${CMAKE_CURRENT_BINARY_DIR}/CMake/ctkExecuteProcess-${EXECUTABLE_NAME}-output.cmake")
+  IF(NOT EXISTS ${output_file})
+    MESSAGE(FATAL_ERROR "Output file doesn't exist - Problem executing: ${cmd}")
+  ENDIF()
+
+  INCLUDE(${output_file})
+  
+ENDFUNCTION()

+ 2 - 1
CMake/ctkMacroValidateBuildOptions.cmake

@@ -93,8 +93,9 @@ MACRO(ctkMacroValidateBuildOptions dir executable target_directories)
 
     IF(${${option_name}})
       # Obtain dependency path
-      EXECUTE_PROCESS(
+      ctkFunctionExecuteProcess(
         COMMAND "${executable}" "${CTK_BINARY_DIR}/DGraphInput-alldep.txt" -paths ${target_project_name}
+        PATH_LIST ${QT_LIBRARY_DIR}
         WORKING_DIRECTORY ${CTK_BINARY_DIR}
         RESULT_VARIABLE RESULT_VAR
         OUTPUT_VARIABLE dep_paths

+ 4 - 2
CMakeLists.txt

@@ -100,6 +100,7 @@ INCLUDE(CMake/ctkMacroBuildQtDesignerPlugin.cmake)
 INCLUDE(CMake/ctkMacroSetupQt.cmake)
 INCLUDE(CMake/ctkMacroTargetLibraries.cmake) # Import multiple macros
 INCLUDE(CMake/ctkFunctionExtractOptionNameAndValue.cmake)
+INCLUDE(CMake/ctkFunctionExecuteProcess.cmake)
 INCLUDE(CMake/ctkMacroValidateBuildOptions.cmake)
 INCLUDE(CMake/ctkMacroAddCtkLibraryOptions.cmake)
 INCLUDE(CMake/ctkFunctionGenerateDGraphInput.cmake)
@@ -357,8 +358,9 @@ ctkMacroValidateBuildOptions("${CTK_BINARY_DIR}" "${DGraph_EXECUTABLE}" "${targe
 ctkFunctionGenerateDGraphInput(${CTK_BINARY_DIR} "${target_directories}" TRUE)
 
 # Obtain list of target ordered topologically
-EXECUTE_PROCESS(
-  COMMAND "${DGraph_EXECUTABLE}" "${CTK_BINARY_DIR}/DGraphInput.txt"  
+ctkFunctionExecuteProcess(
+  COMMAND "${DGraph_EXECUTABLE}" "${CTK_BINARY_DIR}/DGraphInput.txt"
+  PATH_LIST ${QT_LIBRARY_DIR}
   WORKING_DIRECTORY ${CTK_BINARY_DIR}
   RESULT_VARIABLE RESULT_VAR
   OUTPUT_VARIABLE CTEST_PROJECT_SUBPROJECTS