]> granicus.if.org Git - clang/commitdiff
Move the options for dependency file generation from DependencyFile.cpp
authorEli Friedman <eli.friedman@gmail.com>
Tue, 19 May 2009 03:35:57 +0000 (03:35 +0000)
committerEli Friedman <eli.friedman@gmail.com>
Tue, 19 May 2009 03:35:57 +0000 (03:35 +0000)
to clang-cc.cpp.  Also, rename CreateDependencyFileGen to
AttachDependencyFileGen, and make it take a raw_ostream rather than
opening a file itself.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@72096 91177308-0d34-0410-b5e6-96231b3b80d8

tools/clang-cc/DependencyFile.cpp
tools/clang-cc/clang-cc.cpp
tools/clang-cc/clang-cc.h

index 34b6ecfcab8615fadadf68c4d3d21c3797c82336..3306f82aea718127ef3ba824e6ea873364401742 100644 (file)
@@ -34,7 +34,8 @@ class VISIBILITY_HIDDEN DependencyFileCallback : public PPCallbacks {
   const Preprocessor *PP;
   std::vector<std::string> Targets;
   llvm::raw_ostream *OS;
-
+  bool IncludeSystemHeaders;
+  bool PhonyTarget;
 private:
   bool FileMatchesDepCriteria(const char *Filename,
                               SrcMgr::CharacteristicKind FileType);
@@ -43,9 +44,11 @@ private:
 public:
   DependencyFileCallback(const Preprocessor *_PP, 
                          llvm::raw_ostream *_OS, 
-                         const std::vector<std::string> &_Targets)
-    : PP(_PP), Targets(_Targets), OS(_OS) {
-  }
+                         const std::vector<std::string> &_Targets,
+                         bool _IncludeSystemHeaders,
+                         bool _PhonyTarget)
+    : PP(_PP), Targets(_Targets), OS(_OS),
+      IncludeSystemHeaders(_IncludeSystemHeaders), PhonyTarget(_PhonyTarget) {}
 
   ~DependencyFileCallback() {
     OutputDependencyFile();
@@ -58,54 +61,18 @@ public:
 };
 }
 
