[Cmake-commits] [cmake-commits] king committed AddExternalProject.cmake 1.12 1.13

cmake-commits at cmake.org cmake-commits at cmake.org
Mon Mar 30 11:35:55 EDT 2009


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

Modified Files:
	AddExternalProject.cmake 
Log Message:
ENH: Factor argument parsing in AddExternalProject

The add_external_project function parses its arguments and puts them in
properties of the target it creates.  This factors out implementation of
the behavior for use by other functions in the module.


Index: AddExternalProject.cmake
===================================================================
RCS file: /cvsroot/CMake/CMake/Modules/AddExternalProject.cmake,v
retrieving revision 1.12
retrieving revision 1.13
diff -C 2 -d -r1.12 -r1.13
*** AddExternalProject.cmake	30 Mar 2009 15:35:22 -0000	1.12
--- AddExternalProject.cmake	30 Mar 2009 15:35:50 -0000	1.13
***************
*** 5,8 ****
--- 5,45 ----
  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 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)
***************
*** 484,488 ****
    get_configure_build_working_dir(${name} working_dir)
  
!   get_property(file_deps TARGET ${name} PROPERTY AEP_FILE_DEPENDS)
    #message(STATUS "info: name='${name}' file_deps='${file_deps}'")
  
--- 521,530 ----
    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}'")
  
***************
*** 679,682 ****
--- 721,725 ----
  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)
***************
*** 709,754 ****
    add_dependencies(${name} CMakeExternals)
  
  
!   # 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 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}-done")
!       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()
  
--- 752,761 ----
    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()
  



More information about the Cmake-commits mailing list