Kaynağa Gözat

Add "superbuild_cmakevar_to_cmakearg" convenience function

Given a variable name and variable type passed as "<varname>:<vartype>",
it return -D<varname>:<vartype>=${<varname>}

Set CMake cache associated CTK and qxmlrpc external projects using
CMAKE_CACHE_ARGS, that way there is no need to separate the argument
using the list separator.

See #418
Jean-Christophe Fillion-Robin 11 yıl önce
ebeveyn
işleme
70fdbf6e11

+ 1 - 0
CMake/Testing/CMakeLists.txt

@@ -14,3 +14,4 @@ endmacro()
 # Add 'CMake script' Tests
 #
 add_cmakescript_test(ctk_list_to_string_test ctkListToString)
+add_cmakescript_test(superbuild_cmakevar_to_cmakearg_test ctkMacroCheckExternalProjectDependencyTest)

+ 46 - 0
CMake/ctkMacroCheckExternalProjectDependency.cmake

@@ -49,6 +49,52 @@ macro(superbuild_include_once)
   set_property(GLOBAL PROPERTY ${_property_name} 1)
 endmacro()
 
+#!
+#! superbuild_cmakevar_to_cmakearg(<cmake_varname_and_type> <cmake_arg_var> <cmake_arg_type> [<varname_var> [<vartype_var>]])
+#!
+#! <cmake_varname_and_type> corresponds to variable name and variable type passed as "<varname>:<vartype>"
+#!
+#! <cmake_arg_var> is a variable name that will be set to "-D<varname>:<vartype>=${<varname>}"
+#!
+#! <cmake_arg_type> is set to either CMAKE_CACHE or CMAKE_CMD.
+#!                  CMAKE_CACHE means that the generated cmake argument will be passed to
+#!                  ExternalProject_Add as CMAKE_CACHE_ARGS.
+#!                  CMAKE_CMD means that the generated cmake argument will be passed to
+#!                  ExternalProject_Add as CMAKE_ARGS.
+#!
+#! <varname_var> is an optional variable name that will be set to "<varname>"
+#!
+#! <vartype_var> is an optional variable name that will be set to "<vartype>"
+function(superbuild_cmakevar_to_cmakearg cmake_varname_and_type cmake_arg_var cmake_arg_type)
+  set(_varname_var ${ARGV3})
+  set(_vartype_var ${ARGV4})
+  string(REPLACE ":" ";" varname_and_vartype ${cmake_varname_and_type})
+  list(GET varname_and_vartype 0 _varname)
+  list(GET varname_and_vartype 1 _vartype)
+  set(_var_value "${${_varname}}")
+  get_property(_value_set_in_cache CACHE ${_varname} PROPERTY VALUE SET)
+  if(_value_set_in_cache)
+    get_property(_var_value CACHE ${_varname} PROPERTY VALUE)
+  endif()
+
+  # XXX Add check for <cmake_arg_type> value
+
+  if(cmake_arg_type STREQUAL "CMAKE_CMD")
+    # Separate list item with <sep>
+    set(ep_arg_as_string "")
+    ctk_list_to_string(${sep} "${_var_value}" _var_value)
+  endif()
+
+  set(${cmake_arg_var} -D${_varname}:${_vartype}=${_var_value} PARENT_SCOPE)
+
+  if(_varname_var MATCHES ".+")
+    set(${_varname_var} ${_varname} PARENT_SCOPE)
+  endif()
+  if(_vartype_var MATCHES ".+")
+    set(${_vartype_var} ${_vartype} PARENT_SCOPE)
+  endif()
+endfunction()
+
 macro(_epd_status txt)
   if(NOT __epd_first_pass)
     message(STATUS ${txt})

+ 85 - 0
CMake/ctkMacroCheckExternalProjectDependencyTest.cmake

