Przeglądaj źródła

SuperBuild - Improve management of "proj" variable adding stack support

Before this commit, the "proj" variable add to be set after calling
the macro "ctkMacroCheckExternalProjectDependency". This was
required because the recursive inclusion of external project
file had the effect of overwriting the value of the project variable if
it was set before.

This commit remove this limitation by "pushing" the current project name
onto a stack and popping it out after inclusion of dependent projects
is completed.

See #418
Jean-Christophe Fillion-Robin 11 lat temu
rodzic
commit
70085ac0a2

+ 4 - 3
CMake/Testing/SuperBuildTest/TheExternals/TheExternal_LibA.cmake

@@ -4,11 +4,12 @@
 
 superbuild_include_once()
 
-set(LibA_DEPENDENCIES "")
-
-superbuild_include_dependencies(LibA)
 set(proj LibA)
 
+set(${proj}_DEPENDENCIES "")
+
+superbuild_include_dependencies(${proj})
+
 if(${CMAKE_PROJECT_NAME}_USE_SYSTEM_${proj})
   message(FATAL_ERROR "Enabling ${CMAKE_PROJECT_NAME}_USE_SYSTEM_${proj} is not supported !")
 endif()

+ 4 - 3
CMake/Testing/SuperBuildTest/TheExternals/TheExternal_LibB.cmake

@@ -4,11 +4,12 @@
 
 superbuild_include_once()
 
-set(LibB_DEPENDENCIES LibA)
-
-superbuild_include_dependencies(LibB)
 set(proj LibB)
 
+set(${proj}_DEPENDENCIES LibA)
+
+superbuild_include_dependencies(${proj})
+
 if(${CMAKE_PROJECT_NAME}_USE_SYSTEM_${proj})
    message(FATAL_ERROR "Enabling ${CMAKE_PROJECT_NAME}_USE_SYSTEM_${proj} is not supported !")
 endif()

+ 4 - 3
CMake/Testing/SuperBuildTest/TheExternals/TheExternal_LibC.cmake

@@ -4,11 +4,12 @@
 
 superbuild_include_once()
 
-set(LibC_DEPENDENCIES LibD)
-
-superbuild_include_dependencies(LibC)
 set(proj LibC)
 
+set(${proj}_DEPENDENCIES LibD)
+
+superbuild_include_dependencies(${proj})
+
 if(${CMAKE_PROJECT_NAME}_USE_SYSTEM_${proj})
   unset(LibC_DIR CACHE)
 endif()

+ 4 - 3
CMake/Testing/SuperBuildTest/TheExternals/TheExternal_LibD.cmake

@@ -4,11 +4,12 @@
 
 superbuild_include_once()
 
-set(LibD_DEPENDENCIES "")
-
-superbuild_include_dependencies(LibD)
 set(proj LibD)
 
+set(${proj}_DEPENDENCIES "")
+
+superbuild_include_dependencies(${proj})
+
 if(${CMAKE_PROJECT_NAME}_USE_SYSTEM_${proj})
   unset(LibD_DIR CACHE)
 endif()

+ 60 - 1
CMake/ctkMacroCheckExternalProjectDependency.cmake

@@ -296,6 +296,60 @@ macro(_epd_status txt)
   endif()
 endmacro()
 
