浏览代码

FindPackage and variable expanding in top-level CMakeLists.txt

Sascha Zelzer 14 年之前
父节点
当前提交
2127d1b68f

+ 1 - 1
Applications/Testing/CMakeLists.txt

@@ -1 +1 @@
-ADD_SUBDIRECTORY(Cpp)
+#ADD_SUBDIRECTORY(Cpp)

+ 2 - 1
CMake/ctkMacroBuildApp.cmake

@@ -78,7 +78,8 @@ MACRO(ctkMacroBuildApp)
   ENDFOREACH()
 
   FOREACH(dep ${ext_deps})
-    LIST(APPEND my_includes ${${dep}_INCLUDE_DIRS})
+    STRING(REPLACE "^" ";" _include_dirs "${${dep}_INCLUDE_DIRS}")
+    LIST(APPEND my_includes ${_include_dirs})
   ENDFOREACH()
 
   LIST(REMOVE_DUPLICATES my_includes)

+ 4 - 1
CMake/ctkMacroBuildLib.cmake

@@ -71,8 +71,11 @@ MACRO(ctkMacroBuildLib)
          )
   ENDFOREACH()
 
+MESSAGE("[${lib_name}] ext deps: ${ext_deps}")
   FOREACH(dep ${ext_deps})
-    LIST(APPEND my_includes ${${dep}_INCLUDE_DIRS})
+MESSAGE("[${lib_name}] ${dep}_INCLUDE_DIRS: ${${dep}_INCLUDE_DIRS}")
+    STRING(REPLACE "^" ";" _include_dirs "${${dep}_INCLUDE_DIRS}")
+    LIST(APPEND my_includes ${_include_dirs})
   ENDFOREACH()
 
   LIST(REMOVE_DUPLICATES my_includes)

+ 2 - 1
CMake/ctkMacroBuildPlugin.cmake

@@ -113,7 +113,8 @@ MACRO(ctkMacroBuildPlugin)
 
   FOREACH(dep ${ext_deps})
 MESSAGE("Adding ext include path for ${dep}: ${${dep}_INCLUDE_DIRS}")
-    LIST(APPEND my_includes ${${dep}_INCLUDE_DIRS})
+    STRING(REPLACE "^" ";" _include_dirs "${${dep}_INCLUDE_DIRS}")
+    LIST(APPEND my_includes ${_include_dirs})
   ENDFOREACH()
 
   LIST(REMOVE_DUPLICATES my_includes)

+ 15 - 1
CMake/ctkMacroValidateBuildOptions.cmake

@@ -84,6 +84,7 @@ MACRO(ctkMacroValidateBuildOptions dir executable target_directories)
       )
   ENDFOREACH()
 
+  SET(EXTERNAL_TARGETS ) # This is used in CMakeLists.txt
   FOREACH(target_info ${target_directories_with_target_name})
 
     # extract target_dir and option_name
@@ -138,10 +139,19 @@ MACRO(ctkMacroValidateBuildOptions dir executable target_directories)
       LIST(APPEND ${target_project_name}_DEPENDENCIES ${dep_path_list})
 
       #MESSAGE("path for ${target_project_name} is: ${dep_path_list}")
-        
+
       # Check if all CTK targets included in the dependency path are enabled
       SET(ctk_dep_path_list )
+      SET(ext_dep_path_list ${dep_path_list})
       ctkMacroGetAllCTKTargetLibraries("${dep_path_list}" ctk_dep_path_list)
+      IF(ctk_dep_path_list)
+        LIST(REMOVE_ITEM ext_dep_path_list ${ctk_dep_path_list})
+      ENDIF()
+
+      IF(ext_dep_path_list)
+        LIST(APPEND EXTERNAL_TARGETS ${ext_dep_path_list})
+      ENDIF()
+
       FOREACH(dep ${ctk_dep_path_list})
         ctkMacroGetOptionName("${target_directories_with_target_name}" ${dep} dep_option)
         IF(NOT ${${dep_option}})
@@ -154,5 +164,9 @@ MACRO(ctkMacroValidateBuildOptions dir executable target_directories)
     
   ENDFOREACH()
 
+  IF(EXTERNAL_TARGETS)
+    LIST(REMOVE_DUPLICATES EXTERNAL_TARGETS)
+  ENDIF()
+
   #MESSAGE(STATUS "Validated: CTK_LIB_*, CTK_PLUGIN_*, CTK_APP_*")
 ENDMACRO()

+ 5 - 0
CMakeExternals/DCMTK.cmake

