CommonCompilerOptions.cs
上传用户:huiyue
上传日期:2022-04-08
资源大小:1429k
文件大小:24k
源码类别:

搜索引擎

开发平台:

ASP/ASPX

  1. //
  2. // CommonCompilerOptions.cs
  3. //
  4. // Author: Rafael Teixeira (rafaelteixeirabr@hotmail.com)
  5. //
  6. // (C) 2005 Rafael Teixeira
  7. //
  8. //
  9. // Permission is hereby granted, free of charge, to any person obtaining
  10. // a copy of this software and associated documentation files (the
  11. // "Software"), to deal in the Software without restriction, including
  12. // without limitation the rights to use, copy, modify, merge, publish,
  13. // distribute, sublicense, and/or sell copies of the Software, and to
  14. // permit persons to whom the Software is furnished to do so, subject to
  15. // the following conditions:
  16. // 
  17. // The above copyright notice and this permission notice shall be
  18. // included in all copies or substantial portions of the Software.
  19. // 
  20. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  21. // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  22. // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  23. // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
  24. // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
  25. // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
  26. // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  27. //
  28. using System;
  29. using System.Collections;
  30. using System.IO;
  31. using System.Diagnostics;
  32. using System.Reflection;
  33. using System.Reflection.Emit;
  34. using System.Text;
  35. namespace Mono.GetOptions.Useful
  36. {
  37. public enum TargetType {
  38. Library, Exe, Module, WinExe
  39. };
  40. public struct FileToCompile {
  41. public string Filename;
  42. public Encoding Encoding;
  43. public FileToCompile(string filename, Encoding encoding)
  44. {
  45. this.Filename = filename;
  46. this.Encoding = encoding;
  47. }
  48. }
  49. public enum InternalCompilerErrorReportAction { 
  50. prompt, send, none 
  51. }
  52. public delegate void ModuleAdder (System.Reflection.Module module);
  53. public delegate void AssemblyAdder (Assembly loadedAssembly);
  54. public class CommonCompilerOptions : Options {
  55. public CommonCompilerOptions() : this(null, null) { }
  56. public CommonCompilerOptions(string[] args) : this(args, null) {}
  57. public CommonCompilerOptions(string[] args, ErrorReporter reportError) : base(args, OptionsParsingMode.Both, false, true, true, reportError) 
  58. {
  59. PathsToSearchForLibraries.Add (Directory.GetCurrentDirectory ());
  60. }
  61. [Option(-1, "References packages listed. {packagelist}=package,...", "pkg")]
  62. public WhatToDoNext ReferenceSomePackage(string packageName)
  63. {
  64. return ReferencePackage(packageName)?WhatToDoNext.GoAhead:WhatToDoNext.AbandonProgram;
  65. }
  66. private Encoding currentEncoding = null;
  67. [Option(-1, "Select codepage by {ID} (number, 'utf8' or 'reset') to process following source files", "codepage")]
  68. public string CurrentCodepage {
  69. set {
  70. switch (value.ToLower()) {
  71. case "reset": 
  72. currentEncoding = null; 
  73. break;
  74. case "utf8": case "utf-8":
  75. currentEncoding = Encoding.UTF8;
  76. break;
  77. default:
  78. try {
  79. currentEncoding = Encoding.GetEncoding(int.Parse(value));
  80. } catch (NotSupportedException) {
  81. ReportError (0, string.Format("Ignoring unsupported codepage number {0}.", value));
  82. } catch (Exception) {
  83. ReportError (0, string.Format("Ignoring unsupported codepage ID {0}.", value));
  84. }
  85. break;
  86. }
  87. }
  88. }
  89. private ArrayList warningsToIgnore = new ArrayList();
  90. public int[] WarningsToIgnore { get { return (int[])warningsToIgnore.ToArray(typeof(int)); } }
  91. [Option(-1, "Ignores warning number {XXXX}", "ignorewarn", SecondLevelHelp = true)]
  92. public WhatToDoNext SetIgnoreWarning(int warningNumber)
  93. {
  94. warningsToIgnore.Add(warningNumber);
  95. return WhatToDoNext.GoAhead;
  96. }
  97. [Option("Sets warning {level} (the highest is 4, the default)", "wlevel", SecondLevelHelp = true)]
  98. public int WarningLevel = 4; 
  99. // Output file options
  100. //------------------------------------------------------------------
  101. public TargetType TargetFileType = TargetType.Exe;
  102. string outputFileName = null;
  103. string firstSourceFile = null;
  104. string targetFileExtension = ".exe";
  105. [Option("Specifies the output {file} name", 'o', "out")]
  106. public string OutputFileName 
  107. {
  108. set { outputFileName = value; }
  109. get 
  110. {
  111. if (outputFileName == null) {
  112. int pos = firstSourceFile.LastIndexOf(".");
  113. if (pos > 0)
  114. outputFileName = firstSourceFile.Substring(0, pos);
  115. else
  116. outputFileName = firstSourceFile;
  117. // TODO: what Codegen does here to get hid of this dependency
  118. // string bname = CodeGen.Basename(outputFileName);
  119. // if (bname.IndexOf(".") == -1)
  120. outputFileName +=  targetFileExtension;
  121. }
  122. return outputFileName;
  123. }
  124. }
  125. [Option("Specifies the target {type} for the output file (exe [default], winexe, library, module)", 't', "target")]
  126. public WhatToDoNext SetTarget(string type)
  127. {
  128. switch (type.ToLower()) {
  129. case "library":
  130. TargetFileType = TargetType.Library;
  131. targetFileExtension = ".dll";
  132. break;
  133. case "exe":
  134. TargetFileType = TargetType.Exe;
  135. targetFileExtension = ".exe";
  136. break;
  137. case "winexe":
  138. TargetFileType = TargetType.WinExe;
  139. targetFileExtension = ".exe";
  140. break;
  141. case "module":
  142. TargetFileType = TargetType.Module;
  143. targetFileExtension = ".netmodule";
  144. break;
  145. }
  146. return WhatToDoNext.GoAhead;
  147. }
  148. [Option("Specifies the {name} of the Class or Module that contains Sub Main tor inherits from System.Windows.Forms.Form.tNeeded to select among many entry-points for a program (target=exe|winexe)",
  149. 'm', "main")]
  150. public string MainClassName = null; 
  151. // TODO: force option to accept number in hex format
  152. // [Option("[NOT IMPLEMENTED YET]The base {address} for a library or module (hex)", SecondLevelHelp = true)]
  153. public int baseaddress;
  154. // input file options
  155. //------------------------------------------------------------------
  156. [Option(-1, "Imports all type information from files in the module-list. {module-list}:module,...", "addmodule")]
  157. public string AddedModule { set { foreach(string module in value.Split(',')) NetModulesToAdd.Add(module); } }
  158. // [Option("[NOT IMPLEMENTED YET]Include all files in the current directory and subdirectories according to the {wildcard}", "recurse")]
  159. public WhatToDoNext Recurse(string wildcard)
  160. {
  161. //AddFiles (DirName, true); // TODO wrong semantics
  162. return WhatToDoNext.GoAhead;
  163. }
  164. [Option(-1, "References metadata from the specified assembly-list. {assembly-list}:assembly,...", 'r', "reference")]
  165. public string AddedReference { set { foreach (string assembly in value.Split(',')) AssembliesToReference.Add(assembly); } }
  166. [Option("List of directories to search for referenced assemblies. t{path-list}:path,...", "libpath", "lib")]
  167. public string AddedLibPath { set { foreach(string path in value.Split(',')) PathsToSearchForLibraries.Add(path); } }
  168. // support for the Compact Framework
  169. //------------------------------------------------------------------
  170. // [Option("[NOT IMPLEMENTED YET]Sets the compiler to TargetFileType the Compact Framework", "netcf")]
  171. public bool CompileForCompactFramework = false;
  172. // [Option("[NOT IMPLEMENTED YET]Specifies the {path} to the location of mscorlib.dll and microsoft.visualbasic.dll", "sdkpath")]
  173. public string SDKPath = null;
  174. // resource options
  175. //------------------------------------------------------------------
  176. public ArrayList EmbeddedResources = new ArrayList();
  177. //TODO: support -res:file[,id[,public|private]] what depends on changes at Mono.GetOptions
  178. [Option(-1, "Adds the specified file as an embedded assembly resource. t{details}:file[,id[,public|private]]", "resource", "res")]
  179. public string AddedResource { set { EmbeddedResources.Add(value); } }
  180. public ArrayList LinkedResources = new ArrayList();
  181. [Option(-1, "Adds the specified file as a linked assembly resource. t{details}:file[,id[,public|private]]", "linkresource", "linkres")]
  182. public string AddedLinkresource { set { LinkedResources.Add(value); } }
  183. public ArrayList Win32Resources = new ArrayList();
  184. // [Option(-1, "[NOT IMPLEMENTED YET]Specifies a Win32 resource {file} (.res)", "win32resource")]
  185. public string AddedWin32resource { set { Win32Resources.Add(value); } }
  186. public ArrayList Win32Icons = new ArrayList();
  187. // [Option(-1, "[NOT IMPLEMENTED YET]Specifies a Win32 icon {file} (.ico) for the default Win32 resources", "win32icon")]
  188. public string AddedWin32icon { set { Win32Icons.Add(value); } }
  189. // code generation options
  190. //------------------------------------------------------------------
  191. // [Option("[NOT IMPLEMENTED YET]Enable optimizations", "optimize", VBCStyleBoolean = true)]
  192. public bool Optimize = false;
  193. public bool CheckedContext = true;
  194. [Option("Remove integer checks. Default off.", SecondLevelHelp = true, VBCStyleBoolean = true)]
  195. public virtual bool removeintchecks { set { CheckedContext = !value; } }
  196. [Option("Emit full debugging information", 'g', "debug", VBCStyleBoolean = true)]
  197. public bool WantDebuggingSupport = false;
  198. [Option("Emit full debugging information (default)", "debug:full", SecondLevelHelp = true)]
  199. public bool debugfull { 
  200. set { 
  201. WantDebuggingSupport = value; 
  202. FullDebugging = value; 
  203. MdbOnly = !value; 
  204. }
  205. }
  206. [Option("Emit MDB file only", "debug:pdbonly", SecondLevelHelp = true)]
  207. public bool debugpdbonly {
  208. set { 
  209. WantDebuggingSupport = value; 
  210. FullDebugging = !value; 
  211. MdbOnly = value; 
  212. }
  213. }
  214. public bool MdbOnly = false;
  215. public bool FullDebugging = true;
  216. // errors and warnings options
  217. //------------------------------------------------------------------
  218. [Option("Treat warnings as errors", "warnaserror", SecondLevelHelp = true)]
  219. public bool WarningsAreErrors = false; 
  220. [Option("Disable warnings", "nowarn", SecondLevelHelp = true)]
  221. public bool NoWarnings { set { if (value) WarningLevel = 0; } }
  222. // Defines
  223. //------------------------------------------------------------------
  224. public Hashtable Defines = new Hashtable();
  225. [Option(-1, "Declares global conditional compilation symbol(s). {symbol-list}:name=value,...", 'd', "define")]
  226. public string DefineSymbol { 
  227. set {
  228. foreach(string item in value.Split(','))  {
  229. string[] dados = item.Split('=');
  230. if (dados.Length > 1)
  231. Defines.Add(dados[0], dados[1]); 
  232. else
  233. Defines.Add(dados[0], "true");
  234. }
  235. }
  236. [Option("Don't assume the standard library", "nostdlib", SecondLevelHelp = true)]
  237. public bool NoStandardLibraries = false;
  238. [Option("Disables implicit references to assemblies", "noconfig", SecondLevelHelp = true)]
  239. public bool NoConfig = false;
  240. [Option("Allows unsafe code", "unsafe", SecondLevelHelp = true)]
  241. public bool AllowUnsafeCode = false;
  242. [Option("Debugger {arguments}", "debug-args", SecondLevelHelp = true)]
  243. public WhatToDoNext SetDebugArgs(string args)
  244. {
  245. DebugListOfArguments.AddRange(args.Split(','));
  246. return WhatToDoNext.GoAhead;
  247. }
  248. public ArrayList Imports = new ArrayList();
  249. [Option(-1, "Declare global Imports for listed namespaces. {import-list}:namespace,...", "imports")]
  250. public string ImportNamespaces
  251. {
  252. set {
  253. foreach(string importedNamespace in value.Split(','))
  254. Imports.Add(importedNamespace);
  255. }
  256. }
  257. [Option("Specifies the root {namespace} for all type declarations", "rootnamespace",  SecondLevelHelp = true)]
  258. public string RootNamespace = null;
  259. // Signing options
  260. //------------------------------------------------------------------
  261. // [Option("[NOT IMPLEMENTED YET]Delay-sign the assembly using only the public portion of the strong name key", VBCStyleBoolean = true)]
  262. public bool delaysign;
  263. // [Option("[NOT IMPLEMENTED YET]Specifies a strong name key {container}")]
  264. public string keycontainer;
  265. // [Option("[NOT IMPLEMENTED YET]Specifies a strong name key {file}")]
  266. public string keyfile;
  267. // Compiler output options
  268. //------------------------------------------------------------------
  269. [Option("Do not display compiler copyright banner", "nologo")]
  270. public bool DontShowBanner = false;
  271. //TODO: Correct semantics
  272. [Option("Commands the compiler to show only error messages for syntax-related errors and warnings", 'q', "quiet", SecondLevelHelp = true)]
  273. public bool SuccintErrorDisplay = false;
  274. [Option("Display verbose messages", 'v', "verbose",  SecondLevelHelp = true)] 
  275. public bool Verbose = false;
  276. [Option("[IGNORED] Emit compiler output in UTF8 character encoding", "utf8output", SecondLevelHelp = true, VBCStyleBoolean = true)]
  277. public bool OutputInUTF8;
  278. // [Option("[NOT IMPLEMENTED YET]Create bug report {file}", "bugreport")]
  279. public string CreateBugReport;
  280. Hashtable sourceFiles = new Hashtable ();
  281. public override void DefaultArgumentProcessor(string fileName)
  282. {
  283. if (firstSourceFile == null)
  284. firstSourceFile = fileName;
  285. if (!sourceFiles.Contains(fileName)) {
  286. SourceFilesToCompile.Add(new FileToCompile(fileName, currentEncoding));
  287. sourceFiles.Add(fileName, fileName);
  288. }
  289. base.DefaultArgumentProcessor(fileName);
  290. }
  291. public ArrayList AssembliesToReference = new ArrayList();
  292. public ArrayList NetModulesToAdd = new ArrayList();
  293. public ArrayList PathsToSearchForLibraries = new ArrayList();
  294. public ArrayList DebugListOfArguments = new ArrayList ();
  295. public ArrayList SourceFilesToCompile = new ArrayList();
  296. public bool ReferencePackage(string packageName)
  297. {
  298. if (packageName == ""){
  299. DoAbout ();
  300. return false;
  301. }
  302. ProcessStartInfo pi = new ProcessStartInfo ();
  303. pi.FileName = "pkg-config";
  304. pi.RedirectStandardOutput = true;
  305. pi.UseShellExecute = false;
  306. pi.Arguments = "--libs " + packageName;
  307. Process p = null;
  308. try {
  309. p = Process.Start (pi);
  310. } catch (Exception e) {
  311. ReportError (0, "Couldn't run pkg-config: " + e.Message);
  312. return false;
  313. }
  314. if (p.StandardOutput == null){
  315. ReportError (0, "Specified package did not return any information");
  316. }
  317. string pkgout = p.StandardOutput.ReadToEnd ();
  318. p.WaitForExit ();
  319. if (p.ExitCode != 0) {
  320. ReportError (0, "Error running pkg-config. Check the above output.");
  321. return false;
  322. }
  323. p.Close ();
  324. if (pkgout != null) {
  325. string [] xargs = pkgout.Trim (new Char [] {' ', 'n', 'r', 't'}).
  326. Split (new Char [] { ' ', 't'});
  327. foreach(string arg in xargs) {
  328. string[] zargs = arg.Split(':', '=');
  329. try {
  330. if (zargs.Length > 1)
  331. AddedReference = zargs[1];
  332. else
  333. AddedReference = arg;
  334. } catch (Exception e) {
  335. ReportError (0, "Something wrong with argument (" + arg + ") in 'pkg-config --libs' output: " + e.Message);
  336. return false;
  337. }
  338. }
  339. }
  340. return true;
  341. }
  342. private bool printTimeStamps = false;
  343. //
  344. // Last time we took the time
  345. //
  346. DateTime last_time;
  347. public void StartTime (string msg)
  348. {
  349. if (!printTimeStamps)
  350. return;
  351. last_time = DateTime.Now;
  352. Console.WriteLine("[*] {0}", msg);
  353. }
  354. public void ShowTime (string msg)
  355. {
  356. if (!printTimeStamps)
  357. return;
  358. DateTime now = DateTime.Now;
  359. TimeSpan span = now - last_time;
  360. last_time = now;
  361. Console.WriteLine (
  362. "[{0:00}:{1:000}] {2}",
  363. (int) span.TotalSeconds, span.Milliseconds, msg);
  364. }
  365. [Option("Displays time stamps of various compiler events", "timestamp", SecondLevelHelp = true)]
  366. public virtual bool PrintTimeStamps {
  367. set
  368. {
  369. printTimeStamps = true;
  370. last_time = DateTime.Now;
  371. DebugListOfArguments.Add("timestamp");
  372. }
  373. }
  374. public bool BeQuiet { get { return DontShowBanner || SuccintErrorDisplay; } } 
  375. private void LoadAssembly (AssemblyAdder adder, string assemblyName, ref int errors, bool soft)
  376. {
  377. Assembly a = null;
  378. string total_log = "";
  379. try  {
  380. char[] path_chars = { '/', '\' };
  381. if (assemblyName.IndexOfAny (path_chars) != -1)
  382. a = Assembly.LoadFrom(assemblyName);
  383. else {
  384. string ass = assemblyName;
  385. if (ass.EndsWith (".dll"))
  386. ass = assemblyName.Substring (0, assemblyName.Length - 4);
  387. a = Assembly.Load (ass);
  388. }
  389. adder(a);
  390. return;
  391. }
  392. catch (FileNotFoundException) {
  393. if (PathsToSearchForLibraries != null) {
  394. foreach (string dir in PathsToSearchForLibraries) {
  395. string full_path = Path.Combine(dir, assemblyName + ".dll");
  396. try  {
  397. a = Assembly.LoadFrom (full_path);
  398. adder(a);
  399. return;
  400. catch (FileNotFoundException ff)  {
  401. total_log += ff.FusionLog;
  402. continue;
  403. }
  404. }
  405. }
  406. if (soft)
  407. return;
  408. ReportError (6, "Can not find assembly '" + assemblyName + "'nLog: " + total_log);
  409. }
  410. catch (BadImageFormatException f)  {
  411. ReportError (6, "Bad file format while loading assemblynLog: " + f.FusionLog);
  412. } catch (FileLoadException f){
  413. ReportError (6, "File Load Exception: " + assemblyName + "nLog: " + f.FusionLog);
  414. } catch (ArgumentNullException){
  415. ReportError (6, "Argument Null exception");
  416. }
  417. errors++;
  418. }
  419. public virtual string [] AssembliesToReferenceSoftly {
  420. get {
  421. // For now the "default config" is hardcoded we can move this outside later
  422. return new string [] { "System", "System.Data", "System.Xml" };
  423. }
  424. }
  425. /// <summary>
  426. ///   Loads all assemblies referenced on the command line
  427. /// </summary>
  428. public bool LoadReferencedAssemblies (AssemblyAdder adder)
  429. {
  430. StartTime("Loading referenced assemblies");
  431. int errors = 0;
  432. int soft_errors = 0;
  433. // Load Core Library for default compilation
  434. if (!NoStandardLibraries)
  435. LoadAssembly(adder, "mscorlib", ref errors, false);
  436. foreach (string r in AssembliesToReference)
  437. LoadAssembly(adder, r, ref errors, false);
  438. if (!NoConfig)
  439. foreach (string r in AssembliesToReferenceSoftly)
  440. if (!(AssembliesToReference.Contains(r) || AssembliesToReference.Contains (r + ".dll")))
  441. LoadAssembly(adder, r, ref soft_errors, true);
  442. ShowTime("References loaded");
  443. return errors == 0;
  444. }
  445. private void LoadModule (MethodInfo adder_method, AssemblyBuilder assemblyBuilder, ModuleAdder adder, string module, ref int errors)
  446. {
  447. System.Reflection.Module m;
  448. string total_log = "";
  449. try {
  450. try {
  451. m = (System.Reflection.Module)adder_method.Invoke (assemblyBuilder, new object [] { module });
  452. }
  453. catch (TargetInvocationException ex) {
  454. throw ex.InnerException;
  455. }
  456. adder(m);
  457. catch (FileNotFoundException) {
  458. foreach (string dir in PathsToSearchForLibraries) {
  459. string full_path = Path.Combine (dir, module);
  460. if (!module.EndsWith (".netmodule"))
  461. full_path += ".netmodule";
  462. try {
  463. try {
  464. m = (System.Reflection.Module) adder_method.Invoke (assemblyBuilder, new object [] { full_path });
  465. }
  466. catch (TargetInvocationException ex) {
  467. throw ex.InnerException;
  468. }
  469. adder(m);
  470. return;
  471. }
  472. catch (FileNotFoundException ff) {
  473. total_log += ff.FusionLog;
  474. continue;
  475. }
  476. }
  477. ReportError (6, "Cannot find module `" + module + "'" );
  478. Console.WriteLine ("Log: n" + total_log);
  479. }
  480. catch (BadImageFormatException f) {
  481. ReportError (6, "Cannot load module (bad file format)" + f.FusionLog);
  482. }
  483. catch (FileLoadException f) {
  484. ReportError (6, "Cannot load module " + f.FusionLog);
  485. }
  486. catch (ArgumentNullException) {
  487. ReportError (6, "Cannot load module (null argument)");
  488. }
  489. errors++;
  490. }
  491. public void UnsupportedFeatureOnthisRuntime(string feature)
  492. {
  493. ReportError (0, string.Format("Cannot use {0} on this runtime: Try the Mono runtime instead.", feature));
  494. Environment.Exit (1);
  495. }
  496. public bool LoadAddedNetModules(AssemblyBuilder assemblyBuilder, ModuleAdder adder)
  497. {
  498. int errors = 0;
  499. if (NetModulesToAdd.Count > 0) {
  500. StartTime("Loading added netmodules");
  501. MethodInfo adder_method = typeof (AssemblyBuilder).GetMethod ("AddModule", BindingFlags.Instance|BindingFlags.NonPublic);
  502. if (adder_method == null)
  503. UnsupportedFeatureOnthisRuntime("/addmodule");
  504. foreach (string module in NetModulesToAdd)
  505. LoadModule (adder_method, assemblyBuilder, adder, module, ref errors);
  506. ShowTime("   Done");
  507. }
  508. return errors == 0;
  509. }
  510. public void AdjustCodegenWhenTargetIsNetModule(AssemblyBuilder assemblyBuilder)
  511. {
  512. if (TargetFileType == TargetType.Module) {
  513. StartTime("Adjusting AssemblyBuilder for NetModule target");
  514. PropertyInfo module_only = typeof (AssemblyBuilder).GetProperty ("IsModuleOnly", BindingFlags.Instance|BindingFlags.Public|BindingFlags.NonPublic);
  515. if (module_only == null)
  516. UnsupportedFeatureOnthisRuntime("/target:module");
  517. MethodInfo set_method = module_only.GetSetMethod (true);
  518. set_method.Invoke (assemblyBuilder, BindingFlags.Default, null, new object[]{true}, null);
  519. ShowTime("   Done");
  520. }
  521. }
  522. //
  523. // Given a path specification, splits the path from the file/pattern
  524. //
  525. void SplitPathAndPattern (string spec, out string path, out string pattern)
  526. {
  527. int p = spec.LastIndexOf ("/");
  528. if (p != -1){
  529. //
  530. // Windows does not like /file.cs, switch that to:
  531. // "", "file.cs"
  532. //
  533. if (p == 0){
  534. path = "\";
  535. pattern = spec.Substring (1);
  536. } else {
  537. path = spec.Substring (0, p);
  538. pattern = spec.Substring (p + 1);
  539. }
  540. return;
  541. }
  542. p = spec.LastIndexOf ("\");
  543. if (p != -1){
  544. path = spec.Substring (0, p);
  545. pattern = spec.Substring (p + 1);
  546. return;
  547. }
  548. path = ".";
  549. pattern = spec;
  550. }
  551. bool AddFiles (string spec, bool recurse)
  552. {
  553. string path, pattern;
  554. SplitPathAndPattern(spec, out path, out pattern);
  555. if (pattern.IndexOf("*") == -1) {
  556. DefaultArgumentProcessor(spec);
  557. return true;
  558. }
  559. string [] files = null;
  560. try {
  561. files = Directory.GetFiles(path, pattern);
  562. } catch (System.IO.DirectoryNotFoundException) {
  563. ReportError (2001, "Source file '" + spec + "' could not be found");
  564. return false;
  565. } catch (System.IO.IOException){
  566. ReportError (2001, "Source file '" + spec + "' could not be found");
  567. return false;
  568. }
  569. foreach (string f in files)
  570. DefaultArgumentProcessor (f);
  571. if (!recurse)
  572. return true;
  573. string [] dirs = null;
  574. try {
  575. dirs = Directory.GetDirectories(path);
  576. } catch {
  577. }
  578. foreach (string d in dirs) {
  579. // Don't include path in this string, as each
  580. // directory entry already does
  581. AddFiles (d + "/" + pattern, true);
  582. }
  583. return true;
  584. }
  585. public void EmbedResources(AssemblyBuilder builder)
  586. {
  587. if (EmbeddedResources != null)
  588. foreach (string file in EmbeddedResources)
  589. builder.AddResourceFile (file, file); // TODO: deal with resource IDs
  590. }
  591. public virtual bool NothingToCompile {
  592. get {
  593. if (SourceFilesToCompile.Count == 0) {
  594. if (!BeQuiet) 
  595. DoHelp();
  596. return true;
  597. }
  598. if (!BeQuiet)
  599. ShowBanner();
  600. return false;
  601. }
  602. }
  603. }
  604. public class CommonCompilerOptions2 : CommonCompilerOptions
  605. {
  606. [Option("Specify target CPU platform {ID}. ID can be x86, Itanium, x64 (AMD 64bit) or anycpu (the default).", "platform", SecondLevelHelp = true)]
  607. public string TargetPlatform;
  608. [Option("What {action} (prompt | send | none) should be done when an internal compiler error occurs.tThe default is none what just prints the error data in the compiler output", "errorreport", SecondLevelHelp = true)]
  609. public InternalCompilerErrorReportAction HowToReportErrors = InternalCompilerErrorReportAction.none;
  610. [Option("Filealign internal blocks to the {blocksize} in bytes. Valid values are 512, 1024, 2048, 4096, and 8192.", "filealign", SecondLevelHelp = true)]
  611. public int FileAlignBlockSize = 0; // 0 means use appropriate (not fixed) default
  612. [Option("Generate documentation from xml commments.", "doc", SecondLevelHelp = true, VBCStyleBoolean = true)]
  613. public bool GenerateXmlDocumentation = false;
  614. [Option("Generate documentation from xml commments to an specific {file}.", "docto", SecondLevelHelp = true)]
  615. public string GenerateXmlDocumentationToFileName = null;
  616. }
  617. }