-//===----------------------------------------------------------------------===//
-// Dependency file options
-//===----------------------------------------------------------------------===//
-static llvm::cl::opt<std::string>
-DependencyFile("dependency-file",
-               llvm::cl::desc("Filename (or -) to write dependency output to"));
-
-static llvm::cl::opt<bool>
-DependenciesIncludeSystemHeaders("sys-header-deps",
-                 llvm::cl::desc("Include system headers in dependency output"));
-
-static llvm::cl::list<std::string>
-DependencyTargets("MT",
-         llvm::cl::desc("Specify target for dependency"));
-
-// FIXME: Implement feature
-static llvm::cl::opt<bool>
-PhonyDependencyTarget("MP",
-            llvm::cl::desc("Create phony target for each dependency "
-                           "(other than main file)"));
-
-bool clang::CreateDependencyFileGen(Preprocessor *PP,
-                                    std::string &ErrStr) {
-  ErrStr = "";
-  if (DependencyFile.empty())
-    return false;
 
-  if (DependencyTargets.empty()) {
-    ErrStr = "-dependency-file requires at least one -MT option\n";
-    return false;
-  }
 
-  std::string ErrMsg;
-  llvm::raw_ostream *OS;
-  if (DependencyFile == "-") {
-    OS = new llvm::raw_stdout_ostream();
-  } else {
-    OS = new llvm::raw_fd_ostream(DependencyFile.c_str(), false, ErrStr);
-    if (!ErrMsg.empty()) {
-      ErrStr = "unable to open dependency file: " + ErrMsg;
-      return false;
-    }
-  }
+void clang::AttachDependencyFileGen(Preprocessor *PP, llvm::raw_ostream *OS,
+                                    std::vector<std::string> &Targets,
+                                    bool IncludeSystemHeaders,
+                                    bool PhonyTarget) {
+  assert(!Targets.empty() && "Target required for dependency generation");
 
   DependencyFileCallback *PPDep = 
-    new DependencyFileCallback(PP, OS, DependencyTargets);
+    new DependencyFileCallback(PP, OS, Targets, IncludeSystemHeaders, 
+                               PhonyTarget);
   PP->setPPCallbacks(PPDep);
-  return true;
 }
 
 /// FileMatchesDepCriteria - Determine whether the given Filename should be
@@ -115,7 +82,7 @@ bool DependencyFileCallback::FileMatchesDepCriteria(const char *Filename,
   if (strcmp("<built-in>", Filename) == 0)
     return false;
 
-  if (DependenciesIncludeSystemHeaders)
+  if (IncludeSystemHeaders)
     return true;
 
   return FileType == SrcMgr::C_User;
@@ -192,7 +159,7 @@ void DependencyFileCallback::OutputDependencyFile() {
   *OS << '\n';
 
   // Create phony targets if requested.
-  if (PhonyDependencyTarget) {
+  if (PhonyTarget) {
     // Skip the first entry, this is always the input file itself.
     for (std::vector<std::string>::iterator I = Files.begin() + 1,
            E = Files.end(); I != E; ++I) {
index 669c47815e3b14a4674c987c8339f99124b05cec..bf6bceec54536cddb392f61abed1111bd77c3670 100644 (file)
@@ -1374,13 +1374,6 @@ public:
     if (InitializePreprocessor(*PP, InitOpts))
       return 0;
 
-    std::string ErrStr;
-    bool DFG = CreateDependencyFileGen(PP.get(), ErrStr);
-    if (!DFG && !ErrStr.empty()) {
-      fprintf(stderr, "%s", ErrStr.c_str());
-      return 0;
-    }
-
     return PP.take();
   }
 };
@@ -1527,6 +1520,28 @@ DumpMacros("dM", llvm::cl::desc("Print macro definitions in -E mode instead of"
 static llvm::cl::opt<bool>
 DumpDefines("dD", llvm::cl::desc("Print macro definitions in -E mode in "
                                 "addition to normal output"));
+
+//===----------------------------------------------------------------------===//
+// Dependency file options
+//===----------------------------------------------------------------------===//
+static llvm::cl::opt<std::string>
+DependencyFile("dependency-file",
+               llvm::cl::desc("Filename (or -) to write dependency output to"));
+
+static llvm::cl::opt<bool>
+DependenciesIncludeSystemHeaders("sys-header-deps",
+                 llvm::cl::desc("Include system headers in dependency output"));
+
+static llvm::cl::list<std::string>
+DependencyTargets("MT",
+         llvm::cl::desc("Specify target for dependency"));
+
+// FIXME: Implement feature
+static llvm::cl::opt<bool>
+PhonyDependencyTarget("MP",
+            llvm::cl::desc("Create phony target for each dependency "
+                           "(other than main file)"));
+
 //===----------------------------------------------------------------------===//
 // -dump-build-information Stuff
 //===----------------------------------------------------------------------===//
@@ -2133,6 +2148,30 @@ int main(int argc, char **argv) {
     if (!PP)
       continue;
 
+    // Handle generating dependencies, if requested
+    if (!DependencyFile.empty()) {
+      llvm::raw_ostream *DependencyOS;
+      if (DependencyTargets.empty()) {
+        // FIXME: Use a proper diagnostic
+        llvm::cerr << "-dependency-file requires at least one -MT option\n";
+        HadErrors = true;
+        continue;
+      }
+      std::string ErrStr;
+      DependencyOS =
+          new llvm::raw_fd_ostream(DependencyFile.c_str(), false, ErrStr);
+      if (!ErrStr.empty()) {
+        // FIXME: Use a proper diagnostic
+        llvm::cerr << "unable to open dependency file: " + ErrStr;
+        HadErrors = true;
+        continue;
+      }
+
+      AttachDependencyFileGen(PP.get(), DependencyOS, DependencyTargets,
+                              DependenciesIncludeSystemHeaders,
+                              PhonyDependencyTarget);
+    }
+
     if (ImplicitIncludePCH.empty() && 
         InitializeSourceManager(*PP.get(), InFile))
       continue;
index 0322d2e905abdeacf08ab83c2625a1c6b0df9624..4ea03f8daa0329730f1619f10f21e9ecb464be15 100644 (file)
@@ -64,9 +64,11 @@ MinimalAction *CreatePrintParserActionsAction(Preprocessor &PP,
 /// CheckDiagnostics - Gather the expected diagnostics and check them.
 bool CheckDiagnostics(Preprocessor &PP);
 
-/// CreateDependencyFileGen - Create dependency file generator.
-/// This is only done if either -MD or -MMD has been specified.
-bool CreateDependencyFileGen(Preprocessor *PP, std::string &ErrStr);
+/// AttachDependencyFileGen - Create a dependency file generator, and attach
+/// it to the given preprocessor.  This takes ownership of the output stream.
+void AttachDependencyFileGen(Preprocessor *PP, llvm::raw_ostream *OS,
+                             std::vector<std::string> &Targets,
+                             bool IncludeSystemHeaders, bool PhonyTarget);
 
 /// CacheTokens - Cache tokens for use with PCH. Note that this requires
 /// a seekable stream.