+#!
+#! superbuild_stack_content(<stack_name> <output_var>)
+#!
+#! <stack_name> corresponds to the name of stack.
+#!
+#! <output_var> is the name of CMake variable that will be set with the content
+#! of the stack identified by <stack_name>.
+function(superbuild_stack_content stack_name output_var)
+  get_property(_stack GLOBAL PROPERTY ${stack_name})
+  set(${output_var} ${_stack} PARENT_SCOPE)
+endfunction()
+
+#!
+#! superbuild_stack_size(<stack_name> <output_var>)
+#!
+#! <stack_name> corresponds to the name of stack.
+#!
+#! <output_var> is the name of CMake variable that will be set with the size
+#! of the stack identified by <stack_name>.
+function(superbuild_stack_size stack_name output_var)
+  get_property(_stack GLOBAL PROPERTY ${stack_name})
+  list(LENGTH _stack _stack_size)
+  set(${output_var} ${_stack_size} PARENT_SCOPE)
+endfunction()
+
+#!
+#! superbuild_stack_push(<stack_name> <value>)
+#!
+#! <stack_name> corresponds to the name of stack.
+#!
+#! <value> is appended to the stack identified by <stack_name>.
+function(superbuild_stack_push stack_name value)
+  set_property(GLOBAL APPEND PROPERTY ${stack_name} ${value})
+endfunction()
+
+#!
+#! superbuild_stack_pop(<stack_name> <item_var>)
+#!
+#! <stack_name> corresponds to the name of stack.
+#!
+#! <item_var> names a CMake variable that will be set with the item
+#! removed from the stack identified by <stack_name>.
+function(superbuild_stack_pop stack_name item_var)
+  get_property(_stack GLOBAL PROPERTY ${stack_name})
+  list(LENGTH _stack _stack_size)
+  if(_stack_size GREATER 0)
+    math(EXPR _index_to_remove "${_stack_size} - 1")
+    list(GET _stack ${_index_to_remove} _item)
+    list(REMOVE_AT _stack ${_index_to_remove})
+    set_property(GLOBAL PROPERTY ${stack_name} ${_stack})
+    set(${item_var} ${_item} PARENT_SCOPE)
+  endif()
+endfunction()
+
 #
 # superbuild_include_dependencies(<project>)
 macro(superbuild_include_dependencies proj)
@@ -312,7 +366,8 @@ macro(superbuild_include_dependencies proj)
     message(FATAL_ERROR "${__indent}${proj}_DEPENDENCIES variable is NOT defined !")
   endif()
 
-  if(NOT DEFINED SUPERBUILD_TOPLEVEL_PROJECT)
+  superbuild_stack_size(SUPERBUILD_PROJECT_STACK _stack_size)
+  if(_stack_size EQUAL 0)
     set(SUPERBUILD_TOPLEVEL_PROJECT ${proj})
   endif()
 
@@ -357,6 +412,8 @@ macro(superbuild_include_dependencies proj)
     #endif()
   endforeach()
 
+  superbuild_stack_push(SUPERBUILD_PROJECT_STACK ${proj})
+
   # Include dependencies
   foreach(dep ${${proj}_DEPENDENCIES})
     get_property(_is_included GLOBAL PROPERTY External_${dep}_FILE_INCLUDED)
@@ -374,6 +431,8 @@ macro(superbuild_include_dependencies proj)
     endif()
   endforeach()
 
+  superbuild_stack_pop(SUPERBUILD_PROJECT_STACK proj)
+
   # If project being process has dependencies, indicates it has also been added.
   if(NOT "${${proj}_DEPENDENCIES}" STREQUAL "")
     _epd_status(${__${proj}_superbuild_message})

+ 4 - 3
CMakeExternals/CTKData.cmake

@@ -4,11 +4,12 @@
 
 superbuild_include_once()
 
-set(CTKData_DEPENDENCIES "")
-
-superbuild_include_dependencies(CTKData)
 set(proj CTKData)
 
+set(${proj}_DEPENDENCIES "")
+
+superbuild_include_dependencies(${proj})
+
 if(${CMAKE_PROJECT_NAME}_USE_SYSTEM_${proj})
   message(FATAL_ERROR "Enabling ${CMAKE_PROJECT_NAME}_USE_SYSTEM_${proj} is not supported !")
 endif()

+ 7 - 6
CMakeExternals/DCMTK.cmake

@@ -4,14 +4,15 @@
 
 superbuild_include_once()
 
-set(DCMTK_enabling_variable DCMTK_LIBRARIES)
-set(${DCMTK_enabling_variable}_INCLUDE_DIRS DCMTK_INCLUDE_DIR)
-set(${DCMTK_enabling_variable}_FIND_PACKAGE_CMD DCMTK)
+set(proj DCMTK)
 
