Преглед изворни кода

ENH: Add macro ctkMacroGetAllTargetLibraries, ctkMacroGetAllCTKTargetLibraries, ctkMacroGetAllNonCTKTargetLibraries and ctkMacroShouldAddExternalProject.

1) ctkMacroGetAllTargetLibraries: Allow to retrieve all target libraries.

2) ctkMacroGetAllCTKTargetLibraries: Extract CTK libraries from 'all target libraries' (obtained using ctkMacroGetAllTargetLibraries)

3) ctkMacroGetAllNonCTKTargetLibraries: Extract non-CTK libraries from 'all target libraries'

4) ctkMacroShouldAddExternalProject: Allow to know if a given external project should be added or not.


Using macro 1) and 3), as stated in the main CMakeLists.txt, it's possible
to obtain the list NON_CTK_DEPENDENCIES

Then, in the SuperBuild.cmake, using the macro 4), it's possible to check if a given variable name
exists in the list NON_CTK_DEPENDENCIES. Such variable name could be DCMTK_LIBRARIES.

If, for example, the variable DCMTK_LIBRARIES exists in the list, the external project DCMTK is expected.

*Important*  -- Not also that within the file target_libraries.cmake located
in each Libs, Plugins or Apps subdirectory, only string should be listed. No Variable.

For example:

SET(target_libraries
  CTKCore
  DCMTK_LIBRARIES
  )

That way, the variable NON_CTK_DEPENDENCIES will contain only expected string and
not path to libraries that could be different from one plateform to another.
Jean-Christophe Fillion-Robin пре 15 година
родитељ
комит
00ce327666

+ 108 - 9
CMake/ctkMacroTargetLibraries.cmake

@@ -2,20 +2,119 @@
 #
 #
 #
-
 MACRO(ctkMacroGetTargetLibraries varname)
 
-  SET(target_libraries_path ${CMAKE_CURRENT_SOURCE_DIR}/target_libraries.cmake)
-  
+  SET(filepath ${CMAKE_CURRENT_SOURCE_DIR}/target_libraries.cmake)
+
   # Check if "target_libraries.cmake" file exists
-  IF(NOT EXISTS ${target_libraries_path})
-    MESSAGE(FATAL_ERROR "${target_libraries_path} doesn't exists !")
+  IF(NOT EXISTS ${filepath})
+    MESSAGE(FATAL_ERROR "${filepath} doesn't exists !")
   ENDIF()
 
-  # Make sure the variable is cleared 
+  # Make sure the variable is cleared
   SET(target_libraries )
 
-  INCLUDE(${target_libraries_path})
+  # Let's make sure target_libraries contains only strings
+  FILE(STRINGS "${filepath}" stringtocheck)
+  STRING(REGEX MATCHALL "[^\\#]\\$\\{.*\\}" incorrect_elements ${stringtocheck})
+  FOREACH(incorrect_element ${incorrect_elements})
+    STRING(REGEX REPLACE "\\$|\\{|\\}" "" correct_element ${incorrect_element})
+    MESSAGE(FATAL_ERROR "In ${filepath}, ${incorrect_element} should be replaced by ${correct_element}")
+  ENDFOREACH()
+
+  INCLUDE(${filepath})
+
+  # Loop over all target library, if it does *NOT* start with "CTK",
+  # let's resolve the variable to access its content
+  FOREACH(target_library ${target_libraries})
+    IF(${target_library} MATCHES "^CTK[a-zA-Z0-9]+$")
+      LIST(APPEND ${varname} ${target_library})
+    ELSE()
+      LIST(APPEND ${varname} "${${target_library}}")
+    ENDIF()
+  ENDFOREACH()
+ENDMACRO()
+
+
+#
+#
+#
+MACRO(ctkMacroGetAllTargetLibraries targets subdir varname)
+
+  FOREACH(target ${targets})
+    SET(option_prefix)
+    IF(${subdir} STREQUAL "Libs")
+      SET(option_prefix CTK_LIB_)
+    ELSEIF(${subdir} STREQUAL "Plugins")
+      SET(option_prefix CTK_PLUGIN_)
+    ELSEIF(${subdir} STREQUAL "Applications")
+      SET(option_prefix CTK_APP_)
+    ELSE()
+      MESSAGE(FATAL_ERROR "Unknown subdir:${subdir}, expected value are: 'Libs, 'Plugins' or 'Applications'")
+    ENDIF()
+
+    SET(option_name ${option_prefix}${target})
+    #MESSAGE(STATUS option_name:${option_name})
+    IF(${${option_name}})
+      #MESSAGE(STATUS target:${target})
+      SET(lib_targets)
+
+      SET(filepath ${CTK_SOURCE_DIR}/${subdir}/${target}/target_libraries.cmake)
+      #MESSAGE(STATUS filepath:${filepath})
+
+      # Check if "target_libraries.cmake" file exists
+      IF(NOT EXISTS ${filepath})
+        MESSAGE(FATAL_ERROR "${filepath} doesn't exists !")
+      ENDIF()
 
