SuperBuild.cmake 14 KB

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