-set(DCMTK_DEPENDENCIES "")
+set(${proj}_enabling_variable DCMTK_LIBRARIES)
+set(${${proj}_enabling_variable}_INCLUDE_DIRS DCMTK_INCLUDE_DIR)
+set(${${proj}_enabling_variable}_FIND_PACKAGE_CMD DCMTK)
 
-superbuild_include_dependencies(DCMTK)
-set(proj DCMTK)
+set(${proj}_DEPENDENCIES "")
+
+superbuild_include_dependencies(${proj})
 
 if(${CMAKE_PROJECT_NAME}_USE_SYSTEM_${proj})
   unset(DCMTK_DIR CACHE)

+ 8 - 7
CMakeExternals/ITK.cmake

@@ -4,15 +4,16 @@
 
 superbuild_include_once()
 
-set(ITK_enabling_variable ITK_LIBRARIES)
-set(${ITK_enabling_variable}_LIBRARY_DIRS ITK_LIBRARY_DIRS)
-set(${ITK_enabling_variable}_INCLUDE_DIRS ITK_INCLUDE_DIRS)
-set(${ITK_enabling_variable}_FIND_PACKAGE_CMD ITK)
+set(proj ITK)
 
-set(ITK_DEPENDENCIES "")
+set(${proj}_enabling_variable ITK_LIBRARIES)
+set(${${proj}_enabling_variable}_LIBRARY_DIRS ITK_LIBRARY_DIRS)
+set(${${proj}_enabling_variable}_INCLUDE_DIRS ITK_INCLUDE_DIRS)
+set(${${proj}_enabling_variable}_FIND_PACKAGE_CMD ITK)
 
-superbuild_include_dependencies(ITK)
-set(proj ITK)
+set(${proj}_DEPENDENCIES "")
+
+superbuild_include_dependencies(${proj})
 
 if(${CMAKE_PROJECT_NAME}_USE_SYSTEM_${proj})
   unset(ITK_DIR CACHE)

+ 4 - 3
CMakeExternals/KWStyle.cmake

@@ -4,11 +4,12 @@
 
 superbuild_include_once()
 
-set(KWStyle_DEPENDENCIES "")
-
-superbuild_include_dependencies(KWStyle)
 set(proj KWStyle)
 
+set(${proj}_DEPENDENCIES "")
+
+superbuild_include_dependencies(${proj})
+
 if(${CMAKE_PROJECT_NAME}_USE_SYSTEM_${proj})
   unset(KWSTYLE_EXECUTABLE CACHE)
   find_program(KWSTYLE_EXECUTABLE kwstyle)

+ 7 - 6
CMakeExternals/Log4Qt.cmake

@@ -4,14 +4,15 @@
 
 superbuild_include_once()
 
-set(Log4Qt_enabling_variable Log4Qt_LIBRARIES)
-set(${Log4Qt_enabling_variable}_INCLUDE_DIRS Log4Qt_INCLUDE_DIRS)
-set(${Log4Qt_enabling_variable}_FIND_PACKAGE_CMD Log4Qt)
+set(proj Log4Qt)
 
-set(Log4Qt_DEPENDENCIES "")
+set(${proj}_enabling_variable Log4Qt_LIBRARIES)
+set(${${proj}_enabling_variable}_INCLUDE_DIRS Log4Qt_INCLUDE_DIRS)
+set(${${proj}_enabling_variable}_FIND_PACKAGE_CMD Log4Qt)
 
-superbuild_include_dependencies(Log4Qt)
-set(proj Log4Qt)
+set(${proj}_DEPENDENCIES "")
+
+superbuild_include_dependencies(${proj})
 
 if(${CMAKE_PROJECT_NAME}_USE_SYSTEM_${proj})
   message(FATAL_ERROR "Enabling ${CMAKE_PROJECT_NAME}_USE_SYSTEM_${proj} is not supported !")

+ 8 - 7
CMakeExternals/OpenIGTLink.cmake

@@ -4,15 +4,16 @@
 
 superbuild_include_once()
 
