summaryrefslogtreecommitdiffstats
path: root/Modules
diff options
context:
space:
mode:
authorDavid Cole <david.cole@kitware.com>2009-08-05 19:39:41 (GMT)
committerDavid Cole <david.cole@kitware.com>2009-08-05 19:39:41 (GMT)
commit6e54b18b5d46a43a19c5f4e479f7ff3dc49445ac (patch)
tree78b749cef226d3c5bb40f0442c1d8cbfd81ac8d5 /Modules
parentfe0b121da93262210f81129cd462c70c880997c2 (diff)
downloadCMake-6e54b18b5d46a43a19c5f4e479f7ff3dc49445ac.zip
CMake-6e54b18b5d46a43a19c5f4e479f7ff3dc49445ac.tar.gz
CMake-6e54b18b5d46a43a19c5f4e479f7ff3dc49445ac.tar.bz2
Remove AddExternalProject.cmake. ExternalProject.cmake supercedes/replaces it.
Diffstat (limited to 'Modules')
-rw-r--r--Modules/AddExternalProject.cmake669
1 files changed, 0 insertions, 669 deletions
diff --git a/Modules/AddExternalProject.cmake b/Modules/AddExternalProject.cmake
deleted file mode 100644
index be1ab85..0000000
--- a/Modules/AddExternalProject.cmake
+++ /dev/null
@@ -1,669 +0,0 @@
-# Requires CVS CMake for 'function' and '-E touch' and '--build'
-
-
-find_package(CVS)
-find_package(Subversion)
-
-function(_aep_parse_arguments f name ns args)
- # Transfer the arguments to this function into target properties for the
- # new custom target we just added so that we can set up all the build steps
- # correctly based on target properties.
- #
- # We loop through ARGN and consider the namespace starting with an
- # upper-case letter followed by at least two more upper-case letters
- # or underscores to be keywords.
- set(key)
- foreach(arg IN LISTS args)
- if(arg MATCHES "^[A-Z][A-Z_][A-Z_]+$" AND
- NOT ((arg STREQUAL "${key}") AND (key STREQUAL "COMMAND")) AND
- NOT arg MATCHES "^(TRUE|FALSE)$")
- # Keyword
- set(key "${arg}")
- if(_aep_keywords_${f} AND NOT key MATCHES "${_aep_keywords_${f}}")
- message(AUTHOR_WARNING "unknown ${f} keyword: ${key}")
- endif()
- elseif(key)
- # Value
- if(NOT arg STREQUAL "")
- set_property(TARGET ${name} APPEND PROPERTY ${ns}${key} "${arg}")
- else()
- get_property(have_key TARGET ${name} PROPERTY ${ns}${key} SET)
- if(have_key)
- get_property(value TARGET ${name} PROPERTY ${ns}${key})
- set_property(TARGET ${name} PROPERTY ${ns}${key} "${value};${arg}")
- else()
- set_property(TARGET ${name} PROPERTY ${ns}${key} "${arg}")
- endif()
- endif()
- else()
- # Missing Keyword
- message(AUTHOR_WARNING "value with no keyword in ${f}")
- endif()
- endforeach()
-endfunction(_aep_parse_arguments)
-
-
-function(get_external_project_directories base_dir_var build_dir_var downloads_dir_var install_dir_var sentinels_dir_var source_dir_var tmp_dir_var)
- set(base "${CMAKE_BINARY_DIR}/CMakeExternals")
- set(${base_dir_var} "${base}" PARENT_SCOPE)
- set(${build_dir_var} "${base}/Build" PARENT_SCOPE)
- set(${downloads_dir_var} "${base}/Downloads" PARENT_SCOPE)
- set(${install_dir_var} "${base}/Install" PARENT_SCOPE)
- set(${sentinels_dir_var} "${base}/Sentinels" PARENT_SCOPE)
- set(${source_dir_var} "${base}/Source" PARENT_SCOPE)
- set(${tmp_dir_var} "${base}/tmp" PARENT_SCOPE)
-endfunction(get_external_project_directories)
-
-
-function(get_configure_build_working_dir name working_dir_var)
- get_external_project_directories(base_dir build_dir downloads_dir install_dir
- sentinels_dir source_dir tmp_dir)
-
- get_target_property(dir ${name} AEP_CONFIGURE_DIR)
- if(dir)
- if (IS_ABSOLUTE "${dir}")
- set(working_dir "${dir}")
- else()
- set(working_dir "${source_dir}/${name}/${dir}")
- endif()
- else()
- set(working_dir "${build_dir}/${name}")
- endif()
-
- set(${working_dir_var} "${working_dir}" PARENT_SCOPE)
-endfunction(get_configure_build_working_dir)
-
-
-function(get_configure_command_id name cfg_cmd_id_var)
- get_target_property(cmd ${name} AEP_CONFIGURE_COMMAND)
-
- if(cmd STREQUAL "")
- # Explicit empty string means no configure step for this project
- set(${cfg_cmd_id_var} "none" PARENT_SCOPE)
- else()
- if(NOT cmd)
- # Default is "use cmake":
- set(${cfg_cmd_id_var} "cmake" PARENT_SCOPE)
- else()
- # Otherwise we have to analyze the value:
- if(cmd MATCHES "^[^;]*/configure")
- set(${cfg_cmd_id_var} "configure" PARENT_SCOPE)
- elseif(cmd MATCHES "^[^;]*/cmake" AND NOT cmd MATCHES ";-[PE];")
- set(${cfg_cmd_id_var} "cmake" PARENT_SCOPE)
- elseif(cmd MATCHES "config")
- set(${cfg_cmd_id_var} "configure" PARENT_SCOPE)
- else()
- set(${cfg_cmd_id_var} "unknown:${cmd}" PARENT_SCOPE)
- endif()
- endif()
- endif()
-endfunction(get_configure_command_id)
-
-function(_aep_get_build_command name step cmd_var)
- set(cmd "${${cmd_var}}")
- if(NOT cmd)
- set(args)
- get_configure_command_id(${name} cfg_cmd_id)
- if(cfg_cmd_id STREQUAL "cmake")
- # CMake project. Select build command based on generator.
- get_target_property(cmake_generator ${name} AEP_CMAKE_GENERATOR)
- if("${cmake_generator}" MATCHES "Make" AND
- "${cmake_generator}" STREQUAL "${CMAKE_GENERATOR}")
- # The project uses the same Makefile generator. Use recursive make.
- set(cmd "$(MAKE)")
- if(step STREQUAL "INSTALL")
- set(args install)
- endif()
- else()
- # Drive the project with "cmake --build".
- get_target_property(cmake_command ${name} AEP_CMAKE_COMMAND)
- if(cmake_command)
- set(cmd "${cmake_command}")
- else()
- set(cmd "${CMAKE_COMMAND}")
- endif()
- set(args --build ${working_dir} --config ${CMAKE_CFG_INTDIR})
- if(step STREQUAL "INSTALL")
- list(APPEND args --target install)
- endif()
- endif()
- else() # if(cfg_cmd_id STREQUAL "configure")
- # Non-CMake project. Guess "make" and "make install".
- set(cmd "make")
- if(step STREQUAL "INSTALL")
- set(args install)
- endif()
- endif()
-
- # Use user-specified arguments instead of default arguments, if any.
- get_property(have_args TARGET ${name} PROPERTY AEP_${step}_ARGS SET)
- if(have_args)
- get_target_property(args ${name} AEP_${step}_ARGS)
- endif()
-
- list(APPEND cmd ${args})
- endif()
-
- set(${cmd_var} "${cmd}" PARENT_SCOPE)
-endfunction(_aep_get_build_command)
-
-function(mkdir d)
- file(MAKE_DIRECTORY "${d}")
- #message(STATUS "mkdir d='${d}'")
- if(NOT EXISTS "${d}")
- message(FATAL_ERROR "error: dir '${d}' does not exist after file(MAKE_DIRECTORY call...")
- endif()
-endfunction(mkdir)
-
-# Pre-compute a regex to match known keywords.
-set(_aep_keyword_regex "^(")
-set(_aep_keyword_sep)
-foreach(key IN ITEMS
- COMMAND
- COMMENT
- DEPENDEES
- DEPENDERS
- DEPENDS
- SYMBOLIC
- WORKING_DIRECTORY
- )
- set(_aep_keyword_regex "${_aep_keyword_regex}${_aep_keyword_sep}${key}")
- set(_aep_keyword_sep "|")
-endforeach(key)
-set(_aep_keyword_regex "${_aep_keyword_regex})$")
-set(_aep_keyword_sep)
-set(_aep_keywords_add_external_project_step "${_aep_keyword_regex}")
-
-function(add_external_project_step name step)
- get_external_project_directories(base_dir build_dir downloads_dir install_dir
- sentinels_dir source_dir tmp_dir)
- add_custom_command(APPEND
- OUTPUT ${sentinels_dir}/${name}-complete
- DEPENDS ${sentinels_dir}/${name}-${step}
- )
- _aep_parse_arguments(add_external_project_step
- ${name} AEP_${step}_ "${ARGN}")
-
- # Steps depending on this step.
- get_property(dependers TARGET ${name} PROPERTY AEP_${step}_DEPENDERS)
- foreach(depender IN LISTS dependers)
- add_custom_command(APPEND
- OUTPUT ${sentinels_dir}/${name}-${depender}
- DEPENDS ${sentinels_dir}/${name}-${step}
- )
- endforeach()
-
- # Dependencies on files.
- get_property(depends TARGET ${name} PROPERTY AEP_${step}_DEPENDS)
-
- # Dependencies on steps.
- get_property(dependees TARGET ${name} PROPERTY AEP_${step}_DEPENDEES)
- foreach(dependee IN LISTS dependees)
- list(APPEND depends ${sentinels_dir}/${name}-${dependee})
- endforeach()
-
- # The command to run.
- get_property(command TARGET ${name} PROPERTY AEP_${step}_COMMAND)
- if(command)
- set(comment "Performing ${step} step for '${name}'")
- else()
- set(comment "No ${step} step for '${name}'")
- endif()
- get_property(work_dir TARGET ${name} PROPERTY AEP_${step}_WORKING_DIRECTORY)
-
- # Replace list separators.
- get_property(sep TARGET ${name} PROPERTY AEP_LIST_SEPARATOR)
- if(sep AND command)
- string(REPLACE "${sep}" "\\;" command "${command}")
- endif()
-
- # Custom comment?
- get_property(comment_set TARGET ${name} PROPERTY AEP_${step}_COMMENT SET)
- if(comment_set)
- get_property(comment TARGET ${name} PROPERTY AEP_${step}_COMMENT)
- endif()
-
- # Run every time?
- get_property(symbolic TARGET ${name} PROPERTY AEP_${step}_SYMBOLIC)
- if(symbolic)
- set_property(SOURCE ${sentinels_dir}/${name}-${step} PROPERTY SYMBOLIC 1)
- set(touch)
- else()
- set(touch ${CMAKE_COMMAND} -E touch ${sentinels_dir}/${name}-${step})
- endif()
-
- add_custom_command(
- OUTPUT ${sentinels_dir}/${name}-${step}
- COMMENT ${comment}
- COMMAND ${command}
- COMMAND ${touch}
- DEPENDS ${depends}
- WORKING_DIRECTORY ${work_dir}
- VERBATIM
- )
-endfunction(add_external_project_step)
-
-function(add_external_project_download_command name)
- get_external_project_directories(base_dir build_dir downloads_dir install_dir
- sentinels_dir source_dir tmp_dir)
-
- get_property(cmd_set TARGET ${name} PROPERTY AEP_DOWNLOAD_COMMAND SET)
- get_property(cmd TARGET ${name} PROPERTY AEP_DOWNLOAD_COMMAND)
- get_property(cvs_repository TARGET ${name} PROPERTY AEP_CVS_REPOSITORY)
- get_property(svn_repository TARGET ${name} PROPERTY AEP_SVN_REPOSITORY)
- get_property(dir TARGET ${name} PROPERTY AEP_DIR)
- get_property(tar TARGET ${name} PROPERTY AEP_TAR)
- get_property(tgz TARGET ${name} PROPERTY AEP_TGZ)
- get_property(tgz_url TARGET ${name} PROPERTY AEP_TGZ_URL)
- get_property(tar_url TARGET ${name} PROPERTY AEP_TAR_URL)
-
- set(depends ${sentinels_dir}/CMakeExternals-directories)
- set(comment)
- set(work_dir)
-
- if(cmd_set)
- set(work_dir ${downloads_dir})
- elseif(cvs_repository)
- if(NOT CVS_EXECUTABLE)
- message(FATAL_ERROR "error: could not find cvs for checkout of ${name}")
- endif()
-
- get_target_property(cvs_module ${name} AEP_CVS_MODULE)
- if(NOT cvs_module)
- message(FATAL_ERROR "error: no CVS_MODULE")
- endif()
-
- get_property(cvs_tag TARGET ${name} PROPERTY AEP_CVS_TAG)
-
- set(repository ${cvs_repository})
- set(module ${cvs_module})
- set(tag ${cvs_tag})
- configure_file(
- "${CMAKE_ROOT}/Modules/RepositoryInfo.txt.in"
- "${sentinels_dir}/${name}-cvsinfo.txt"
- @ONLY
- )
-
- mkdir("${source_dir}/${name}")
- set(work_dir ${source_dir})
- set(comment "Performing download step (CVS checkout) for '${name}'")
- set(cmd ${CVS_EXECUTABLE} -d ${cvs_repository} -q co ${cvs_tag} -d ${name} ${cvs_module})
- list(APPEND depends ${sentinels_dir}/${name}-cvsinfo.txt)
- elseif(svn_repository)
- if(NOT Subversion_SVN_EXECUTABLE)
- message(FATAL_ERROR "error: could not find svn for checkout of ${name}")
- endif()
-
- get_property(svn_tag TARGET ${name} PROPERTY AEP_SVN_TAG)
-
- set(repository ${svn_repository})
- set(module)
- set(tag ${svn_tag})
- configure_file(
- "${CMAKE_ROOT}/Modules/RepositoryInfo.txt.in"
- "${sentinels_dir}/${name}-svninfo.txt"
- @ONLY
- )
-
- mkdir("${source_dir}/${name}")
- set(work_dir ${source_dir})
- set(comment "Performing download step (SVN checkout) for '${name}'")
- set(cmd ${Subversion_SVN_EXECUTABLE} co ${svn_repository} ${svn_tag} ${name})
- list(APPEND depends ${sentinels_dir}/${name}-svninfo.txt)
- elseif(dir)
- get_filename_component(abs_dir "${dir}" ABSOLUTE)
-
- set(repository "add_external_project DIR")
- set(module "${abs_dir}")
- set(tag "")
-
- configure_file(
- "${CMAKE_ROOT}/Modules/RepositoryInfo.txt.in"
- "${sentinels_dir}/${name}-dirinfo.txt"
- @ONLY
- )
-
- mkdir("${source_dir}/${name}")
- set(work_dir ${source_dir})
- set(comment "Performing download step (DIR copy) for '${name}'")
- set(cmd ${CMAKE_COMMAND} -E remove_directory ${source_dir}/${name}
- COMMAND ${CMAKE_COMMAND} -E copy_directory ${abs_dir} ${source_dir}/${name})
- list(APPEND depends ${sentinels_dir}/${name}-dirinfo.txt)
- elseif(tar)
- mkdir("${source_dir}/${name}")
- set(work_dir ${source_dir})
- set(comment "Performing download step (TAR untar) for '${name}'")
- set(cmd ${CMAKE_COMMAND} -Dfilename=${tar} -Dtmp=${tmp_dir}/${name} -Ddirectory=${source_dir}/${name} -P ${CMAKE_ROOT}/Modules/UntarFile.cmake)
- list(APPEND depends ${tar})
- elseif(tgz)
- mkdir("${source_dir}/${name}")
- set(work_dir ${source_dir})
- set(comment "Performing download step (TGZ untar) for '${name}'")
- set(cmd ${CMAKE_COMMAND} -Dfilename=${tgz} -Dtmp=${tmp_dir}/${name} -Ddirectory=${source_dir}/${name} -P ${CMAKE_ROOT}/Modules/UntarFile.cmake)
- list(APPEND depends ${tgz})
- elseif(tgz_url)
- set(repository "add_external_project TGZ_URL")
- set(module "${tgz_url}")
- set(tag "")
-
- configure_file(
- "${CMAKE_ROOT}/Modules/RepositoryInfo.txt.in"
- "${sentinels_dir}/${name}-urlinfo.txt"
- @ONLY
- )
-
- mkdir("${source_dir}/${name}")
- set(work_dir ${source_dir})
- set(comment "Performing download step (TGZ_URL download and untar) for '${name}'")
- set(cmd ${CMAKE_COMMAND} -Dremote=${tgz_url} -Dlocal=${downloads_dir}/${name}.tgz -P ${CMAKE_ROOT}/Modules/DownloadFile.cmake
- COMMAND ${CMAKE_COMMAND} -Dfilename=${downloads_dir}/${name} -Dtmp=${tmp_dir}/${name} -Ddirectory=${source_dir}/${name} -P ${CMAKE_ROOT}/Modules/UntarFile.cmake)
- list(APPEND depends ${sentinels_dir}/${name}-urlinfo.txt)
- elseif(tar_url)
- set(repository "add_external_project TAR_URL")
- set(module "${tar_url}")
- set(tag "")
-
- configure_file(
- "${CMAKE_ROOT}/Modules/RepositoryInfo.txt.in"
- "${sentinels_dir}/${name}-urlinfo.txt"
- @ONLY
- )
-
- mkdir("${source_dir}/${name}")
- set(work_dir ${source_dir})
- set(comment "Performing download step (TAR_URL download and untar) for '${name}'")
- set(cmd ${CMAKE_COMMAND} -Dremote=${tar_url} -Dlocal=${downloads_dir}/${name}.tar -P ${CMAKE_ROOT}/Modules/DownloadFile.cmake
- COMMAND ${CMAKE_COMMAND} -Dfilename=${downloads_dir}/${name} -Dtmp=${tmp_dir}/${name} -Ddirectory=${source_dir}/${name} -P ${CMAKE_ROOT}/Modules/UntarFile.cmake)
- list(APPEND depends ${sentinels_dir}/${name}-urlinfo.txt)
- else()
- message(SEND_ERROR "error: no download info for '${name}'")
- endif()
-
- add_external_project_step(${name} download
- COMMENT ${comment}
- COMMAND ${cmd}
- WORKING_DIRECTORY ${source_dir}
- DEPENDS ${depends}
- )
-endfunction(add_external_project_download_command)
-
-
-function(add_external_project_update_command name)
- get_external_project_directories(base_dir build_dir downloads_dir install_dir
- sentinels_dir source_dir tmp_dir)
-
- get_property(cmd TARGET ${name} PROPERTY AEP_UPDATE_COMMAND)
- get_property(cvs_repository TARGET ${name} PROPERTY AEP_CVS_REPOSITORY)
- get_property(svn_repository TARGET ${name} PROPERTY AEP_SVN_REPOSITORY)
-
- set(work_dir)
- set(comment)
- set(symbolic)
- if(cmd)
- set(work_dir ${source_dir}/${name})
- elseif(cvs_repository)
- if(NOT CVS_EXECUTABLE)
- message(FATAL_ERROR "error: could not find cvs for update of ${name}")
- endif()
- mkdir("${source_dir}/${name}")
- set(work_dir ${source_dir}/${name})
- set(comment "Performing update step (CVS update) for '${name}'")
- get_property(cvs_tag TARGET ${name} PROPERTY AEP_CVS_TAG)
- set(cmd ${CVS_EXECUTABLE} -d ${cvs_repository} -q up -dP ${cvs_tag})
- set(symbolic 1)
- elseif(svn_repository)
- if(NOT Subversion_SVN_EXECUTABLE)
- message(FATAL_ERROR "error: could not find svn for update of ${name}")
- endif()
- mkdir("${source_dir}/${name}")
- set(work_dir ${source_dir}/${name})
- set(comment "Performing update step (SVN update) for '${name}'")
- get_property(svn_tag TARGET ${name} PROPERTY AEP_SVN_TAG)
- set(cmd ${Subversion_SVN_EXECUTABLE} up ${svn_tag})
- set(symbolic 1)
- endif()
-
- add_external_project_step(${name} update
- COMMENT ${comment}
- COMMAND ${cmd}
- SYMBOLIC ${symbolic}
- WORKING_DIRECTORY ${work_dir}
- DEPENDEES download
- )
-endfunction(add_external_project_update_command)
-
-
-function(add_external_project_patch_command name)
- get_external_project_directories(base_dir build_dir downloads_dir install_dir
- sentinels_dir source_dir tmp_dir)
-
- set(work_dir)
- get_property(cmd TARGET ${name} PROPERTY AEP_PATCH_COMMAND)
- if(cmd)
- set(work_dir ${source_dir}/${name})
- endif()
-
- add_external_project_step(${name} patch
- COMMAND ${cmd}
- WORKING_DIRECTORY ${work_dir}
- DEPENDEES download
- )
-endfunction(add_external_project_patch_command)
-
-
-# TODO: Make sure external projects use the proper compiler
-function(add_external_project_configure_command name)
- get_external_project_directories(base_dir build_dir downloads_dir install_dir
- sentinels_dir source_dir tmp_dir)
- get_configure_build_working_dir(${name} working_dir)
-
- # Depend on other external projects (file-level).
- set(file_deps)
- get_property(deps TARGET ${name} PROPERTY AEP_DEPENDS)
- foreach(arg IN LISTS deps)
- list(APPEND file_deps ${sentinels_dir}/${arg}-done)
- endforeach()
- #message(STATUS "info: name='${name}' file_deps='${file_deps}'")
-
- # Create the working_dir for configure, build and install steps:
- #
- mkdir("${working_dir}")
- add_external_project_step(${name} working_dir
- COMMENT "Making directory \"${working_dir}\""
- COMMAND ${CMAKE_COMMAND} -E make_directory ${working_dir}
- DEPENDEES update patch
- DEPENDS ${file_deps}
- )
-
- get_property(cmd_set TARGET ${name} PROPERTY AEP_CONFIGURE_COMMAND SET)
- if(cmd_set)
- get_property(cmd TARGET ${name} PROPERTY AEP_CONFIGURE_COMMAND)
- else()
- get_target_property(cmake_command ${name} AEP_CMAKE_COMMAND)
- if(cmake_command)
- set(cmd "${cmake_command}")
- else()
- set(cmd "${CMAKE_COMMAND}")
- endif()
-
- get_property(cmake_args TARGET ${name} PROPERTY AEP_CMAKE_ARGS)
- list(APPEND cmd ${cmake_args})
-
- get_target_property(cmake_generator ${name} AEP_CMAKE_GENERATOR)
- if(cmake_generator)
- list(APPEND cmd "-G${cmake_generator}" "${source_dir}/${name}")
- endif()
- endif()
-
- add_external_project_step(${name} configure
- COMMAND ${cmd}
- WORKING_DIRECTORY ${working_dir}
- DEPENDEES working_dir
- )
-endfunction(add_external_project_configure_command)
-
-
-function(add_external_project_build_command name)
- get_external_project_directories(base_dir build_dir downloads_dir install_dir
- sentinels_dir source_dir tmp_dir)
- get_configure_build_working_dir(${name} working_dir)
-
- get_property(cmd_set TARGET ${name} PROPERTY AEP_BUILD_COMMAND SET)
- if(cmd_set)
- get_property(cmd TARGET ${name} PROPERTY AEP_BUILD_COMMAND)
- else()
- _aep_get_build_command(${name} BUILD cmd)
- endif()
- add_external_project_step(${name} build
- COMMAND ${cmd}
- WORKING_DIRECTORY ${working_dir}
- DEPENDEES configure
- )
-endfunction(add_external_project_build_command)
-
-
-function(add_external_project_install_command name)
- get_external_project_directories(base_dir build_dir downloads_dir install_dir
- sentinels_dir source_dir tmp_dir)
- get_configure_build_working_dir(${name} working_dir)
-
- get_property(cmd_set TARGET ${name} PROPERTY AEP_INSTALL_COMMAND SET)
- if(cmd_set)
- get_property(cmd TARGET ${name} PROPERTY AEP_INSTALL_COMMAND)
- else()
- _aep_get_build_command(${name} INSTALL cmd)
- endif()
- add_external_project_step(${name} install
- COMMAND ${cmd}
- WORKING_DIRECTORY ${working_dir}
- DEPENDEES build
- )
-endfunction(add_external_project_install_command)
-
-
-function(add_CMakeExternals_target)
- if(NOT TARGET CMakeExternals)
- get_external_project_directories(base_dir build_dir downloads_dir install_dir
- sentinels_dir source_dir tmp_dir)
-
- # Make the directories at CMake configure time *and* add a custom command
- # to make them at build time. They need to exist at makefile generation
- # time for Borland make and wmake so that CMake may generate makefiles
- # with "cd C:\short\paths\with\no\spaces" commands in them.
- #
- # Additionally, the add_custom_command is still used in case somebody
- # removes one of the necessary directories and tries to rebuild without
- # re-running cmake.
- #
- mkdir("${build_dir}")
- mkdir("${downloads_dir}")
- mkdir("${install_dir}")
- mkdir("${sentinels_dir}")
- mkdir("${source_dir}")
- mkdir("${tmp_dir}")
-
- add_custom_command(
- OUTPUT ${sentinels_dir}/CMakeExternals-directories
- COMMAND ${CMAKE_COMMAND} -E make_directory ${build_dir}
- COMMAND ${CMAKE_COMMAND} -E make_directory ${downloads_dir}
- COMMAND ${CMAKE_COMMAND} -E make_directory ${install_dir}
- COMMAND ${CMAKE_COMMAND} -E make_directory ${sentinels_dir}
- COMMAND ${CMAKE_COMMAND} -E make_directory ${source_dir}
- COMMAND ${CMAKE_COMMAND} -E make_directory ${tmp_dir}
- COMMAND ${CMAKE_COMMAND} -E touch ${sentinels_dir}/CMakeExternals-directories
- COMMENT "Creating CMakeExternals directories"
- VERBATIM
- )
-
- add_custom_target(CMakeExternals ALL
- DEPENDS ${sentinels_dir}/CMakeExternals-directories
- )
- endif()
-endfunction(add_CMakeExternals_target)
-
-# Pre-compute a regex to match known keywords.
-set(_aep_keyword_regex "^(")
-set(_aep_keyword_sep)
-foreach(key IN ITEMS
- BUILD_ARGS
- BUILD_COMMAND
- CMAKE_ARGS
- CMAKE_COMMAND
- CMAKE_GENERATOR
- CONFIGURE_COMMAND
- CONFIGURE_DIR
- CVS_MODULE
- CVS_REPOSITORY
- CVS_TAG
- DEPENDS
- DIR
- DOWNLOAD_COMMAND
- INSTALL_ARGS
- INSTALL_COMMAND
- LIST_SEPARATOR
- PATCH_COMMAND
- SVN_REPOSITORY
- SVN_TAG
- TAR
- TAR_URL
- TGZ
- TGZ_URL
- UPDATE_COMMAND
- )
- set(_aep_keyword_regex "${_aep_keyword_regex}${_aep_keyword_sep}${key}")
- set(_aep_keyword_sep "|")
-endforeach(key)
-set(_aep_keyword_regex "${_aep_keyword_regex})$")
-set(_aep_keyword_sep)
-set(_aep_keywords_add_external_project "${_aep_keyword_regex}")
-
-function(add_external_project name)
- get_external_project_directories(base_dir build_dir downloads_dir install_dir
- sentinels_dir source_dir tmp_dir)
-
-
- # Ensure root CMakeExternals target and directories are created.
- # All external projects will depend on this root CMakeExternals target.
- #
- add_CMakeExternals_target()
-
-
- # Add a custom target for the external project. The 'complete' step
- # depends on all other steps and creates a 'done' mark. A dependent
- # external project's 'configure' step depends on the 'done' mark so
- # that it rebuilds when this project rebuilds. It is important that
- # 'done' is not the output of any custom command so that CMake does
- # not propagate build rules to other external project targets.
- add_custom_target(${name} ALL DEPENDS ${sentinels_dir}/${name}-complete)
- add_custom_command(
- OUTPUT ${sentinels_dir}/${name}-complete
- COMMENT "Completed '${name}'"
- COMMAND ${CMAKE_COMMAND} -E touch ${sentinels_dir}/${name}-complete
- COMMAND ${CMAKE_COMMAND} -E touch ${sentinels_dir}/${name}-done
- DEPENDS ${sentinels_dir}/${name}-install
- VERBATIM
- )
- set_target_properties(${name} PROPERTIES AEP_IS_EXTERNAL_PROJECT 1)
- add_dependencies(${name} CMakeExternals)
-
- _aep_parse_arguments(add_external_project ${name} AEP_ "${ARGN}")
-
- # Depend on other external projects (target-level).
- get_property(deps TARGET ${name} PROPERTY AEP_DEPENDS)
- foreach(arg IN LISTS deps)
- add_dependencies(${name} ${arg})
- endforeach()
-
- # Set up custom build steps based on the target properties.
- # Each step depends on the previous one.
- #
- # The target depends on the output of the final step.
- # (Already set up above in the DEPENDS of the add_custom_target command.)
- #
- add_external_project_download_command(${name})
- add_external_project_update_command(${name})
- add_external_project_patch_command(${name})
- add_external_project_configure_command(${name})
- add_external_project_build_command(${name})
- add_external_project_install_command(${name})
-endfunction(add_external_project)