[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