Subproject.cmake 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. include(ExternalProject)
  2. # add_subproject(<name> [NO_INSTALL] [DIR <dirname>] [DEPENDS [subpro_dep ...]])
  3. function(add_subproject _name)
  4. cmake_parse_arguments(_arg "NO_INSTALL" "DIR" "DEPENDS" ${ARGN})
  5. if(_arg_UNPARSED_ARGUMENTS)
  6. message(FATAL_ERROR "There are unparsed arguments")
  7. endif()
  8. set(_maybe_NO_INSTALL)
  9. if(_arg_NO_INSTALL)
  10. set(_maybe_NO_INSTALL "INSTALL_COMMAND")
  11. else()
  12. # This is a trick to get a valid call.
  13. # Since we set UPDATE_COMMAND to ""
  14. # explicitly below, this won't harm.
  15. set(_maybe_NO_INSTALL "UPDATE_COMMAND")
  16. endif()
  17. if(CMAKE_GENERATOR MATCHES "Ninja Multi-Config")
  18. # Replace list separator before passing on to ExternalProject_Add
  19. string(REPLACE ";" "|" _CONFIGURATION_TYPES "${CMAKE_CONFIGURATION_TYPES}")
  20. string(REPLACE ";" "|" _CROSS_CONFIGS "${CMAKE_CROSS_CONFIGS}")
  21. string(REPLACE ";" "|" _DEFAULT_CONFIGS "${CMAKE_DEFAULT_CONFIGS}")
  22. set(_maybe_NINJA_MULTICONFIG_ARGS
  23. "-DCMAKE_CONFIGURATION_TYPES:STRINGS=${_CONFIGURATION_TYPES}"
  24. "-DCMAKE_CROSS_CONFIGS:STRINGS=${_CROSS_CONFIGS}"
  25. "-DCMAKE_DEFAULT_BUILD_TYPE:STRING=${CMAKE_DEFAULT_BUILD_TYPE}"
  26. "-DCMAKE_DEFAULT_CONFIGS:STRINGS=${_DEFAULT_CONFIGS}"
  27. )
  28. endif()
  29. ExternalProject_Add("${_name}"
  30. DOWNLOAD_COMMAND ""
  31. UPDATE_COMMAND ""
  32. ${_maybe_NO_INSTALL} ""
  33. BUILD_ALWAYS ON
  34. LOG_DOWNLOAD OFF
  35. LOG_UPDATE OFF
  36. LOG_PATCH OFF
  37. LOG_CONFIGURE OFF
  38. LOG_BUILD OFF
  39. LOG_INSTALL OFF
  40. SOURCE_DIR "${PROJECT_SOURCE_DIR}/${_arg_DIR}"
  41. # Private build directory per subproject
  42. BINARY_DIR "${PROJECT_BINARY_DIR}/subproject/${_arg_DIR}"
  43. # Common install directory, populated immediately
  44. # during build (during build - not install - of superproject)
  45. INSTALL_DIR "${CMAKE_INSTALL_PREFIX}"
  46. DEPENDS
  47. ${_arg_DEPENDS}
  48. LIST_SEPARATOR "|"
  49. CMAKE_ARGS
  50. "-DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>"
  51. # We can rely on ExternalProject to pick the right
  52. # generator (and architecture/toolset where applicable),
  53. # however, we need to explicitly inherit other parent
  54. # project's build settings.
  55. "-DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE}"
  56. ${_maybe_NINJA_MULTICONFIG_ARGS}
  57. # Subproject progress reports clutter up the output, disable
  58. "-DCMAKE_TARGET_MESSAGES:BOOL=OFF"
  59. "-DCMAKE_RULE_MESSAGES:BOOL=OFF"
  60. )
  61. endfunction()