Browse Source

ENH: Warn if build dir is too long for filesystem

When an object file directory is too deep to place an object file
without exceeding CMAKE_OBJECT_PATH_MAX, this issues a warning.
Previously we silently ignored the problem.  See issue #7860.
Brad King 17 years ago
parent
commit
205fce61b6
2 changed files with 22 additions and 2 deletions
  1. 21 2
      Source/cmLocalGenerator.cxx
  2. 1 0
      Source/cmLocalGenerator.h

+ 21 - 2
Source/cmLocalGenerator.cxx

@@ -136,6 +136,7 @@ void cmLocalGenerator::Configure()
       this->Makefile->IssueMessage(cmake::AUTHOR_WARNING, w.str());
       }
     }
+  this->ObjectMaxPathViolations.clear();
   }
 
   this->Configured = true;
@@ -2536,8 +2537,26 @@ cmLocalGenerator
       }
 
 #if defined(CM_LG_ENCODE_OBJECT_NAMES)
-    cmLocalGeneratorCheckObjectName(ssin, dir_max.size(),
-                                    this->ObjectPathMax);
+    if(!cmLocalGeneratorCheckObjectName(ssin, dir_max.size(),
+                                        this->ObjectPathMax))
+      {
+      // Warn if this is the first time the path has been seen.
+      if(this->ObjectMaxPathViolations.insert(dir_max).second)
+        {
+        cmOStringStream m;
+        m << "The object file directory\n"
+          << "  " << dir_max << "\n"
+          << "has " << dir_max.size() << " characters.  "
+          << "The maximum full path to an object file is "
+          << this->ObjectPathMax << " characters "
+          << "(see CMAKE_OBJECT_PATH_MAX).  "
+          << "Object file\n"
+          << "  " << ssin << "\n"
+          << "cannot be safely placed under this directory.  "
+          << "The build may not work correctly.";
+        this->Makefile->IssueMessage(cmake::WARNING, m.str());
+        }
+      }
 #else
     (void)dir_max;
 #endif

+ 1 - 0
Source/cmLocalGenerator.h

@@ -370,6 +370,7 @@ protected:
   std::map<cmStdString, cmStdString> LanguageToIncludeFlags;
   std::map<cmStdString, cmStdString> UniqueObjectNamesMap;
   std::string::size_type ObjectPathMax;
+  std::set<cmStdString> ObjectMaxPathViolations;
   bool WindowsShell;
   bool WindowsVSIDE;
   bool WatcomWMake;