[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