-  SET(${varname} ${target_libraries})
-ENDMACRO()
+      # Let's make sure target_libraries contains only strings
+      FILE(STRINGS "${filepath}" stringtocheck)
+      STRING(REGEX MATCHALL "[^#]\\$\\{.*\\}" incorrect_elements ${stringtocheck})
+      FOREACH(incorrect_element ${incorrect_elements})
+        STRING(REGEX REPLACE "\\$|\\{|\\}" "" correct_element ${incorrect_element})
+        MESSAGE(FATAL_ERROR "In ${filepath}, ${incorrect_element} should be replaced by ${correct_element}")
+      ENDFOREACH()
+
+      # Make sure the variable is cleared
+      SET(target_libraries )
+
+      INCLUDE(${filepath})
+
+      LIST(APPEND ${varname} ${target_libraries})
+      LIST(REMOVE_DUPLICATES ${varname})
+    ENDIF()
+  ENDFOREACH()
+  
+ENDMACRO()
+
+#
+# Extract all library names starting with CTK uppercase
+#
+MACRO(ctkMacroGetAllCTKTargetLibraries all_target_libraries varname)
+  SET(re_ctklib "^CTK[a-zA-Z0-9]+$")
+  LIST(APPEND _tmp_list ${all_target_libraries})
+  ctkMacroListFilter(_tmp_list re_ctklib OUTPUT_VARIABLE ${varname})
+  #MESSAGE(STATUS varname:${varname}:${${varname}})
+ENDMACRO()
+
+#
+# Extract all library names *NOT* starting with CTK uppercase
+#
+MACRO(ctkMacroGetAllNonCTKTargetLibraries all_target_libraries varname)
+  ctkMacroGetAllCTKTargetLibraries("${all_target_libraries}" all_ctk_libraries)
+  SET(_tmp_list ${all_target_libraries})
+  LIST(REMOVE_ITEM _tmp_list ${all_ctk_libraries})
+  SET(${varname} ${_tmp_list})
+  #MESSAGE(STATUS varname:${varname}:${${varname}})
+ENDMACRO()
+
+#
+# 
+#
+MACRO(ctkMacroShouldAddExternalProject libraries_variable_name resultvar)
+  LIST(FIND NON_CTK_DEPENDENCIES ${libraries_variable_name} index)
+  SET(${resultvar} FALSE)
+  IF(${index} GREATER -1)
+    SET(${resultvar} TRUE)
+  ENDIF()
+ENDMACRO()

+ 12 - 2
CMakeLists.txt

@@ -51,11 +51,12 @@ SET(CTK_BASE_INCLUDE_DIRS CACHE INTERNAL "CTK includes" FORCE)
 # CMake Macro(s)
 # 
 INCLUDE(CMake/ctkMacroParseArguments.cmake)
+INCLUDE(CMake/ctkMacroListFilter.cmake)
 INCLUDE(CMake/ctkMacroBuildQtLib.cmake)
 INCLUDE(CMake/ctkMacroBuildQtPlugin.cmake)
 INCLUDE(CMake/ctkMacroBuildQtApp.cmake)
 INCLUDE(CMake/ctkMacroSetupQt.cmake)
