Index: cfe/trunk/docs/JSONCompilationDatabase.rst =================================================================== --- cfe/trunk/docs/JSONCompilationDatabase.rst +++ cfe/trunk/docs/JSONCompilationDatabase.rst @@ -91,3 +91,9 @@ the top of the build directory. Clang tools are pointed to the top of the build directory to detect the file and use the compilation database to parse C++ code in the source tree. + +Alternatives +============ +For simple projects, Clang tools also recognize a compile_flags.txt file. +This should contain one flag per line. The same flags will be used to compile +any file. Index: cfe/trunk/include/clang/Tooling/CompilationDatabase.h =================================================================== --- cfe/trunk/include/clang/Tooling/CompilationDatabase.h +++ cfe/trunk/include/clang/Tooling/CompilationDatabase.h @@ -182,6 +182,11 @@ int &Argc, const char *const *Argv, std::string &ErrorMsg, Twine Directory = "."); + /// Reads flags from the given file, one-per line. + /// Returns nullptr and sets ErrorMessage if we can't read the file. + static std::unique_ptr + loadFromFile(StringRef Path, std::string &ErrorMsg); + /// \brief Constructs a compilation data base from a specified directory /// and command line. FixedCompilationDatabase(Twine Directory, ArrayRef CommandLine); Index: cfe/trunk/lib/Tooling/CompilationDatabase.cpp =================================================================== --- cfe/trunk/lib/Tooling/CompilationDatabase.cpp +++ cfe/trunk/lib/Tooling/CompilationDatabase.cpp @@ -10,6 +10,9 @@ // This file contains implementations of the CompilationDatabase base class // and the FixedCompilationDatabase. // +// FIXME: Various functions that take a string &ErrorMessage should be upgraded +// to Expected. +// //===----------------------------------------------------------------------===// #include "clang/Tooling/CompilationDatabase.h" @@ -26,6 +29,7 @@ #include "llvm/ADT/SmallString.h" #include "llvm/Option/Arg.h" #include "llvm/Support/Host.h" +#include "llvm/Support/LineIterator.h" #include "llvm/Support/Path.h" #include "llvm/Support/raw_ostream.h" #include @@ -302,8 +306,22 @@ std::vector StrippedArgs; if (!stripPositionalArgs(CommandLine, StrippedArgs, ErrorMsg)) return nullptr; - return std::unique_ptr( - new FixedCompilationDatabase(Directory, StrippedArgs)); + return llvm::make_unique(Directory, StrippedArgs); +} + +std::unique_ptr +FixedCompilationDatabase::loadFromFile(StringRef Path, std::string &ErrorMsg) { + ErrorMsg.clear(); + llvm::ErrorOr> File = + llvm::MemoryBuffer::getFile(Path); + if (std::error_code Result = File.getError()) { + ErrorMsg = "Error while opening fixed database: " + Result.message(); + return nullptr; + } + std::vector Args{llvm::line_iterator(**File), + llvm::line_iterator()}; + return llvm::make_unique( + llvm::sys::path::parent_path(Path), std::move(Args)); } FixedCompilationDatabase:: @@ -334,6 +352,22 @@ return std::vector(); } +namespace { + +class FixedCompilationDatabasePlugin : public CompilationDatabasePlugin { + std::unique_ptr + loadFromDirectory(StringRef Directory, std::string &ErrorMessage) override { + SmallString<1024> DatabasePath(Directory); + llvm::sys::path::append(DatabasePath, "compile_flags.txt"); + return FixedCompilationDatabase::loadFromFile(DatabasePath, ErrorMessage); + } +}; + +static CompilationDatabasePluginRegistry::Add +X("fixed-compilation-database", "Reads plain-text flags file"); + +} // namespace + namespace clang { namespace tooling { Index: cfe/trunk/test/Tooling/Inputs/fixed-header.h =================================================================== --- cfe/trunk/test/Tooling/Inputs/fixed-header.h +++ cfe/trunk/test/Tooling/Inputs/fixed-header.h @@ -0,0 +1 @@ +#define SECRET_SYMBOL 1 Index: cfe/trunk/test/Tooling/fixed-database.cpp =================================================================== --- cfe/trunk/test/Tooling/fixed-database.cpp +++ cfe/trunk/test/Tooling/fixed-database.cpp @@ -0,0 +1,18 @@ +// RUN: rm -rf %t +// RUN: mkdir -p %t/Src +// RUN: cp "%s" "%t/Src/test.cpp" +// RUN: mkdir -p %t/Include +// RUN: cp "%S/Inputs/fixed-header.h" "%t/Include/" +// -I flag is relative to %t (where compile_flags is), not Src/. +// RUN: echo '-IInclude/' >> %t/compile_flags.txt +// RUN: echo "-Dklazz=class" >> %t/compile_flags.txt +// RUN: echo '-std=c++11' >> %t/compile_flags.txt +// RUN: clang-check "%t/Src/test.cpp" 2>&1 +// RUN: not clang-check "%s" 2>&1 | FileCheck "%s" -check-prefix=NODB + +// NODB: unknown type name 'klazz' +klazz F{}; + +// NODB: 'fixed-header.h' file not found +#include "fixed-header.h" +static_assert(SECRET_SYMBOL == 1, "");