[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