Browse Source

CTest: Extend -D command line arg handling for variable definitions

If the argument following -D is not a valid dashboard type string,
then try to parse it as a "var:type=value" string just like cmake
already does.
David Cole 13 years ago
parent
commit
93d084c180
4 changed files with 46 additions and 2 deletions
  1. 9 0
      Source/CTest/cmCTestScriptHandler.cxx
  2. 21 2
      Source/cmCTest.cxx
  3. 10 0
      Source/cmCTest.h
  4. 6 0
      Source/ctest.cxx

+ 9 - 0
Source/CTest/cmCTestScriptHandler.cxx

@@ -435,6 +435,15 @@ int cmCTestScriptHandler::ReadInScript(const std::string& total_script_arg)
     return 2;
     return 2;
     }
     }
 
 
+  // Add definitions of variables passed in on the command line:
+  const std::map<std::string, std::string> &defs =
+    this->CTest->GetDefinitions();
+  for (std::map<std::string, std::string>::const_iterator it = defs.begin();
+       it != defs.end(); ++it)
+    {
+    this->Makefile->AddDefinition(it->first.c_str(), it->second.c_str());
+    }
+
   // finally read in the script
   // finally read in the script
   if (!this->Makefile->ReadListFile(0, script.c_str()) ||
   if (!this->Makefile->ReadListFile(0, script.c_str()) ||
     cmSystemTools::GetErrorOccuredFlag())
     cmSystemTools::GetErrorOccuredFlag())

+ 21 - 2
Source/cmCTest.cxx

@@ -2229,6 +2229,22 @@ void cmCTest::HandleScriptArguments(size_t &i,
     }
     }
 }
 }
 
 
+//----------------------------------------------------------------------
+bool cmCTest::AddVariableDefinition(const std::string &arg)
+{
+  std::string name;
+  std::string value;
+  cmCacheManager::CacheEntryType type = cmCacheManager::UNINITIALIZED;
+
+  if (cmCacheManager::ParseEntry(arg.c_str(), name, value, type))
+    {
+    this->Definitions[name] = value;
+    return true;
+    }
+
+  return false;
+}
+
 //----------------------------------------------------------------------
 //----------------------------------------------------------------------
 // the main entry point of ctest, called from main
 // the main entry point of ctest, called from main
 int cmCTest::Run(std::vector<std::string> &args, std::string* output)
 int cmCTest::Run(std::vector<std::string> &args, std::string* output)
@@ -2265,8 +2281,11 @@ int cmCTest::Run(std::vector<std::string> &args, std::string* output)
       // into the separate stages
       // into the separate stages
       if (!this->AddTestsForDashboardType(targ))
       if (!this->AddTestsForDashboardType(targ))
         {
         {
-        this->ErrorMessageUnknownDashDValue(targ);
-        executeTests = false;
+        if (!this->AddVariableDefinition(targ))
+          {
+          this->ErrorMessageUnknownDashDValue(targ);
+          executeTests = false;
+          }
         }
         }
       }
       }
 
 

+ 10 - 0
Source/cmCTest.h

@@ -418,6 +418,11 @@ public:
 
 
   std::string GetCostDataFile();
   std::string GetCostDataFile();
 
 
+  const std::map<std::string, std::string> &GetDefinitions()
+    {
+    return this->Definitions;
+    }
+
 private:
 private:
   std::string ConfigType;
   std::string ConfigType;
   std::string ScheduleType;
   std::string ScheduleType;
@@ -520,6 +525,9 @@ private:
   //! read as "emit an error message for an unknown -D value"
   //! read as "emit an error message for an unknown -D value"
   void ErrorMessageUnknownDashDValue(std::string &val);
   void ErrorMessageUnknownDashDValue(std::string &val);
 
 
+  //! add a variable definition from a command line -D value
+  bool AddVariableDefinition(const std::string &arg);
+
   //! parse and process most common command line arguments
   //! parse and process most common command line arguments
   void HandleCommandLineArguments(size_t &i, 
   void HandleCommandLineArguments(size_t &i, 
                                   std::vector<std::string> &args);
                                   std::vector<std::string> &args);
@@ -562,6 +570,8 @@ private:
   int OutputLogFileLastTag;
   int OutputLogFileLastTag;
 
 
   bool OutputTestOutputOnTestFailure;
   bool OutputTestOutputOnTestFailure;
+
+  std::map<std::string, std::string> Definitions;
 };
 };
 
 
 class cmCTestLogWrite
 class cmCTestLogWrite

+ 6 - 0
Source/ctest.cxx

@@ -103,6 +103,12 @@ static const char * cmDocumentationOptions[][3] =
    "a dashboard test. All tests are <Mode><Test>, where Mode can be "
    "a dashboard test. All tests are <Mode><Test>, where Mode can be "
    "Experimental, Nightly, and Continuous, and Test can be Start, Update, "
    "Experimental, Nightly, and Continuous, and Test can be Start, Update, "
    "Configure, Build, Test, Coverage, and Submit."},
    "Configure, Build, Test, Coverage, and Submit."},
+  {"-D <var>:<type>=<value>", "Define a variable for script mode",
+   "Pass in variable values on the command line. Use in "
+   "conjunction with -S to pass variable values to a dashboard script. "
+   "Parsing -D arguments as variable values is only attempted if "
+   "the value following -D does not match any of the known dashboard "
+   "types."},
   {"-M <model>, --test-model <model>", "Sets the model for a dashboard",
   {"-M <model>, --test-model <model>", "Sets the model for a dashboard",
    "This option tells ctest to act as a Dart client "
    "This option tells ctest to act as a Dart client "
    "where the TestModel can be Experimental, "
    "where the TestModel can be Experimental, "