ctkMacroCheckExternalProjectDependency.cmake 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529
  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. include(CMakeParseArguments)
  21. include(ctkListToString)
  22. # Use this value where semi-colons are needed in ep_add args:
  23. set(sep "^^")
  24. if(NOT EXISTS "${EXTERNAL_PROJECT_DIR}")
  25. set(EXTERNAL_PROJECT_DIR ${${CMAKE_PROJECT_NAME}_SOURCE_DIR}/SuperBuild)
  26. endif()
  27. if(NOT DEFINED EXTERNAL_PROJECT_FILE_PREFIX)
  28. set(EXTERNAL_PROJECT_FILE_PREFIX "External_")
  29. endif()
  30. #
  31. # superbuild_include_once()
  32. #
  33. # superbuild_include_once() is a macro intented to be used as include guard.
  34. #
  35. # It ensures that the CMake code placed after the include guard in a CMake file included
  36. # using either 'include(/path/to/file.cmake)' or 'include(cmake_module)' will be executed
  37. # once.
  38. #
  39. # It internally set the global property '<CMAKE_CURRENT_LIST_FILENAME>_FILE_INCLUDED' to check if
  40. # a file has already been included.
  41. #
  42. macro(superbuild_include_once)
  43. # Make sure this file is included only once
  44. get_filename_component(CMAKE_CURRENT_LIST_FILENAME ${CMAKE_CURRENT_LIST_FILE} NAME_WE)
  45. set(_property_name ${CMAKE_CURRENT_LIST_FILENAME}_FILE_INCLUDED)
  46. get_property(${_property_name} GLOBAL PROPERTY ${_property_name})
  47. if(${_property_name})
  48. return()
  49. endif()
  50. set_property(GLOBAL PROPERTY ${_property_name} 1)
  51. endmacro()
  52. #!
  53. #! mark_as_superbuild(<varname1>[:<vartype1>] [<varname2>[:<vartype2>] [...]])
  54. #!
  55. #! mark_as_superbuild(
  56. #! VARS <varname1>[:<vartype1>] [<varname2>[:<vartype2>] [...]]
  57. #! [PROJECT <projectname>]
  58. #! [LABELS <label1> [<label2> [...]]]
  59. #! [CMAKE_CMD]
  60. #! )
  61. #!
  62. #! PROJECT corresponds to a <projectname> that will be added using 'ExternalProject_Add' function.
  63. #! If not specified and called within a project file, it defaults to the value of 'SUPERBUILD_TOPLEVEL_PROJECT'
  64. #! Otherwise, it defaults to 'CMAKE_PROJECT_NAME'.
  65. #!
  66. #! VARS is an expected list of variables specified as <varname>:<vartype> to pass to <projectname>
  67. #!
  68. #!
  69. #! LABELS is an optional list of label to associate with the variable names specified using 'VARS' and passed to
  70. #! the <projectname> as CMake CACHE args of the form:
  71. #! -D<projectname>_EP_LABEL_<label1>=<varname1>;<varname2>[...]
  72. #! -D<projectname>_EP_LABEL_<label2>=<varname1>;<varname2>[...]
  73. #!
  74. function(mark_as_superbuild)
  75. set(options CMAKE_CMD)
  76. set(oneValueArgs PROJECT)
  77. set(multiValueArgs VARS LABELS)
  78. cmake_parse_arguments(_sb "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
  79. set(_vars ${_sb_UNPARSED_ARGUMENTS})
  80. set(_named_parameters_expected 0)
  81. if(_sb_PROJECT OR _sb_LABELS OR _sb_VARS)
  82. set(_named_parameters_expected 1)
  83. set(_vars ${_sb_VARS})
  84. endif()
  85. if(_named_parameters_expected AND _sb_UNPARSED_ARGUMENTS)
  86. message(FATAL_ERROR "Arguments '${_sb_UNPARSED_ARGUMENTS}' should be associated with VARS parameter !")
  87. endif()
  88. foreach(var ${_vars})
  89. set(_type_specified 0)
  90. if(${var} MATCHES ":")
  91. set(_type_specified 1)
  92. endif()
  93. # XXX Display warning with variable type is also specified for cache variable.
  94. set(_var ${var})
  95. if(NOT _type_specified)
  96. get_property(_type_set_in_cache CACHE ${_var} PROPERTY TYPE SET)
  97. set(_var_name ${_var})
  98. set(_var_type "STRING")
  99. if(_type_set_in_cache)
  100. get_property(_var_type CACHE ${_var_name} PROPERTY TYPE)
  101. endif()
  102. set(_var ${_var_name}:${_var_type})
  103. endif()
  104. list(APPEND _vars_with_type ${_var})
  105. endforeach()
  106. if(_sb_CMAKE_CMD)
  107. set(optional_arg_CMAKE_CMD "CMAKE_CMD")
  108. endif()
  109. _sb_append_to_cmake_args(VARS ${_vars_with_type} PROJECT ${_sb_PROJECT} LABELS ${_sb_LABELS} ${optional_arg_CMAKE_CMD})
  110. endfunction()
  111. #!
  112. #! _sb_extract_varname_and_vartype(<cmake_varname_and_type> <varname_var> [<vartype_var>])
  113. #!
  114. #! <cmake_varname_and_type> corresponds to variable name and variable type passed as "<varname>:<vartype>"
  115. #!
  116. #! <varname_var> will be set to "<varname>"
  117. #!
  118. #! <vartype_var> is an optional variable name that will be set to "<vartype>"
  119. function(_sb_extract_varname_and_vartype cmake_varname_and_type varname_var)
  120. set(_vartype_var ${ARGV2})
  121. string(REPLACE ":" ";" varname_and_vartype ${cmake_varname_and_type})
  122. list(GET varname_and_vartype 0 _varname)
  123. list(GET varname_and_vartype 1 _vartype)
  124. set(${varname_var} ${_varname} PARENT_SCOPE)
  125. if(_vartype_var MATCHES ".+")
  126. set(${_vartype_var} ${_vartype} PARENT_SCOPE)
  127. endif()
  128. endfunction()
  129. #!
  130. #! _sb_cmakevar_to_cmakearg(<cmake_varname_and_type> <cmake_arg_var> <cmake_arg_type> [<varname_var> [<vartype_var>]])
  131. #!
  132. #! <cmake_varname_and_type> corresponds to variable name and variable type passed as "<varname>:<vartype>"
  133. #!
  134. #! <cmake_arg_var> is a variable name that will be set to "-D<varname>:<vartype>=${<varname>}"
  135. #!
  136. #! <cmake_arg_type> is set to either CMAKE_CACHE or CMAKE_CMD.
  137. #! CMAKE_CACHE means that the generated cmake argument will be passed to
  138. #! ExternalProject_Add as CMAKE_CACHE_ARGS.
  139. #! CMAKE_CMD means that the generated cmake argument will be passed to
  140. #! ExternalProject_Add as CMAKE_ARGS.
  141. #!
  142. #! <varname_var> is an optional variable name that will be set to "<varname>"
  143. #!
  144. #! <vartype_var> is an optional variable name that will be set to "<vartype>"
  145. function(_sb_cmakevar_to_cmakearg cmake_varname_and_type cmake_arg_var cmake_arg_type)
  146. set(_varname_var ${ARGV3})
  147. set(_vartype_var ${ARGV4})
  148. # XXX Add check for <cmake_arg_type> value
  149. _sb_extract_varname_and_vartype(${cmake_varname_and_type} _varname _vartype)
  150. set(_var_value "${${_varname}}")
  151. get_property(_value_set_in_cache CACHE ${_varname} PROPERTY VALUE SET)
  152. if(_value_set_in_cache)
  153. get_property(_var_value CACHE ${_varname} PROPERTY VALUE)
  154. endif()
  155. if(cmake_arg_type STREQUAL "CMAKE_CMD")
  156. # Separate list item with <sep>
  157. set(ep_arg_as_string "")
  158. ctk_list_to_string(${sep} "${_var_value}" _var_value)
  159. endif()
  160. set(${cmake_arg_var} -D${_varname}:${_vartype}=${_var_value} PARENT_SCOPE)
  161. if(_varname_var MATCHES ".+")
  162. set(${_varname_var} ${_varname} PARENT_SCOPE)
  163. endif()
  164. if(_vartype_var MATCHES ".+")
  165. set(${_vartype_var} ${_vartype} PARENT_SCOPE)
  166. endif()
  167. endfunction()
  168. #!
  169. #! _sb_append_to_cmake_args(
  170. #! VARS <varname1>:<vartype1> [<varname2>:<vartype2> [...]]
  171. #! [PROJECT <projectname>]
  172. #! [LABELS <label1> [<label2> [...]]]
  173. #! [CMAKE_CMD]
  174. #! )
  175. #!
  176. #! PROJECT corresponds to a <projectname> that will be added using 'ExternalProject_Add' function.
  177. #! If not specified and called within a project file, it defaults to the value of 'SUPERBUILD_TOPLEVEL_PROJECT'
  178. #! Otherwise, it defaults to 'CMAKE_PROJECT_NAME'.
  179. #!
  180. #! VARS is an expected list of variables specified as <varname>:<vartype> to pass to <projectname>
  181. #!
  182. #!
  183. #! LABELS is an optional list of label to associate with the variable names specified using 'VARS' and passed to
  184. #! the <projectname> as CMake CACHE args of the form:
  185. #! -D<projectname>_EP_LABEL_<label1>=<varname1>;<varname2>[...]
  186. #! -D<projectname>_EP_LABEL_<label2>=<varname1>;<varname2>[...]
  187. #!
  188. function(_sb_append_to_cmake_args)
  189. set(options CMAKE_CMD)
  190. set(oneValueArgs PROJECT)
  191. set(multiValueArgs VARS LABELS)
  192. cmake_parse_arguments(_sb "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
  193. if(NOT _sb_PROJECT)
  194. if(SUPERBUILD_TOPLEVEL_PROJECT)
  195. set(_sb_PROJECT ${SUPERBUILD_TOPLEVEL_PROJECT})
  196. else()
  197. set(_sb_PROJECT ${CMAKE_PROJECT_NAME})
  198. endif()
  199. endif()
  200. set(_cmake_arg_type "CMAKE_CACHE")
  201. if(_sb_CMAKE_CMD)
  202. set(_cmake_arg_type "CMAKE")
  203. set(optional_arg_CMAKE_CMD "CMAKE_CMD")
  204. endif()
  205. set(_ep_property "${_cmake_arg_type}_ARGS")
  206. set(_ep_varnames "")
  207. foreach(varname_and_vartype ${_sb_VARS})
  208. if(NOT TARGET ${_sb_PROJECT})
  209. set_property(GLOBAL APPEND PROPERTY ${_sb_PROJECT}_EP_${_ep_property} ${varname_and_vartype})
  210. _sb_extract_varname_and_vartype(${varname_and_vartype} _varname)
  211. set_property(GLOBAL APPEND PROPERTY ${_sb_PROJECT}_EP_PROPERTIES ${_ep_property})
  212. else()
  213. message(FATAL_ERROR "Function _sb_append_to_cmake_args not allowed is project already added !")
  214. endif()
  215. list(APPEND _ep_varnames ${_varname})
  216. endforeach()
  217. if(_sb_LABELS)
  218. set_property(GLOBAL APPEND PROPERTY ${_sb_PROJECT}_EP_LABELS ${_sb_LABELS})
  219. foreach(label ${_sb_LABELS})
  220. set_property(GLOBAL APPEND PROPERTY ${_sb_PROJECT}_EP_LABEL_${label} ${_ep_varnames})
  221. endforeach()
  222. endif()
  223. endfunction()
  224. function(_sb_get_external_project_arguments proj varname)
  225. mark_as_superbuild(${SUPERBUILD_TOPLEVEL_PROJECT}_USE_SYSTEM_${proj}:BOOL)
  226. # Set list of CMake args associated with each label
  227. get_property(_labels GLOBAL PROPERTY ${proj}_EP_LABELS)
  228. if(_labels)
  229. list(REMOVE_DUPLICATES _labels)
  230. foreach(label ${_labels})
  231. get_property(${proj}_EP_LABEL_${label} GLOBAL PROPERTY ${proj}_EP_LABEL_${label})
  232. list(REMOVE_DUPLICATES ${proj}_EP_LABEL_${label})
  233. _sb_append_to_cmake_args(PROJECT ${proj}
  234. VARS ${proj}_EP_LABEL_${label}:STRING)
  235. endforeach()
  236. endif()
  237. foreach(cmake_arg_type CMAKE_CMD CMAKE_CACHE)
  238. set(_ep_property "CMAKE_CACHE_ARGS")
  239. if(cmake_arg_type STREQUAL "CMAKE_CMD")
  240. set(_ep_property "CMAKE_ARGS")
  241. endif()
  242. get_property(_args GLOBAL PROPERTY ${proj}_EP_${_ep_property})
  243. foreach(var ${_args})
  244. _sb_cmakevar_to_cmakearg(${var} cmake_arg ${cmake_arg_type})
  245. set_property(GLOBAL APPEND PROPERTY ${proj}_EP_PROPERTY_${_ep_property} ${cmake_arg})
  246. endforeach()
  247. endforeach()
  248. set(_ep_arguments "")
  249. get_property(_properties GLOBAL PROPERTY ${proj}_EP_PROPERTIES)
  250. if(_properties)
  251. list(REMOVE_DUPLICATES _properties)
  252. foreach(property ${_properties})
  253. get_property(${proj}_EP_PROPERTY_${property} GLOBAL PROPERTY ${proj}_EP_PROPERTY_${property})
  254. list(APPEND _ep_arguments ${property} ${${proj}_EP_PROPERTY_${property}})
  255. endforeach()
  256. endif()
  257. set(${varname} ${_ep_arguments} PARENT_SCOPE)
  258. endfunction()
  259. function(_sb_update_indent proj)
  260. superbuild_stack_size(SUPERBUILD_PROJECT_STACK _stack_size)
  261. set(_indent "")
  262. if(_stack_size GREATER 0)
  263. foreach(not_used RANGE 1 ${_stack_size})
  264. set(_indent " ${_indent}")
  265. endforeach()
  266. endif()
  267. set_property(GLOBAL PROPERTY SUPERBUILD_${proj}_INDENT ${_indent})
  268. endfunction()
  269. function(superbuild_message proj msg)
  270. if(NOT SUPERBUILD_FIRST_PASS)
  271. get_property(_indent GLOBAL PROPERTY SUPERBUILD_${proj}_INDENT)
  272. message(STATUS "SuperBuild - ${_indent}${msg}")
  273. endif()
  274. endfunction()
  275. #!
  276. #! superbuild_stack_content(<stack_name> <output_var>)
  277. #!
  278. #! <stack_name> corresponds to the name of stack.
  279. #!
  280. #! <output_var> is the name of CMake variable that will be set with the content
  281. #! of the stack identified by <stack_name>.
  282. function(superbuild_stack_content stack_name output_var)
  283. get_property(_stack GLOBAL PROPERTY ${stack_name})
  284. set(${output_var} ${_stack} PARENT_SCOPE)
  285. endfunction()
  286. #!
  287. #! superbuild_stack_size(<stack_name> <output_var>)
  288. #!
  289. #! <stack_name> corresponds to the name of stack.
  290. #!
  291. #! <output_var> is the name of CMake variable that will be set with the size
  292. #! of the stack identified by <stack_name>.
  293. function(superbuild_stack_size stack_name output_var)
  294. get_property(_stack GLOBAL PROPERTY ${stack_name})
  295. list(LENGTH _stack _stack_size)
  296. set(${output_var} ${_stack_size} PARENT_SCOPE)
  297. endfunction()
  298. #!
  299. #! superbuild_stack_push(<stack_name> <value>)
  300. #!
  301. #! <stack_name> corresponds to the name of stack.
  302. #!
  303. #! <value> is appended to the stack identified by <stack_name>.
  304. function(superbuild_stack_push stack_name value)
  305. set_property(GLOBAL APPEND PROPERTY ${stack_name} ${value})
  306. endfunction()
  307. #!
  308. #! superbuild_stack_pop(<stack_name> <item_var>)
  309. #!
  310. #! <stack_name> corresponds to the name of stack.
  311. #!
  312. #! <item_var> names a CMake variable that will be set with the item
  313. #! removed from the stack identified by <stack_name>.
  314. function(superbuild_stack_pop stack_name item_var)
  315. get_property(_stack GLOBAL PROPERTY ${stack_name})
  316. list(LENGTH _stack _stack_size)
  317. if(_stack_size GREATER 0)
  318. math(EXPR _index_to_remove "${_stack_size} - 1")
  319. list(GET _stack ${_index_to_remove} _item)
  320. list(REMOVE_AT _stack ${_index_to_remove})
  321. set_property(GLOBAL PROPERTY ${stack_name} ${_stack})
  322. set(${item_var} ${_item} PARENT_SCOPE)
  323. endif()
  324. endfunction()
  325. #
  326. # superbuild_include_dependencies(<project>)
  327. #
  328. # superbuild_include_dependencies(PROJECT_VAR <project_var>)
  329. #
  330. macro(superbuild_include_dependencies)
  331. set(options)
  332. set(oneValueArgs PROJECT_VAR)
  333. set(multiValueArgs)
  334. cmake_parse_arguments(_sb "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
  335. # XXX Implement invalid parameter checking
  336. if(NOT "x" STREQUAL "x${_sb_PROJECT_VAR}")
  337. set(proj ${${_sb_PROJECT_VAR}})
  338. else()
  339. set(proj ${_sb_UNPARSED_ARGUMENTS})
  340. endif()
  341. # Sanity checks
  342. if(NOT DEFINED ${proj}_DEPENDENCIES)
  343. message(FATAL_ERROR "${proj}_DEPENDENCIES variable is NOT defined !")
  344. endif()
  345. superbuild_stack_size(SUPERBUILD_PROJECT_STACK _stack_size)
  346. if(_stack_size EQUAL 0)
  347. set(SUPERBUILD_TOPLEVEL_PROJECT ${proj})
  348. endif()
  349. _sb_update_indent(${proj})
  350. # Keep track of the projects
  351. list(APPEND __epd_${SUPERBUILD_TOPLEVEL_PROJECT}_projects ${proj})
  352. # Is this the first run ? (used to set the <SUPERBUILD_TOPLEVEL_PROJECT>_USE_SYSTEM_* variables)
  353. if(${proj} STREQUAL ${SUPERBUILD_TOPLEVEL_PROJECT} AND NOT DEFINED SUPERBUILD_FIRST_PASS)
  354. message(STATUS "SuperBuild - First pass")
  355. set(SUPERBUILD_FIRST_PASS TRUE)
  356. endif()
  357. # Display dependency of project being processed
  358. if("${${proj}_DEPENDENCIES}" STREQUAL "")
  359. set(_msg "${proj}[OK]")
  360. if(${SUPERBUILD_TOPLEVEL_PROJECT}_USE_SYSTEM_${proj})
  361. set(_msg "${_msg} (SYSTEM)")
  362. endif()
  363. superbuild_message(${proj} ${_msg})
  364. else()
  365. set(dependency_str " ")
  366. foreach(dep ${${proj}_DEPENDENCIES})
  367. get_property(_is_included GLOBAL PROPERTY ${EXTERNAL_PROJECT_FILE_PREFIX}${dep}_FILE_INCLUDED)
  368. if(_is_included)
  369. set(dependency_str "${dependency_str}${dep}[INCLUDED], ")
  370. else()
  371. set(dependency_str "${dependency_str}${dep}, ")
  372. endif()
  373. endforeach()
  374. superbuild_message(${proj} "${proj} => Requires${dependency_str}")
  375. endif()
  376. foreach(dep ${${proj}_DEPENDENCIES})
  377. if(${${SUPERBUILD_TOPLEVEL_PROJECT}_USE_SYSTEM_${proj}})
  378. set(${SUPERBUILD_TOPLEVEL_PROJECT}_USE_SYSTEM_${dep} ${${SUPERBUILD_TOPLEVEL_PROJECT}_USE_SYSTEM_${proj}})
  379. endif()
  380. #if(SUPERBUILD_FIRST_PASS)
  381. # message("${SUPERBUILD_TOPLEVEL_PROJECT}_USE_SYSTEM_${dep} set to [${SUPERBUILD_TOPLEVEL_PROJECT}_USE_SYSTEM_${proj}:${${SUPERBUILD_TOPLEVEL_PROJECT}_USE_SYSTEM_${proj}}]")
  382. #endif()
  383. endforeach()
  384. superbuild_stack_push(SUPERBUILD_PROJECT_STACK ${proj})
  385. # Include dependencies
  386. foreach(dep ${${proj}_DEPENDENCIES})
  387. get_property(_is_included GLOBAL PROPERTY External_${dep}_FILE_INCLUDED)
  388. if(NOT _is_included)
  389. # XXX - Refactor - Add a single variable named 'EXTERNAL_PROJECT_DIRS'
  390. if(EXISTS "${EXTERNAL_PROJECT_DIR}/${EXTERNAL_PROJECT_FILE_PREFIX}${dep}.cmake")
  391. include(${EXTERNAL_PROJECT_DIR}/${EXTERNAL_PROJECT_FILE_PREFIX}${dep}.cmake)
  392. elseif(EXISTS "${${dep}_FILEPATH}")
  393. include(${${dep}_FILEPATH})
  394. elseif(EXISTS "${EXTERNAL_PROJECT_ADDITIONAL_DIR}/${EXTERNAL_PROJECT_FILE_PREFIX}${dep}.cmake")
  395. include(${EXTERNAL_PROJECT_ADDITIONAL_DIR}/${EXTERNAL_PEXCLUDEDROJECT_FILE_PREFIX}${dep}.cmake)
  396. else()
  397. message(FATAL_ERROR "Can't find ${EXTERNAL_PROJECT_FILE_PREFIX}${dep}.cmake")
  398. endif()
  399. endif()
  400. endforeach()
  401. superbuild_stack_pop(SUPERBUILD_PROJECT_STACK proj)
  402. # If project being process has dependencies, indicates it has also been added.
  403. if(NOT "${${proj}_DEPENDENCIES}" STREQUAL "")
  404. set(_msg "${proj}[OK]")
  405. if(${SUPERBUILD_TOPLEVEL_PROJECT}_USE_SYSTEM_${proj})
  406. set(_msg "${_ok_message} (SYSTEM)")
  407. endif()
  408. superbuild_message(${proj} ${_msg})
  409. endif()
  410. if(${proj} STREQUAL ${SUPERBUILD_TOPLEVEL_PROJECT} AND SUPERBUILD_FIRST_PASS)
  411. message(STATUS "SuperBuild - First pass - done")
  412. unset(${SUPERBUILD_TOPLEVEL_PROJECT}_DEPENDENCIES) # XXX - Refactor
  413. set(SUPERBUILD_FIRST_PASS FALSE)
  414. foreach(possible_proj ${__epd_${SUPERBUILD_TOPLEVEL_PROJECT}_projects})
  415. set_property(GLOBAL PROPERTY ${EXTERNAL_PROJECT_FILE_PREFIX}${possible_proj}_FILE_INCLUDED 0)
  416. if(NOT ${possible_proj} STREQUAL ${SUPERBUILD_TOPLEVEL_PROJECT})
  417. set(_include_project 1)
  418. if(COMMAND superbuild_is_external_project_includable)
  419. superbuild_is_external_project_includable("${possible_proj}" _include_project)
  420. endif()
  421. if(_include_project)
  422. list(APPEND ${SUPERBUILD_TOPLEVEL_PROJECT}_DEPENDENCIES ${possible_proj})
  423. else()
  424. superbuild_message(STATUS "${possible_proj}[OPTIONAL]")
  425. endif()
  426. endif()
  427. endforeach()
  428. list(REMOVE_DUPLICATES ${SUPERBUILD_TOPLEVEL_PROJECT}_DEPENDENCIES)
  429. if(${SUPERBUILD_TOPLEVEL_PROJECT}_SUPERBUILD)
  430. superbuild_include_dependencies(${SUPERBUILD_TOPLEVEL_PROJECT})
  431. endif()
  432. set(SUPERBUILD_FIRST_PASS TRUE)
  433. endif()
  434. if(_sb_PROJECT_VAR)
  435. set(${_sb_PROJECT_VAR} ${proj})
  436. endif()
  437. if(SUPERBUILD_FIRST_PASS)
  438. return()
  439. else()
  440. unset(${proj}_EXTERNAL_PROJECT_ARGS)
  441. _sb_get_external_project_arguments(${proj} ${proj}_EXTERNAL_PROJECT_ARGS)
  442. #message("${proj}_EXTERNAL_PROJECT_ARGS:${${proj}_EXTERNAL_PROJECT_ARGS}")
  443. endif()
  444. endmacro()
  445. #!
  446. #! Convenient macro allowing to define a "empty" project in case an external one is provided
  447. #! using for example <proj>_DIR.
  448. #! Doing so allows to keep the external project dependency system happy.
  449. #!
  450. #! \ingroup CMakeUtilities
  451. macro(superbuild_add_empty_external_project proj dependencies)
  452. ExternalProject_Add(${proj}
  453. SOURCE_DIR ${CMAKE_BINARY_DIR}/${proj}
  454. BINARY_DIR ${proj}-build
  455. DOWNLOAD_COMMAND ""
  456. CONFIGURE_COMMAND ""
  457. BUILD_COMMAND ""
  458. INSTALL_COMMAND ""
  459. DEPENDS
  460. ${dependencies}
  461. )
  462. endmacro()