1d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko//===--- CommonOptionsParser.cpp - common options for clang tools ---------===// 2dea8fba3c632745136017f3e8e9d9e0341d6feb9Alexander Kornienko// 3dea8fba3c632745136017f3e8e9d9e0341d6feb9Alexander Kornienko// The LLVM Compiler Infrastructure 4dea8fba3c632745136017f3e8e9d9e0341d6feb9Alexander Kornienko// 5dea8fba3c632745136017f3e8e9d9e0341d6feb9Alexander Kornienko// This file is distributed under the University of Illinois Open Source 6dea8fba3c632745136017f3e8e9d9e0341d6feb9Alexander Kornienko// License. See LICENSE.TXT for details. 7dea8fba3c632745136017f3e8e9d9e0341d6feb9Alexander Kornienko// 8dea8fba3c632745136017f3e8e9d9e0341d6feb9Alexander Kornienko//===----------------------------------------------------------------------===// 9dea8fba3c632745136017f3e8e9d9e0341d6feb9Alexander Kornienko// 10d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko// This file implements the CommonOptionsParser class used to parse common 11d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko// command-line options for clang tools, so that they can be run as separate 12d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko// command-line applications with a consistent common interface for handling 13d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko// compilation database and input files. 14dea8fba3c632745136017f3e8e9d9e0341d6feb9Alexander Kornienko// 15dea8fba3c632745136017f3e8e9d9e0341d6feb9Alexander Kornienko// It provides a common subset of command-line options, common algorithm 16dea8fba3c632745136017f3e8e9d9e0341d6feb9Alexander Kornienko// for locating a compilation database and source files, and help messages 17dea8fba3c632745136017f3e8e9d9e0341d6feb9Alexander Kornienko// for the basic command-line interface. 18dea8fba3c632745136017f3e8e9d9e0341d6feb9Alexander Kornienko// 19d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko// It creates a CompilationDatabase and reads common command-line options. 20d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko// 21d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko// This class uses the Clang Tooling infrastructure, see 22d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko// http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html 23d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko// for details on setting it up with LLVM source tree. 24dea8fba3c632745136017f3e8e9d9e0341d6feb9Alexander Kornienko// 25dea8fba3c632745136017f3e8e9d9e0341d6feb9Alexander Kornienko//===----------------------------------------------------------------------===// 26dea8fba3c632745136017f3e8e9d9e0341d6feb9Alexander Kornienko 27d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko#include "llvm/Support/CommandLine.h" 28d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko#include "clang/Tooling/CommonOptionsParser.h" 29dea8fba3c632745136017f3e8e9d9e0341d6feb9Alexander Kornienko#include "clang/Tooling/Tooling.h" 30dea8fba3c632745136017f3e8e9d9e0341d6feb9Alexander Kornienko 31dea8fba3c632745136017f3e8e9d9e0341d6feb9Alexander Kornienkousing namespace clang::tooling; 32dea8fba3c632745136017f3e8e9d9e0341d6feb9Alexander Kornienkousing namespace llvm; 33dea8fba3c632745136017f3e8e9d9e0341d6feb9Alexander Kornienko 346fbe982bb487931feb3f1ceb9eec8f7f1961393aAlexander Kornienkoconst char *const CommonOptionsParser::HelpMessage = 35dea8fba3c632745136017f3e8e9d9e0341d6feb9Alexander Kornienko "\n" 36dea8fba3c632745136017f3e8e9d9e0341d6feb9Alexander Kornienko "-p <build-path> is used to read a compile command database.\n" 37dea8fba3c632745136017f3e8e9d9e0341d6feb9Alexander Kornienko "\n" 38dea8fba3c632745136017f3e8e9d9e0341d6feb9Alexander Kornienko "\tFor example, it can be a CMake build directory in which a file named\n" 39dea8fba3c632745136017f3e8e9d9e0341d6feb9Alexander Kornienko "\tcompile_commands.json exists (use -DCMAKE_EXPORT_COMPILE_COMMANDS=ON\n" 40dea8fba3c632745136017f3e8e9d9e0341d6feb9Alexander Kornienko "\tCMake option to get this output). When no build path is specified,\n" 41b1f67dbbb12dec8304434c76c72e01336bf186e4Edwin Vane "\ta search for compile_commands.json will be attempted through all\n" 42b1f67dbbb12dec8304434c76c72e01336bf186e4Edwin Vane "\tparent paths of the first input file . See:\n" 43dea8fba3c632745136017f3e8e9d9e0341d6feb9Alexander Kornienko "\thttp://clang.llvm.org/docs/HowToSetupToolingForLLVM.html for an\n" 44dea8fba3c632745136017f3e8e9d9e0341d6feb9Alexander Kornienko "\texample of setting up Clang Tooling on a source tree.\n" 45dea8fba3c632745136017f3e8e9d9e0341d6feb9Alexander Kornienko "\n" 46d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko "<source0> ... specify the paths of source files. These paths are\n" 47d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko "\tlooked up in the compile command database. If the path of a file is\n" 48d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko "\tabsolute, it needs to point into CMake's source tree. If the path is\n" 49d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko "\trelative, the current working directory needs to be in the CMake\n" 50d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko "\tsource tree and the file must be in a subdirectory of the current\n" 51d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko "\tworking directory. \"./\" prefixes in the relative files will be\n" 52d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko "\tautomatically removed, but the rest of a relative path must be a\n" 53d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko "\tsuffix of a path in the compile command database.\n" 54dea8fba3c632745136017f3e8e9d9e0341d6feb9Alexander Kornienko "\n"; 55dea8fba3c632745136017f3e8e9d9e0341d6feb9Alexander Kornienko 568b1f2f9d36faf28028d232c3a5943c433d63c0e7Manuel KlimekCommonOptionsParser::CommonOptionsParser(int &argc, const char **argv, 57651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines cl::OptionCategory &Category, 588b1f2f9d36faf28028d232c3a5943c433d63c0e7Manuel Klimek const char *Overview) { 59651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines static cl::opt<bool> Help("h", cl::desc("Alias for -help"), cl::Hidden); 60651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 61651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines static cl::opt<std::string> BuildPath("p", cl::desc("Build path"), 62651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines cl::Optional, cl::cat(Category)); 63d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko 64ffb155f4f8c756c3ca13f9517492d6780c4f46a6Alexander Kornienko static cl::list<std::string> SourcePaths( 65651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines cl::Positional, cl::desc("<source0> [... <sourceN>]"), cl::OneOrMore, 66651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines cl::cat(Category)); 67651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 68651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Hide unrelated options. 69651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines StringMap<cl::Option*> Options; 70651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines cl::getRegisteredOptions(Options); 71651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (StringMap<cl::Option *>::iterator I = Options.begin(), E = Options.end(); 72651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines I != E; ++I) { 73651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (I->second->Category != &Category && I->first() != "help" && 74651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines I->first() != "version") 75651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines I->second->setHiddenFlag(cl::ReallyHidden); 76651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 77dea8fba3c632745136017f3e8e9d9e0341d6feb9Alexander Kornienko 78d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko Compilations.reset(FixedCompilationDatabase::loadFromCommandLine(argc, 79d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko argv)); 808b1f2f9d36faf28028d232c3a5943c433d63c0e7Manuel Klimek cl::ParseCommandLineOptions(argc, argv, Overview); 81d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko SourcePathList = SourcePaths; 82dea8fba3c632745136017f3e8e9d9e0341d6feb9Alexander Kornienko if (!Compilations) { 83dea8fba3c632745136017f3e8e9d9e0341d6feb9Alexander Kornienko std::string ErrorMessage; 84dea8fba3c632745136017f3e8e9d9e0341d6feb9Alexander Kornienko if (!BuildPath.empty()) { 85dea8fba3c632745136017f3e8e9d9e0341d6feb9Alexander Kornienko Compilations.reset(CompilationDatabase::autoDetectFromDirectory( 86dea8fba3c632745136017f3e8e9d9e0341d6feb9Alexander Kornienko BuildPath, ErrorMessage)); 87dea8fba3c632745136017f3e8e9d9e0341d6feb9Alexander Kornienko } else { 88dea8fba3c632745136017f3e8e9d9e0341d6feb9Alexander Kornienko Compilations.reset(CompilationDatabase::autoDetectFromSource( 89dea8fba3c632745136017f3e8e9d9e0341d6feb9Alexander Kornienko SourcePaths[0], ErrorMessage)); 90dea8fba3c632745136017f3e8e9d9e0341d6feb9Alexander Kornienko } 91dea8fba3c632745136017f3e8e9d9e0341d6feb9Alexander Kornienko if (!Compilations) 92dea8fba3c632745136017f3e8e9d9e0341d6feb9Alexander Kornienko llvm::report_fatal_error(ErrorMessage); 93dea8fba3c632745136017f3e8e9d9e0341d6feb9Alexander Kornienko } 94dea8fba3c632745136017f3e8e9d9e0341d6feb9Alexander Kornienko} 95