[cmake-commits] martink committed CMakeLists.txt 1.348 1.349
cmIncludeDirectoryCommand.cxx 1.24 1.25
cmIncludeDirectoryCommand.h 1.13 1.14 cmMakefile.cxx 1.374
1.375 cmSeparateArgumentsCommand.cxx 1.4 1.5
cmake-commits at cmake.org
cmake-commits at cmake.org
Wed Mar 7 11:03:59 EST 2007
Update of /cvsroot/CMake/CMake/Source
In directory public:/mounts/ram/cvs-serv23575/Source
Modified Files:
CMakeLists.txt cmIncludeDirectoryCommand.cxx
cmIncludeDirectoryCommand.h cmMakefile.cxx
cmSeparateArgumentsCommand.cxx
Log Message:
BUG: improve bad argument handling for INCLUDE_DIRECTORIES and ADD_DEFINITIONS bug 4364
Index: cmIncludeDirectoryCommand.h
===================================================================
RCS file: /cvsroot/CMake/CMake/Source/cmIncludeDirectoryCommand.h,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -d -r1.13 -r1.14
--- cmIncludeDirectoryCommand.h 5 Oct 2006 12:55:59 -0000 1.13
+++ cmIncludeDirectoryCommand.h 7 Mar 2007 16:03:57 -0000 1.14
@@ -74,6 +74,10 @@
}
cmTypeMacro(cmIncludeDirectoryCommand, cmCommand);
+
+protected:
+ // used internally
+ void AddDirectory(const char *arg, bool before, bool system);
};
Index: CMakeLists.txt
===================================================================
RCS file: /cvsroot/CMake/CMake/Source/CMakeLists.txt,v
retrieving revision 1.348
retrieving revision 1.349
diff -u -d -r1.348 -r1.349
--- CMakeLists.txt 3 Mar 2007 15:47:06 -0000 1.348
+++ CMakeLists.txt 7 Mar 2007 16:03:57 -0000 1.349
@@ -571,6 +571,16 @@
--build-two-config
--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}
--build-and-test
"${CMake_SOURCE_DIR}/Tests/MacroTest"
Index: cmMakefile.cxx
===================================================================
RCS file: /cvsroot/CMake/CMake/Source/cmMakefile.cxx,v
retrieving revision 1.374
retrieving revision 1.375
diff -u -d -r1.374 -r1.375
--- cmMakefile.cxx 28 Feb 2007 19:45:58 -0000 1.374
+++ cmMakefile.cxx 7 Mar 2007 16:03:57 -0000 1.375
@@ -859,8 +859,28 @@
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 += flag;
+ this->DefineFlags += ret;
}
@@ -1111,6 +1131,12 @@
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,
// 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
Index: cmIncludeDirectoryCommand.cxx
===================================================================
RCS file: /cvsroot/CMake/CMake/Source/cmIncludeDirectoryCommand.cxx,v
retrieving revision 1.24
retrieving revision 1.25
diff -u -d -r1.24 -r1.25
--- cmIncludeDirectoryCommand.cxx 23 Feb 2007 14:45:04 -0000 1.24
+++ cmIncludeDirectoryCommand.cxx 7 Mar 2007 16:03:57 -0000 1.25
@@ -64,24 +64,77 @@
return 0;
}
}
- std::string unixPath = *i;
- if (!cmSystemTools::IsOff(unixPath.c_str()))
+
+ this->AddDirectory(i->c_str(),before,system);
+
+ }
+ 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)
{
- cmSystemTools::ConvertToUnixSlashes(unixPath);
- if(!cmSystemTools::FileIsFullPath(unixPath.c_str()))
- {
- std::string tmp = this->Makefile->GetStartDirectory();
- tmp += "/";
- tmp += unixPath;
- unixPath = tmp;
- }
+ this->AddDirectory(ret.substr(0,pos).c_str(), before, system);
}
- this->Makefile->AddIncludeDirectory(unixPath.c_str(), before);
- if(system)
+ if (ret.size()-pos-1)
{
- this->Makefile->AddSystemIncludeDirectory(unixPath.c_str());
+ 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());
}
- return true;
}
Index: cmSeparateArgumentsCommand.cxx
===================================================================
RCS file: /cvsroot/CMake/CMake/Source/cmSeparateArgumentsCommand.cxx,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- cmSeparateArgumentsCommand.cxx 12 May 2006 17:53:20 -0000 1.4
+++ cmSeparateArgumentsCommand.cxx 7 Mar 2007 16:03:57 -0000 1.5
@@ -31,8 +31,7 @@
return true;
}
std::string value = cacheValue;
- cmSystemTools::ReplaceString(value,
- " ", ";");
+ cmSystemTools::ReplaceString(value," ", ";");
this->Makefile->AddDefinition(args[0].c_str(), value.c_str());
return true;
}
More information about the Cmake-commits
mailing list