From 035c7fabc3b82cbc9a346c11abe2e9462b4c0379 Mon Sep 17 00:00:00 2001 From: Anas Nashif Date: Tue, 30 Oct 2012 15:39:57 -0700 Subject: Imported Upstream version 2.8.9 --- Source/cmCreateTestSourceList.cxx | 189 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 189 insertions(+) create mode 100644 Source/cmCreateTestSourceList.cxx (limited to 'Source/cmCreateTestSourceList.cxx') diff --git a/Source/cmCreateTestSourceList.cxx b/Source/cmCreateTestSourceList.cxx new file mode 100644 index 000000000..de20cb7ef --- /dev/null +++ b/Source/cmCreateTestSourceList.cxx @@ -0,0 +1,189 @@ +/*============================================================================ + 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 "cmCreateTestSourceList.h" +#include "cmSourceFile.h" + +// cmCreateTestSourceList +bool cmCreateTestSourceList +::InitialPass(std::vector const& args, cmExecutionStatus &) +{ + if (args.size() < 3) + { + this->SetError("called with wrong number of arguments."); + return false; + } + + + std::vector::const_iterator i = args.begin(); + std::string extraInclude; + std::string function; + std::vector tests; + // extract extra include and function ot + for(; i != args.end(); i++) + { + if(*i == "EXTRA_INCLUDE") + { + ++i; + if(i == args.end()) + { + this->SetError("incorrect arguments to EXTRA_INCLUDE"); + return false; + } + extraInclude = "#include \""; + extraInclude += *i; + extraInclude += "\"\n"; + } + else if(*i == "FUNCTION") + { + ++i; + if(i == args.end()) + { + this->SetError("incorrect arguments to FUNCTION"); + return false; + } + function = *i; + function += "(&ac, &av);\n"; + } + else + { + tests.push_back(*i); + } + } + i = tests.begin(); + + // Name of the source list + + const char* sourceList = i->c_str(); + ++i; + + // Name of the test driver + // make sure they specified an extension + if (cmSystemTools::GetFilenameExtension(*i).size() < 2) + { + this->SetError( + "You must specify a file extension for the test driver file."); + return false; + } + std::string driver = this->Makefile->GetCurrentOutputDirectory(); + driver += "/"; + driver += *i; + ++i; + + std::string configFile = + this->Makefile->GetRequiredDefinition("CMAKE_ROOT"); + + configFile += "/Templates/TestDriver.cxx.in"; + // Create the test driver file + + std::vector::const_iterator testsBegin = i; + std::vector tests_func_name; + + // The rest of the arguments consist of a list of test source files. + // Sadly, they can be in directories. Let's find a unique function + // name for the corresponding test, and push it to the tests_func_name + // list. + // For the moment: + // - replace spaces ' ', ':' and '/' with underscores '_' + std::string forwardDeclareCode; + for(i = testsBegin; i != tests.end(); ++i) + { + if(*i == "EXTRA_INCLUDE") + { + break; + } + std::string func_name; + if (cmSystemTools::GetFilenamePath(*i).size() > 0) + { + func_name = cmSystemTools::GetFilenamePath(*i) + "/" + + cmSystemTools::GetFilenameWithoutLastExtension(*i); + } + else + { + func_name = cmSystemTools::GetFilenameWithoutLastExtension(*i); + } + cmSystemTools::ConvertToUnixSlashes(func_name); + cmSystemTools::ReplaceString(func_name, " ", "_"); + cmSystemTools::ReplaceString(func_name, "/", "_"); + cmSystemTools::ReplaceString(func_name, ":", "_"); + tests_func_name.push_back(func_name); + forwardDeclareCode += "int "; + forwardDeclareCode += func_name; + forwardDeclareCode += "(int, char*[]);\n"; + } + + std::string functionMapCode; + int numTests = 0; + std::vector::iterator j; + for(i = testsBegin, j = tests_func_name.begin(); i != tests.end(); ++i, ++j) + { + std::string func_name; + if (cmSystemTools::GetFilenamePath(*i).size() > 0) + { + func_name = cmSystemTools::GetFilenamePath(*i) + "/" + + cmSystemTools::GetFilenameWithoutLastExtension(*i); + } + else + { + func_name = cmSystemTools::GetFilenameWithoutLastExtension(*i); + } + functionMapCode += " {\n" + " \""; + functionMapCode += func_name; + functionMapCode += "\",\n" + " "; + functionMapCode += *j; + functionMapCode += "\n" + " },\n"; + numTests++; + } + if(extraInclude.size()) + { + this->Makefile->AddDefinition("CMAKE_TESTDRIVER_EXTRA_INCLUDES", + extraInclude.c_str()); + } + if(function.size()) + { + this->Makefile->AddDefinition("CMAKE_TESTDRIVER_ARGVC_FUNCTION", + function.c_str()); + } + this->Makefile->AddDefinition("CMAKE_FORWARD_DECLARE_TESTS", + forwardDeclareCode.c_str()); + this->Makefile->AddDefinition("CMAKE_FUNCTION_TABLE_ENTIRES", + functionMapCode.c_str()); + bool res = true; + if ( !this->Makefile->ConfigureFile(configFile.c_str(), driver.c_str(), + false, true, false) ) + { + res = false; + } + + // Construct the source list. + std::string sourceListValue; + { + cmSourceFile* sf = this->Makefile->GetOrCreateSource(driver.c_str()); + sf->SetProperty("ABSTRACT","0"); + sourceListValue = args[1]; + } + for(i = testsBegin; i != tests.end(); ++i) + { + cmSourceFile* sf = this->Makefile->GetOrCreateSource(i->c_str()); + sf->SetProperty("ABSTRACT","0"); + sourceListValue += ";"; + sourceListValue += *i; + } + + this->Makefile->AddDefinition(sourceList, sourceListValue.c_str()); + return res; +} + + + -- cgit v1.2.3