SuperBuild.cmake 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402
  1. SET(cmake_version_required "2.8")
  2. SET(cmake_version_required_dash "2-8")
  3. CMAKE_MINIMUM_REQUIRED(VERSION ${cmake_version_required})
  4. #
  5. # CTK_KWSTYLE_EXECUTABLE
  6. # DCMTK_DIR
  7. # QT_QMAKE_EXECUTABLE
  8. # VTK_DIR
  9. #
  10. #-----------------------------------------------------------------------------
  11. # Enable and setup External project global properties
  12. #
  13. INCLUDE(ExternalProject)
  14. SET(ep_base "${CMAKE_BINARY_DIR}/CMakeExternals")
  15. SET_PROPERTY(DIRECTORY PROPERTY EP_BASE ${ep_base})
  16. SET(ep_install_dir ${ep_base}/Install)
  17. SET(ep_build_dir ${ep_base}/Build)
  18. SET(ep_source_dir ${ep_base}/Source)
  19. #SET(ep_parallelism_level)
  20. SET(ep_build_shared_libs ON)
  21. SET(ep_build_testing OFF)
  22. SET(ep_common_args
  23. -DCMAKE_INSTALL_PREFIX:PATH=${ep_install_dir}
  24. -DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE}
  25. -DBUILD_TESTING:BOOL=${ep_build_testing}
  26. )
  27. # Compute -G arg for configuring external projects with the same CMake generator:
  28. IF(CMAKE_EXTRA_GENERATOR)
  29. SET(gen "${CMAKE_EXTRA_GENERATOR} - ${CMAKE_GENERATOR}")
  30. ELSE()
  31. SET(gen "${CMAKE_GENERATOR}")
  32. ENDIF()
  33. # Use this value where semi-colons are needed in ep_add args:
  34. set(sep "^^")
  35. # Find the git executable, used for custom git commands for external projects
  36. # (e.g. for QtMobility)
  37. find_program(Git_EXECUTABLE git DOC "git command line client")
  38. mark_as_advanced(Git_EXECUTABLE)
  39. if(NOT Git_EXECUTABLE)
  40. message(SEND_ERROR "Set Git_EXECUTABLE to the path of your git executable")
  41. endif()
  42. #-----------------------------------------------------------------------------
  43. # Update CMake module path
  44. #
  45. SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/CMake)
  46. #-----------------------------------------------------------------------------
  47. # Collect CTK library target dependencies
  48. #
  49. ctkMacroCollectAllTargetLibraries("${CTK_LIBS}" "Libs" ALL_TARGET_LIBRARIES)
  50. ctkMacroCollectAllTargetLibraries("${CTK_PLUGINS}" "Plugins" ALL_TARGET_LIBRARIES)
  51. ctkMacroCollectAllTargetLibraries("${CTK_APPLICATIONS}" "Applications" ALL_TARGET_LIBRARIES)
  52. #MESSAGE(STATUS ALL_TARGET_LIBRARIES:${ALL_TARGET_LIBRARIES})
  53. #-----------------------------------------------------------------------------
  54. # Initialize NON_CTK_DEPENDENCIES variable
  55. #
  56. # Using the variable ALL_TARGET_LIBRARIES initialized above with the help
  57. # of the macro ctkMacroCollectAllTargetLibraries, let's get the list of all Non-CTK dependencies.
  58. # NON_CTK_DEPENDENCIES is expected by the macro ctkMacroShouldAddExternalProject
  59. ctkMacroGetAllNonCTKTargetLibraries("${ALL_TARGET_LIBRARIES}" NON_CTK_DEPENDENCIES)
  60. #MESSAGE(STATUS NON_CTK_DEPENDENCIES:${NON_CTK_DEPENDENCIES})
  61. #-----------------------------------------------------------------------------
  62. # Qt is expected to be setup by CTK/CMakeLists.txt just before it includes the SuperBuild script
  63. #
  64. #-----------------------------------------------------------------------------
  65. # KWStyle
  66. #
  67. SET(kwstyle_DEPENDS)
  68. IF(CTK_USE_KWSTYLE)
  69. IF(NOT DEFINED CTK_KWSTYLE_EXECUTABLE)
  70. SET(proj KWStyle-CVSHEAD)
  71. SET(kwstyle_DEPENDS ${proj})
  72. ExternalProject_Add(${proj}
  73. LIST_SEPARATOR ${sep}
  74. CVS_REPOSITORY ":pserver:anoncvs:@public.kitware.com:/cvsroot/KWStyle"
  75. CVS_MODULE "KWStyle"
  76. CMAKE_GENERATOR ${gen}
  77. CMAKE_ARGS
  78. ${ep_common_args}
  79. )
  80. SET(CTK_KWSTYLE_EXECUTABLE ${ep_install_dir}/bin/KWStyle)
  81. ENDIF()
  82. ENDIF()
  83. #-----------------------------------------------------------------------------
  84. # PythonQt
  85. #
  86. SET(PythonQt_DEPENDS)
  87. ctkMacroShouldAddExternalProject(PYTHONQT_LIBRARIES add_project)
  88. IF(${add_project})
  89. # SET(proj PythonQt)
  90. # SET(PythonQt_DEPENDS ${proj})
  91. # ExternalProject_Add(${proj}
  92. # SVN_REPOSITORY "https://pythonqt.svn.sourceforge.net/svnroot/pythonqt/trunk"
  93. # CMAKE_GENERATOR ${gen}
  94. # PATCH_COMMAND ${CMAKE_COMMAND} -P ${pythonqt_patch_script}
  95. # BUILD_COMMAND ""
  96. # CMAKE_ARGS
  97. # ${ep_common_args}
  98. # -DQT_QMAKE_EXECUTABLE:FILEPATH=${QT_QMAKE_EXECUTABLE}
  99. # #${vtk_PYTHON_ARGS}
  100. # INSTALL_COMMAND "")
  101. ENDIF()
  102. #-----------------------------------------------------------------------------
  103. # Utilities/DCMTK
  104. #
  105. SET(DCMTK_DEPENDS)
  106. ctkMacroShouldAddExternalProject(DCMTK_LIBRARIES add_project)
  107. IF(${add_project})
  108. IF(NOT DEFINED DCMTK_DIR)
  109. SET(proj DCMTK)
  110. # MESSAGE(STATUS "Adding project:${proj}")
  111. SET(DCMTK_DEPENDS ${proj})
  112. ExternalProject_Add(${proj}
  113. DOWNLOAD_COMMAND ""
  114. CMAKE_GENERATOR ${gen}
  115. SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/Utilities/${proj}
  116. CMAKE_ARGS
  117. ${ep_common_args}
  118. -DDCMTK_BUILD_APPS:BOOL=ON # Build also dmctk tools (movescu, storescp, ...)
  119. )
  120. SET(DCMTK_DIR ${ep_install_dir})
  121. ENDIF()
  122. ENDIF()
  123. #-----------------------------------------------------------------------------
  124. # Utilities/ZMQ
  125. #
  126. SET(ZMQ_DEPENDS)
  127. ctkMacroShouldAddExternalProject(ZMQ_LIBRARIES add_project)
  128. IF(${add_project})
  129. SET(proj ZMQ)
  130. # MESSAGE(STATUS "Adding project:${proj}")
  131. SET(ZMQ_DEPENDS ${proj})
  132. ExternalProject_Add(${proj}
  133. DOWNLOAD_COMMAND ""
  134. INSTALL_COMMAND ""
  135. CMAKE_GENERATOR ${gen}
  136. SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/Utilities/ZMQ
  137. CMAKE_ARGS
  138. ${ep_common_args}
  139. )
  140. ENDIF()
  141. #-----------------------------------------------------------------------------
  142. # QtMobility
  143. #
  144. SET(QtMobility_DEPENDS)
  145. ctkMacroShouldAddExternalProject(QTMOBILITY_QTSERVICEFW_LIBRARIES add_project)
  146. IF(${add_project})
  147. SET(proj QtMobility)
  148. # MESSAGE(STATUS "Adding project:${proj}")
  149. SET(QtMobility_DEPENDS ${proj})
  150. # Configure patch script
  151. SET(qtmobility_src_dir ${ep_source_dir}/${proj})
  152. SET(qtmobility_patch_dir ${CTK_SOURCE_DIR}/Utilities/QtMobility/)
  153. SET(qtmobility_configured_patch_dir ${CTK_BINARY_DIR}/Utilities/QtMobility/)
  154. SET(qtmobility_patchscript
  155. ${CTK_BINARY_DIR}/Utilities/QtMobility/QtMobilityGitBranch1.0-patch.cmake)
  156. CONFIGURE_FILE(
  157. ${CTK_SOURCE_DIR}/Utilities/QtMobility/QtMobilityGitBranch1.0-patch.cmake.in
  158. ${qtmobility_patchscript} @ONLY)
  159. # Define configure options
  160. SET(qtmobility_modules "serviceframework")
  161. SET(qtmobility_build_type "release")
  162. IF(UNIX)
  163. IF(CMAKE_BUILD_TYPE STREQUAL "Debug")
  164. SET(qtmobility_build_type "debug")
  165. ENDIF()
  166. ELSEIF(NOT ${CMAKE_CFG_INTDIR} STREQUAL "Release")
  167. SET(qtmobility_build_type "debug")
  168. ENDIf()
  169. SET(qtmobility_make_cmd)
  170. IF(UNIX OR MINGW)
  171. SET(qtmobility_make_cmd make)
  172. ELSEIF(WIN32)
  173. SET(qtmobility_make_cmd nmake)
  174. ENDIF()
  175. ExternalProject_Add(${proj}
  176. GIT_REPOSITORY git://gitorious.org/qt-mobility/qt-mobility.git
  177. # the patch command is also used to checkout the 1.0 branch
  178. PATCH_COMMAND ${CMAKE_COMMAND} -P ${qtmobility_patchscript}
  179. CONFIGURE_COMMAND <SOURCE_DIR>/configure -${qtmobility_build_type} -libdir ${CMAKE_BINARY_DIR}/CTK-build/bin -no-docs -modules ${qtmobility_modules}
  180. BUILD_COMMAND ${qtmobility_make_cmd}
  181. INSTALL_COMMAND ${qtmobility_make_cmd} install
  182. BUILD_IN_SOURCE 1
  183. )
  184. ENDIF()
  185. #-----------------------------------------------------------------------------
  186. # Utilities/OpenIGTLink
  187. #
  188. SET (OpenIGTLink_DEPENDS)
  189. ctkMacroShouldAddExternalProject(OpenIGTLink_LIBRARIES add_project)
  190. IF(${add_project})
  191. IF(NOT DEFINED OpenIGTLink_DIR)
  192. SET(proj OpenIGTLink)
  193. # MESSAGE(STATUS "Adding project:${proj}")
  194. SET(OpenIGTLink_DEPENDS ${proj})
  195. ExternalProject_Add(${proj}
  196. SVN_REPOSITORY "http://svn.na-mic.org/NAMICSandBox/trunk/OpenIGTLink"
  197. INSTALL_COMMAND ""
  198. CMAKE_GENERATOR ${gen}
  199. CMAKE_ARGS
  200. ${ep_common_args}
  201. )
  202. SET(OpenIGTLink_DIR ${ep_build_dir}/${proj})
  203. ENDIF()
  204. ENDIF()
  205. #-----------------------------------------------------------------------------
  206. # VTK
  207. #
  208. SET (VTK_DEPENDS)
  209. ctkMacroShouldAddExternalProject(VTK_LIBRARIES add_project)
  210. IF(${add_project})
  211. IF(NOT DEFINED VTK_DIR)
  212. SET(proj VTK)
  213. MESSAGE(STATUS "Adding project:${proj}")
  214. SET(VTK_DEPENDS ${proj})
  215. ExternalProject_Add(${proj}
  216. GIT_REPOSITORY git://vtk.org/VTK.git
  217. INSTALL_COMMAND ""
  218. CMAKE_GENERATOR ${gen}
  219. CMAKE_ARGS
  220. ${ep_common_args}
  221. -DVTK_WRAP_TCL:BOOL=OFF
  222. -DVTK_WRAP_PYTHON:BOOL=OFF
  223. -DVTK_WRAP_JAVA:BOOL=OFF
  224. -DBUILD_SHARED_LIBS:BOOL=ON
  225. -DDESIRED_QT_VERSION:STRING=4
  226. -DVTK_USE_GUISUPPORT:BOOL=ON
  227. -DVTK_USE_QVTK_QTOPENGL:BOOL=ON
  228. -DVTK_USE_QT:BOOL=ON
  229. -DQT_QMAKE_EXECUTABLE:FILEPATH=${QT_QMAKE_EXECUTABLE}
  230. )
  231. SET(VTK_DIR ${ep_build_dir}/${proj})
  232. ENDIF()
  233. ENDIF()
  234. #-----------------------------------------------------------------------------
  235. # XIP
  236. #
  237. SET (XIP_DEPENDS)
  238. ctkMacroShouldAddExternalProject(XIP_LIBRARIES add_project)
  239. IF(${add_project})
  240. SET(proj XIP)
  241. # MESSAGE(STATUS "Adding project:${proj}")
  242. SET(XIP_DEPENDS ${proj})
  243. ExternalProject_Add(${proj}
  244. SVN_REPOSITORY "https://collab01a.scr.siemens.com/svn/xip/releases/latest"
  245. SVN_USERNAME "anonymous"
  246. INSTALL_COMMAND ""
  247. CMAKE_GENERATOR ${gen}
  248. CMAKE_ARGS
  249. ${ep_common_args}
  250. )
  251. ENDIF()
  252. #-----------------------------------------------------------------------------
  253. # CTK Utilities
  254. #
  255. set(proj CTK-Utilities)
  256. ExternalProject_Add(${proj}
  257. DOWNLOAD_COMMAND ""
  258. CONFIGURE_COMMAND ""
  259. BUILD_COMMAND ""
  260. INSTALL_COMMAND ""
  261. DEPENDS
  262. # Mandatory dependencies
  263. ${QtMobility_DEPENDS}
  264. # Optionnal dependencies
  265. ${kwstyle_DEPENDS}
  266. ${DCMTK_DEPENDS}
  267. ${PythonQt_DEPENDS}
  268. ${ZMQ_DEPENDS}
  269. ${OpenIGTLink_DEPENDS}
  270. ${VTK_DEPENDS}
  271. ${XIP_DEPENDS}
  272. )
  273. #-----------------------------------------------------------------------------
  274. # Generate cmake variable name corresponding to Libs, Plugins and Applications
  275. #
  276. SET(ctk_libs_bool_vars)
  277. FOREACH(lib ${ctk_libs})
  278. LIST(APPEND ctk_libs_bool_vars CTK_LIB_${lib})
  279. ENDFOREACH()
  280. SET(ctk_plugins_bool_vars)
  281. FOREACH(plugin ${ctk_plugins})
  282. LIST(APPEND ctk_plugins_bool_vars CTK_PLUGIN_${plugin})
  283. ENDFOREACH()
  284. SET(ctk_applications_bool_vars)
  285. FOREACH(app ${ctk_applications})
  286. LIST(APPEND ctk_applications_bool_vars CTK_APP_${app})
  287. ENDFOREACH()
  288. #-----------------------------------------------------------------------------
  289. # Convenient macro allowing to define superbuild arg
  290. #
  291. MACRO(ctk_set_superbuild_boolean_arg ctk_cmake_var)
  292. SET(superbuild_${ctk_cmake_var} ON)
  293. IF(DEFINED ${ctk_cmake_var} AND NOT ${ctk_cmake_var})
  294. SET(superbuild_${ctk_cmake_var} OFF)
  295. ENDIF()
  296. ENDMACRO()
  297. #-----------------------------------------------------------------------------
  298. # Set superbuild boolean args
  299. #
  300. SET(ctk_cmake_boolean_args
  301. BUILD_TESTING
  302. CTK_USE_KWSTYLE
  303. ${ctk_libs_bool_vars}
  304. ${ctk_plugins_bool_vars}
  305. ${ctk_applications_bool_vars}
  306. )
  307. SET(ctk_superbuild_boolean_args)
  308. FOREACH(ctk_cmake_arg ${ctk_cmake_boolean_args})
  309. ctk_set_superbuild_boolean_arg(${ctk_cmake_arg})
  310. LIST(APPEND ctk_superbuild_boolean_args -D${ctk_cmake_arg}:BOOL=${superbuild_${ctk_cmake_arg}})
  311. ENDFOREACH()
  312. #-----------------------------------------------------------------------------
  313. # CTK Configure
  314. #
  315. SET(proj CTK-Configure)
  316. ExternalProject_Add(${proj}
  317. DOWNLOAD_COMMAND ""
  318. CMAKE_GENERATOR ${gen}
  319. CMAKE_ARGS
  320. ${ctk_superbuild_boolean_args}
  321. -DCTK_SUPERBUILD:BOOL=OFF
  322. -DWITH_COVERAGE:BOOL=${WITH_COVERAGE}
  323. -DCTEST_USE_LAUNCHERS:BOOL=${CTEST_USE_LAUNCHERS}
  324. -DCTK_SUPERBUILD_BINARY_DIR:PATH=${CTK_BINARY_DIR}
  325. -DCMAKE_INSTALL_PREFIX:PATH=${ep_install_dir}
  326. -DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE}
  327. -DCTK_CXX_FLAGS:STRING=${CTK_CXX_FLAGS}
  328. -DCTK_C_FLAGS:STRING=${CTK_C_FLAGS}
  329. -DQT_QMAKE_EXECUTABLE:FILEPATH=${QT_QMAKE_EXECUTABLE}
  330. -DCTK_KWSTYLE_EXECUTABLE:FILEPATH=${CTK_KWSTYLE_EXECUTABLE}
  331. -DDCMTK_DIR:PATH=${DCMTK_DIR} # FindDCMTK expects DCMTK_DIR
  332. -DVTK_DIR:PATH=${VTK_DIR} # FindVTK expects VTK_DIR
  333. SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}
  334. BINARY_DIR ${CMAKE_BINARY_DIR}/CTK-build
  335. BUILD_COMMAND ""
  336. INSTALL_COMMAND ""
  337. DEPENDS
  338. "CTK-Utilities"
  339. )
  340. #-----------------------------------------------------------------------------
  341. # CTK
  342. #
  343. #MESSAGE(STATUS SUPERBUILD_EXCLUDE_CTKBUILD_TARGET:${SUPERBUILD_EXCLUDE_CTKBUILD_TARGET})
  344. IF(NOT DEFINED SUPERBUILD_EXCLUDE_CTKBUILD_TARGET OR NOT SUPERBUILD_EXCLUDE_CTKBUILD_TARGET)
  345. SET(proj CTK-build)
  346. ExternalProject_Add(${proj}
  347. DOWNLOAD_COMMAND ""
  348. CMAKE_GENERATOR ${gen}
  349. SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}
  350. BINARY_DIR CTK-build
  351. INSTALL_COMMAND ""
  352. DEPENDS
  353. "CTK-Configure"
  354. )
  355. ENDIF()
  356. #-----------------------------------------------------------------------------
  357. # Custom target allowing to drive the build of CTK project itself
  358. #
  359. ADD_CUSTOM_TARGET(CTK
  360. COMMAND ${CMAKE_COMMAND} --build ${CMAKE_CURRENT_BINARY_DIR}/CTK-build
  361. WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/CTK-build
  362. )