-INCLUDE(CMake/ctkMacroGetTargetLibraries.cmake)
+INCLUDE(CMake/ctkMacroTargetLibraries.cmake) # Import multiple macros
 INCLUDE(CMake/ctkMacroAddCtkLibraryOptions.cmake)
 
 #-----------------------------------------------------------------------------
@@ -120,13 +121,14 @@ SET(ctk_libs
   Widgets
   DICOM/Core
   DICOM/Widgets
+  Visualization/XIP
   )
 
 #-----------------------------------------------------------------------------
 # CTK Plugins
 #
 SET(ctk_plugins
-  org.commontk.cli
+  #org.commontk.cli
   )
 
 #-----------------------------------------------------------------------------
@@ -180,6 +182,14 @@ FOREACH(app ${ctk_applications})
 ENDFOREACH()
 
 #-----------------------------------------------------------------------------
+# Check dependencies
+#
+ctkMacroGetAllTargetLibraries("${ctk_libs}" "Libs" ALL_TARGET_LIBRARIES)
+ctkMacroGetAllTargetLibraries("${ctk_plugins}" "Plugins" ALL_TARGET_LIBRARIES)
+ctkMacroGetAllTargetLibraries("${ctk_applications}" "Applications" ALL_TARGET_LIBRARIES)
+#MESSAGE(STATUS ALL_TARGET_LIBRARIES:${ALL_TARGET_LIBRARIES})
+
+#-----------------------------------------------------------------------------
 # Superbuild is used by default
 #
 OPTION(CTK_SUPERBUILD "Build CTK and the projects it depends on via SuperBuild.cmake." ON)

+ 7 - 3
Libs/Core/CMakeLists.txt

@@ -1,5 +1,9 @@
 PROJECT(CTKCore)
 
+#
+# 3rd party dependencies
+#
+
 # use the QtMobility SuperBuild paths for now
 # we should add a FindQtMobility later
 SET(QTMOBILITY_INCLUDE_DIRS 
@@ -14,12 +18,12 @@ FIND_LIBRARY(QTMOBILITY_QTSERVICEFW_LIBRARY_RELEASE QtServiceFramework
              PATHS ${QTMOBILITY_LIBRARY_DIR}
              )
              
-SET(QTMOBILITY_QTSERVICEFW_LIBRARY )
+SET(QTMOBILITY_QTSERVICEFW_LIBRARIES )
 IF(QTMOBILITY_QTSERVICEFW_LIBRARY_RELEASE)
-  LIST(APPEND QTMOBILITY_QTSERVICEFW_LIBRARY optimized ${QTMOBILITY_QTSERVICEFW_LIBRARY_RELEASE})
+  LIST(APPEND QTMOBILITY_QTSERVICEFW_LIBRARIES optimized ${QTMOBILITY_QTSERVICEFW_LIBRARY_RELEASE})
 ENDIF()
 IF(QTMOBILITY_QTSERVICEFW_LIBRARY_DEBUG)
-  LIST(APPEND QTMOBILITY_QTSERVICEFW_LIBRARY debug ${QTMOBILITY_QTSERVICEFW_LIBRARY_DEBUG})
+  LIST(APPEND QTMOBILITY_QTSERVICEFW_LIBRARIES debug ${QTMOBILITY_QTSERVICEFW_LIBRARY_DEBUG})
 ENDIF()
              
 #

+ 2 - 2
Libs/Core/target_libraries.cmake

@@ -5,6 +5,6 @@
 #
 
 SET(target_libraries
-  ${QT_LIBRARIES}
-  ${QTMOBILITY_QTSERVICEFW_LIBRARY}
+  QT_LIBRARIES
+  QTMOBILITY_QTSERVICEFW_LIBRARIES
   )

+ 1 - 1
Libs/DICOM/Core/target_libraries.cmake

@@ -6,5 +6,5 @@
 
 SET(target_libraries
   CTKCore
-  ${DCMTK_LIBRARIES}
+  DCMTK_LIBRARIES
   )

+ 102 - 74
SuperBuild.cmake

@@ -46,15 +46,24 @@ set(sep "^^")
 SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/CMake)
 
 #-----------------------------------------------------------------------------
