SuperBuild.cmake 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. ###########################################################################
  2. #
  3. # Library: CTK
  4. #
  5. # Copyright (c) Kitware Inc.
  6. #
  7. # Licensed under the Apache License, Version 2.0 (the "License");
  8. # you may not use this file except in compliance with the License.
  9. # You may obtain a copy of the License at
  10. #
  11. # http://www.apache.org/licenses/LICENSE-2.0.txt
  12. #
  13. # Unless required by applicable law or agreed to in writing, software
  14. # distributed under the License is distributed on an "AS IS" BASIS,
  15. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  16. # See the License for the specific language governing permissions and
  17. # limitations under the License.
  18. #
  19. ###########################################################################
  20. #-----------------------------------------------------------------------------
  21. # WARNING - No change should be required after this comment
  22. # when you are adding a new external project dependency.
  23. #-----------------------------------------------------------------------------
  24. #-----------------------------------------------------------------------------
  25. # The CTK_EXTERNAL_LIBRARY_DIRS variable stores
  26. # the library output directory associated with the different external project
  27. # It's then used in CMake/LastConfigureStep/CTKGenerateCTKConfig.cmake to
  28. # configure CTKConfig.cmake.in
  29. # This variable would then be exposed to project building against CTK
  30. #-----------------------------------------------------------------------------
  31. # Make sure ${CTK_BINARY_DIR}/CTK-build/bin exists
  32. # May be used by some external project to install libs
  33. if(NOT EXISTS ${CTK_BINARY_DIR}/CTK-build/bin)
  34. file(MAKE_DIRECTORY ${CTK_BINARY_DIR}/CTK-build/bin)
  35. endif()
  36. #-----------------------------------------------------------------------------
  37. # Qt is expected to be setup by CTK/CMakeLists.txt just before it includes the SuperBuild script
  38. #
  39. #-----------------------------------------------------------------------------
  40. # Attempt to discover Doxygen so that DOXYGEN_EXECUTABLE is set to an appropriate default value
  41. #
  42. find_package(Doxygen QUIET)
  43. #-----------------------------------------------------------------------------
  44. # Generate cmake variable name corresponding to Libs, Plugins and Applications
  45. #
  46. set(ctk_libs_bool_vars)
  47. foreach(lib ${CTK_LIBS})
  48. list(APPEND ctk_libs_bool_vars CTK_LIB_${lib})
  49. endforeach()
  50. set(ctk_plugins_bool_vars)
  51. foreach(plugin ${CTK_PLUGINS})
  52. list(APPEND ctk_plugins_bool_vars CTK_PLUGIN_${plugin})
  53. endforeach()
  54. set(ctk_applications_bool_vars)
  55. foreach(app ${CTK_APPS})
  56. list(APPEND ctk_applications_bool_vars CTK_APP_${app})
  57. endforeach()
  58. #-----------------------------------------------------------------------------
  59. # Set superbuild boolean args
  60. #
  61. set(ctk_cmake_boolean_args
  62. BUILD_TESTING
  63. CTK_BUILD_ALL
  64. CTK_BUILD_ALL_APPS
  65. CTK_BUILD_ALL_LIBRARIES
  66. CTK_BUILD_ALL_PLUGINS
  67. CTK_BUILD_QTDESIGNER_PLUGINS
  68. CTK_USE_QTTESTING
  69. CTK_USE_KWSTYLE
  70. CTK_USE_CONTRIBUTED_PLUGINS
  71. WITH_COVERAGE
  72. DOCUMENTATION_TARGET_IN_ALL
  73. CTK_WRAP_PYTHONQT_FULL
  74. CTK_ENABLE_Python_Wrapping
  75. ${ctk_lib_options_list}
  76. )
  77. set(ctk_superbuild_boolean_args)
  78. foreach(ctk_cmake_arg ${ctk_cmake_boolean_args})
  79. list(APPEND ctk_superbuild_boolean_args -D${ctk_cmake_arg}:BOOL=${${ctk_cmake_arg}})
  80. endforeach()
  81. foreach(ctk_cmake_arg ${ctk_libs_bool_vars} ${ctk_plugins_bool_vars} ${ctk_applications_bool_vars})
  82. # Use the cached value of the option in case the current value has been
  83. # overridden by a "CTK_BUILD_ALL" option.
  84. get_property(arg_value CACHE ${ctk_cmake_arg} PROPERTY VALUE)
  85. list(APPEND ctk_superbuild_boolean_args -D${ctk_cmake_arg}:BOOL=${arg_value})
  86. endforeach()
  87. # message("CMake boolean args:")
  88. # foreach(arg ${ctk_superbuild_boolean_args})
  89. # message(" ${arg}")
  90. # endforeach()
  91. #-----------------------------------------------------------------------------
  92. # Expand superbuild external project args
  93. #
  94. set(CTK_SUPERBUILD_EP_ARGS)
  95. set(CTK_SUPERBUILD_EP_VARNAMES)
  96. foreach(arg ${CTK_SUPERBUILD_EP_VARS})
  97. string(REPLACE ":" ";" varname_and_vartype ${arg})
  98. set(target_info_list ${target_info_list})
  99. list(GET varname_and_vartype 0 _varname)
  100. list(GET varname_and_vartype 1 _vartype)
  101. list(APPEND CTK_SUPERBUILD_EP_ARGS -D${_varname}:${_vartype}=${${_varname}})
  102. list(APPEND CTK_SUPERBUILD_EP_VARNAMES ${_varname})
  103. endforeach()
  104. string(REPLACE ";" "^" CTK_SUPERBUILD_EP_VARNAMES "${CTK_SUPERBUILD_EP_VARNAMES}")
  105. # message("CMake external project args:")
  106. # foreach(arg ${CTK_SUPERBUILD_EP_ARGS})
  107. # message(" ${arg}")
  108. # endforeach()
  109. #-----------------------------------------------------------------------------
  110. if(CTK_USE_CONTRIBUTED_PLUGINS)
  111. list(APPEND CTK_SUPERBUILD_EP_ARGS
  112. -DExternalProjectsContrib_DIR:STRING=${ExternalProjectsContrib_DIR}
  113. -DPluginsContrib_DIR:STRING=${PluginsContrib_DIR}
  114. )
  115. endif()
  116. #-----------------------------------------------------------------------------
  117. # CTK Configure
  118. #
  119. set(proj CTK-Configure)
  120. ExternalProject_Add(${proj}
  121. DOWNLOAD_COMMAND ""
  122. CMAKE_GENERATOR ${gen}
  123. CMAKE_ARGS
  124. -DCTK_SUPERBUILD:BOOL=OFF
  125. -DCTK_SUPERBUILD_BINARY_DIR:PATH=${CTK_BINARY_DIR}
  126. ${ctk_superbuild_boolean_args}
  127. -DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE}
  128. -DCMAKE_C_COMPILER:FILEPATH=${CMAKE_C_COMPILER}
  129. -DCMAKE_CXX_COMPILER:FILEPATH=${CMAKE_CXX_COMPILER}
  130. -DCMAKE_CXX_FLAGS_INIT:STRING=${CMAKE_CXX_FLAGS_INIT}
  131. -DCMAKE_C_FLAGS_INIT:STRING=${CMAKE_C_FLAGS_INIT}
  132. -DADDITIONAL_C_FLAGS:STRING=${ADDITIONAL_C_FLAGS}
  133. -DADDITIONAL_CXX_FLAGS:STRING=${ADDITIONAL_CXX_FLAGS}
  134. -DCMAKE_INSTALL_PREFIX:PATH=${ep_install_dir}
  135. -DCTK_BUILD_SHARED_LIBS:BOOL=${CTK_BUILD_SHARED_LIBS}
  136. ${CMAKE_OSX_EXTERNAL_PROJECT_ARGS}
  137. -DDOCUMENTATION_ARCHIVES_OUTPUT_DIRECTORY:PATH=${DOCUMENTATION_ARCHIVES_OUTPUT_DIRECTORY}
  138. -DDOXYGEN_EXECUTABLE:FILEPATH=${DOXYGEN_EXECUTABLE}
  139. -DCTK_CMAKE_ARCHIVE_OUTPUT_DIRECTORY:PATH=${CTK_CMAKE_ARCHIVE_OUTPUT_DIRECTORY}
  140. -DCTK_CMAKE_LIBRARY_OUTPUT_DIRECTORY:PATH=${CTK_CMAKE_LIBRARY_OUTPUT_DIRECTORY}
  141. -DCTK_CMAKE_RUNTIME_OUTPUT_DIRECTORY:PATH=${CTK_CMAKE_RUNTIME_OUTPUT_DIRECTORY}
  142. -DCTK_INSTALL_BIN_DIR:STRING=${CTK_INSTALL_BIN_DIR}
  143. -DCTK_INSTALL_LIB_DIR:STRING=${CTK_INSTALL_LIB_DIR}
  144. -DCTK_INSTALL_QTPLUGIN_DIR:STRING=${CTK_INSTALL_QTPLUGIN_DIR}
  145. -DCTK_INSTALL_INCLUDE_DIR:STRING=${CTK_INSTALL_INCLUDE_DIR}
  146. -DCTK_INSTALL_DOC_DIR:STRING=${CTK_INSTALL_DOC_DIR}
  147. -DCTK_EXTERNAL_LIBRARY_DIRS:STRING=${CTK_EXTERNAL_LIBRARY_DIRS}
  148. -DQT_QMAKE_EXECUTABLE:FILEPATH=${QT_QMAKE_EXECUTABLE}
  149. ${CTK_SUPERBUILD_EP_ARGS}
  150. -DCTK_SUPERBUILD_EP_VARNAMES:STRING=${CTK_SUPERBUILD_EP_VARNAMES}
  151. SOURCE_DIR ${CTK_SOURCE_DIR}
  152. BINARY_DIR ${CTK_BINARY_DIR}/CTK-build
  153. BUILD_COMMAND ""
  154. INSTALL_COMMAND ""
  155. DEPENDS
  156. ${CTK_DEPENDENCIES}
  157. )
  158. if(CMAKE_GENERATOR MATCHES ".*Makefiles.*")
  159. set(ctk_build_cmd "$(MAKE)")
  160. else()
  161. set(ctk_build_cmd ${CMAKE_COMMAND} --build ${CTK_BINARY_DIR}/CTK-build --config ${CMAKE_CFG_INTDIR})
  162. endif()
  163. #-----------------------------------------------------------------------------
  164. # CTK
  165. #
  166. #message(STATUS SUPERBUILD_EXCLUDE_CTKBUILD_TARGET:${SUPERBUILD_EXCLUDE_CTKBUILD_TARGET})
  167. if(NOT DEFINED SUPERBUILD_EXCLUDE_CTKBUILD_TARGET OR NOT SUPERBUILD_EXCLUDE_CTKBUILD_TARGET)
  168. set(CTKBUILD_TARGET_ALL_OPTION "ALL")
  169. else()
  170. set(CTKBUILD_TARGET_ALL_OPTION "")
  171. endif()
  172. add_custom_target(CTK-build ${CTKBUILD_TARGET_ALL_OPTION}
  173. COMMAND ${ctk_build_cmd}
  174. WORKING_DIRECTORY ${CTK_BINARY_DIR}/CTK-build
  175. )
  176. add_dependencies(CTK-build CTK-Configure)
  177. #-----------------------------------------------------------------------------
  178. # Custom target allowing to drive the build of CTK project itself
  179. #
  180. add_custom_target(CTK
  181. COMMAND ${ctk_build_cmd}
  182. WORKING_DIRECTORY ${CTK_BINARY_DIR}/CTK-build
  183. )