-set(OpenIGTLink_enabling_variable OpenIGTLink_LIBRARIES)
-set(${OpenIGTLink_enabling_variable}_LIBRARY_DIRS OpenIGTLink_LIBRARY_DIRS)
-set(${OpenIGTLink_enabling_variable}_INCLUDE_DIRS OpenIGTLink_INCLUDE_DIRS)
-set(${OpenIGTLink_enabling_variable}_FIND_PACKAGE_CMD OpenIGTLink)
+set(proj OpenIGTLink)
 
-set(OpenIGTLink_DEPENDENCIES "")
+set(${proj}_enabling_variable OpenIGTLink_LIBRARIES)
+set(${${proj}_enabling_variable}_LIBRARY_DIRS OpenIGTLink_LIBRARY_DIRS)
+set(${${proj}_enabling_variable}_INCLUDE_DIRS OpenIGTLink_INCLUDE_DIRS)
+set(${${proj}_enabling_variable}_FIND_PACKAGE_CMD OpenIGTLink)
 
-superbuild_include_dependencies(OpenIGTLink)
-set(proj OpenIGTLink)
+set(${proj}_DEPENDENCIES "")
+
+superbuild_include_dependencies(${proj})
 
 if(${CMAKE_PROJECT_NAME}_USE_SYSTEM_${proj})
   unset(OpenIGTLink_DIR CACHE)

+ 7 - 6
CMakeExternals/PythonQt.cmake

@@ -4,14 +4,15 @@
 
 superbuild_include_once()
 
-set(PythonQt_enabling_variable PYTHONQT_LIBRARIES)
-set(${PythonQt_enabling_variable}_INCLUDE_DIRS PYTHONQT_INCLUDE_DIR PYTHON_INCLUDE_DIRS)
-set(${PythonQt_enabling_variable}_FIND_PACKAGE_CMD PythonQt)
+set(proj PythonQt)
 
-set(PythonQt_DEPENDENCIES "")
+set(${proj}_enabling_variable PYTHONQT_LIBRARIES)
+set(${${proj}_enabling_variable}_INCLUDE_DIRS PYTHONQT_INCLUDE_DIR PYTHON_INCLUDE_DIRS)
+set(${${proj}_enabling_variable}_FIND_PACKAGE_CMD ${proj})
 
-superbuild_include_dependencies(PythonQt)
-set(proj PythonQt)
+set(${proj}_DEPENDENCIES "")
+
+superbuild_include_dependencies(${proj})
 
 if(${CMAKE_PROJECT_NAME}_USE_SYSTEM_${proj})
   message(FATAL_ERROR "Enabling ${CMAKE_PROJECT_NAME}_USE_SYSTEM_${proj} is not supported !")

+ 4 - 3
CMakeExternals/PythonQtGenerator.cmake

@@ -4,15 +4,16 @@
 
 superbuild_include_once()
 
+set(proj PythonQtGenerator)
+
 # Sanity checks
 if(DEFINED PYTHONQTGENERATOR_EXECUTABLE AND NOT EXISTS ${PYTHONQTGENERATOR_EXECUTABLE})
   message(FATAL_ERROR "PYTHONQTGENERATOR_EXECUTABLE variable is defined but corresponds to non-existing executable")
 endif()
 
-set(PythonQtGenerator_DEPENDENCIES PythonQt)
+set(${proj}_DEPENDENCIES PythonQt)
 
-superbuild_include_dependencies(PythonQtGenerator)
-set(proj PythonQtGenerator)
+superbuild_include_dependencies(${proj})
 
 if(${CMAKE_PROJECT_NAME}_USE_SYSTEM_${proj})
   message(FATAL_ERROR "Enabling ${CMAKE_PROJECT_NAME}_USE_SYSTEM_${proj} is not supported !")

+ 8 - 7
CMakeExternals/QtSOAP.cmake

@@ -4,15 +4,16 @@
 
 superbuild_include_once()
 