@@ -10,6 +10,8 @@ IF(${add_project})
   IF(DEFINED DCMTK_DIR AND NOT EXISTS ${DCMTK_DIR})
     MESSAGE(FATAL_ERROR "DCMTK_DIR variable is defined but corresponds to non-existing directory")
   ENDIF()
+
+  SET(DCMTK_enabling_variable DCMTK_LIBRARIES)
   
   SET(proj DCMTK)
   SET(proj_DEPENDENCIES)
@@ -45,4 +47,7 @@ IF(${add_project})
   ELSE()
     ctkMacroEmptyExternalProject(${proj} "${proj_DEPENDENCIES}")
   ENDIF()
+
+  SET(${DCMTK_enabling_variable}_INCLUDE_DIRS DCMTK_INCLUDE_DIR)
+  SET(${DCMTK_enabling_variable}_FIND_PACKAGE_CMD DCMTK)
 ENDIF()

+ 5 - 9
CMakeExternals/Log4Qt.cmake

@@ -2,14 +2,15 @@
 # Log4Qt
 #
 SET(Log4Qt_DEPENDS)
-SET(Log4Qt_enabling_variable Log4Qt_LIBRARIES)
-ctkMacroShouldAddExternalProject(${Log4Qt_enabling_variable} add_project)
+ctkMacroShouldAddExternalProject(Log4Qt_LIBRARIES add_project)
 IF(${add_project})
 
   # Sanity checks
   IF(DEFINED Log4Qt_DIR AND NOT EXISTS ${Log4Qt_DIR})
     MESSAGE(FATAL_ERROR "Log4Qt_DIR variable is defined but corresponds to non-existing directory")
   ENDIF()
+
+  SET(Log4Qt_enabling_variable Log4Qt_LIBRARIES)
   
   SET(proj Log4Qt)
   SET(proj_DEPENDENCIES)
@@ -30,7 +31,6 @@ IF(${add_project})
         ${proj_DEPENDENCIES}
       )
     SET(Log4Qt_DIR ${ep_install_dir})
-    SET(Log4Qt_FOUND 1)
     
     # Since Log4Qt is statically build, there is not need to add its corresponding 
     # library output directory to CTK_EXTERNAL_LIBRARY_DIRS
@@ -39,11 +39,7 @@ IF(${add_project})
     ctkMacroEmptyExternalProject(${proj} "${proj_DEPENDENCIES}")
   ENDIF()
 
-  FIND_PACKAGE(Log4Qt)
-  IF(NOT Log4Qt_FOUND)
-    MESSAGE(FATAL_ERROR "error: Log4Qt package is required" )
-  ELSE()
-    SET(${Log4Qt_enabling_variable}_INCLUDE_DIRS ${Log4Qt_INCLUDE_DIR})
-  ENDIF()
+  SET(${Log4Qt_enabling_variable}_INCLUDE_DIRS Log4Qt_INCLUDE_DIR)
+  SET(${Log4Qt_enabling_variable}_FIND_PACKAGE_CMD Log4Qt)
 
 ENDIF()

+ 5 - 0
CMakeExternals/PythonQt.cmake

@@ -9,6 +9,8 @@ IF(${add_project})
   IF(DEFINED PYTHONQT_INSTALL_DIR AND NOT EXISTS ${PYTHONQT_INSTALL_DIR})
     MESSAGE(FATAL_ERROR "PYTHONQT_INSTALL_DIR variable is defined but corresponds to non-existing directory")
   ENDIF()
+
+  SET(PythonQt_enabling_variable PYTHONQT_LIBRARIES)
   
   SET(proj PythonQt)
   SET(proj_DEPENDENCIES)
@@ -53,4 +55,7 @@ IF(${add_project})
   ELSE()
     ctkMacroEmptyExternalProject(${proj} "${proj_DEPENDENCIES}")
   ENDIF()
+
+  SET(${PythonQt_enabling_variable}_INCLUDE_DIRS PYTHONQT_INCLUDE_DIR PYTHON_INCLUDE_DIRS)
+  SET(${PythonQt_enabling_variable}_FIND_PACKAGE_CMD PythonQt)
 ENDIF()

+ 2 - 2
CMakeExternals/QtMobility.cmake

@@ -2,9 +2,9 @@
 # QtMobility
 #
 SET(QtMobility_DEPENDS)
-SET(QtMobility_enabling_variable QTMOBILITY_QTSERVICEFW_LIBRARIES)
-ctkMacroShouldAddExternalProject(${QtMobility_enabling_variable} add_project)
+ctkMacroShouldAddExternalProject(QTMOBILITY_QTSERVICEFW_LIBRARIES add_project)
 IF(${add_project})
