BUG: improve bad argument handling for INCLUDE_DIRECTORIES and ADD_DEFINITIONS bug 4364

This commit is contained in:
Ken Martin 2007-03-07 11:03:57 -05:00
parent 4148fedbf0
commit bfb3598c4b
6 changed files with 114 additions and 22 deletions

View File

@ -571,6 +571,16 @@ IF(BUILD_TESTING)
--build-two-config --build-two-config
--test-command cxxonly) --test-command cxxonly)
ADD_TEST(NewlineArgs ${CMAKE_CTEST_COMMAND}
--build-and-test
"${CMake_SOURCE_DIR}/Tests/NewlineArgs"
"${CMake_BINARY_DIR}/Tests/NewlineArgs"
--build-generator ${CMAKE_TEST_GENERATOR}
--build-project cxxonly
--build-makeprogram ${CMAKE_TEST_MAKEPROGRAM}
--build-two-config
--test-command cxxonly)
ADD_TEST(MacroTest ${CMAKE_CTEST_COMMAND} ADD_TEST(MacroTest ${CMAKE_CTEST_COMMAND}
--build-and-test --build-and-test
"${CMake_SOURCE_DIR}/Tests/MacroTest" "${CMake_SOURCE_DIR}/Tests/MacroTest"

View File

@ -64,24 +64,77 @@ bool cmIncludeDirectoryCommand
return 0; return 0;
} }
} }
std::string unixPath = *i;
if (!cmSystemTools::IsOff(unixPath.c_str())) this->AddDirectory(i->c_str(),before,system);
{
cmSystemTools::ConvertToUnixSlashes(unixPath);
if(!cmSystemTools::FileIsFullPath(unixPath.c_str()))
{
std::string tmp = this->Makefile->GetStartDirectory();
tmp += "/";
tmp += unixPath;
unixPath = tmp;
}
}
this->Makefile->AddIncludeDirectory(unixPath.c_str(), before);
if(system)
{
this->Makefile->AddSystemIncludeDirectory(unixPath.c_str());
}
} }
return true; return true;
} }
// do a lot of cleanup on the arguments because this is one place where folks
// sometimes take the output of a program and pass it directly into this
// command not thinking that a single argument could be filled with spaces
// and newlines etc liek below:
//
// " /foo/bar
// /boo/hoo /dingle/berry "
//
// ideally that should be three seperate arguments but when sucking the
// output from a program and passing it into a command the cleanup doesn't
// always happen
//
void cmIncludeDirectoryCommand::AddDirectory(const char *i,
bool before,
bool system)
{
// break apart any line feed arguments
std::string ret = i;
std::string::size_type pos = 0;
if((pos = ret.find('\n', pos)) != std::string::npos)
{
if (pos)
{
this->AddDirectory(ret.substr(0,pos).c_str(), before, system);
}
if (ret.size()-pos-1)
{
this->AddDirectory(ret.substr(pos+1,ret.size()-pos-1).c_str(), before, system);
}
return;
}
// remove any leading or trailing spaces and \r
pos = ret.size()-1;
while(ret[pos] == ' ' || ret[pos] == '\r')
{
ret.erase(pos);
pos--;
}
pos = 0;
while(ret.size() && ret[pos] == ' ' || ret[pos] == '\r')
{
ret.erase(pos,1);
}
if (!ret.size())
{
return;
}
if (!cmSystemTools::IsOff(ret.c_str()))
{
cmSystemTools::ConvertToUnixSlashes(ret);
if(!cmSystemTools::FileIsFullPath(ret.c_str()))
{
std::string tmp = this->Makefile->GetStartDirectory();
tmp += "/";
tmp += ret;
ret = tmp;
}
}
this->Makefile->AddIncludeDirectory(ret.c_str(), before);
if(system)
{
this->Makefile->AddSystemIncludeDirectory(ret.c_str());
}
}

View File

@ -74,6 +74,10 @@ public:
} }
cmTypeMacro(cmIncludeDirectoryCommand, cmCommand); cmTypeMacro(cmIncludeDirectoryCommand, cmCommand);
protected:
// used internally
void AddDirectory(const char *arg, bool before, bool system);
}; };

View File

@ -859,8 +859,28 @@ void cmMakefile::AddUtilityCommand(const char* utilityName, bool all,
void cmMakefile::AddDefineFlag(const char* flag) void cmMakefile::AddDefineFlag(const char* flag)
{ {
if (!flag)
{
return;
}
// remove any \n\r
std::string ret = flag;
std::string::size_type pos = 0;
while((pos = ret.find('\n', pos)) != std::string::npos)
{
ret[pos] = ' ';
pos++;
}
pos = 0;
while((pos = ret.find('\r', pos)) != std::string::npos)
{
ret[pos] = ' ';
pos++;
}
this->DefineFlags += " "; this->DefineFlags += " ";
this->DefineFlags += flag; this->DefineFlags += ret;
} }
@ -1111,6 +1131,12 @@ void cmMakefile::AddSubDirectory(const char* srcPath, const char *binPath,
void cmMakefile::AddIncludeDirectory(const char* inc, bool before) void cmMakefile::AddIncludeDirectory(const char* inc, bool before)
{ {
// if there is a newline then break it into multiple arguments
if (!inc)
{
return;
}
// Don't add an include directory that is already present. Yes, // Don't add an include directory that is already present. Yes,
// this linear search results in n^2 behavior, but n won't be // this linear search results in n^2 behavior, but n won't be
// getting much bigger than 20. We cannot use a set because of // getting much bigger than 20. We cannot use a set because of

View File

@ -31,8 +31,7 @@ bool cmSeparateArgumentsCommand
return true; return true;
} }
std::string value = cacheValue; std::string value = cacheValue;
cmSystemTools::ReplaceString(value, cmSystemTools::ReplaceString(value," ", ";");
" ", ";");
this->Makefile->AddDefinition(args[0].c_str(), value.c_str()); this->Makefile->AddDefinition(args[0].c_str(), value.c_str());
return true; return true;
} }

View File

@ -4,8 +4,8 @@ project (newlineargs CXX)
add_definitions("-DTEST_FLAG_1 add_definitions("-DTEST_FLAG_1
-DTEST_FLAG_2") -DTEST_FLAG_2")
include_directories("${newlineargs_BINARY_DIR} include_directories(" ${newlineargs_BINARY_DIR}
${newlineargs_SOURCE_DIR}") ${newlineargs_SOURCE_DIR} ")
configure_file("${newlineargs_SOURCE_DIR}/libcxx2.h.in" configure_file("${newlineargs_SOURCE_DIR}/libcxx2.h.in"
"${newlineargs_BINARY_DIR}/libcxx2.h") "${newlineargs_BINARY_DIR}/libcxx2.h")