/*============================================================================ CMake - Cross Platform Makefile Generator Copyright 2000-2009 Kitware, Inc., Insight Software Consortium Distributed under the OSI-approved BSD License (the "License"); see accompanying file Copyright.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the License for more information. ============================================================================*/ #include "cmCTest.h" #include "cmSystemTools.h" // Need these for documentation support. #include "cmake.h" #include "cmDocumentation.h" #include "CTest/cmCTestScriptHandler.h" #include "CTest/cmCTestLaunch.h" #include "cmsys/Encoding.hxx" //---------------------------------------------------------------------------- static const char * cmDocumentationName[][2] = { {0, " ctest - Testing driver provided by CMake."}, {0,0} }; //---------------------------------------------------------------------------- static const char * cmDocumentationUsage[][2] = { {0, " ctest [options]"}, {0,0} }; //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- static const char * cmDocumentationOptions[][2] = { {"-C <cfg>, --build-config <cfg>", "Choose configuration to test."}, {"-V,--verbose", "Enable verbose output from tests."}, {"-VV,--extra-verbose", "Enable more verbose output from tests."}, {"--debug", "Displaying more verbose internals of CTest."}, {"--output-on-failure"}, {"-F", "Enable failover."}, {"-j <jobs>, --parallel <jobs>", "Run the tests in parallel using the" "given number of jobs."}, {"-Q,--quiet", "Make ctest quiet."}, {"-O <file>, --output-log <file>", "Output to log file"}, {"-N,--show-only", "Disable actual execution of tests."}, {"-L <regex>, --label-regex <regex>", "Run tests with labels matching " "regular expression."}, {"-R <regex>, --tests-regex <regex>", "Run tests matching regular " "expression."}, {"-E <regex>, --exclude-regex <regex>", "Exclude tests matching regular " "expression."}, {"-LE <regex>, --label-exclude <regex>", "Exclude tests with labels " "matching regular expression."}, {"-D <dashboard>, --dashboard <dashboard>", "Execute dashboard test"}, {"-D <var>:<type>=<value>", "Define a variable for script mode"}, {"-M <model>, --test-model <model>", "Sets the model for a dashboard"}, {"-T <action>, --test-action <action>", "Sets the dashboard action to " "perform"}, {"--track <track>", "Specify the track to submit dashboard to"}, {"-S <script>, --script <script>", "Execute a dashboard for a " "configuration"}, {"-SP <script>, --script-new-process <script>", "Execute a dashboard for a " "configuration"}, {"-A <file>, --add-notes <file>", "Add a notes file with submission"}, {"-I [Start,End,Stride,test#,test#|Test file], --tests-information", "Run a specific number of tests by number."}, {"-U, --union", "Take the Union of -I and -R"}, {"--rerun-failed", "Run only the tests that failed previously"}, {"--max-width <width>", "Set the max width for a test name to output"}, {"--interactive-debug-mode [0|1]", "Set the interactive mode to 0 or 1."}, {"--no-label-summary", "Disable timing summary information for labels."}, {"--build-and-test", "Configure, build and run a test."}, {"--build-target", "Specify a specific target to build."}, {"--build-nocmake", "Run the build without running cmake first."}, {"--build-run-dir", "Specify directory to run programs from."}, {"--build-two-config", "Run CMake twice"}, {"--build-exe-dir", "Specify the directory for the executable."}, {"--build-generator", "Specify the generator to use."}, {"--build-generator-toolset", "Specify the generator-specific toolset."}, {"--build-project", "Specify the name of the project to build."}, {"--build-makeprogram", "Specify the make program to use."}, {"--build-noclean", "Skip the make clean step."}, {"--build-config-sample", "A sample executable to use to determine the configuration"}, {"--build-options", "Add extra options to the build step."}, {"--test-command", "The test to run with the --build-and-test option."}, {"--test-timeout", "The time limit in seconds, internal use only."}, {"--tomorrow-tag", "Nightly or experimental starts with next day tag."}, {"--ctest-config", "The configuration file used to initialize CTest state " "when submitting dashboards."}, {"--overwrite", "Overwrite CTest configuration option."}, {"--extra-submit <file>[;<file>]", "Submit extra files to the dashboard."}, {"--force-new-ctest-process", "Run child CTest instances as new processes"}, {"--schedule-random", "Use a random order for scheduling tests"}, {"--submit-index", "Submit individual dashboard tests with specific index"}, {"--timeout <seconds>", "Set a global timeout on all tests."}, {"--stop-time <time>", "Set a time at which all tests should stop running."}, {"--http1.0", "Submit using HTTP 1.0."}, {"--no-compress-output", "Do not compress test output when submitting."}, {"--print-labels", "Print all available test labels."}, {0,0} }; // this is a test driver program for cmCTest. int main (int argc, char const* const* argv) { cmsys::Encoding::CommandLineArguments encoding_args = cmsys::Encoding::CommandLineArguments::Main(argc, argv); argc = encoding_args.argc(); argv = encoding_args.argv(); cmSystemTools::DoNotInheritStdPipes(); cmSystemTools::EnableMSVCDebugHook(); cmSystemTools::FindCMakeResources(argv[0]); // Dispatch 'ctest --launch' mode directly. if(argc >= 2 && strcmp(argv[1], "--launch") == 0) { return cmCTestLaunch::Main(argc, argv); } cmCTest inst; if ( cmSystemTools::GetCurrentWorkingDirectory().size() == 0 ) { cmCTestLog(&inst, ERROR_MESSAGE, "Current working directory cannot be established." << std::endl); return 1; } // If there is a testing input file, check for documentation options // only if there are actually arguments. We want running without // arguments to run tests. if(argc > 1 || !(cmSystemTools::FileExists("CTestTestfile.cmake") || cmSystemTools::FileExists("DartTestfile.txt"))) { if(argc == 1) { cmCTestLog(&inst, ERROR_MESSAGE, "*********************************" << std::endl << "No test configuration file found!" << std::endl << "*********************************" << std::endl); } cmDocumentation doc; doc.addCTestStandardDocSections(); if(doc.CheckOptions(argc, argv)) { cmake hcm; hcm.AddCMakePaths(); // Construct and print requested documentation. cmCTestScriptHandler* ch = static_cast<cmCTestScriptHandler*>(inst.GetHandler("script")); ch->CreateCMake(); doc.SetShowGenerators(false); doc.SetName("ctest"); doc.SetSection("Name",cmDocumentationName); doc.SetSection("Usage",cmDocumentationUsage); doc.PrependSection("Options",cmDocumentationOptions); #ifdef cout # undef cout #endif return doc.PrintRequestedDocumentation(std::cout)? 0:1; #define cout no_cout_use_cmCTestLog } } // copy the args to a vector std::vector<std::string> args; for(int i =0; i < argc; ++i) { args.push_back(argv[i]); } // run ctest std::string output; int res = inst.Run(args,&output); cmCTestLog(&inst, OUTPUT, output); return res; }