]> granicus.if.org Git - clang/commitdiff
Add DependencyOutputOptions to wrap -M... options, and propogate to
authorDaniel Dunbar <daniel@zuster.org>
Wed, 11 Nov 2009 21:43:12 +0000 (21:43 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Wed, 11 Nov 2009 21:43:12 +0000 (21:43 +0000)
CompilerInvocation and clang-cc.

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

include/clang/Frontend/CompilerInvocation.h
include/clang/Frontend/DependencyOutputOptions.h [new file with mode: 0644]
include/clang/Frontend/PreprocessorOutputOptions.h
include/clang/Frontend/Utils.h
lib/Frontend/DependencyFile.cpp
tools/clang-cc/Options.cpp
tools/clang-cc/Options.h
tools/clang-cc/clang-cc.cpp

index b217dca965c1047105a3b03949b16d1b72a07097..fc0b95284d12d3f40aa2a480cbd6bc61bf92b6b4 100644 (file)
@@ -12,6 +12,7 @@
 
 #include "clang/Basic/LangOptions.h"
 #include "clang/Frontend/CompileOptions.h"
+#include "clang/Frontend/DependencyOutputOptions.h"
 #include "clang/Frontend/DiagnosticOptions.h"
 #include "clang/Frontend/HeaderSearchOptions.h"
 #include "clang/Frontend/PreprocessorOptions.h"
@@ -31,6 +32,9 @@ class CompilerInvocation {
   /// Options controlling IRgen and the backend.
   CompileOptions CompileOpts;
 
+  /// Options controlling dependency output.
+  DependencyOutputOptions DependencyOutputOpts;
+
   /// Options controlling the diagnostic engine.
   DiagnosticOptions DiagOpts;
 
@@ -68,6 +72,13 @@ public:
     return CompileOpts;
   }
 
+  DependencyOutputOptions &getDependencyOutputOpts() {
+    return DependencyOutputOpts;
+  }
+  const DependencyOutputOptions &getDependencyOutputOpts() const {
+    return DependencyOutputOpts;
+  }
+
   DiagnosticOptions &getDiagnosticOpts() { return DiagOpts; }
   const DiagnosticOptions &getDiagnosticOpts() const { return DiagOpts; }
 
diff --git a/include/clang/Frontend/DependencyOutputOptions.h b/include/clang/Frontend/DependencyOutputOptions.h
new file mode 100644 (file)
index 0000000..194c0eb
--- /dev/null
@@ -0,0 +1,42 @@
+//===--- DependencyOutputOptions.h ------------------------------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_CLANG_FRONTEND_DEPENDENCYOUTPUTOPTIONS_H
+#define LLVM_CLANG_FRONTEND_DEPENDENCYOUTPUTOPTIONS_H
+
+#include <vector>
+
+namespace clang {
+
+/// DependencyOutputOptions - Options for controlling the compiler dependency
+/// file generation.
+class DependencyOutputOptions {
+public:
+  unsigned IncludeSystemHeaders : 1; ///< Include system header dependencies.
+  unsigned UsePhonyTargets : 1;      ///< Include phony targets for each
+                                     /// dependency, which can avoid some 'make'
+                                     /// problems.
+
+  /// The file to write depencency output to.
+  std::string OutputFile;
+
+  /// A list of names to use as the targets in the dependency file; this list
+  /// must contain at least one entry.
+  std::vector<std::string> Targets;
+
+public:
+  DependencyOutputOptions() {
+    IncludeSystemHeaders = 0;
+    UsePhonyTargets = 0;
+  }
+};
+
+}  // end namespace clang
+
+#endif
index e375a8545fb7b609b3eb032298539b4a013b1c98..a712a3d1bb0561013b5f1841b4fd1ed58d958cdd 100644 (file)
@@ -10,9 +10,6 @@
 #ifndef LLVM_CLANG_FRONTEND_PREPROCESSOROUTPUTOPTIONS_H
 #define LLVM_CLANG_FRONTEND_PREPROCESSOROUTPUTOPTIONS_H
 
-#include <string>
-#include <vector>
-
 namespace clang {
 
 /// PreprocessorOutputOptions - Options for controlling the C preprocessor
@@ -22,8 +19,8 @@ public:
   unsigned ShowCPP : 1;           ///< Print normal preprocessed output.
   unsigned ShowMacros : 1;        ///< Print macro definitions.
   unsigned ShowLineMarkers : 1;   ///< Show #line markers.
-  unsigned ShowComments : 1;      /// Show comments.
-  unsigned ShowMacroComments : 1; /// Show comments, even in macros.
+  unsigned ShowComments : 1;      ///< Show comments.
+  unsigned ShowMacroComments : 1; ///< Show comments, even in macros.
 
 public:
   PreprocessorOutputOptions() {
index d3a0b097f0c03753ce6854efeb35c5adcfab50da..859f06a434bb6562c4e621ad57083b84437ab928 100644 (file)
@@ -26,6 +26,7 @@ class raw_fd_ostream;
 namespace clang {
 class ASTConsumer;
 class Decl;
+class DependencyOutputOptions;
 class Diagnostic;
 class HeaderSearch;
 class HeaderSearchOptions;
@@ -77,9 +78,8 @@ bool CheckDiagnostics(Preprocessor &PP);
 
 /// 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);
+void AttachDependencyFileGen(Preprocessor *PP,
+                             const DependencyOutputOptions &Opts);
 
 /// CacheTokens - Cache tokens for use with PCH. Note that this requires
 /// a seekable stream.
index 81d1179f28e36b382e0d657e0527216792f39376..9c311fac629b85e707ad3241cc5493da961adbe0 100644 (file)
 //===----------------------------------------------------------------------===//
 
 #include "clang/Frontend/Utils.h"
-#include "clang/Basic/SourceManager.h"
 #include "clang/Basic/FileManager.h"
-#include "clang/Lex/Preprocessor.h"
-#include "clang/Lex/PPCallbacks.h"
-#include "clang/Lex/DirectoryLookup.h"
 #include "clang/Basic/SourceLocation.h"
+#include "clang/Basic/SourceManager.h"
+#include "clang/Frontend/DependencyOutputOptions.h"
+#include "clang/Frontend/FrontendDiagnostic.h"
+#include "clang/Lex/DirectoryLookup.h"
+#include "clang/Lex/PPCallbacks.h"
+#include "clang/Lex/Preprocessor.h"
 #include "llvm/ADT/StringSet.h"
 #include "llvm/Support/Compiler.h"
 #include "llvm/Support/raw_ostream.h"
@@ -42,11 +44,10 @@ private:
 public:
   DependencyFileCallback(const Preprocessor *_PP,
                          llvm::raw_ostream *_OS,
-                         const std::vector<std::string> &_Targets,
-                         bool _IncludeSystemHeaders,
-                         bool _PhonyTarget)
-    : PP(_PP), Targets(_Targets), OS(_OS),
-      IncludeSystemHeaders(_IncludeSystemHeaders), PhonyTarget(_PhonyTarget) {}
+                         const DependencyOutputOptions &Opts)
+    : PP(_PP), Targets(Opts.Targets), OS(_OS),
+      IncludeSystemHeaders(Opts.IncludeSystemHeaders),
+      PhonyTarget(Opts.UsePhonyTargets) {}
 
   ~DependencyFileCallback() {
     OutputDependencyFile();
@@ -59,18 +60,23 @@ public:
 };
 }
 
+void clang::AttachDependencyFileGen(Preprocessor *PP,
+                                    const DependencyOutputOptions &Opts) {
+  if (Opts.Targets.empty()) {
+    PP->getDiagnostics().Report(diag::err_fe_dependency_file_requires_MT);
+    return;
+  }
 
+  std::string Err;
+  llvm::raw_ostream *OS(new llvm::raw_fd_ostream(Opts.OutputFile.c_str(), Err));
+  if (!Err.empty()) {
+    PP->getDiagnostics().Report(diag::err_fe_error_opening)
+      << Opts.OutputFile << Err;
+    return;
+  }
 
-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, Targets, IncludeSystemHeaders,
-                               PhonyTarget);
-  PP->setPPCallbacks(PPDep);
+  assert(!PP->getPPCallbacks() && "Preprocessor callbacks already registered!");
+  PP->setPPCallbacks(new DependencyFileCallback(PP, OS, Opts));
 }
 
 /// FileMatchesDepCriteria - Determine whether the given Filename should be
index 211f1412a1b4d539e4df61cdb21d45b54f8bbd32..2428d3ab8faa5466d428f6155c0c286b0bd07752 100644 (file)
@@ -16,6 +16,7 @@
 #include "clang/Basic/TargetInfo.h"
 #include "clang/Frontend/AnalysisConsumer.h"
 #include "clang/Frontend/CompileOptions.h"
+#include "clang/Frontend/DependencyOutputOptions.h"
 #include "clang/Frontend/DiagnosticOptions.h"
 #include "clang/Frontend/HeaderSearchOptions.h"
 #include "clang/Frontend/PCHReader.h"
@@ -189,6 +190,31 @@ TargetFeatures("target-feature", llvm::cl::desc("Target specific attributes"));
 
 }
 
