sammccall created this revision. Herald added a subscriber: ilya-biryukov. This is an alternative to JSONCompilationDatabase for simple projects that don't use a build system such as CMake. (You can also drop one in ~, to make your tools use e.g. C++11 by default)
There's no facility for varying flags per-source-file or per-machine. Possibly this could be accommodated backwards-compatibly using cpp, but even if not the simplicity seems worthwhile for the cases that are addressed. Tested with clangd, works great! (requires clangd restart) https://reviews.llvm.org/D39799 Files: docs/JSONCompilationDatabase.rst include/clang/Tooling/CompilationDatabase.h lib/Tooling/CompilationDatabase.cpp test/Tooling/fixed-database.cpp
Index: test/Tooling/fixed-database.cpp =================================================================== --- /dev/null +++ test/Tooling/fixed-database.cpp @@ -0,0 +1,8 @@ +// RUN: rm -rf %t +// RUN: mkdir %t +// RUN: echo "-Dklazz=class" > %t/compile_flags.txt +// RUN: cp "%s" "%t/test.cpp" +// RUN: clang-check "%t/test.cpp" 2>&1 +// RUN: not clang-check "%s" 2>&1 | FileCheck "%s" -check-prefix=NODB +// NODB: unknown type name 'klazz' +klazz F{}; Index: lib/Tooling/CompilationDatabase.cpp =================================================================== --- lib/Tooling/CompilationDatabase.cpp +++ lib/Tooling/CompilationDatabase.cpp @@ -26,6 +26,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 <sstream> @@ -306,6 +307,22 @@ new FixedCompilationDatabase(Directory, StrippedArgs)); } +std::unique_ptr<FixedCompilationDatabase> +FixedCompilationDatabase::loadFromFile(StringRef Path, std::string &ErrorMsg) { + ErrorMsg.clear(); + llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> File = + llvm::MemoryBuffer::getFile(Path); + if (std::error_code Result = File.getError()) { + ErrorMsg = "Error while opening fixed database: " + Result.message(); + return nullptr; + } + std::vector<std::string> Args{ + llvm::line_iterator(**File, /*SkipBlanks=*/true, /*CommentMarker=*/'#'), + llvm::line_iterator()}; + return std::unique_ptr<FixedCompilationDatabase>(new FixedCompilationDatabase( + llvm::sys::path::parent_path(Path), std::move(Args))); +} + FixedCompilationDatabase:: FixedCompilationDatabase(Twine Directory, ArrayRef<std::string> CommandLine) { std::vector<std::string> ToolCommandLine(1, "clang-tool"); @@ -334,6 +351,24 @@ return std::vector<CompileCommand>(); } +namespace { + +class FixedCompilationDatabasePlugin : public CompilationDatabasePlugin { + std::unique_ptr<CompilationDatabase> + loadFromDirectory(StringRef Directory, std::string &ErrorMessage) override { + SmallString<1024> DatabasePath(Directory); + llvm::sys::path::append(DatabasePath, "compile_flags.txt"); + return FixedCompilationDatabase::loadFromFile(DatabasePath, ErrorMessage); + } +}; + +// Register the JSONCompilationDatabasePlugin with the +// CompilationDatabasePluginRegistry using this statically initialized variable. +static CompilationDatabasePluginRegistry::Add<FixedCompilationDatabasePlugin> +X("fixed-compilation-database", "Reads plain-text flags file"); + +} // namespace + namespace clang { namespace tooling { Index: include/clang/Tooling/CompilationDatabase.h =================================================================== --- include/clang/Tooling/CompilationDatabase.h +++ 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<FixedCompilationDatabase> + loadFromFile(StringRef Path, std::string &ErrorMsg); + /// \brief Constructs a compilation data base from a specified directory /// and command line. FixedCompilationDatabase(Twine Directory, ArrayRef<std::string> CommandLine); Index: docs/JSONCompilationDatabase.rst =================================================================== --- docs/JSONCompilationDatabase.rst +++ 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.
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits