[Cmake-commits] [cmake-commits] king committed AddExternalProject.cmake 1.8 1.9

cmake-commits at cmake.org cmake-commits at cmake.org
Wed Mar 18 11:00:32 EDT 2009


Update of /cvsroot/CMake/CMake/Modules
In directory public:/mounts/ram/cvs-serv14822/Modules

Modified Files:
	AddExternalProject.cmake 
Log Message:
ENH: Improve add_external_project interface

This rewrites the keyword/argument parsing and handling in the
AddExternalProject module to use arguments more literally:

  - The strict keyword-value pairing is gone in favor of keywords with
    arbitrary non-keyword values.  This avoids requiring users to escape
    spaces and quotes in command lines.

  - Customized step command lines are now specified with a single
    keyword <step>_COMMAND instead of putting the arguments in a
    separate entry (previously called <step>_ARGS).

  - Build step custom commands now use VERBATIM mode so that arguments
    are correctly escaped on the command line during builds.


Index: AddExternalProject.cmake
===================================================================
RCS file: /cvsroot/CMake/CMake/Modules/AddExternalProject.cmake,v
retrieving revision 1.8
retrieving revision 1.9
diff -C 2 -d -r1.8 -r1.9
*** AddExternalProject.cmake	4 Mar 2009 16:45:40 -0000	1.8
--- AddExternalProject.cmake	18 Mar 2009 15:00:27 -0000	1.9
***************
*** 66,75 ****
  endfunction(get_configure_command_id)
  
! function(_aep_get_build_command name step cmd_var args_var)
!   # No default arguments if command is user-specified.
!   set(args)
! 
    set(cmd "${${cmd_var}}")
    if(NOT cmd)
      get_configure_command_id(${name} cfg_cmd_id)
      if(cfg_cmd_id STREQUAL "cmake")
--- 66,73 ----
  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")
***************
*** 85,91 ****
        else()
          # Drive the project with "cmake --build".
!         get_target_property(cfg_cmd ${name} AEP_CONFIGURE_COMMAND)
!         if(cfg_cmd)
!           set(cmd "${cfg_cmd}")
          else()
            set(cmd "${CMAKE_COMMAND}")
--- 83,89 ----
        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}")
***************
*** 103,117 ****
        endif()
      endif()
-   endif()
  
!   # Use user-specified build 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()
  
-   # Return answers to caller.
    set(${cmd_var} "${cmd}" PARENT_SCOPE)
-   set(${args_var} "${args}" PARENT_SCOPE)
  endfunction(_aep_get_build_command)
  
--- 101,115 ----
        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)
  
***************
*** 139,160 ****
        COMMENT "No download step for '${name}'"
        DEPENDS ${sentinels_dir}/CMakeExternals-directories
        )
      return()
    else()
      if(cmd)
-       set(args "")
-       get_target_property(download_args ${name} AEP_DOWNLOAD_ARGS)
-       if(download_args)
-         set(args "${download_args}")
-         separate_arguments(args)
-       endif()
- 
        add_custom_command(
          OUTPUT ${sentinels_dir}/${name}-download
!         COMMAND ${cmd} ${args}
          COMMAND ${CMAKE_COMMAND} -E touch ${sentinels_dir}/${name}-download
          WORKING_DIRECTORY ${downloads_dir}
          COMMENT "Performing download step for '${name}'"
          DEPENDS ${sentinels_dir}/CMakeExternals-directories
          )
        return()
--- 137,153 ----
        COMMENT "No download step for '${name}'"
        DEPENDS ${sentinels_dir}/CMakeExternals-directories
+       VERBATIM
        )
      return()
    else()
      if(cmd)
        add_custom_command(
          OUTPUT ${sentinels_dir}/${name}-download
!         COMMAND ${cmd}
          COMMAND ${CMAKE_COMMAND} -E touch ${sentinels_dir}/${name}-download
          WORKING_DIRECTORY ${downloads_dir}
          COMMENT "Performing download step for '${name}'"
          DEPENDS ${sentinels_dir}/CMakeExternals-directories
+         VERBATIM
          )
        return()
***************
*** 199,202 ****
--- 192,196 ----
        COMMENT "Performing download step (CVS checkout) for '${name}'"
        DEPENDS ${sentinels_dir}/${name}-cvsinfo.txt
+       VERBATIM
      )
      return()
***************
*** 232,235 ****
--- 226,230 ----
        COMMENT "Performing download step (SVN checkout) for '${name}'"
        DEPENDS ${sentinels_dir}/${name}-svninfo.txt
+       VERBATIM
      )
      return()
***************
*** 260,263 ****
--- 255,259 ----
        COMMENT "Performing download step (DIR copy) for '${name}'"
        DEPENDS ${sentinels_dir}/${name}-dirinfo.txt
+       VERBATIM
      )
      return()
***************
*** 275,278 ****
--- 271,275 ----
        COMMENT "Performing download step (TAR untar) for '${name}'"
        DEPENDS ${tar}
+       VERBATIM
      )
      return()
***************
*** 290,293 ****
--- 287,291 ----
        COMMENT "Performing download step (TGZ untar) for '${name}'"
        DEPENDS ${tgz}
+       VERBATIM
      )
      return()
***************
*** 316,319 ****
--- 314,318 ----
        COMMENT "Performing download step (TGZ_URL download and untar) for '${name}'"
        DEPENDS ${sentinels_dir}/${name}-urlinfo.txt
+       VERBATIM
      )
      return()
***************
*** 342,345 ****
--- 341,345 ----
        COMMENT "Performing download step (TAR_URL download and untar) for '${name}'"
        DEPENDS ${sentinels_dir}/${name}-urlinfo.txt
+       VERBATIM
      )
      return()
***************
*** 369,386 ****
    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()
--- 369,380 ----
    else()
      if(cmd)
        add_custom_command(
          OUTPUT ${sentinels_dir}/${name}-update
!         COMMAND ${cmd}
          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
+         VERBATIM
          )
        return()
***************
*** 409,412 ****
--- 403,407 ----
        COMMENT "Performing update step (CVS update) for '${name}'"
        DEPENDS ${sentinels_dir}/${name}-download
+       VERBATIM
      )
      # Since the update sentinel is not actually written:
***************
*** 434,437 ****
--- 429,433 ----
        COMMENT "Performing update step (SVN update) for '${name}'"
        DEPENDS ${sentinels_dir}/${name}-download
+       VERBATIM
      )
      # Since the update sentinel is not actually written:
***************
*** 448,451 ****
--- 444,448 ----
      COMMENT "No update step for '${name}'"
      DEPENDS ${sentinels_dir}/${name}-download
+     VERBATIM
      )
  endfunction(add_external_project_update_command)
***************
*** 469,472 ****
--- 466,470 ----
      DEPENDS ${sentinels_dir}/${name}-update
        ${file_deps}
+     VERBATIM
      )
  
***************
*** 480,501 ****
        COMMENT "No configure step for '${name}'"
        DEPENDS ${sentinels_dir}/${name}-working_dir
        )
    else()
      if(NOT cmd)
!       set(cmd ${CMAKE_COMMAND})
!     endif()
  
!     set(args "")
!     get_target_property(configure_args ${name} AEP_CONFIGURE_ARGS)
!     if(configure_args)
!       set(args "${configure_args}")
!       separate_arguments(args)
!     endif()
  
!     get_target_property(cmake_generator ${name} AEP_CMAKE_GENERATOR)
!     if(cmake_generator)
!       get_configure_command_id(${name} cfg_cmd_id)
!       if(cfg_cmd_id STREQUAL "cmake")
!         list(APPEND args "-G${cmake_generator}" "${source_dir}/${name}")
        endif()
      endif()
--- 478,498 ----
        COMMENT "No configure step for '${name}'"
        DEPENDS ${sentinels_dir}/${name}-working_dir
+       VERBATIM
        )
    else()
      if(NOT cmd)
!       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()
***************
*** 503,511 ****
      add_custom_command(
        OUTPUT ${sentinels_dir}/${name}-configure
!       COMMAND ${cmd} ${args}
        COMMAND ${CMAKE_COMMAND} -E touch ${sentinels_dir}/${name}-configure
        WORKING_DIRECTORY ${working_dir}
        COMMENT "Performing configure step for '${name}'"
        DEPENDS ${sentinels_dir}/${name}-working_dir
        )
    endif()
--- 500,509 ----
      add_custom_command(
        OUTPUT ${sentinels_dir}/${name}-configure
!       COMMAND ${cmd}
        COMMAND ${CMAKE_COMMAND} -E touch ${sentinels_dir}/${name}-configure
        WORKING_DIRECTORY ${working_dir}
        COMMENT "Performing configure step for '${name}'"
        DEPENDS ${sentinels_dir}/${name}-working_dir
+       VERBATIM
        )
    endif()
***************
*** 527,541 ****
        COMMENT "No build step for '${name}'"
        DEPENDS ${sentinels_dir}/${name}-configure
        )
    else()
!     _aep_get_build_command(${name} BUILD cmd args)
  
      add_custom_command(
        OUTPUT ${sentinels_dir}/${name}-build
!       COMMAND ${cmd} ${args}
        COMMAND ${CMAKE_COMMAND} -E touch ${sentinels_dir}/${name}-build
        WORKING_DIRECTORY ${working_dir}
        COMMENT "Performing build step for '${name}'"
        DEPENDS ${sentinels_dir}/${name}-configure
        )
    endif()
--- 525,541 ----
        COMMENT "No build step for '${name}'"
        DEPENDS ${sentinels_dir}/${name}-configure
+       VERBATIM
        )
    else()
!     _aep_get_build_command(${name} BUILD cmd)
  
      add_custom_command(
        OUTPUT ${sentinels_dir}/${name}-build
!       COMMAND ${cmd}
        COMMAND ${CMAKE_COMMAND} -E touch ${sentinels_dir}/${name}-build
        WORKING_DIRECTORY ${working_dir}
        COMMENT "Performing build step for '${name}'"
        DEPENDS ${sentinels_dir}/${name}-configure
+       VERBATIM
        )
    endif()
