From 28f6e1b194cd71af7308cd2c91b438d8de72bc0d Mon Sep 17 00:00:00 2001 From: Andy Cedilnik Date: Thu, 29 Apr 2004 17:41:33 -0400 Subject: [PATCH] ENH: Add ARGV and ARGN support to MACRO command. ARGV is the list of all arguments and ARGN is the list of all nonexpected arguments --- Source/cmMacroCommand.cxx | 39 +++++++++++++++++++++++ Source/cmMacroCommand.h | 4 ++- Tests/Complex/CMakeLists.txt | 15 +++++++++ Tests/ComplexOneConfig/CMakeLists.txt | 15 +++++++++ Tests/ComplexRelativePaths/CMakeLists.txt | 15 +++++++++ 5 files changed, 87 insertions(+), 1 deletion(-) diff --git a/Source/cmMacroCommand.cxx b/Source/cmMacroCommand.cxx index 1fd86544a..65154fe33 100644 --- a/Source/cmMacroCommand.cxx +++ b/Source/cmMacroCommand.cxx @@ -105,6 +105,45 @@ IsFunctionBlocked(const cmListFileFunction& lff, cmMakefile &mf) variable = "${ARGC}"; cmSystemTools::ReplaceString(tmps, variable.c_str(),argcDef.c_str()); } + for (unsigned int j = 1; j < m_Args.size(); ++j) + { + variable = "${ARGV}"; + std::vector::iterator eit; + std::string var = ""; + for ( eit = expandedArguments.begin(); + eit != expandedArguments.end(); + ++ eit ) + { + if ( var.size() > 0 ) + { + var += ";"; + } + var += *eit; + } + cmSystemTools::ReplaceString(tmps, variable.c_str(),var.c_str()); + } + for (unsigned int j = 1; j < m_Args.size(); ++j) + { + variable = "${ARGN}"; + std::vector::iterator eit; + std::string var = ""; + std::vector::size_type cnt = 0; + for ( eit = expandedArguments.begin(); + eit != expandedArguments.end(); + ++ eit ) + { + if ( cnt >= m_Args.size()-1 ) + { + if ( var.size() > 0 ) + { + var += ";"; + } + var += *eit; + } + cnt ++; + } + cmSystemTools::ReplaceString(tmps, variable.c_str(),var.c_str()); + } for (unsigned int j = 1; j < m_Args.size(); ++j) { // since this could be slow, first check if there is an ARGV diff --git a/Source/cmMacroCommand.h b/Source/cmMacroCommand.h index c614588b4..b0848d1c5 100644 --- a/Source/cmMacroCommand.h +++ b/Source/cmMacroCommand.h @@ -106,7 +106,9 @@ public: "the variable ARGC which will be set to the number of arguments " "passed into the function as well as ARGV0 ARGV1 ARGV2 ... which " "will have the actual values of the arguments passed in. This " - "fascilitates creating macros with optional arguments."; + "fascilitates creating macros with optional arguments. Additionally " + "ARGV holds the list of all arguments given to the macro and ARGN " + "holds the list of argument pass the last expected argument."; } cmTypeMacro(cmMacroCommand, cmCommand); diff --git a/Tests/Complex/CMakeLists.txt b/Tests/Complex/CMakeLists.txt index ef0ff8075..c8a0ec3c4 100644 --- a/Tests/Complex/CMakeLists.txt +++ b/Tests/Complex/CMakeLists.txt @@ -29,6 +29,21 @@ ENDMACRO(TEST_ARGC) # invoke the macro TEST_ARGC(-DCMAKE_ARGV1 -DCMAKE_ARGV2 -DCMAKE_ARGV3 -DCMAKE_ARGV4) +MACRO(TEST_VAR_ARG fa) + IF("${ARGV}" MATCHES "^1;2;3$") + MESSAGE(STATUS "ARGV works") + ELSE("${ARGV}" MATCHES "^1;2;3$") + MESSAGE(FATAL_ERROR "ARGV does not work; got \"${ARGV}\" instead of \"1;2;3\"") + ENDIF("${ARGV}" MATCHES "^1;2;3$") + IF("${ARGN}" MATCHES "^2;3$") + MESSAGE(STATUS "ARGN works") + ELSE("${ARGN}" MATCHES "^2;3$") + MESSAGE(FATAL_ERROR "ARGV does not work; got \"${ARGN}\" instead of \"2;3\"") + ENDIF("${ARGN}" MATCHES "^2;3$") +ENDMACRO(TEST_VAR_ARG) + +TEST_VAR_ARG(1 2 3) + # # Use the ansi CXX compile flag for building cmake # diff --git a/Tests/ComplexOneConfig/CMakeLists.txt b/Tests/ComplexOneConfig/CMakeLists.txt index ef0ff8075..c8a0ec3c4 100644 --- a/Tests/ComplexOneConfig/CMakeLists.txt +++ b/Tests/ComplexOneConfig/CMakeLists.txt @@ -29,6 +29,21 @@ ENDMACRO(TEST_ARGC) # invoke the macro TEST_ARGC(-DCMAKE_ARGV1 -DCMAKE_ARGV2 -DCMAKE_ARGV3 -DCMAKE_ARGV4) +MACRO(TEST_VAR_ARG fa) + IF("${ARGV}" MATCHES "^1;2;3$") + MESSAGE(STATUS "ARGV works") + ELSE("${ARGV}" MATCHES "^1;2;3$") + MESSAGE(FATAL_ERROR "ARGV does not work; got \"${ARGV}\" instead of \"1;2;3\"") + ENDIF("${ARGV}" MATCHES "^1;2;3$") + IF("${ARGN}" MATCHES "^2;3$") + MESSAGE(STATUS "ARGN works") + ELSE("${ARGN}" MATCHES "^2;3$") + MESSAGE(FATAL_ERROR "ARGV does not work; got \"${ARGN}\" instead of \"2;3\"") + ENDIF("${ARGN}" MATCHES "^2;3$") +ENDMACRO(TEST_VAR_ARG) + +TEST_VAR_ARG(1 2 3) + # # Use the ansi CXX compile flag for building cmake # diff --git a/Tests/ComplexRelativePaths/CMakeLists.txt b/Tests/ComplexRelativePaths/CMakeLists.txt index ef0ff8075..c8a0ec3c4 100644 --- a/Tests/ComplexRelativePaths/CMakeLists.txt +++ b/Tests/ComplexRelativePaths/CMakeLists.txt @@ -29,6 +29,21 @@ ENDMACRO(TEST_ARGC) # invoke the macro TEST_ARGC(-DCMAKE_ARGV1 -DCMAKE_ARGV2 -DCMAKE_ARGV3 -DCMAKE_ARGV4) +MACRO(TEST_VAR_ARG fa) + IF("${ARGV}" MATCHES "^1;2;3$") + MESSAGE(STATUS "ARGV works") + ELSE("${ARGV}" MATCHES "^1;2;3$") + MESSAGE(FATAL_ERROR "ARGV does not work; got \"${ARGV}\" instead of \"1;2;3\"") + ENDIF("${ARGV}" MATCHES "^1;2;3$") + IF("${ARGN}" MATCHES "^2;3$") + MESSAGE(STATUS "ARGN works") + ELSE("${ARGN}" MATCHES "^2;3$") + MESSAGE(FATAL_ERROR "ARGV does not work; got \"${ARGN}\" instead of \"2;3\"") + ENDIF("${ARGN}" MATCHES "^2;3$") +ENDMACRO(TEST_VAR_ARG) + +TEST_VAR_ARG(1 2 3) + # # Use the ansi CXX compile flag for building cmake #