فهرست منبع

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

Andy Cedilnik 21 سال پیش
والد
کامیت
28f6e1b194

+ 39 - 0
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<std::string>::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<std::string>::iterator eit;
+          std::string var = "";
+          std::vector<std::string>::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

+ 3 - 1
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);

+ 15 - 0
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
 #

+ 15 - 0
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
 #

+ 15 - 0
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
 #