ENH: add the ability to process command line arguments in the test driver before the test driver gets them
This commit is contained in:
parent
04d53a3865
commit
e4dce08591
|
@ -30,7 +30,39 @@ bool cmCreateTestSourceList::InitialPass(std::vector<std::string> const& argsIn)
|
|||
cmSystemTools::ExpandListArguments(argsIn, args);
|
||||
|
||||
std::vector<std::string>::iterator i = args.begin();
|
||||
|
||||
std::string extraInclude;
|
||||
std::string function;
|
||||
std::vector<std::string> 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 = *i;
|
||||
}
|
||||
else if(*i == "FUNCTION")
|
||||
{
|
||||
++i;
|
||||
if(i == args.end())
|
||||
{
|
||||
this->SetError("incorrect arguments to FUNCTION");
|
||||
return false;
|
||||
}
|
||||
function = *i;
|
||||
}
|
||||
else
|
||||
{
|
||||
tests.push_back(*i);
|
||||
}
|
||||
}
|
||||
i = tests.begin();
|
||||
|
||||
// Name of the source list
|
||||
|
||||
const char* sourceList = i->c_str();
|
||||
|
@ -59,8 +91,13 @@ bool cmCreateTestSourceList::InitialPass(std::vector<std::string> const& argsIn)
|
|||
fout <<
|
||||
"#include <ctype.h>\n"
|
||||
"#include <stdio.h>\n"
|
||||
"#include <string.h>\n"
|
||||
|
||||
"#include <string.h>\n";
|
||||
if(extraInclude.size())
|
||||
{
|
||||
fout << "#include \"" << extraInclude << "\"\n";
|
||||
}
|
||||
|
||||
fout <<
|
||||
"\n"
|
||||
"// Forward declare test functions\n"
|
||||
"\n";
|
||||
|
@ -75,8 +112,12 @@ bool cmCreateTestSourceList::InitialPass(std::vector<std::string> const& argsIn)
|
|||
// For the moment:
|
||||
// - replace spaces ' ', ':' and '/' with underscores '_'
|
||||
|
||||
for(i = testsBegin; i != args.end(); ++i)
|
||||
for(i = testsBegin; i != tests.end(); ++i)
|
||||
{
|
||||
if(*i == "EXTRA_INCLUDE")
|
||||
{
|
||||
break;
|
||||
}
|
||||
std::string func_name = *i;
|
||||
cmSystemTools::ConvertToUnixSlashes(func_name);
|
||||
cmSystemTools::ReplaceString(func_name, " ", "_");
|
||||
|
@ -101,7 +142,7 @@ bool cmCreateTestSourceList::InitialPass(std::vector<std::string> const& argsIn)
|
|||
|
||||
int numTests = 0;
|
||||
std::vector<std::string>::iterator j;
|
||||
for(i = testsBegin, j = tests_func_name.begin(); i != args.end(); ++i, ++j)
|
||||
for(i = testsBegin, j = tests_func_name.begin(); i != tests.end(); ++i, ++j)
|
||||
{
|
||||
fout <<
|
||||
" {\n"
|
||||
|
@ -138,7 +179,14 @@ bool cmCreateTestSourceList::InitialPass(std::vector<std::string> const& argsIn)
|
|||
" int NumTests = " << numTests << ";\n"
|
||||
" int i;\n"
|
||||
" \n"
|
||||
" // If no test name was given\n"
|
||||
" // If no test name was given\n";
|
||||
if(function.size())
|
||||
{
|
||||
fout << " // process command line with user function\n"
|
||||
<< " " << function << "(&ac, &av);\n";
|
||||
}
|
||||
|
||||
fout <<
|
||||
" if (ac < 2)\n"
|
||||
" {\n"
|
||||
" // If there is only one test, then run it with the arguments\n"
|
||||
|
@ -218,7 +266,7 @@ bool cmCreateTestSourceList::InitialPass(std::vector<std::string> const& argsIn)
|
|||
false);
|
||||
m_Makefile->AddSource(cfile, sourceList);
|
||||
|
||||
for(i = testsBegin; i != args.end(); ++i)
|
||||
for(i = testsBegin; i != tests.end(); ++i)
|
||||
{
|
||||
cmSourceFile cfile;
|
||||
cfile.SetIsAnAbstractClass(false);
|
||||
|
|
|
@ -67,13 +67,16 @@ public:
|
|||
virtual const char* GetFullDocumentation()
|
||||
{
|
||||
return
|
||||
"CREATE_TEST_SOURCELIST(SourceListName DriverName test1 test2 test3"
|
||||
"CREATE_TEST_SOURCELIST(SourceListName DriverName test1 test2 test3 EXTRA_INCLUDE include.h FUNCTION function)"
|
||||
"The list of source files needed to build the testdriver will be in SourceListName.\n"
|
||||
"DriverName.cxx is the name of the test driver program.\n"
|
||||
"The rest of the arguments consist of a list of test source files, can be "
|
||||
"; separated. Each test source file should have a function in it that "
|
||||
"is the same name as the file with no extension (foo.cxx should have int foo();) "
|
||||
"DriverName.cxx will be able to call each of the tests by name on the command line.";
|
||||
"DriverName.cxx will be able to call each of the tests by name on the command line. "
|
||||
"If EXTRA_INCLUDE is specified, then the next argument is included into the generated file. "
|
||||
"If FUNCTION is specified, then the next argument is taken as a function name that is passed "
|
||||
"a pointer to ac and av. This can be used to add extra command line processing to each test. ";
|
||||
}
|
||||
|
||||
cmTypeMacro(cmCreateTestSourceList, cmCommand);
|
||||
|
|
|
@ -2,12 +2,13 @@ PROJECT(TestDriverTest)
|
|||
|
||||
SET(Extra_SRCS testExtraStuff.cxx testExtraStuff2.cxx )
|
||||
SET(Extra_SRCS ${Extra_SRCS};testExtraStuff3.cxx )
|
||||
|
||||
INCLUDE_DIRECTORIES(${TestDriverTest_SOURCE_DIR})
|
||||
CREATE_TEST_SOURCELIST(testSrcs
|
||||
TestDriverTest
|
||||
test1
|
||||
test2
|
||||
subdir/test3)
|
||||
subdir/test3
|
||||
EXTRA_INCLUDE testArgs.h FUNCTION testProccessArgs)
|
||||
|
||||
ADD_EXECUTABLE(TestDriverTest testSrcs ${Extra_SRCS})
|
||||
|
||||
|
|
Loading…
Reference in New Issue