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