PreferenceOptions.cpp revision a790f0a8f3175183bea088389b3e4ae41813e192
1//===- PreferenceOptions.cpp ----------------------------------------------===//
2//
3//                     The MCLinker Project
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9#include <mcld/PreferenceOptions.h>
10#include <mcld/LinkerConfig.h>
11#include <mcld/Support/CommandLine.h>
12#include <mcld/Support/raw_ostream.h>
13#include <llvm/Support/Process.h>
14
15#if defined(HAVE_UNISTD_H)
16# include <unistd.h>
17#endif
18
19#if defined(_MSC_VER) || defined(__MINGW32__)
20#include <io.h>
21#ifndef STDIN_FILENO
22# define STDIN_FILENO 0
23#endif
24#ifndef STDOUT_FILENO
25# define STDOUT_FILENO 1
26#endif
27#ifndef STDERR_FILENO
28# define STDERR_FILENO 2
29#endif
30#endif
31
32namespace {
33
34llvm::cl::opt<bool> ArgTrace("t",
35  llvm::cl::desc("Print the names of the input files as ld processes them."));
36
37llvm::cl::alias ArgTraceAlias("trace",
38  llvm::cl::desc("alias for -t"),
39  llvm::cl::aliasopt(ArgTrace));
40
41llvm::cl::opt<int> ArgVerbose("verbose",
42  llvm::cl::init(-1),
43  llvm::cl::desc("Display the version number for ld and list the\n"
44                 "linker emulations supported."));
45
46llvm::cl::opt<bool> ArgVersion("V",
47  llvm::cl::init(false),
48  llvm::cl::desc("Display the version number for MCLinker."));
49
50llvm::cl::opt<int> ArgMaxErrorNum("error-limit",
51  llvm::cl::init(-1),
52  llvm::cl::desc("limits the maximum number of erros."));
53
54llvm::cl::opt<int> ArgMaxWarnNum("warning-limit",
55  llvm::cl::init(-1),
56  llvm::cl::desc("limits the maximum number of warnings."));
57
58llvm::cl::opt<mcld::PreferenceOptions::Color> ArgColor("color",
59  llvm::cl::value_desc("When"),
60  llvm::cl::desc("Surround the result strings with the marker"),
61  llvm::cl::init(mcld::PreferenceOptions::COLOR_Auto),
62  llvm::cl::values(
63    clEnumValN(mcld::PreferenceOptions::COLOR_Never, "never",
64      "do not surround result"),
65    clEnumValN(mcld::PreferenceOptions::COLOR_Always, "always",
66      "always surround results, even the output is a plain file"),
67    clEnumValN(mcld::PreferenceOptions::COLOR_Auto, "auto",
68      "surround result strings only if the output is a tty"),
69    clEnumValEnd));
70
71llvm::cl::opt<bool> ArgPrintMap("M",
72  llvm::cl::desc("Print a link map to the standard output."),
73  llvm::cl::init(false));
74
75llvm::cl::alias ArgPrintMapAlias("print-map",
76  llvm::cl::desc("alias for -M"),
77  llvm::cl::aliasopt(ArgPrintMap));
78
79bool ArgFatalWarnings;
80
81llvm::cl::opt<bool, true, llvm::cl::FalseParser> ArgNoFatalWarnings("no-fatal-warnings",
82  llvm::cl::location(ArgFatalWarnings),
83  llvm::cl::desc("do not turn warnings into errors"),
84  llvm::cl::init(false),
85  llvm::cl::ValueDisallowed);
86
87llvm::cl::opt<bool, true> ArgFatalWarningsFlag("fatal-warnings",
88  llvm::cl::ZeroOrMore,
89  llvm::cl::location(ArgFatalWarnings),
90  llvm::cl::desc("turn all warnings into errors"),
91  llvm::cl::init(false),
92  llvm::cl::ValueDisallowed);
93
94llvm::cl::opt<std::string> ArgUseLD("fuse-ld",
95  llvm::cl::desc("Ignored for GCC/collect2 linker compatibility."),
96  llvm::cl::init("mcld"));
97
98llvm::cl::opt<std::string> ArgUseMCLD("use-mcld",
99  llvm::cl::desc("Ignored for GCC/collect2 linker compatibility."),
100  llvm::cl::init("mcld"));
101
102//===----------------------------------------------------------------------===//
103// Non-member functions
104//===----------------------------------------------------------------------===//
105inline bool ShouldColorize()
106{
107   const char* term = getenv("TERM");
108   return term && (0 != strcmp(term, "dumb"));
109}
110
111} // anonymous namespace
112
113using namespace mcld;
114
115//===----------------------------------------------------------------------===//
116// PreferenceOptions
117//===----------------------------------------------------------------------===//
118PreferenceOptions::PreferenceOptions()
119  : m_Trace(ArgTrace),
120    m_Verbose(ArgVerbose),
121    m_Version(ArgVersion),
122    m_MaxErrorNum(ArgMaxErrorNum),
123    m_MaxWarnNum(ArgMaxWarnNum),
124    m_Color(ArgColor),
125    m_PrintMap(ArgPrintMap),
126    m_FatalWarnings(ArgFatalWarnings) {
127}
128
129bool PreferenceOptions::parse(LinkerConfig& pConfig)
130{
131  // set -t
132  pConfig.options().setTrace(m_Trace);
133
134  // set --verbose
135  pConfig.options().setVerbose(m_Verbose);
136
137  // set --error-limit [number]
138  pConfig.options().setMaxErrorNum(m_MaxErrorNum);
139
140  // set --warning-limit [number]
141  pConfig.options().setMaxWarnNum(m_MaxWarnNum);
142
143  // set --color [mode]
144  switch (m_Color) {
145    case COLOR_Never:
146      pConfig.options().setColor(false);
147    break;
148    case COLOR_Always:
149      pConfig.options().setColor(true);
150    break;
151    case COLOR_Auto:
152      bool color_option = ShouldColorize() &&
153                 llvm::sys::Process::FileDescriptorIsDisplayed(STDOUT_FILENO);
154      pConfig.options().setColor(color_option);
155    break;
156  }
157
158  mcld::outs().setColor(pConfig.options().color());
159  mcld::errs().setColor(pConfig.options().color());
160
161  return true;
162}
163
164