[Cmake-commits] [cmake-commits] david.cole committed AddExternalProject.cmake 1.4 1.5
cmake-commits at cmake.org
cmake-commits at cmake.org
Fri Dec 19 10:35:19 EST 2008
Update of /cvsroot/CMake/CMake/Modules
In directory public:/mounts/ram/cvs-serv4729
Modified Files:
AddExternalProject.cmake
Log Message:
ENH: Add the update step in between download and build. Add UPDATE_ARGS and UPDATE_COMMAND handling. Output a -complete sentinel in synch with the -install sentinel, but do not list it as an OUTPUT of the custom command. That breaks the chaining of add_custom_commands between custom targets, but allows for a file-level dependency expression that will cause proper incremental rebuilds. When earlier targets rebuild, subsequent dependent targets will also rebuild. CVS and SVN update commands are always out-of-date so that they always run to get the latest source. To suppress that behavior on a per-external project basis use an explicit empty string for UPDATE_COMMAND. The source will still be checked out from the repository prior to the update step by the download step.
Index: AddExternalProject.cmake
===================================================================
RCS file: /cvsroot/CMake/CMake/Modules/AddExternalProject.cmake,v
retrieving revision 1.4
retrieving revision 1.5
diff -C 2 -d -r1.4 -r1.5
*** AddExternalProject.cmake 9 Dec 2008 20:31:28 -0000 1.4
--- AddExternalProject.cmake 19 Dec 2008 15:35:16 -0000 1.5
***************
*** 77,86 ****
function(add_external_project_download_command name)
- set(added 0)
get_external_project_directories(base_dir build_dir downloads_dir install_dir
sentinels_dir source_dir tmp_dir)
- if(NOT added)
get_target_property(cmd ${name} AEP_DOWNLOAD_COMMAND)
if(cmd STREQUAL "")
--- 77,84 ----
***************
*** 93,97 ****
DEPENDS ${sentinels_dir}/CMakeExternals-directories
)
! set(added 1)
else()
if(cmd)
--- 91,95 ----
DEPENDS ${sentinels_dir}/CMakeExternals-directories
)
! return()
else()
if(cmd)
***************
*** 111,115 ****
DEPENDS ${sentinels_dir}/CMakeExternals-directories
)
! set(added 1)
else()
# No explicit DOWNLOAD_COMMAND property. Look for other properties
--- 109,113 ----
DEPENDS ${sentinels_dir}/CMakeExternals-directories
)
! return()
else()
# No explicit DOWNLOAD_COMMAND property. Look for other properties
***************
*** 117,124 ****
endif()
endif()
- endif()
- if(NOT added)
get_target_property(cvs_repository ${name} AEP_CVS_REPOSITORY)
if(cvs_repository)
--- 115,120 ----
***************
*** 138,142 ****
endif()
! set(args -d ${cvs_repository} co ${cvs_tag} -d ${name} ${cvs_module})
set(repository ${cvs_repository})
--- 134,138 ----
endif()
! set(args -d ${cvs_repository} -q co ${cvs_tag} -d ${name} ${cvs_module})
set(repository ${cvs_repository})
***************
*** 159,168 ****
DEPENDS ${sentinels_dir}/${name}-cvsinfo.txt
)
! set(added 1)
endif()
- endif(NOT added)
- if(NOT added)
get_target_property(svn_repository ${name} AEP_SVN_REPOSITORY)
if(svn_repository)
--- 155,162 ----
DEPENDS ${sentinels_dir}/${name}-cvsinfo.txt
)
! return()
endif()
get_target_property(svn_repository ${name} AEP_SVN_REPOSITORY)
if(svn_repository)
***************
*** 198,207 ****
DEPENDS ${sentinels_dir}/${name}-svninfo.txt
)
! set(added 1)
endif()
- endif(NOT added)
- if(NOT added)
get_target_property(dir ${name} AEP_DIR)
if(dir)
--- 192,199 ----
DEPENDS ${sentinels_dir}/${name}-svninfo.txt
)
! return()
endif()
get_target_property(dir ${name} AEP_DIR)
if(dir)
***************
*** 228,237 ****
DEPENDS ${sentinels_dir}/${name}-dirinfo.txt
)
! set(added 1)
endif()
- endif(NOT added)
- if(NOT added)
get_target_property(tar ${name} AEP_TAR)
if(tar)
--- 220,227 ----
DEPENDS ${sentinels_dir}/${name}-dirinfo.txt
)
! return()
endif()
get_target_property(tar ${name} AEP_TAR)
if(tar)
***************
*** 245,254 ****
DEPENDS ${tar}
)
! set(added 1)
endif()
- endif(NOT added)
- if(NOT added)
get_target_property(tgz ${name} AEP_TGZ)
if(tgz)
--- 235,242 ----
DEPENDS ${tar}
)
! return()
endif()
get_target_property(tgz ${name} AEP_TGZ)
if(tgz)
***************
*** 262,271 ****
DEPENDS ${tgz}
)
! set(added 1)
endif()
- endif(NOT added)
- if(NOT added)
get_target_property(tgz_url ${name} AEP_TGZ_URL)
if(tgz_url)
--- 250,257 ----
DEPENDS ${tgz}
)
! return()
endif()
get_target_property(tgz_url ${name} AEP_TGZ_URL)
if(tgz_url)
***************
*** 290,299 ****
DEPENDS ${sentinels_dir}/${name}-urlinfo.txt
)
! set(added 1)
endif()
- endif(NOT added)
- if(NOT added)
get_target_property(tar_url ${name} AEP_TAR_URL)
if(tar_url)
--- 276,283 ----
DEPENDS ${sentinels_dir}/${name}-urlinfo.txt
)
! return()
endif()
get_target_property(tar_url ${name} AEP_TAR_URL)
if(tar_url)
***************
*** 318,332 ****
DEPENDS ${sentinels_dir}/${name}-urlinfo.txt
)
! set(added 1)
endif()
- endif(NOT added)
! if(NOT added)
! message(SEND_ERROR "error: no download info for '${name}'")
! endif(NOT added)
endfunction(add_external_project_download_command)
function(add_external_project_configure_command name)
get_external_project_directories(base_dir build_dir downloads_dir install_dir
--- 302,417 ----
DEPENDS ${sentinels_dir}/${name}-urlinfo.txt
)
! return()
endif()
! message(SEND_ERROR "error: no download info for '${name}'")
endfunction(add_external_project_download_command)
+ function(add_external_project_update_command name)
+ set(added 0)
+ get_external_project_directories(base_dir build_dir downloads_dir install_dir
+ sentinels_dir source_dir tmp_dir)
+
+
+ get_target_property(cmd ${name} AEP_UPDATE_COMMAND)
+ if(cmd STREQUAL "")
+ # Explicit empty string means no update step for this project
+ add_custom_command(
+ OUTPUT ${sentinels_dir}/${name}-update
+ COMMAND ${CMAKE_COMMAND} -E touch ${sentinels_dir}/${name}-update
+ WORKING_DIRECTORY ${sentinels_dir}
+ COMMENT "No update step for '${name}'"
+ DEPENDS ${sentinels_dir}/${name}-download
+ )
+ return()
+ else()
+ if(cmd)
+ set(args "")
+ get_target_property(update_args ${name} AEP_UPDATE_ARGS)
+ if(update_args)
+ set(args "${update_args}")
+ separate_arguments(args)
+ endif()
+
+ add_custom_command(
+ OUTPUT ${sentinels_dir}/${name}-update
+ COMMAND ${cmd} ${args}
+ COMMAND ${CMAKE_COMMAND} -E touch ${sentinels_dir}/${name}-update
+ WORKING_DIRECTORY ${source_dir}/${name}
+ COMMENT "Performing update step for '${name}'"
+ DEPENDS ${sentinels_dir}/${name}-download
+ )
+ return()
+ else()
+ # No explicit UPDATE_COMMAND property. Look for other properties
+ # indicating which update method to use in the logic below...
+ endif()
+ endif()
+
+
+ get_target_property(cvs_repository ${name} AEP_CVS_REPOSITORY)
+ if(cvs_repository)
+ if(NOT CVS_EXECUTABLE)
+ message(FATAL_ERROR "error: could not find cvs for update of ${name}")
+ endif()
+
+ get_target_property(tag ${name} AEP_CVS_TAG)
+ set(cvs_tag)
+ if(tag)
+ set(cvs_tag ${tag})
+ endif()
+
+ set(args -d ${cvs_repository} -q up -dP ${cvs_tag})
+
+ mkdir("${source_dir}/${name}")
+ add_custom_command(
+ OUTPUT ${sentinels_dir}/${name}-update
+ COMMAND ${CVS_EXECUTABLE} ${args}
+ WORKING_DIRECTORY ${source_dir}/${name}
+ COMMENT "Performing update step (CVS update) for '${name}'"
+ DEPENDS ${sentinels_dir}/${name}-download
+ )
+ return()
+ endif()
+
+
+ get_target_property(svn_repository ${name} AEP_SVN_REPOSITORY)
+ if(svn_repository)
+ if(NOT Subversion_SVN_EXECUTABLE)
+ message(FATAL_ERROR "error: could not find svn for update of ${name}")
+ endif()
+
+ get_target_property(tag ${name} AEP_SVN_TAG)
+ set(svn_tag)
+ if(tag)
+ set(svn_tag ${tag})
+ endif()
+
+ set(args up ${svn_tag})
+
+ mkdir("${source_dir}/${name}")
+ add_custom_command(
+ OUTPUT ${sentinels_dir}/${name}-update
+ COMMAND ${Subversion_SVN_EXECUTABLE} ${args}
+ WORKING_DIRECTORY ${source_dir}/${name}
+ COMMENT "Performing update step (SVN update) for '${name}'"
+ DEPENDS ${sentinels_dir}/${name}-download
+ )
+ return()
+ endif()
+
+
+ add_custom_command(
+ OUTPUT ${sentinels_dir}/${name}-update
+ COMMAND ${CMAKE_COMMAND} -E touch ${sentinels_dir}/${name}-update
+ WORKING_DIRECTORY ${sentinels_dir}
+ COMMENT "No update step for '${name}'"
+ DEPENDS ${sentinels_dir}/${name}-download
+ )
+ endfunction(add_external_project_update_command)
+
+
function(add_external_project_configure_command name)
get_external_project_directories(base_dir build_dir downloads_dir install_dir
***************
*** 334,337 ****
--- 419,428 ----
get_configure_build_working_dir(${name} working_dir)
+ get_target_property(file_deps ${name} AEP_FILE_DEPENDS)
+ if(NOT file_deps)
+ set(file_deps)
+ endif()
+ #message(STATUS "info: name='${name}' file_deps='${file_deps}'")
+
# Create the working_dir for configure, build and install steps:
#
***************
*** 341,345 ****
COMMAND ${CMAKE_COMMAND} -E make_directory ${working_dir}
COMMAND ${CMAKE_COMMAND} -E touch ${sentinels_dir}/${name}-working_dir
! DEPENDS ${sentinels_dir}/${name}-download
)
--- 432,437 ----
COMMAND ${CMAKE_COMMAND} -E make_directory ${working_dir}
COMMAND ${CMAKE_COMMAND} -E touch ${sentinels_dir}/${name}-working_dir
! DEPENDS ${sentinels_dir}/${name}-update
! ${file_deps}
)
***************
*** 439,442 ****
--- 531,535 ----
OUTPUT ${sentinels_dir}/${name}-install
COMMAND ${CMAKE_COMMAND} -E touch ${sentinels_dir}/${name}-install
+ COMMAND ${CMAKE_COMMAND} -E touch ${sentinels_dir}/${name}-complete
WORKING_DIRECTORY ${working_dir}
COMMENT "No install step for '${name}'"
***************
*** 473,476 ****
--- 566,570 ----
COMMAND ${cmd} ${args}
COMMAND ${CMAKE_COMMAND} -E touch ${sentinels_dir}/${name}-install
+ COMMAND ${CMAKE_COMMAND} -E touch ${sentinels_dir}/${name}-complete
WORKING_DIRECTORY ${working_dir}
COMMENT "Performing install step for '${name}'"
***************
*** 524,528 ****
set(${result_var} 0 PARENT_SCOPE)
! if(key MATCHES "^BUILD_ARGS|BUILD_COMMAND|CONFIGURE_ARGS|CONFIGURE_COMMAND|CONFIGURE_DIR|CVS_REPOSITORY|CVS_MODULE|CVS_TAG|DEPENDS|DOWNLOAD_ARGS|DOWNLOAD_COMMAND|DIR|INSTALL_ARGS|INSTALL_COMMAND|SVN_REPOSITORY|SVN_TAG|TAR|TAR_URL|TGZ|TGZ_URL$"
)
#message(STATUS "info: recognized via MATCHES - key='${key}'")
--- 618,622 ----
set(${result_var} 0 PARENT_SCOPE)
! if(key MATCHES "^BUILD_ARGS|BUILD_COMMAND|CONFIGURE_ARGS|CONFIGURE_COMMAND|CONFIGURE_DIR|CVS_REPOSITORY|CVS_MODULE|CVS_TAG|DEPENDS|DOWNLOAD_ARGS|DOWNLOAD_COMMAND|DIR|INSTALL_ARGS|INSTALL_COMMAND|SVN_REPOSITORY|SVN_TAG|TAR|TAR_URL|TGZ|TGZ_URL|UPDATE_ARGS|UPDATE_COMMAND$"
)
#message(STATUS "info: recognized via MATCHES - key='${key}'")
***************
*** 576,584 ****
if(NOT value STREQUAL "")
add_dependencies(${name} ${value})
else()
message(STATUS "warning: empty DEPENDS value in add_external_project")
endif()
else()
! set_target_properties(${name} PROPERTIES AEP_${key} "${value}")
endif()
else()
--- 670,679 ----
if(NOT value STREQUAL "")
add_dependencies(${name} ${value})
+ set_property(TARGET ${name} APPEND PROPERTY AEP_FILE_DEPENDS "${sentinels_dir}/${value}-complete")
else()
message(STATUS "warning: empty DEPENDS value in add_external_project")
endif()
else()
! set_property(TARGET ${name} PROPERTY AEP_${key} "${value}")
endif()
else()
***************
*** 597,600 ****
--- 692,696 ----
#
add_external_project_download_command(${name})
+ add_external_project_update_command(${name})
add_external_project_configure_command(${name})
add_external_project_build_command(${name})
More information about the Cmake-commits
mailing list