@@ -0,0 +1,85 @@
+
+set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR} ${CMAKE_MODULE_PATH})
+include(ctkMacroCheckExternalProjectDependency)
+
+#
+# cmake -DTEST_superbuild_cmakevar_to_cmakearg_test:BOOL=ON -P ctkMacroCheckExternalProjectDependencyTest.cmake
+#
+function(superbuild_cmakevar_to_cmakearg_test)
+  function(check_test_result id current_output expected_output
+      current_varname expected_varname
+      current_vartype expected_vartype)
+    if(NOT "${current_output}" STREQUAL "${expected_output}")
+      message(FATAL_ERROR "Problem with superbuild_cmakevar_to_cmakearg() - See testcase: ${id}\n"
+                          "current_output:${current_output}\n"
+                          "expected_output:${expected_output}")
+    endif()
+    if(NOT "${current_varname}" STREQUAL "${expected_varname}")
+      message(FATAL_ERROR "Problem with superbuild_cmakevar_to_cmakearg() - See testcase: ${id}\n"
+                          "current_varname:${current_varname}\n"
+                          "expected_varname:${expected_varname}")
+    endif()
+    if(NOT "${current_vartype}" STREQUAL "${expected_vartype}")
+      message(FATAL_ERROR "Problem with superbuild_cmakevar_to_cmakearg() - See testcase: ${id}\n"
+                          "current_vartype:${current_vartype}\n"
+                          "expected_vartype:${expected_vartype}")
+    endif()
+  endfunction()
+
+  set(id 1)
+  set(case${id}_input "Hello")
+  set(case${id}_expected_varname "")
+  set(case${id}_expected_vartype "")
+  set(case${id}_expected_cmake_arg_var "-Dcase${id}_input:STRING=${case${id}_input}")
+  superbuild_cmakevar_to_cmakearg("case${id}_input:STRING"
+      case${id}_cmake_arg_var CMAKE_CACHE
+      )
+  check_test_result(${id}
+      "${case${id}_cmake_arg_var}" "${case${id}_expected_cmake_arg_var}"
+      "${case${id}_varname}" "${case${id}_expected_varname}"
+      "${case${id}_vartype}" "${case${id}_expected_vartype}")
+
+  set(id 2)
+  set(case${id}_input "Hello")
+  set(case${id}_expected_varname "case${id}_input")
+  set(case${id}_expected_vartype "STRING")
+  set(case${id}_expected_cmake_arg_var "-Dcase${id}_input:STRING=${case${id}_input}")
+  superbuild_cmakevar_to_cmakearg("case${id}_input:STRING"
+      case${id}_cmake_arg_var CMAKE_CACHE
+      case${id}_varname case${id}_vartype)
+  check_test_result(${id}
+      "${case${id}_cmake_arg_var}" "${case${id}_expected_cmake_arg_var}"
+      "${case${id}_varname}" "${case${id}_expected_varname}"
+      "${case${id}_vartype}" "${case${id}_expected_vartype}")
+
+  set(id 3)
+  set(case${id}_input Hello World)
+  set(case${id}_expected_varname "case${id}_input")
+  set(case${id}_expected_vartype "STRING")
+  set(case${id}_expected_cmake_arg_var "-Dcase${id}_input:STRING=${case${id}_input}")
+  superbuild_cmakevar_to_cmakearg("case${id}_input:STRING"
+      case${id}_cmake_arg_var CMAKE_CACHE
+      case${id}_varname case${id}_vartype)
+  check_test_result(${id}
+      "${case${id}_cmake_arg_var}" "${case${id}_expected_cmake_arg_var}"
+      "${case${id}_varname}" "${case${id}_expected_varname}"
+      "${case${id}_vartype}" "${case${id}_expected_vartype}")
+
+  set(id 4)
+  set(case${id}_input Hello World)
+  set(case${id}_expected_varname "case${id}_input")
+  set(case${id}_expected_vartype "STRING")
+  set(case${id}_expected_cmake_arg_var "-Dcase${id}_input:STRING=Hello^^World")
+  superbuild_cmakevar_to_cmakearg("case${id}_input:STRING"
+      case${id}_cmake_arg_var CMAKE_CMD
+      case${id}_varname case${id}_vartype)
+  check_test_result(${id}
+      "${case${id}_cmake_arg_var}" "${case${id}_expected_cmake_arg_var}"
+      "${case${id}_varname}" "${case${id}_expected_varname}"
+      "${case${id}_vartype}" "${case${id}_expected_vartype}")
+
+  message("SUCCESS")
+endfunction()
+if(TEST_superbuild_cmakevar_to_cmakearg_test)
+  superbuild_cmakevar_to_cmakearg_test()
+endif()

+ 1 - 1
CMakeExternals/qxmlrpc.cmake

@@ -49,7 +49,7 @@ if(NOT DEFINED qxmlrpc_DIR)
     CMAKE_GENERATOR ${gen}
     INSTALL_COMMAND ""
     LIST_SEPARATOR ${sep}
-    CMAKE_ARGS
+    CMAKE_CACHE_ARGS
       ${ep_common_cache_args}
       -DQT_QMAKE_EXECUTABLE:FILEPATH=${QT_QMAKE_EXECUTABLE}
     DEPENDS

+ 4 - 10
SuperBuild.cmake

@@ -110,15 +110,9 @@ endforeach()
 set(CTK_SUPERBUILD_EP_ARGS)
 set(CTK_SUPERBUILD_EP_VARNAMES)
 foreach(arg ${CTK_SUPERBUILD_EP_VARS})
-  string(REPLACE ":" ";" varname_and_vartype ${arg})
-  set(target_info_list ${target_info_list})
-  list(GET varname_and_vartype 0 _varname)
-  list(GET varname_and_vartype 1 _vartype)
-  # Separate list item with <sep>
-  set(ep_arg_as_string "")
-  ctk_list_to_string(${sep} "${${_varname}}" ep_arg_as_string)
-  list(APPEND CTK_SUPERBUILD_EP_ARGS -D${_varname}:${_vartype}=${ep_arg_as_string})
-  list(APPEND CTK_SUPERBUILD_EP_VARNAMES ${_varname})
+  superbuild_cmakevar_to_cmakearg(${arg} cmake_arg varname)
+  list(APPEND CTK_SUPERBUILD_EP_ARGS ${cmake_arg})
+  list(APPEND CTK_SUPERBUILD_EP_VARNAMES ${varname})
 endforeach()
 string(REPLACE ";" "^" CTK_SUPERBUILD_EP_VARNAMES "${CTK_SUPERBUILD_EP_VARNAMES}")
 
@@ -142,7 +136,7 @@ ExternalProject_Add(${proj}
   DOWNLOAD_COMMAND ""
   CMAKE_GENERATOR ${gen}
   LIST_SEPARATOR ${sep}
-  CMAKE_ARGS
+  CMAKE_CACHE_ARGS
     -DCTK_SUPERBUILD:BOOL=OFF
     -DCTK_SUPERBUILD_BINARY_DIR:PATH=${CTK_BINARY_DIR}
     ${ctk_superbuild_boolean_args}