-set(QtSOAP_enabling_variable QtSOAP_LIBRARIES)
-set(${QtSOAP_enabling_variable}_LIBRARY_DIRS QtSOAP_LIBRARY_DIRS)
-set(${QtSOAP_enabling_variable}_INCLUDE_DIRS QtSOAP_INCLUDE_DIRS)
-set(${QtSOAP_enabling_variable}_FIND_PACKAGE_CMD QtSOAP)
+set(proj QtSOAP)
 
-set(QtSOAP_DEPENDENCIES "")
+set(${proj}_enabling_variable QtSOAP_LIBRARIES)
+set(${${proj}_enabling_variable}_LIBRARY_DIRS QtSOAP_LIBRARY_DIRS)
+set(${${proj}_enabling_variable}_INCLUDE_DIRS QtSOAP_INCLUDE_DIRS)
+set(${${proj}_enabling_variable}_FIND_PACKAGE_CMD QtSOAP)
 
-superbuild_include_dependencies(QtSOAP)
-set(proj QtSOAP)
+set(${proj}_DEPENDENCIES "")
+
+superbuild_include_dependencies(${proj})
 
 if(${CMAKE_PROJECT_NAME}_USE_SYSTEM_${proj})
   message(FATAL_ERROR "Enabling ${CMAKE_PROJECT_NAME}_USE_SYSTEM_${proj} is not supported !")

+ 5 - 4
CMakeExternals/QtTesting.cmake

@@ -4,12 +4,13 @@
 
 superbuild_include_once()
 
-set(QtTesting_DEPENDS)
+set(proj QtTesting)
 
-set(QtTesting_DEPENDENCIES "")
+set(${proj}_DEPENDS)
 
-superbuild_include_dependencies(QtTesting)
-set(proj QtTesting)
+set(${proj}_DEPENDENCIES "")
+
+superbuild_include_dependencies(${proj})
 
 if(${CMAKE_PROJECT_NAME}_USE_SYSTEM_${proj})
   message(FATAL_ERROR "Enabling ${CMAKE_PROJECT_NAME}_USE_SYSTEM_${proj} is not supported !")

+ 8 - 7
CMakeExternals/VTK.cmake

@@ -4,15 +4,16 @@
 
 superbuild_include_once()
 
-set(VTK_enabling_variable VTK_LIBRARIES)
-set(${VTK_enabling_variable}_LIBRARY_DIRS VTK_LIBRARY_DIRS)
-set(${VTK_enabling_variable}_INCLUDE_DIRS VTK_INCLUDE_DIRS)
-set(${VTK_enabling_variable}_FIND_PACKAGE_CMD VTK)
+set(proj VTK)
 
-set(VTK_DEPENDENCIES "")
+set(${proj}_enabling_variable VTK_LIBRARIES)
+set(${${proj}_enabling_variable}_LIBRARY_DIRS VTK_LIBRARY_DIRS)
+set(${${proj}_enabling_variable}_INCLUDE_DIRS VTK_INCLUDE_DIRS)
+set(${${proj}_enabling_variable}_FIND_PACKAGE_CMD VTK)
 
-superbuild_include_dependencies(VTK)
-set(proj VTK)
+set(${proj}_DEPENDENCIES "")
+
+superbuild_include_dependencies(${proj})
 
 if(${CMAKE_PROJECT_NAME}_USE_SYSTEM_${proj})
   unset(VTK_DIR CACHE)

+ 8 - 7
CMakeExternals/XIP.cmake

@@ -4,15 +4,16 @@
 
 superbuild_include_once()
 
-set(XIP_enabling_variable XIP_LIBRARIES)
-set(${XIP_enabling_variable}_LIBRARY_DIRS XIP_LIBRARY_DIRS)
-set(${XIP_enabling_variable}_INCLUDE_DIRS XIP_INCLUDE_DIRS)
-set(${XIP_enabling_variable}_FIND_PACKAGE_CMD XIP)
+set(proj XIP)
 
-set(XIP_DEPENDENCIES "")
+set(${proj}_enabling_variable XIP_LIBRARIES)
+set(${${proj}_enabling_variable}_LIBRARY_DIRS XIP_LIBRARY_DIRS)
+set(${${proj}_enabling_variable}_INCLUDE_DIRS XIP_INCLUDE_DIRS)
+set(${${proj}_enabling_variable}_FIND_PACKAGE_CMD XIP)
 
