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