This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "CMake".
The branch, next has been updated via b8bbab49a67056db603ae48403de45b3fc758d58 (commit) via da13eecef80a62ff17dcf4c19bff8729d0e7bc71 (commit) via d236993695e9a7bf3a4301d84eb3238059fe9a47 (commit) via bf203c8f8e4a6ad4f642b2653f8abca563484889 (commit) via 273e66e761589f29b5202ea6e61e0fa890d4bb8e (commit) via 1acf3c6cae0524925c269d41cd0bddbbcec9f8f9 (commit) via 8a8cc69e1a3b9a9f35a16290519d8249f14a4029 (commit) via 3a88afa33e311749358c3abc393804aa421fb4f5 (commit) via c9d0426ba560d1b70656a3f444ddb7053b7f82e4 (commit) from 23ebeb79ea28706205d5882fd3b8e242df588957 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=b8bbab49a67056db603ae48403de45b3fc758d58 commit b8bbab49a67056db603ae48403de45b3fc758d58 Merge: 23ebeb7 da13eec Author: Daniele E. Domenichelli <daniele.domeniche...@gmail.com> AuthorDate: Wed Nov 27 18:03:22 2013 -0500 Commit: CMake Topic Stage <kwro...@kitware.com> CommitDate: Wed Nov 27 18:03:22 2013 -0500 Merge topic 'CMakeParseArguments_EmptyArgs' into next da13eec Make define_property() scriptable d236993 CMakeParseArguments: Add unit tests bf203c8 CMakeParseArguments: Add workaround for compatibility with CMake <= 2.8.12 273e66e CMakeParseArguments: Next release will be 3.0.0, not 2.8.13 1acf3c6 CMakeParseArguments: Avoid replacing CMAKE_MATCH_1 8a8cc69 CMakeParseArguments: Update documentation 3a88afa CMakeParseArguments: Keep compatibility with previous behaviour c9d0426 CMakeParseArguments: Do not skip empty arguments diff --cc Tests/RunCMake/CMakeLists.txt index 89a0794,bb26396..9325b8c --- a/Tests/RunCMake/CMakeLists.txt +++ b/Tests/RunCMake/CMakeLists.txt @@@ -135,5 -134,5 +135,6 @@@ endif( add_RunCMake_test(File_Generate) add_RunCMake_test(ExportWithoutLanguage) add_RunCMake_test(target_link_libraries) +add_RunCMake_test(target_compile_features) add_RunCMake_test(CheckModules) + add_RunCMake_test(CMakeParseArguments) http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=da13eecef80a62ff17dcf4c19bff8729d0e7bc71 commit da13eecef80a62ff17dcf4c19bff8729d0e7bc71 Author: Daniele E. Domenichelli <daniele.domeniche...@iit.it> AuthorDate: Thu Nov 14 16:14:30 2013 +0100 Commit: Daniele E. Domenichelli <daniele.domeniche...@iit.it> CommitDate: Thu Nov 28 00:02:22 2013 +0100 Make define_property() scriptable This will allow CMakeParseArguments and some other modules that use define_property (i.e. ExternalProject) to be used in script mode. diff --git a/Source/cmDefinePropertyCommand.h b/Source/cmDefinePropertyCommand.h index 8dc4d96..c4143cf 100644 --- a/Source/cmDefinePropertyCommand.h +++ b/Source/cmDefinePropertyCommand.h @@ -34,6 +34,13 @@ public: */ virtual const char* GetName() const { return "define_property";} + /** + * This determines if the command is invoked when in script mode. + * define_property() will have no effect in script mode, but this will + * make many of the modules usable in cmake/ctest scripts. + */ + virtual bool IsScriptable() const { return true; } + cmTypeMacro(cmDefinePropertyCommand, cmCommand); private: std::string PropertyName; http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=d236993695e9a7bf3a4301d84eb3238059fe9a47 commit d236993695e9a7bf3a4301d84eb3238059fe9a47 Author: Daniele E. Domenichelli <daniele.domeniche...@iit.it> AuthorDate: Thu Nov 14 11:54:29 2013 +0100 Commit: Daniele E. Domenichelli <daniele.domeniche...@iit.it> CommitDate: Thu Nov 28 00:02:22 2013 +0100 CMakeParseArguments: Add unit tests diff --git a/Tests/RunCMake/CMakeLists.txt b/Tests/RunCMake/CMakeLists.txt index 209b0b3..bb26396 100644 --- a/Tests/RunCMake/CMakeLists.txt +++ b/Tests/RunCMake/CMakeLists.txt @@ -135,3 +135,4 @@ add_RunCMake_test(File_Generate) add_RunCMake_test(ExportWithoutLanguage) add_RunCMake_test(target_link_libraries) add_RunCMake_test(CheckModules) +add_RunCMake_test(CMakeParseArguments) diff --git a/Tests/RunCMake/CMakeParseArguments/ARGUMENT-KEEP.cmake b/Tests/RunCMake/CMakeParseArguments/ARGUMENT-KEEP.cmake new file mode 100644 index 0000000..1913713 --- /dev/null +++ b/Tests/RunCMake/CMakeParseArguments/ARGUMENT-KEEP.cmake @@ -0,0 +1,29 @@ +# CMAKE_MINIMUM_REQUIRED_VERSION 2.8.12 +# CMAKE_PARSE_ARGUMENTS_DEFAULT_SKIP_EMPTY 1 +# CMAKE_PARSE_ARGUMENTS_(KEEP|SKIP)_EMPTY KEEP +# => KEEP + +cmake_minimum_required(VERSION 2.8.12) + +include(CMakeParseArguments) + +set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY CMAKE_PARSE_ARGUMENTS_DEFAULT_SKIP_EMPTY 1) + +macro(MY_INSTALL) + set(options OPTIONAL FAST) + set(oneValueArgs DESTINATION RENAME) + set(multiValueArgs TARGETS CONFIGURATIONS) + cmake_parse_arguments(MY_INSTALL "${options}" "${oneValueArgs}" "${multiValueArgs}" CMAKE_PARSE_ARGUMENTS_KEEP_EMPTY "${ARGN}") +endmacro() + +my_install(DESTINATION "" TARGETS foo "" bar) + +if(NOT DEFINED MY_INSTALL_DESTINATION) + message(FATAL_ERROR "NOT DEFINED MY_INSTALL_DESTINATION") +elseif(NOT "${MY_INSTALL_DESTINATION}" STREQUAL "") + message(FATAL_ERROR "NOT \"\${MY_INSTALL_DESTINATION}\" STREQUAL \"\"") +endif() + +if(NOT "${MY_INSTALL_TARGETS}" STREQUAL "foo;;bar") + message(FATAL_ERROR "NOT \"\${MY_INSTALL_TARGETS}\" STREQUAL \"foo;;bar\"") +endif() diff --git a/Tests/RunCMake/CMakeParseArguments/ARGUMENT-SKIP.cmake b/Tests/RunCMake/CMakeParseArguments/ARGUMENT-SKIP.cmake new file mode 100644 index 0000000..6e0598c --- /dev/null +++ b/Tests/RunCMake/CMakeParseArguments/ARGUMENT-SKIP.cmake @@ -0,0 +1,27 @@ +# CMAKE_MINIMUM_REQUIRED_VERSION 2.8.12 +# CMAKE_PARSE_ARGUMENTS_DEFAULT_SKIP_EMPTY 0 +# CMAKE_PARSE_ARGUMENTS_(KEEP|SKIP)_EMPTY SKIP +# => SKIP + +cmake_minimum_required(VERSION 2.8.12) + +include(CMakeParseArguments) + +set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY CMAKE_PARSE_ARGUMENTS_DEFAULT_SKIP_EMPTY 0) + +macro(MY_INSTALL) + set(options OPTIONAL FAST) + set(oneValueArgs DESTINATION RENAME) + set(multiValueArgs TARGETS CONFIGURATIONS) + cmake_parse_arguments(MY_INSTALL "${options}" "${oneValueArgs}" "${multiValueArgs}" CMAKE_PARSE_ARGUMENTS_SKIP_EMPTY "${ARGN}") +endmacro() + +my_install(DESTINATION "" TARGETS foo "" bar) + +if(DEFINED MY_INSTALL_DESTINATION) + message(FATAL_ERROR "DEFINED MY_INSTALL_DESTINATION") +endif() + +if(NOT "${MY_INSTALL_TARGETS}" STREQUAL "foo;bar") + message(FATAL_ERROR "NOT \"\${MY_INSTALL_TARGETS}\" STREQUAL \"foo;bar\"") +endif() diff --git a/Tests/RunCMake/CMakeParseArguments/CMakeLists.txt b/Tests/RunCMake/CMakeParseArguments/CMakeLists.txt new file mode 100644 index 0000000..4b3de84 --- /dev/null +++ b/Tests/RunCMake/CMakeParseArguments/CMakeLists.txt @@ -0,0 +1,3 @@ +cmake_minimum_required(VERSION 2.8.12) +project(${RunCMake_TEST} NONE) +include(${RunCMake_TEST}.cmake) diff --git a/Tests/RunCMake/CMakeParseArguments/Example.cmake b/Tests/RunCMake/CMakeParseArguments/Example.cmake new file mode 100644 index 0000000..063b5f8 --- /dev/null +++ b/Tests/RunCMake/CMakeParseArguments/Example.cmake @@ -0,0 +1,70 @@ +include(CMakeParseArguments) + +macro(MY_INSTALL) + set(options OPTIONAL FAST) + set(oneValueArgs DESTINATION RENAME) + set(multiValueArgs TARGETS CONFIGURATIONS) + cmake_parse_arguments(MY_INSTALL "${options}" "${oneValueArgs}" "${multiValueArgs}" "${ARGN}") +endmacro() + +my_install(TARGETS foo bar DESTINATION bin OPTIONAL) + +if(NOT MY_INSTALL_OPTIONAL) + message(FATAL_ERROR "NOT MY_INSTALL_OPTIONAL") +endif() + +if(MY_INSTALL_FAST) + message(FATAL_ERROR "MY_INSTALL_FAST") +endif() + +if(NOT "${MY_INSTALL_DESTINATION}" STREQUAL "bin") + message(FATAL_ERROR "NOT \"\${MY_INSTALL_DESTINATION}\" STREQUAL \"bin\"") +endif() + +if(DEFINED MY_INSTALL_RENAME) + message(FATAL_ERROR "DEFINED MY_INSTALL_RENAME") +endif() + +if(NOT "${MY_INSTALL_TARGETS}" STREQUAL "foo;bar") + message(FATAL_ERROR "NOT \"\${MY_INSTALL_TARGETS}\" STREQUAL \"foo;bar\"") +endif() + +if(DEFINED MY_INSTALL_CONFIGURATIONS) + message(FATAL_ERROR "DEFINED MY_INSTALL_CONFIGURATIONS") +endif() + +if(DEFINED MY_INSTALL_UNPARSED_ARGUMENTS) + message(DEFINED MY_INSTALL_UNPARSED_ARGUMENTS) +endif() + + + +my_install(TARGETS foo bar DESTINATION bin OPTIONAL blub) + +if(NOT MY_INSTALL_OPTIONAL) + message(FATAL_ERROR "NOT MY_INSTALL_OPTIONAL") +endif() + +if(MY_INSTALL_FAST) + message(FATAL_ERROR "MY_INSTALL_FAST") +endif() + +if(NOT "${MY_INSTALL_DESTINATION}" STREQUAL "bin") + message(FATAL_ERROR "NOT \"\${MY_INSTALL_DESTINATION}\" STREQUAL \"bin\"") +endif() + +if(DEFINED MY_INSTALL_RENAME) + message(FATAL_ERROR "DEFINED MY_INSTALL_RENAME") +endif() + +if(NOT "${MY_INSTALL_TARGETS}" STREQUAL "foo;bar") + message(FATAL_ERROR "NOT \"\${MY_INSTALL_TARGETS}\" STREQUAL \"foo;bar\"") +endif() + +if(DEFINED MY_INSTALL_CONFIGURATIONS) + message(FATAL_ERROR "DEFINED MY_INSTALL_CONFIGURATIONS") +endif() + +if(NOT "${MY_INSTALL_UNPARSED_ARGUMENTS}" STREQUAL "blub") + message(FATAL_ERROR "NOT \"\${MY_INSTALL_UNPARSED_ARGUMENTS}\" STREQUAL \"blub\"") +endif() diff --git a/Tests/RunCMake/CMakeParseArguments/PROPERTY-KEEP.cmake b/Tests/RunCMake/CMakeParseArguments/PROPERTY-KEEP.cmake new file mode 100644 index 0000000..67046ef --- /dev/null +++ b/Tests/RunCMake/CMakeParseArguments/PROPERTY-KEEP.cmake @@ -0,0 +1,29 @@ +# CMAKE_MINIMUM_REQUIRED_VERSION 2.8.12 +# CMAKE_PARSE_ARGUMENTS_DEFAULT_SKIP_EMPTY 0 +# CMAKE_PARSE_ARGUMENTS_(KEEP|SKIP)_EMPTY UNSET +# => KEEP + +cmake_minimum_required(VERSION 2.8.12) + +include(CMakeParseArguments) + +set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY CMAKE_PARSE_ARGUMENTS_DEFAULT_SKIP_EMPTY 0) + +macro(MY_INSTALL) + set(options OPTIONAL FAST) + set(oneValueArgs DESTINATION RENAME) + set(multiValueArgs TARGETS CONFIGURATIONS) + cmake_parse_arguments(MY_INSTALL "${options}" "${oneValueArgs}" "${multiValueArgs}" "${ARGN}") +endmacro() + +my_install(DESTINATION "" TARGETS foo "" bar) + +if(NOT DEFINED MY_INSTALL_DESTINATION) + message(FATAL_ERROR "NOT DEFINED MY_INSTALL_DESTINATION") +elseif(NOT "${MY_INSTALL_DESTINATION}" STREQUAL "") + message(FATAL_ERROR "NOT \"\${MY_INSTALL_DESTINATION}\" STREQUAL \"\"") +endif() + +if(NOT "${MY_INSTALL_TARGETS}" STREQUAL "foo;;bar") + message(FATAL_ERROR "NOT \"\${MY_INSTALL_TARGETS}\" STREQUAL \"foo;;bar\"") +endif() diff --git a/Tests/RunCMake/CMakeParseArguments/PROPERTY-SKIP.cmake b/Tests/RunCMake/CMakeParseArguments/PROPERTY-SKIP.cmake new file mode 100644 index 0000000..941d63f --- /dev/null +++ b/Tests/RunCMake/CMakeParseArguments/PROPERTY-SKIP.cmake @@ -0,0 +1,27 @@ +# CMAKE_MINIMUM_REQUIRED_VERSION 2.8.12 +# CMAKE_PARSE_ARGUMENTS_DEFAULT_SKIP_EMPTY 1 +# CMAKE_PARSE_ARGUMENTS_(KEEP|SKIP)_EMPTY UNSET +# => SKIP + +cmake_minimum_required(VERSION 2.8.12) + +include(CMakeParseArguments) + +set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY CMAKE_PARSE_ARGUMENTS_DEFAULT_SKIP_EMPTY 1) + +macro(MY_INSTALL) + set(options OPTIONAL FAST) + set(oneValueArgs DESTINATION RENAME) + set(multiValueArgs TARGETS CONFIGURATIONS) + cmake_parse_arguments(MY_INSTALL "${options}" "${oneValueArgs}" "${multiValueArgs}" "${ARGN}") +endmacro() + +my_install(DESTINATION "" TARGETS foo "" bar) + +if(DEFINED MY_INSTALL_DESTINATION) + message(FATAL_ERROR "DEFINED MY_INSTALL_DESTINATION") +endif() + +if(NOT "${MY_INSTALL_TARGETS}" STREQUAL "foo;bar") + message(FATAL_ERROR "NOT \"\${MY_INSTALL_TARGETS}\" STREQUAL \"foo;bar\"") +endif() diff --git a/Tests/RunCMake/CMakeParseArguments/RunCMakeTest.cmake b/Tests/RunCMake/CMakeParseArguments/RunCMakeTest.cmake new file mode 100644 index 0000000..30ab6c6 --- /dev/null +++ b/Tests/RunCMake/CMakeParseArguments/RunCMakeTest.cmake @@ -0,0 +1,9 @@ +include(RunCMake) + +run_cmake(Example) +run_cmake(VERSION-SKIP) +# run_cmake(VERSION-KEEP) # Enable when 3.0.0 is released +run_cmake(PROPERTY-SKIP) +run_cmake(PROPERTY-KEEP) +run_cmake(ARGUMENT-SKIP) +run_cmake(ARGUMENT-KEEP) diff --git a/Tests/RunCMake/CMakeParseArguments/VERSION-KEEP.cmake b/Tests/RunCMake/CMakeParseArguments/VERSION-KEEP.cmake new file mode 100644 index 0000000..44967ec --- /dev/null +++ b/Tests/RunCMake/CMakeParseArguments/VERSION-KEEP.cmake @@ -0,0 +1,27 @@ +# CMAKE_MINIMUM_REQUIRED_VERSION 3.0.0 +# CMAKE_PARSE_ARGUMENTS_DEFAULT_SKIP_EMPTY UNSET +# CMAKE_PARSE_ARGUMENTS_(KEEP|SKIP)_EMPTY UNSET +# => KEEP + +cmake_minimum_required(VERSION 3.0.0) + +include(CMakeParseArguments) + +macro(MY_INSTALL) + set(options OPTIONAL FAST) + set(oneValueArgs DESTINATION RENAME) + set(multiValueArgs TARGETS CONFIGURATIONS) + cmake_parse_arguments(MY_INSTALL "${options}" "${oneValueArgs}" "${multiValueArgs}" "${ARGN}") +endmacro() + +my_install(DESTINATION "" TARGETS foo "" bar) + +if(NOT DEFINED MY_INSTALL_DESTINATION) + message(FATAL_ERROR "NOT DEFINED MY_INSTALL_DESTINATION") +elseif(NOT "${MY_INSTALL_DESTINATION}" STREQUAL "") + message(FATAL_ERROR "NOT \"\${MY_INSTALL_DESTINATION}\" STREQUAL \"\"") +endif() + +if(NOT "${MY_INSTALL_TARGETS}" STREQUAL "foo;;bar") + message(FATAL_ERROR "NOT \"\${MY_INSTALL_TARGETS}\" STREQUAL \"foo;;bar\"") +endif() diff --git a/Tests/RunCMake/CMakeParseArguments/VERSION-SKIP.cmake b/Tests/RunCMake/CMakeParseArguments/VERSION-SKIP.cmake new file mode 100644 index 0000000..88ff49c --- /dev/null +++ b/Tests/RunCMake/CMakeParseArguments/VERSION-SKIP.cmake @@ -0,0 +1,25 @@ +# CMAKE_MINIMUM_REQUIRED_VERSION 2.8.12 +# CMAKE_PARSE_ARGUMENTS_DEFAULT_SKIP_EMPTY UNSET +# CMAKE_PARSE_ARGUMENTS_(KEEP|SKIP)_EMPTY UNSET +# => SKIP + +cmake_minimum_required(VERSION 2.8.12) + +include(CMakeParseArguments) + +macro(MY_INSTALL) + set(options OPTIONAL FAST) + set(oneValueArgs DESTINATION RENAME) + set(multiValueArgs TARGETS CONFIGURATIONS) + cmake_parse_arguments(MY_INSTALL "${options}" "${oneValueArgs}" "${multiValueArgs}" "${ARGN}") +endmacro() + +my_install(DESTINATION "" TARGETS foo "" bar) + +if(DEFINED MY_INSTALL_DESTINATION) + message(FATAL_ERROR "DEFINED MY_INSTALL_DESTINATION") +endif() + +if(NOT "${MY_INSTALL_TARGETS}" STREQUAL "foo;bar") + message(FATAL_ERROR "NOT \"\${MY_INSTALL_TARGETS}\" STREQUAL \"foo;bar\"") +endif() http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=bf203c8f8e4a6ad4f642b2653f8abca563484889 commit bf203c8f8e4a6ad4f642b2653f8abca563484889 Author: Daniele E. Domenichelli <daniele.domeniche...@iit.it> AuthorDate: Thu Nov 14 11:42:35 2013 +0100 Commit: Daniele E. Domenichelli <daniele.domeniche...@iit.it> CommitDate: Thu Nov 28 00:02:22 2013 +0100 CMakeParseArguments: Add workaround for compatibility with CMake <= 2.8.12 This "wrapper" macro is a workaround that allows to use this version of this module with CMake <= 2.8.12. Before that version set(VAR "" PARENT_SCOPE) did not set the variable in the parent scope and instead it used to unset it. This wrapper calls the real function, but if necessary (i.e. when empty arguments should not be skipped and CMake < 3.0.0) it parses the arguments again in order to find single and multiple arguments that have not been set and sets them to an empty string in the same variable scope as the caller. diff --git a/Modules/CMakeParseArguments.cmake b/Modules/CMakeParseArguments.cmake index e688e55..6aa2d63 100644 --- a/Modules/CMakeParseArguments.cmake +++ b/Modules/CMakeParseArguments.cmake @@ -163,40 +163,10 @@ define_property(DIRECTORY PROPERTY "CMAKE_PARSE_ARGUMENTS_DEFAULT_SKIP_EMPTY" IN ) -function(CMAKE_PARSE_ARGUMENTS prefix _optionNames _singleArgNames _multiArgNames) - # first set all result variables to empty/FALSE - foreach(arg_name ${_singleArgNames} ${_multiArgNames}) - set(${prefix}_${arg_name}) - endforeach() - - foreach(option ${_optionNames}) - set(${prefix}_${option} FALSE) - endforeach() - - set(${prefix}_UNPARSED_ARGUMENTS) - +function(_CMAKE_PARSE_ARGUMENTS prefix _optionNames _singleArgNames _multiArgNames _skipEmpty) set(insideValues FALSE) set(currentArgName) - get_property(_defaultSkipEmptySet DIRECTORY PROPERTY CMAKE_PARSE_ARGUMENTS_DEFAULT_SKIP_EMPTY SET) - get_property(_defaultSkipEmpty DIRECTORY PROPERTY CMAKE_PARSE_ARGUMENTS_DEFAULT_SKIP_EMPTY) - - if("x${ARGN}" MATCHES "^xCMAKE_PARSE_ARGUMENTS_(SKIP|KEEP)_EMPTY;?") - if("${CMAKE_MATCH_1}" STREQUAL "SKIP") - set(_skipEmpty 1) - elseif("${CMAKE_MATCH_1}" STREQUAL "KEEP") - set(_skipEmpty 0) - endif() - string(REGEX REPLACE "^${CMAKE_MATCH_0}" "" ARGN "x${ARGN}") - elseif(_defaultSkipEmptySet) - set(_skipEmpty ${_defaultSkipEmpty}) - elseif(CMAKE_MINIMUM_REQUIRED_VERSION VERSION_LESS 3.0.0) - # Keep compatibility with previous releases - set(_skipEmpty 1) - else() - set(_skipEmpty 0) - endif() - if(_skipEmpty) set(_loopARGN ${ARGN}) else() @@ -257,3 +227,63 @@ function(CMAKE_PARSE_ARGUMENTS prefix _optionNames _singleArgNames _multiArgName endforeach() endfunction() + + +# This "wrapper" macro is a workaround that allows to use this version of this +# module with CMake <= 2.8.12 +# Before that version set(VAR "" PARENT_SCOPE) did not set the variable in +# the parent scope and instead it used to unset it. +# This wrapper calls the real function, but if necessary (i.e. when empty +# arguments should not be skipped and CMake < 3.0.0) it parses the arguments +# again in order to find single and multiple arguments that have not been set +# and sets them to an empty string in the same variable scope as the caller. +macro(CMAKE_PARSE_ARGUMENTS prefix _optionNames _singleArgNames _multiArgNames) + # first set all result variables to empty/FALSE + foreach(arg_name ${_singleArgNames} ${_multiArgNames}) + set(${prefix}_${arg_name}) + endforeach() + + foreach(option ${_optionNames}) + set(${prefix}_${option} FALSE) + endforeach() + + set(${prefix}_UNPARSED_ARGUMENTS) + + get_property(_defaultSkipEmptySet DIRECTORY PROPERTY CMAKE_PARSE_ARGUMENTS_DEFAULT_SKIP_EMPTY SET) + get_property(_defaultSkipEmpty DIRECTORY PROPERTY CMAKE_PARSE_ARGUMENTS_DEFAULT_SKIP_EMPTY) + + if("x${ARGN}" MATCHES "^xCMAKE_PARSE_ARGUMENTS_(SKIP|KEEP)_EMPTY;?") + if("${CMAKE_MATCH_1}" STREQUAL "SKIP") + set(_skipEmpty 1) + elseif("${CMAKE_MATCH_1}" STREQUAL "KEEP") + set(_skipEmpty 0) + endif() + string(REGEX REPLACE "^${CMAKE_MATCH_0}" "" ARGN "x${ARGN}") + elseif(_defaultSkipEmptySet) + set(_skipEmpty "${_defaultSkipEmpty}") + elseif(CMAKE_MINIMUM_REQUIRED_VERSION VERSION_LESS 3.0.0) + # Keep compatibility with previous releases + set(_skipEmpty 1) + else() + set(_skipEmpty 0) + endif() + + _cmake_parse_arguments("${prefix}" "${_optionNames}" "${_singleArgNames}" "${_multiArgNames}" "${_skipEmpty}" "${ARGN}") + + if(NOT _skipEmpty AND CMAKE_VERSION VERSION_LESS 3.0.0) + set(__singleArgNames ${_singleArgNames}) + set(__multiArgNames ${_multiArgNames}) + foreach(currentArg ${ARGN}) + if(NOT DEFINED ${prefix}_${currentArg}) + list(FIND __singleArgNames "${currentArg}" _singleArgIndex) + list(FIND __multiArgNames "${currentArg}" _multiArgIndex) + if(NOT ${_singleArgIndex} EQUAL -1 OR NOT ${_multiArgIndex} EQUAL -1) + set(${prefix}_${currentArg} "") + endif() + endif() + endforeach() + unset(__singleArgNames) + unset(__multiArgNames) + endif() + +endmacro() http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=273e66e761589f29b5202ea6e61e0fa890d4bb8e commit 273e66e761589f29b5202ea6e61e0fa890d4bb8e Author: Daniele E. Domenichelli <daniele.domeniche...@iit.it> AuthorDate: Thu Nov 14 11:58:08 2013 +0100 Commit: Daniele E. Domenichelli <daniele.domeniche...@iit.it> CommitDate: Thu Nov 28 00:02:22 2013 +0100 CMakeParseArguments: Next release will be 3.0.0, not 2.8.13 diff --git a/Modules/CMakeParseArguments.cmake b/Modules/CMakeParseArguments.cmake index d4b42a5..e688e55 100644 --- a/Modules/CMakeParseArguments.cmake +++ b/Modules/CMakeParseArguments.cmake @@ -46,7 +46,7 @@ # The cmake CMAKE_PARSE_ARGUMENTS_SKIP_EMPTY (old behaviour) and # CMAKE_PARSE_ARGUMENTS_KEEP_EMPTY options decide how empty arguments # should be handled. If none of these options is set, for backwards -# compatibility, if CMAKE_MINIMUM_REQUIRED_VERSION < 2.8.13, the default +# compatibility, if CMAKE_MINIMUM_REQUIRED_VERSION < 3.0.0, the default # behaviour is to skip empty arguments, otherwise the default behaviour # is to keep them. Using the CMAKE_PARSE_ARGUMENTS_DEFAULT_SKIP_EMPTY # directory property the user can explicitly set the default behaviour @@ -190,7 +190,7 @@ function(CMAKE_PARSE_ARGUMENTS prefix _optionNames _singleArgNames _multiArgName string(REGEX REPLACE "^${CMAKE_MATCH_0}" "" ARGN "x${ARGN}") elseif(_defaultSkipEmptySet) set(_skipEmpty ${_defaultSkipEmpty}) - elseif(CMAKE_MINIMUM_REQUIRED_VERSION VERSION_LESS 2.8.13) + elseif(CMAKE_MINIMUM_REQUIRED_VERSION VERSION_LESS 3.0.0) # Keep compatibility with previous releases set(_skipEmpty 1) else() http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=1acf3c6cae0524925c269d41cd0bddbbcec9f8f9 commit 1acf3c6cae0524925c269d41cd0bddbbcec9f8f9 Author: Daniele E. Domenichelli <daniele.domeniche...@iit.it> AuthorDate: Thu Nov 14 11:57:10 2013 +0100 Commit: Daniele E. Domenichelli <daniele.domeniche...@iit.it> CommitDate: Thu Nov 28 00:02:22 2013 +0100 CMakeParseArguments: Avoid replacing CMAKE_MATCH_1 diff --git a/Modules/CMakeParseArguments.cmake b/Modules/CMakeParseArguments.cmake index 3f5375f..d4b42a5 100644 --- a/Modules/CMakeParseArguments.cmake +++ b/Modules/CMakeParseArguments.cmake @@ -182,12 +182,12 @@ function(CMAKE_PARSE_ARGUMENTS prefix _optionNames _singleArgNames _multiArgName get_property(_defaultSkipEmpty DIRECTORY PROPERTY CMAKE_PARSE_ARGUMENTS_DEFAULT_SKIP_EMPTY) if("x${ARGN}" MATCHES "^xCMAKE_PARSE_ARGUMENTS_(SKIP|KEEP)_EMPTY;?") - string(REGEX REPLACE "^${CMAKE_MATCH_0}" "" ARGN "x${ARGN}") if("${CMAKE_MATCH_1}" STREQUAL "SKIP") set(_skipEmpty 1) elseif("${CMAKE_MATCH_1}" STREQUAL "KEEP") set(_skipEmpty 0) endif() + string(REGEX REPLACE "^${CMAKE_MATCH_0}" "" ARGN "x${ARGN}") elseif(_defaultSkipEmptySet) set(_skipEmpty ${_defaultSkipEmpty}) elseif(CMAKE_MINIMUM_REQUIRED_VERSION VERSION_LESS 2.8.13) http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=8a8cc69e1a3b9a9f35a16290519d8249f14a4029 commit 8a8cc69e1a3b9a9f35a16290519d8249f14a4029 Author: Daniele E. Domenichelli <daniele.domeniche...@iit.it> AuthorDate: Fri Nov 8 16:41:41 2013 +0100 Commit: Daniele E. Domenichelli <daniele.domeniche...@iit.it> CommitDate: Thu Nov 28 00:02:22 2013 +0100 CMakeParseArguments: Update documentation diff --git a/Modules/CMakeParseArguments.cmake b/Modules/CMakeParseArguments.cmake index b396657..3f5375f 100644 --- a/Modules/CMakeParseArguments.cmake +++ b/Modules/CMakeParseArguments.cmake @@ -2,16 +2,23 @@ # CMakeParseArguments # ------------------- # +# Parse arguments given to a macro or a function. # -# -# CMAKE_PARSE_ARGUMENTS(<prefix> <options> <one_value_keywords> -# <multi_value_keywords> args...) -# -# CMAKE_PARSE_ARGUMENTS() is intended to be used in macros or functions +# cmake_parse_arguments() is intended to be used in macros or functions # for parsing the arguments given to that macro or function. It # processes the arguments and defines a set of variables which hold the # values of the respective options. # +# :: +# +# cmake_parse_arguments(<prefix> +# <options> +# <one_value_keywords> +# <multi_value_keywords> +# [CMAKE_PARSE_ARGUMENTS_SKIP_EMPTY|CMAKE_PARSE_ARGUMENTS_KEEP_EMPTY] +# args... +# ) +# # The <options> argument contains all options for the respective macro, # i.e. keywords which can be used when calling the macro without any # value following, like e.g. the OPTIONAL keyword of the install() @@ -25,7 +32,7 @@ # macro which can be followed by more than one value, like e.g. the # TARGETS or FILES keywords of the install() command. # -# When done, CMAKE_PARSE_ARGUMENTS() will have defined for each of the +# When done, cmake_parse_arguments() will have defined for each of the # keywords listed in <options>, <one_value_keywords> and # <multi_value_keywords> a variable composed of the given <prefix> # followed by "_" and the name of the respective keyword. These @@ -36,6 +43,17 @@ # <prefix>_UNPARSED_ARGUMENTS, this can be checked afterwards to see # whether your macro was called with unrecognized parameters. # +# The cmake CMAKE_PARSE_ARGUMENTS_SKIP_EMPTY (old behaviour) and +# CMAKE_PARSE_ARGUMENTS_KEEP_EMPTY options decide how empty arguments +# should be handled. If none of these options is set, for backwards +# compatibility, if CMAKE_MINIMUM_REQUIRED_VERSION < 2.8.13, the default +# behaviour is to skip empty arguments, otherwise the default behaviour +# is to keep them. Using the CMAKE_PARSE_ARGUMENTS_DEFAULT_SKIP_EMPTY +# directory property the user can explicitly set the default behaviour +# for a folder and its subfolders. +# +# +# # As an example here a my_install() macro, which takes similar arguments # as the real install() command: # @@ -80,7 +98,42 @@ # interpreted as the beginning of the new option. E.g. # my_install(TARGETS foo DESTINATION OPTIONAL) would result in # MY_INSTALL_DESTINATION set to "OPTIONAL", but MY_INSTALL_DESTINATION -# would be empty and MY_INSTALL_OPTIONAL would be set to TRUE therefor. +# would be empty and MY_INSTALL_OPTIONAL would be set to TRUE therefore. +# +# +# +# If the "CMAKE_PARSE_ARGUMENTS_SKIP_EMPTY" option is set, +# cmake_parse_argumentswill not consider empty arguments. +# Therefore +# +# :: +# +# my_install(DESTINATION "" TARGETS foo "" bar) +# +# Will set +# +# :: +# +# MY_INSTALL_DESTINATION = (unset) +# MY_INSTALL_MULTI = "foo;bar" +# +# Using the "CMAKE_PARSE_ARGUMENTS_SKIP_EMPTY" option instead, will set +# +# :: +# +# MY_INSTALL_SINGLE = "" +# MY_INSTALL_MULTI = "foo;;bar" +# +# +# It is also important to note that: +# +# :: +# +# cmake_parse_arguments(MY_INSTALL "${options}" "${oneValueArgs}" "${multiValueArgs}" "${ARGN}" ) +# cmake_parse_arguments(MY_INSTALL "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} ) +# +# Will behave differently, because in the latter case empty arguments +# are not passed to cmake_parse_arguments. #============================================================================= # Copyright 2010 Alexander Neundorf <neund...@kde.org> http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=3a88afa33e311749358c3abc393804aa421fb4f5 commit 3a88afa33e311749358c3abc393804aa421fb4f5 Author: Daniele E. Domenichelli <daniele.domeniche...@iit.it> AuthorDate: Fri Nov 8 16:26:06 2013 +0100 Commit: Daniele E. Domenichelli <daniele.domeniche...@iit.it> CommitDate: Thu Nov 28 00:02:22 2013 +0100 CMakeParseArguments: Keep compatibility with previous behaviour The behaviour is now decided as follows: * If CMAKE_MINIMUM_REQUIRED_VERSION < 2.8.13, the default behaviour is to skip empty arguments, otherwise the default behaviour is to keep them. * Using the CMAKE_PARSE_ARGUMENTS_DEFAULT_SKIP_EMPTY directory property the user can explicitly set the default behaviour for a folder and its subfolders. * Using CMAKE_PARSE_ARGUMENTS_(SKIP|KEEP)_EMPTY or as the first argument of the call after the mandatory ones, the user can specify whether to keep or to skip the empty arguments, regardless of the default behaviour for that cmake_parse_arguments() call. Therefore the new syntax is: cmake_parse_arguments(<prefix> <options> <one_value_keywords> <multi_value_keywords> [CMAKE_PARSE_ARGUMENTS_SKIP_EMPTY|CMAKE_PARSE_ARGUMENTS_KEEP_EMPTY] args... ) diff --git a/Modules/CMakeParseArguments.cmake b/Modules/CMakeParseArguments.cmake index d96e9a4..b396657 100644 --- a/Modules/CMakeParseArguments.cmake +++ b/Modules/CMakeParseArguments.cmake @@ -102,6 +102,14 @@ endif() set(__CMAKE_PARSE_ARGUMENTS_INCLUDED TRUE) +define_property(DIRECTORY PROPERTY "CMAKE_PARSE_ARGUMENTS_DEFAULT_SKIP_EMPTY" INHERITED + BRIEF_DOCS "Whether empty arguments should be skipped or not by default." + FULL_DOCS + "See documentation of the cmake_parse_arguments() function in the " + "CMakeParseArguments module." + ) + + function(CMAKE_PARSE_ARGUMENTS prefix _optionNames _singleArgNames _multiArgNames) # first set all result variables to empty/FALSE foreach(arg_name ${_singleArgNames} ${_multiArgNames}) @@ -117,8 +125,33 @@ function(CMAKE_PARSE_ARGUMENTS prefix _optionNames _singleArgNames _multiArgName set(insideValues FALSE) set(currentArgName) + get_property(_defaultSkipEmptySet DIRECTORY PROPERTY CMAKE_PARSE_ARGUMENTS_DEFAULT_SKIP_EMPTY SET) + get_property(_defaultSkipEmpty DIRECTORY PROPERTY CMAKE_PARSE_ARGUMENTS_DEFAULT_SKIP_EMPTY) + + if("x${ARGN}" MATCHES "^xCMAKE_PARSE_ARGUMENTS_(SKIP|KEEP)_EMPTY;?") + string(REGEX REPLACE "^${CMAKE_MATCH_0}" "" ARGN "x${ARGN}") + if("${CMAKE_MATCH_1}" STREQUAL "SKIP") + set(_skipEmpty 1) + elseif("${CMAKE_MATCH_1}" STREQUAL "KEEP") + set(_skipEmpty 0) + endif() + elseif(_defaultSkipEmptySet) + set(_skipEmpty ${_defaultSkipEmpty}) + elseif(CMAKE_MINIMUM_REQUIRED_VERSION VERSION_LESS 2.8.13) + # Keep compatibility with previous releases + set(_skipEmpty 1) + else() + set(_skipEmpty 0) + endif() + + if(_skipEmpty) + set(_loopARGN ${ARGN}) + else() + set(_loopARGN IN LISTS ARGN) + endif() + # now iterate over all arguments and fill the result variables - foreach(currentArg IN LISTS ARGN) + foreach(currentArg ${_loopARGN}) list(FIND _optionNames "${currentArg}" optionIndex) # ... then this marks the end of the arguments belonging to this keyword list(FIND _singleArgNames "${currentArg}" singleArgIndex) # ... then this marks the end of the arguments belonging to this keyword list(FIND _multiArgNames "${currentArg}" multiArgIndex) # ... then this marks the end of the arguments belonging to this keyword @@ -126,13 +159,25 @@ function(CMAKE_PARSE_ARGUMENTS prefix _optionNames _singleArgNames _multiArgName if(${optionIndex} EQUAL -1 AND ${singleArgIndex} EQUAL -1 AND ${multiArgIndex} EQUAL -1) if(insideValues) if("${insideValues}" STREQUAL "SINGLE") - set(${prefix}_${currentArgName} "${currentArg}") + if(_skipEmpty) + set(${prefix}_${currentArgName} ${currentArg}) + else() + set(${prefix}_${currentArgName} "${currentArg}") + endif() set(insideValues FALSE) elseif("${insideValues}" STREQUAL "MULTI") - list(APPEND ${prefix}_${currentArgName} "${currentArg}") + if(_skipEmpty) + list(APPEND ${prefix}_${currentArgName} ${currentArg}) + else() + list(APPEND ${prefix}_${currentArgName} "${currentArg}") + endif() endif() else() - list(APPEND ${prefix}_UNPARSED_ARGUMENTS "${currentArg}") + if(_skipEmpty) + list(APPEND ${prefix}_UNPARSED_ARGUMENTS ${currentArg}) + else() + list(APPEND ${prefix}_UNPARSED_ARGUMENTS "${currentArg}") + endif() endif() else() if(NOT ${optionIndex} EQUAL -1) http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=c9d0426ba560d1b70656a3f444ddb7053b7f82e4 commit c9d0426ba560d1b70656a3f444ddb7053b7f82e4 Author: Daniele E. Domenichelli <daniele.domeniche...@iit.it> AuthorDate: Tue Nov 5 15:31:49 2013 +0100 Commit: Daniele E. Domenichelli <daniele.domeniche...@iit.it> CommitDate: Thu Nov 28 00:02:22 2013 +0100 CMakeParseArguments: Do not skip empty arguments Current implementation of cmake_parse_arguments skips empty arguments. For example: cmake_parse_arguments("OPTION" "SINGLE" "MULTI" ${ARGN}) with ARGN that is set using something like: <args> SINGLE "" <more args> # (<args>;SINGLE;;<more args>) <args> SINGLE "" # (<args>;SINGLE;) it will fail in 4 different ways: 1) because the "foreach" skips empty arguments. 2) because list(APPEND <list> ${currentArg}) will fail to append an empty element to the list if ${currentArg} is an empty string. 3) because set(${prefix}_${arg_name} ${${prefix}_${arg_name}} PARENT_SCOPE) will not set an empty variable to the parent scope if ${${prefix}_${arg_name}} is an empty string. 4) because empty arguments are not passed to cmake_parse_arguments if not quoted, i.e. if ARGN="a;;b" * ${ARGN} will pass the arguments "a", "b" * "${ARGN}" will pass the arguments "a", "", "b". This patch fixes the first behaviour using foreach(IN LISTS) version, the second and the third by enclosing args in quotes where required, and finally fixes the documentation in order to suggest to use quoted "${ARGN}" in order not to miss the empty arguments at the end of the list. diff --git a/Modules/CMakeParseArguments.cmake b/Modules/CMakeParseArguments.cmake index 4248176..d96e9a4 100644 --- a/Modules/CMakeParseArguments.cmake +++ b/Modules/CMakeParseArguments.cmake @@ -45,7 +45,7 @@ # set(options OPTIONAL FAST) # set(oneValueArgs DESTINATION RENAME) # set(multiValueArgs TARGETS CONFIGURATIONS) -# cmake_parse_arguments(MY_INSTALL "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} ) +# cmake_parse_arguments(MY_INSTALL "${options}" "${oneValueArgs}" "${multiValueArgs}" "${ARGN}" ) # ... # # @@ -118,7 +118,7 @@ function(CMAKE_PARSE_ARGUMENTS prefix _optionNames _singleArgNames _multiArgName set(currentArgName) # now iterate over all arguments and fill the result variables - foreach(currentArg ${ARGN}) + foreach(currentArg IN LISTS ARGN) list(FIND _optionNames "${currentArg}" optionIndex) # ... then this marks the end of the arguments belonging to this keyword list(FIND _singleArgNames "${currentArg}" singleArgIndex) # ... then this marks the end of the arguments belonging to this keyword list(FIND _multiArgNames "${currentArg}" multiArgIndex) # ... then this marks the end of the arguments belonging to this keyword @@ -126,13 +126,13 @@ function(CMAKE_PARSE_ARGUMENTS prefix _optionNames _singleArgNames _multiArgName if(${optionIndex} EQUAL -1 AND ${singleArgIndex} EQUAL -1 AND ${multiArgIndex} EQUAL -1) if(insideValues) if("${insideValues}" STREQUAL "SINGLE") - set(${prefix}_${currentArgName} ${currentArg}) + set(${prefix}_${currentArgName} "${currentArg}") set(insideValues FALSE) elseif("${insideValues}" STREQUAL "MULTI") - list(APPEND ${prefix}_${currentArgName} ${currentArg}) + list(APPEND ${prefix}_${currentArgName} "${currentArg}") endif() else() - list(APPEND ${prefix}_UNPARSED_ARGUMENTS ${currentArg}) + list(APPEND ${prefix}_UNPARSED_ARGUMENTS "${currentArg}") endif() else() if(NOT ${optionIndex} EQUAL -1) @@ -152,9 +152,10 @@ function(CMAKE_PARSE_ARGUMENTS prefix _optionNames _singleArgNames _multiArgName endforeach() # propagate the result variables to the caller: - foreach(arg_name ${_singleArgNames} ${_multiArgNames} ${_optionNames}) - set(${prefix}_${arg_name} ${${prefix}_${arg_name}} PARENT_SCOPE) + foreach(arg_name ${_singleArgNames} ${_multiArgNames} ${_optionNames} UNPARSED_ARGUMENTS) + if(DEFINED ${prefix}_${arg_name}) + set(${prefix}_${arg_name} "${${prefix}_${arg_name}}" PARENT_SCOPE) + endif() endforeach() - set(${prefix}_UNPARSED_ARGUMENTS ${${prefix}_UNPARSED_ARGUMENTS} PARENT_SCOPE) endfunction() ----------------------------------------------------------------------- Summary of changes: Modules/CMakeParseArguments.cmake | 179 +++++++++++++++++--- Source/cmDefinePropertyCommand.h | 7 + Tests/RunCMake/CMakeLists.txt | 1 + .../CMakeParseArguments/ARGUMENT-KEEP.cmake | 29 +++ .../CMakeParseArguments/ARGUMENT-SKIP.cmake | 27 +++ .../{set => CMakeParseArguments}/CMakeLists.txt | 0 Tests/RunCMake/CMakeParseArguments/Example.cmake | 70 ++++++++ .../CMakeParseArguments/PROPERTY-KEEP.cmake | 29 +++ .../CMakeParseArguments/PROPERTY-SKIP.cmake | 27 +++ .../CMakeParseArguments/RunCMakeTest.cmake | 9 + .../CMakeParseArguments/VERSION-KEEP.cmake | 27 +++ .../CMakeParseArguments/VERSION-SKIP.cmake | 25 +++ 12 files changed, 405 insertions(+), 25 deletions(-) create mode 100644 Tests/RunCMake/CMakeParseArguments/ARGUMENT-KEEP.cmake create mode 100644 Tests/RunCMake/CMakeParseArguments/ARGUMENT-SKIP.cmake copy Tests/RunCMake/{set => CMakeParseArguments}/CMakeLists.txt (100%) create mode 100644 Tests/RunCMake/CMakeParseArguments/Example.cmake create mode 100644 Tests/RunCMake/CMakeParseArguments/PROPERTY-KEEP.cmake create mode 100644 Tests/RunCMake/CMakeParseArguments/PROPERTY-SKIP.cmake create mode 100644 Tests/RunCMake/CMakeParseArguments/RunCMakeTest.cmake create mode 100644 Tests/RunCMake/CMakeParseArguments/VERSION-KEEP.cmake create mode 100644 Tests/RunCMake/CMakeParseArguments/VERSION-SKIP.cmake hooks/post-receive -- CMake _______________________________________________ Cmake-commits mailing list Cmake-commits@cmake.org http://public.kitware.com/cgi-bin/mailman/listinfo/cmake-commits