+  SET(QtMobility_enabling_variable QTMOBILITY_QTSERVICEFW_LIBRARIES)
   SET(proj QtMobility)
 #   MESSAGE(STATUS "Adding project:${proj}")
   SET(QtMobility_DEPENDS ${proj})

+ 5 - 0
CMakeExternals/VTK.cmake

@@ -8,6 +8,8 @@ IF(${add_project})
   IF(DEFINED VTK_DIR AND NOT EXISTS ${VTK_DIR})
     MESSAGE(FATAL_ERROR "VTK_DIR variable is defined but corresponds to non-existing directory")
   ENDIF()
+
+  SET(VTK_enabling_variable VTK_LIBRARIES)
   
   SET(additional_vtk_cmakevars )
   IF(MINGW)
@@ -49,5 +51,8 @@ IF(${add_project})
   ELSE()
     ctkMacroEmptyExternalProject(${proj} "${proj_DEPENDENCIES}")
   ENDIF()
+
+  SET(${VTK_enabling_variable}_INCLUDE_DIRS VTK_INCLUDE_DIRS)
+  SET(${VTK_enabling_variable}_FIND_PACKAGE_CMD VTK)
 ENDIF()
 

+ 8 - 3
CMakeExternals/ZMQ.cmake

@@ -9,6 +9,8 @@ IF(${add_project})
   IF(DEFINED ZMQ_DIR AND NOT EXISTS ${ZMQ_DIR})
     MESSAGE(FATAL_ERROR "ZMQ_DIR variable is defined but corresponds to non-existing directory")
   ENDIF()
+
+  SET(ZMQ_enabling_variable ZMQ_LIBRARIES)
   
   SET(proj ZMQ)
   SET(proj_DEPENDENCIES)
@@ -29,9 +31,12 @@ IF(${add_project})
 		  DEPENDS
 		    ${proj_DEPENDENCIES}
       )
-	  SET(ZMQ_DIR ${ep_build_dir}/${proj})
+    SET(ZMQ_DIR ${ep_build_dir}/${proj})
 	
-	ELSE()
+  ELSE()
     ctkMacroEmptyExternalProject(${proj} "${proj_DEPENDENCIES}")
-	ENDIF()
+  ENDIF()
+
+  SET(${ZMQ_enabling_variable}_INCLUDE_DIRS ZMQ_INCLUDE_DIRS)
+  SET(${ZMQ_enabling_variable}_FIND_PACKAGE_CMD ZMQ)
 ENDIF()

+ 37 - 0
CMakeLists.txt

@@ -498,6 +498,43 @@ IF(CTK_SUPERBUILD)
 ENDIF()
 
 #-----------------------------------------------------------------------------
+# Expand variables containing include directories for external projects
+# This relies on the variable EXTERNAL_TARGETS set in ctkMacroValidateBuildOptions
+FOREACH(_external_target ${EXTERNAL_TARGETS})
+  IF(${_external_target}_FIND_PACKAGE_CMD)
+MESSAGE("Calling FIND_PACKAGE(${${_external_target}_FIND_PACKAGE_CMD})")
+    FIND_PACKAGE(${${_external_target}_FIND_PACKAGE_CMD})
+  ENDIF()
+ENDFOREACH()
+
+FOREACH(_external_target ${EXTERNAL_TARGETS})
+  IF(${_external_target}_INCLUDE_DIRS)
+  STRING(REPLACE "^" ";" _include_variable_list "${${_external_target}_INCLUDE_DIRS}")
+  IF(_include_variable_list)
+MESSAGE("[${_external_target}] Resolving include variables: ${${_external_target}_INCLUDE_DIRS}")
+    #LIST(LENGTH _include_variable_list _list_length)
+    SET(${_external_target}_INCLUDE_DIRS "")
+    #IF(_list_length GREATER 1)
+      FOREACH(_include_variable ${_include_variable_list})
+        #SET(${_external_target}_INCLUDE_DIRS
+        #    "${${_external_target}_INCLUDE_DIRS}^${${_include_variable}}")
+MESSAGE("[${_external_target}] Appending ${${_include_variable}}")
+        IF(${_include_variable})
+          LIST(APPEND ${_external_target}_INCLUDE_DIRS ${${_include_variable}})
+        ELSE()
+          LIST(APPEND ${_external_target}_INCLUDE_DIRS ${_include_variable})
+        ENDIF()
+MESSAGE("[${_external_target}] New dirs: ${${_external_target}_INCLUDE_DIRS}")
+      ENDFOREACH()
+MESSAGE("[${_external_target}] Appended dirs: ${${_external_target}_INCLUDE_DIRS}")
+    #ELSE()
+    #  SET(${_external_target}_INCLUDE_DIRS ${_include_variable_list})
+    #ENDIF()
+  ENDIF()
+  ENDIF()
+ENDFOREACH()
+
+#-----------------------------------------------------------------------------
 # CTK_SUPERBUILD_BINARY_DIR
 
 # If CTK_SUPERBUILD_BINARY_DIR isn't defined, it means CTK is *NOT* build using Superbuild.

