BUG: improve bad argument handling for INCLUDE_DIRECTORIES and ADD_DEFINITIONS bug 4364
This commit is contained in:
parent
4148fedbf0
commit
bfb3598c4b
|
@ -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"
|
||||||
|
|
|
@ -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());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -74,6 +74,10 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
cmTypeMacro(cmIncludeDirectoryCommand, cmCommand);
|
cmTypeMacro(cmIncludeDirectoryCommand, cmCommand);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
// used internally
|
||||||
|
void AddDirectory(const char *arg, bool before, bool system);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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")
|
||||||
|
|
Loading…
Reference in New Issue