+//===----------------------------------------------------------------------===//
+// Dependency Output Options
+//===----------------------------------------------------------------------===//
+
+namespace dependencyoutputoptions {
+
+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"));
+
+static llvm::cl::opt<bool>
+PhonyDependencyTarget("MP",
+            llvm::cl::desc("Create phony target for each dependency "
+                           "(other than main file)"));
+
+}
+
 //===----------------------------------------------------------------------===//
 // Diagnostic Options
 //===----------------------------------------------------------------------===//
@@ -616,6 +642,16 @@ void clang::InitializeCompileOptions(CompileOptions &Opts,
 #endif
 }
 
+void clang::InitializeDependencyOutputOptions(DependencyOutputOptions &Opts) {
+  using namespace dependencyoutputoptions;
+
+  Opts.OutputFile = DependencyFile;
+  Opts.Targets.insert(Opts.Targets.begin(), DependencyTargets.begin(),
+                      DependencyTargets.end());
+  Opts.IncludeSystemHeaders = DependenciesIncludeSystemHeaders;
+  Opts.UsePhonyTargets = PhonyDependencyTarget;
+}
+
 void clang::InitializeDiagnosticOptions(DiagnosticOptions &Opts) {
   using namespace diagnosticoptions;
 
index 88acb4263a5bc7410d244a55b9b1c688c0b9395c..6275e77e9752a06743619a0ab72c211cc7ad8e02 100644 (file)
@@ -16,6 +16,7 @@ namespace clang {
 
 class AnalyzerOptions;
 class CompileOptions;
+class DependencyOutputOptions;
 class DiagnosticOptions;
 class HeaderSearchOptions;
 class LangOptions;
@@ -40,6 +41,8 @@ enum LangKind {
 
 void InitializeAnalyzerOptions(AnalyzerOptions &Opts);
 
+void InitializeDependencyOutputOptions(DependencyOutputOptions &Opts);
+
 void InitializeDiagnosticOptions(DiagnosticOptions &Opts);
 
 void InitializeCompileOptions(CompileOptions &Opts,
index e55deb51c980e6e3cd5f606e926e03078e02834c..85a11923e12fc2e5ad949cd884636cf00ca06491 100644 (file)
@@ -32,6 +32,7 @@
 #include "clang/Frontend/ChainedDiagnosticClient.h"
 #include "clang/Frontend/CommandLineSourceLoc.h"
 #include "clang/Frontend/CompilerInvocation.h"
+#include "clang/Frontend/DependencyOutputOptions.h"
 #include "clang/Frontend/FixItRewriter.h"
 #include "clang/Frontend/FrontendDiagnostic.h"
 #include "clang/Frontend/PCHReader.h"
@@ -454,27 +455,6 @@ static llvm::cl::opt<bool> OptPedantic("pedantic");
 static llvm::cl::opt<bool> OptPedanticErrors("pedantic-errors");
 static llvm::cl::opt<bool> OptNoWarnings("w");
 
-//===----------------------------------------------------------------------===//
-// 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"));
-
-static llvm::cl::opt<bool>
-PhonyDependencyTarget("MP",
-            llvm::cl::desc("Create phony target for each dependency "
-                           "(other than main file)"));
-
 //===----------------------------------------------------------------------===//
 // -dump-build-information Stuff
 //===----------------------------------------------------------------------===//
@@ -646,8 +626,7 @@ static ASTConsumer *CreateConsumerAction(const CompilerInvocation &CompOpts,
 ///
 static void ProcessInputFile(const CompilerInvocation &CompOpts,
                              Preprocessor &PP, const std::string &InFile,
-                             ProgActions PA,
-                             llvm::LLVMContext& Context) {
+                             ProgActions PA, llvm::LLVMContext& Context) {
   llvm::OwningPtr<llvm::raw_ostream> OS;
   llvm::OwningPtr<ASTConsumer> Consumer;
   bool ClearSourceMgr = false;
@@ -1085,6 +1064,9 @@ static void ConstructCompilerInvocation(CompilerInvocation &Opts,
     InitializeLangOptions(Opts.getLangOpts(), LK, Target,
                           Opts.getCompileOpts());
 
+  // Initialize the dependency output options (-M...).
+  InitializeDependencyOutputOptions(Opts.getDependencyOutputOpts());
+
   // Initialize the header search options.
   InitializeHeaderSearchOptions(Opts.getHeaderSearchOpts(),
                                 GetBuiltinIncludePath(Argv0),
@@ -1229,23 +1211,8 @@ int main(int argc, char **argv) {
                             HeaderInfo));
 
     // Handle generating dependencies, if requested.
-    if (!DependencyFile.empty()) {
-      if (DependencyTargets.empty()) {
-        Diags.Report(diag::err_fe_dependency_file_requires_MT);
-        continue;
-      }
-      std::string ErrStr;
-      llvm::raw_ostream *DependencyOS =
-          new llvm::raw_fd_ostream(DependencyFile.c_str(), ErrStr);
-      if (!ErrStr.empty()) {
-        Diags.Report(diag::err_fe_error_opening) << DependencyFile << ErrStr;
-        continue;
-      }
-
-      AttachDependencyFileGen(PP.get(), DependencyOS, DependencyTargets,
-                              DependenciesIncludeSystemHeaders,
-                              PhonyDependencyTarget);
-    }
+    if (!CompOpts.getDependencyOutputOpts().OutputFile.empty())
+      AttachDependencyFileGen(PP.get(), CompOpts.getDependencyOutputOpts());
 
     if (CompOpts.getPreprocessorOpts().getImplicitPCHInclude().empty()) {
       if (InitializeSourceManager(*PP.get(), InFile))