***************
*** 558,568 ****
        COMMENT "No install step for '${name}'"
        DEPENDS ${sentinels_dir}/${name}-build
        )
    else()
!     _aep_get_build_command(${name} INSTALL cmd args)
  
      add_custom_command(
        OUTPUT ${sentinels_dir}/${name}-install
!       COMMAND ${cmd} ${args}
        COMMAND ${CMAKE_COMMAND} -E touch ${sentinels_dir}/${name}-install
        COMMAND ${CMAKE_COMMAND} -E touch ${sentinels_dir}/${name}-complete
--- 558,569 ----
        COMMENT "No install step for '${name}'"
        DEPENDS ${sentinels_dir}/${name}-build
+       VERBATIM
        )
    else()
!     _aep_get_build_command(${name} INSTALL cmd)
  
      add_custom_command(
        OUTPUT ${sentinels_dir}/${name}-install
!       COMMAND ${cmd}
        COMMAND ${CMAKE_COMMAND} -E touch ${sentinels_dir}/${name}-install
        COMMAND ${CMAKE_COMMAND} -E touch ${sentinels_dir}/${name}-complete
***************
*** 570,573 ****
--- 571,575 ----
        COMMENT "Performing install step for '${name}'"
        DEPENDS ${sentinels_dir}/${name}-build
+       VERBATIM
        )
    endif()
***************
*** 606,609 ****
--- 608,612 ----
        COMMAND ${CMAKE_COMMAND} -E touch ${sentinels_dir}/CMakeExternals-directories
        COMMENT "Creating CMakeExternals directories"
+       VERBATIM
      )
  
***************
*** 614,630 ****
  endfunction(add_CMakeExternals_target)
  
! 
! function(is_known_aep_property_key key result_var)
!   set(${result_var} 0 PARENT_SCOPE)
! 
!   if(key MATCHES "^BUILD_ARGS|BUILD_COMMAND|CMAKE_GENERATOR|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}'")
!     set(${result_var} 1 PARENT_SCOPE)
!   else()
!     message(STATUS "warning: is_known_aep_property_key unknown key='${key}'")
!   endif()
! endfunction(is_known_aep_property_key)
! 
  
  function(add_external_project name)
--- 617,652 ----
  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
!     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)
  
  function(add_external_project name)
***************
*** 653,687 ****
    # correctly based on target properties.
    #
!   # Loop over ARGN by 2's extracting key/value pairs from the non-explicit
!   # arguments to this function:
!   #
!   list(LENGTH ARGN n)
!   set(i 0)
!   while(i LESS n)
!     math(EXPR j ${i}+1)
! 
!     list(GET ARGN ${i} key)
!     list(GET ARGN ${j} value)
! 
!     is_known_aep_property_key("${key}" is_known_key)
! 
!     if(is_known_key)
!       if(key STREQUAL "DEPENDS")
!         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()
!       message(SEND_ERROR "error: unknown add_external_project key with name='${name}' key='${key}' value='${value}'")
      endif()
! 
!     math(EXPR i ${i}+2)
!   endwhile()
! 
  
    # Set up custom build steps based on the target properties.
--- 675,716 ----
    # 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 ARGN)
!     if(arg MATCHES "^[A-Z][A-Z_][A-Z_]+$" AND
!         NOT arg MATCHES "^(TRUE|FALSE)$")
!       # Keyword
!       set(key "${arg}")
!       if(NOT key MATCHES "${_aep_keyword_regex}")
!         message(AUTHOR_WARNING "unknown add_external_project keyword: ${key}")
!       endif()
!     elseif(key STREQUAL "DEPENDS")
!       # Value for DEPENDS
!       if(NOT arg STREQUAL "")
!         add_dependencies(${name} ${arg})
!         set_property(TARGET ${name} APPEND PROPERTY AEP_FILE_DEPENDS "${sentinels_dir}/${arg}-complete")
!       else()
!         message(AUTHOR_WARNING "empty DEPENDS value in add_external_project")
!       endif()
!     elseif(key)
!       # Value
!       if(NOT arg STREQUAL "")
!         set_property(TARGET ${name} APPEND PROPERTY AEP_${key} "${arg}")
!       else()
!         get_property(have_key TARGET ${name} PROPERTY AEP_${key} SET)
!         if(have_key)
!           get_property(value TARGET ${name} PROPERTY AEP_${key})
!           set_property(TARGET ${name} PROPERTY AEP_${key} "${value};${arg}")
          else()
!           set_property(TARGET ${name} PROPERTY AEP_${key} "${arg}")
          endif()
        endif()
      else()
!       # Missing Keyword
!       message(AUTHOR_WARNING "value with no keyword in add_external_project")
      endif()
!   endforeach()
  
    # Set up custom build steps based on the target properties.



More information about the Cmake-commits mailing list