+# Initialize NON_CTK_DEPENDENCIES variable
+#
+# Using the variable ALL_TARGET_LIBRARIES initialized in the main CMakeLists.txt with the help
+# of the macro ctkMacroGetAllTargetLibraries, let's get the list of all Non-CTK dependencies.
+# NON_CTK_DEPENDENCIES is expected by the macro ctkMacroShouldAddExternalProject
+ctkMacroGetAllNonCTKTargetLibraries("${ALL_TARGET_LIBRARIES}" NON_CTK_DEPENDENCIES)
+#MESSAGE(STATUS NON_CTK_DEPENDENCIES:${NON_CTK_DEPENDENCIES})
+
+#-----------------------------------------------------------------------------
 # Qt is expected to be setup by CTK/CMakeLists.txt just before it includes the SuperBuild script
 #
 
 #-----------------------------------------------------------------------------
 # KWStyle
 #
-SET (kwstyle_DEPENDS)
-IF (CTK_USE_KWSTYLE)
-  IF (NOT DEFINED CTK_KWSTYLE_EXECUTABLE)
+SET(kwstyle_DEPENDS)
+IF(CTK_USE_KWSTYLE)
+  IF(NOT DEFINED CTK_KWSTYLE_EXECUTABLE)
     SET(proj KWStyle-CVSHEAD)
     SET(kwstyle_DEPENDS ${proj})
     ExternalProject_Add(${proj}
@@ -72,8 +81,9 @@ ENDIF()
 #-----------------------------------------------------------------------------
 # PythonQt
 #
-SET (PythonQt_DEPENDS)
-# IF ()
+SET(PythonQt_DEPENDS)
+ctkMacroShouldAddExternalProject(PYTHONQT_LIBRARIES add_project)
+IF(${add_project})
 #   SET(proj PythonQt)
 #   SET(PythonQt_DEPENDS ${proj})
 #   ExternalProject_Add(${proj}
@@ -86,32 +96,38 @@ SET (PythonQt_DEPENDS)
 #         -DQT_QMAKE_EXECUTABLE:FILEPATH=${QT_QMAKE_EXECUTABLE}
 #         #${vtk_PYTHON_ARGS}
 #       INSTALL_COMMAND "")
-# ENDIF()
+ENDIF()
     
 #-----------------------------------------------------------------------------
 # Utilities/DCMTK
 #
-SET (DCMTK_DEPENDS)
-IF (NOT DEFINED DCMTK_DIR)
-  SET(proj DCMTK)
-  SET(DCMTK_DEPENDS ${proj})
-  ExternalProject_Add(${proj}
-      DOWNLOAD_COMMAND ""
-      CMAKE_GENERATOR ${gen}
-      SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/Utilities/${proj}
-      CMAKE_ARGS
-        ${ep_common_args}
-        -DDCMTK_BUILD_APPS:BOOL=ON # Build also dmctk tools (movescu, storescp, ...)
-      )
-  SET(DCMTK_DIR ${ep_install_dir})
+SET(DCMTK_DEPENDS)
+ctkMacroShouldAddExternalProject(DCMTK_LIBRARIES add_project)
+IF(${add_project})
+  IF(NOT DEFINED DCMTK_DIR)
+    SET(proj DCMTK)
+#     MESSAGE(STATUS "Adding project:${proj}")
+    SET(DCMTK_DEPENDS ${proj})
+    ExternalProject_Add(${proj}
+        DOWNLOAD_COMMAND ""
+        CMAKE_GENERATOR ${gen}
+        SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/Utilities/${proj}
+        CMAKE_ARGS
+          ${ep_common_args}
+          -DDCMTK_BUILD_APPS:BOOL=ON # Build also dmctk tools (movescu, storescp, ...)
+        )
+    SET(DCMTK_DIR ${ep_install_dir})
+  ENDIF()
 ENDIF()
 
 #-----------------------------------------------------------------------------
 # Utilities/ZMQ
 #
-SET (ZMQ_DEPENDS)
-#IF ()
+SET(ZMQ_DEPENDS)
+ctkMacroShouldAddExternalProject(ZMQ_LIBRARIES add_project)
+IF(${add_project})
   SET(proj ZMQ)
+#   MESSAGE(STATUS "Adding project:${proj}")
   SET(ZMQ_DEPENDS ${proj})
   ExternalProject_Add(${proj}
       DOWNLOAD_COMMAND ""
@@ -121,74 +137,86 @@ SET (ZMQ_DEPENDS)
       CMAKE_ARGS
         ${ep_common_args}
       )
-#ENDIF()
+ENDIF()
 
 #-----------------------------------------------------------------------------
 # QtMobility
 #
-SET(proj QtMobility)
-
-# Configure patch script
-SET(qtmobility_src_dir ${ep_source_dir}/${proj})
-SET(qtmobility_patch_dir ${CTK_SOURCE_DIR}/Utilities/QtMobility/)
-SET(qtmobility_configured_patch_dir ${CTK_BINARY_DIR}/Utilities/QtMobility/)
-SET(qtmobility_patchscript
-  ${CTK_BINARY_DIR}/Utilities/QtMobility/QtMobilityBeta1-patch.cmake)
-CONFIGURE_FILE(
-  ${CTK_SOURCE_DIR}/Utilities/QtMobility/QtMobilityBeta1-patch.cmake.in
-  ${qtmobility_patchscript} @ONLY)
+SET(QtMobility_DEPENDS)
+ctkMacroShouldAddExternalProject(QTMOBILITY_QTSERVICEFW_LIBRARIES add_project)
+IF(${add_project})
+  SET(proj QtMobility)
+#   MESSAGE(STATUS "Adding project:${proj}")
+  SET(QtMobility_DEPENDS ${proj})
+  
+  # Configure patch script
+  SET(qtmobility_src_dir ${ep_source_dir}/${proj})
+  SET(qtmobility_patch_dir ${CTK_SOURCE_DIR}/Utilities/QtMobility/)
+  SET(qtmobility_configured_patch_dir ${CTK_BINARY_DIR}/Utilities/QtMobility/)
+  SET(qtmobility_patchscript
+    ${CTK_BINARY_DIR}/Utilities/QtMobility/QtMobilityBeta1-patch.cmake)
+  CONFIGURE_FILE(
+    ${CTK_SOURCE_DIR}/Utilities/QtMobility/QtMobilityBeta1-patch.cmake.in
+    ${qtmobility_patchscript} @ONLY)
 
-# Define configure options
-SET(qtmobility_modules "serviceframework")
-SET(qtmobility_build_type "release")
-IF(UNIX)
- IF(CMAKE_BUILD_TYPE STREQUAL "Debug")
-   SET(qtmobility_build_type "debug")
- ENDIF()
-ELSEIF(NOT ${CMAKE_CFG_INTDIR} STREQUAL "Release")
- SET(qtmobility_build_type "debug")
-ENDIf()
+  # Define configure options
+  SET(qtmobility_modules "serviceframework")
+  SET(qtmobility_build_type "release")
+  IF(UNIX)
+  IF(CMAKE_BUILD_TYPE STREQUAL "Debug")
+    SET(qtmobility_build_type "debug")
+  ENDIF()
+  ELSEIF(NOT ${CMAKE_CFG_INTDIR} STREQUAL "Release")
+  SET(qtmobility_build_type "debug")
+  ENDIf()
 
-ExternalProject_Add(${proj}
-   URL "http://get.qt.nokia.com/qt/solutions/qt-mobility-src-1.0.0-beta1.tar.gz"
-   CONFIGURE_COMMAND <SOURCE_DIR>/configure -${qtmobility_build_type} -libdir ${CMAKE_BINARY_DIR}/CTK-build/bin -no-docs -modules ${qtmobility_modules}
-   PATCH_COMMAND ${CMAKE_COMMAND} -P ${qtmobility_patchscript}
-   BUILD_IN_SOURCE 1
-   )
+  ExternalProject_Add(${proj}
+    URL "http://get.qt.nokia.com/qt/solutions/qt-mobility-src-1.0.0-beta1.tar.gz"
+    CONFIGURE_COMMAND <SOURCE_DIR>/configure -${qtmobility_build_type} -libdir ${CMAKE_BINARY_DIR}/CTK-build/bin -no-docs -modules ${qtmobility_modules}
+    PATCH_COMMAND ${CMAKE_COMMAND} -P ${qtmobility_patchscript}
+    BUILD_IN_SOURCE 1
+    )
+ENDIF()
 
 #-----------------------------------------------------------------------------
 # Utilities/OpenIGTLink
 #
 SET (OpenIGTLink_DEPENDS)
-#IF ()
-  SET(proj OpenIGTLink)
-  SET(OpenIGTLink_DEPENDS ${proj})
-  ExternalProject_Add(${proj}
-      SVN_REPOSITORY "http://svn.na-mic.org/NAMICSandBox/trunk/OpenIGTLink"
-      INSTALL_COMMAND ""
-      CMAKE_GENERATOR ${gen}
-      CMAKE_ARGS
-        ${ep_common_args}
-      )
-#ENDIF()
+ctkMacroShouldAddExternalProject(OpenIGTLink_LIBRARIES add_project)
+IF(${add_project})
+  IF(NOT DEFINED OpenIGTLink_DIR)
+    SET(proj OpenIGTLink)
+  #   MESSAGE(STATUS "Adding project:${proj}")
+    SET(OpenIGTLink_DEPENDS ${proj})
+    ExternalProject_Add(${proj}
+        SVN_REPOSITORY "http://svn.na-mic.org/NAMICSandBox/trunk/OpenIGTLink"
+        INSTALL_COMMAND ""
+        CMAKE_GENERATOR ${gen}
+        CMAKE_ARGS
+          ${ep_common_args}
+        )
+    SET(OpenIGTLink_DIR ${ep_build_dir}/${proj})
+  ENDIF()
+ENDIF()
 
 #-----------------------------------------------------------------------------
 # XIP
 #
 SET (XIP_DEPENDS)
-#IF ()
-#   SET(proj XIP)
-#   SET(XIP_DEPENDS ${proj})
-#   SET(url https://collab01a.scr.siemens.com/svn/xip/releases/latest)
-#   ExternalProject_Add(${proj}
-#     SVN_REPOSITORY "https://collab01a.scr.siemens.com/svn/xip/releases/latest"
-#     SVN_USERNAME "anonymous"
-#     INSTALL_COMMAND ""
-#     CMAKE_GENERATOR ${gen}
-#     CMAKE_ARGS
-#       ${ep_common_args}
-#     )
-#ENDIF()
+ctkMacroShouldAddExternalProject(XIP_LIBRARIES add_project)
+IF(${add_project})
+  SET(proj XIP)
+#   MESSAGE(STATUS "Adding project:${proj}")
+  SET(XIP_DEPENDS ${proj})
+  ExternalProject_Add(${proj}
+    SVN_REPOSITORY "https://collab01a.scr.siemens.com/svn/xip/releases/latest"
+    SVN_USERNAME "anonymous"
+    INSTALL_COMMAND ""
+    CMAKE_GENERATOR ${gen}
+    CMAKE_ARGS
+      ${ep_common_args}
+    )
+ENDIF()
    
 #-----------------------------------------------------------------------------
 # CTK Utilities
@@ -201,7 +229,7 @@ ExternalProject_Add(${proj}
   INSTALL_COMMAND ""
   DEPENDS
     # Mandatory dependencies
-    QtMobility
+    ${QtMobility_DEPENDS}
     # Optionnal dependencies
     ${kwstyle_DEPENDS}
     ${DCMTK_DEPENDS}