SuperBuild.cmake 13 KB

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