Add DependencyOutputOptions to wrap -M... options, and propogate to
CompilerInvocation and clang-cc. llvm-svn: 86880
This commit is contained in:
parent
fd84d6d808
commit
89d1fdff65
|
@ -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; }
|
||||
|
||||
|
|
|
@ -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
|
|
@ -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() {
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -12,12 +12,14 @@
|
|||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#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
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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))
|
||||
|
|
Loading…
Reference in New Issue