+ 0 - 4
Libs/Core/CMakeLists.txt

@@ -6,10 +6,6 @@ SET(CMAKE_MODULE_PATH ${CTKCore_SOURCE_DIR}/CMake ${CMAKE_MODULE_PATH})
 # CMake Macros
 INCLUDE(CMake/ctkMacroBFDCheck.cmake)
 
-FIND_PACKAGE(Log4Qt)
-if (NOT Log4Qt_FOUND)
-  MESSAGE(FATAL_ERROR "error: Log4Qt package is required to build ${PROJECT_NAME}" )
-endif()
 #
 # See CTK/CMake/ctkMacroBuildLib.cmake for details
 #

+ 0 - 10
Libs/DICOM/Core/CMakeLists.txt

@@ -1,15 +1,6 @@
 PROJECT(CTKDICOMCore)
 
 #
-# 3rd party dependencies
-#
-
-FIND_PACKAGE(DCMTK)
-IF(NOT DCMTK_FOUND)
-  MESSAGE(FATAL_ERROR "error: DCMTK package is required to build ${PROJECT_NAME}")
-ENDIF()
-
-#
 # See CTK/CMake/ctkMacroBuildLib.cmake for details
 #
 
@@ -17,7 +8,6 @@ SET(KIT_export_directive "CTK_DICOM_CORE_EXPORT")
 
 # Additional directories to include
 SET(KIT_include_directories
-  ${DCMTK_INCLUDE_DIR}
   )
   
 # Source files

+ 0 - 10
Libs/Scripting/Python/Core/CMakeLists.txt

@@ -1,13 +1,5 @@
 PROJECT(CTKScriptingPythonCore)
 
-#
-# 3rd party dependencies
-#
-
-FIND_PACKAGE(PythonQt)
-IF(NOT PYTHONQT_FOUND)
-  MESSAGE(FATAL_ERROR "error: PythonQt package is required to build ${PROJECT_NAME}")
-ENDIF()
 
 #
 # See CTK/CMake/ctkMacroBuildLib.cmake for details
@@ -17,8 +9,6 @@ SET(KIT_export_directive "CTK_SCRIPTING_PYTHON_CORE_EXPORT")
 
 # Additional directories to include
 SET(KIT_include_directories
-  ${PYTHON_INCLUDE_DIRS}
-  ${PYTHONQT_INCLUDE_DIR}
   )
   
 # Source files

+ 0 - 5
Libs/Visualization/VTK/Core/CMakeLists.txt

@@ -3,11 +3,6 @@ PROJECT(CTKVisualizationVTKCore)
 #
 # 3rd party dependencies
 #
-
-FIND_PACKAGE(VTK)
-IF(NOT VTK_FOUND)
-  MESSAGE(FATAL_ERROR "error: VTK package is required to build ${PROJECT_NAME}")
-ENDIF()
 INCLUDE(${VTK_USE_FILE})
 
 #

+ 11 - 1
SuperBuild.cmake

@@ -129,8 +129,18 @@ SET(dependency_args )
 FOREACH(p ${external_projects})
   INCLUDE(CMakeExternals/${p}.cmake)
   IF(${p}_enabling_variable)
+    # Provide the include directories either directly or provide the variable name
+    # used by the corresponding Find<package>.cmake files. 
+    # The top-level CMakeLists.txt file will expand the variable names if not in
+    # superbuild mode. The include dirs are then used in 
+    # ctkMacroBuildApp, ctkMacroBuildLib, and ctkMacroBuildPlugin
+    STRING(REPLACE ";" "^" _include_dirs "${${${p}_enabling_variable}_INCLUDE_DIRS}")
     LIST(APPEND dependency_args 
-      "-D${${p}_enabling_variable}_INCLUDE_DIRS:STRING=${${${p}_enabling_variable}_INCLUDE_DIRS}")
+         -D${${p}_enabling_variable}_INCLUDE_DIRS:STRING=${_include_dirs})
+    IF(${${p}_enabling_variable}_FIND_PACKAGE_CMD)
+      LIST(APPEND dependency_args
+           -D${${p}_enabling_variable}_FIND_PACKAGE_CMD:STRING=${${${p}_enabling_variable}_FIND_PACKAGE_CMD})
+    ENDIF()
   ENDIF()
 ENDFOREACH()