-superbuild_include_dependencies(XIP)
-set(proj XIP)
+set(${proj}_DEPENDENCIES "")
+
+superbuild_include_dependencies(${proj})
 
 if(${CMAKE_PROJECT_NAME}_USE_SYSTEM_${proj})
   message(FATAL_ERROR "Enabling ${CMAKE_PROJECT_NAME}_USE_SYSTEM_${proj} is not supported !")

+ 8 - 7
CMakeExternals/ZMQ.cmake

@@ -4,15 +4,16 @@
 
 superbuild_include_once()
 
-set(ZMQ_enabling_variable ZMQ_LIBRARIES)
-set(${ZMQ_enabling_variable}_LIBRARY_DIRS ZMQ_LIBRARY_DIRS)
-set(${ZMQ_enabling_variable}_INCLUDE_DIRS ZMQ_INCLUDE_DIRS)
-set(${ZMQ_enabling_variable}_FIND_PACKAGE_CMD ZMQ)
+set(proj ZMQ)
 
-set(ZMQ_DEPENDENCIES "")
+set(${proj}_enabling_variable ZMQ_LIBRARIES)
+set(${${proj}_enabling_variable}_LIBRARY_DIRS ZMQ_LIBRARY_DIRS)
+set(${${proj}_enabling_variable}_INCLUDE_DIRS ZMQ_INCLUDE_DIRS)
+set(${${proj}_enabling_variable}_FIND_PACKAGE_CMD ZMQ)
 
-superbuild_include_dependencies(ZMQ)
-set(proj ZMQ)
+set(${proj}_DEPENDENCIES "")
+
+superbuild_include_dependencies(${proj})
 
 if(${CMAKE_PROJECT_NAME}_USE_SYSTEM_${proj})
   message(FATAL_ERROR "Enabling ${CMAKE_PROJECT_NAME}_USE_SYSTEM_${proj} is not supported !")

+ 8 - 7
CMakeExternals/qxmlrpc.cmake

@@ -4,15 +4,16 @@
 
 superbuild_include_once()
 
-set(qxmlrpc_enabling_variable qxmlrpc_LIBRARY)
-set(${qxmlrpc_enabling_variable}_LIBRARY_DIRS qxmlrpc_LIBRARY_DIRS)
-set(${qxmlrpc_enabling_variable}_INCLUDE_DIRS qxmlrpc_INCLUDE_DIRS)
-set(${qxmlrpc_enabling_variable}_FIND_PACKAGE_CMD qxmlrpc)
+set(proj qxmlrpc)
 
-set(qxmlrpc_DEPENDENCIES "")
+set(${proj}_enabling_variable qxmlrpc_LIBRARY)
+set(${${proj}_enabling_variable}_LIBRARY_DIRS qxmlrpc_LIBRARY_DIRS)
+set(${${proj}_enabling_variable}_INCLUDE_DIRS qxmlrpc_INCLUDE_DIRS)
+set(${${proj}_enabling_variable}_FIND_PACKAGE_CMD qxmlrpc)
 
-superbuild_include_dependencies(qxmlrpc)
-set(proj qxmlrpc)
+set(${proj}_DEPENDENCIES "")
+
+superbuild_include_dependencies(${proj})
 
 if(${CMAKE_PROJECT_NAME}_USE_SYSTEM_${proj})
   message(FATAL_ERROR "Enabling ${CMAKE_PROJECT_NAME}_USE_SYSTEM_${proj} is not supported !")

+ 1 - 1
CMakeLists.txt

@@ -921,7 +921,7 @@ if(CTK_USE_CONTRIBUTED_PLUGINS)
     ctkFunctionCheckoutRepo(
       NAME ExternalProjectsContrib
       GIT_URL github.com/commontk/ExternalProjectsContrib.git
-      GIT_TAG 2bed266
+      GIT_TAG d8613c6
       )
     mark_as_superbuild(ExternalProjectsContrib_DIR:PATH)
   endif()