// // This parses the -arg and /arg options to the compiler, even if the strings // in the following text use "/arg" on the strings. // bool CSCParseOption (string option, ref string [] args) { int idx = option.IndexOf (':'); string arg, value; if (idx == -1){ arg = option; value = ""; } else { arg = option.Substring (0, idx); value = option.Substring (idx + 1); } switch (arg.ToLower (CultureInfo.InvariantCulture)){ case "/nologo": return true; case "/t": case "/target": switch (value){ case "exe": RootContext.Target = Target.Exe; break; case "winexe": RootContext.Target = Target.WinExe; break; case "library": RootContext.Target = Target.Library; RootContext.TargetExt = ".dll"; break; case "module": RootContext.Target = Target.Module; RootContext.TargetExt = ".netmodule"; break; default: TargetUsage (); break; } return true; case "/out": if (value.Length == 0){ Usage (); Environment.Exit (1); } OutputFile = value; return true; case "/o": case "/o+": case "/optimize": case "/optimize+": RootContext.Optimize = true; return true; case "/o-": case "/optimize-": RootContext.Optimize = false; return true; // TODO: Not supported by csc 3.5+ case "/incremental": case "/incremental+": case "/incremental-": // nothing. return true; case "/d": case "/define": { if (value.Length == 0){ Usage (); Environment.Exit (1); } foreach (string d in value.Split (argument_value_separator)) { string conditional = d.Trim (); if (!Tokenizer.IsValidIdentifier (conditional)) { Report.Warning (2029, 1, "Invalid conditional define symbol `{0}'", conditional); continue; } RootContext.AddConditional (conditional); } return true; } case "/bugreport": // // We should collect data, runtime, etc and store in the file specified // Console.WriteLine ("To file bug reports, please visit: http://www.mono-project.com/Bugs"); return true; #if !SMCS_SOURCE case "/pkg": { string packages; if (value.Length == 0){ Usage (); Environment.Exit (1); } packages = String.Join (" ", value.Split (new Char [] { ';', ',', '\n', '\r'})); string pkgout = GetPackageFlags (packages, true, Report); if (pkgout != null){ string [] xargs = pkgout.Trim (new Char [] {' ', '\n', '\r', '\t'}). Split (new Char [] { ' ', '\t'}); args = AddArgs (args, xargs); } return true; } #endif case "/linkres": case "/linkresource": case "/res": case "/resource": if (embedded_resources == null) embedded_resources = new Resources (ctx); bool embeded = arg [1] == 'r' || arg [1] == 'R'; string[] s = value.Split (argument_value_separator); switch (s.Length) { case 1: if (s[0].Length == 0) goto default; embedded_resources.Add (embeded, s [0], Path.GetFileName (s[0])); break; case 2: embedded_resources.Add (embeded, s [0], s [1]); break; case 3: if (s [2] != "public" && s [2] != "private") { Report.Error (1906, "Invalid resource visibility option `{0}'. Use either `public' or `private' instead", s [2]); return true; } embedded_resources.Add (embeded, s [0], s [1], s [2] == "private"); break; default: Report.Error (-2005, "Wrong number of arguments for option `{0}'", option); break; } return true; case "/recurse": if (value.Length == 0){ Report.Error (5, "-recurse requires an argument"); Environment.Exit (1); } ProcessSourceFiles (value, true); return true; case "/r": case "/reference": { if (value.Length == 0){ Report.Error (5, "-reference requires an argument"); Environment.Exit (1); } string[] refs = value.Split (argument_value_separator); foreach (string r in refs){ string val = r; int index = val.IndexOf ('='); if (index > -1) { string alias = r.Substring (0, index); string assembly = r.Substring (index + 1); AddExternAlias (alias, assembly); return true; } if (val.Length != 0) references.Add (val); } return true; } case "/addmodule": { if (value.Length == 0){ Report.Error (5, arg + " requires an argument"); Environment.Exit (1); } string[] refs = value.Split (argument_value_separator); foreach (string r in refs){ modules.Add (r); } return true; } case "/win32res": { if (value.Length == 0) { Report.Error (5, arg + " requires an argument"); Environment.Exit (1); } if (win32IconFile != null) Report.Error (1565, "Cannot specify the `win32res' and the `win32ico' compiler option at the same time"); win32ResourceFile = value; return true; } case "/win32icon": { if (value.Length == 0) { Report.Error (5, arg + " requires an argument"); Environment.Exit (1); } if (win32ResourceFile != null) Report.Error (1565, "Cannot specify the `win32res' and the `win32ico' compiler option at the same time"); win32IconFile = value; return true; } case "/doc": { if (value.Length == 0){ Report.Error (2006, arg + " requires an argument"); Environment.Exit (1); } RootContext.Documentation = new Documentation (value); return true; } case "/lib": { string [] libdirs; if (value.Length == 0){ Report.Error (5, "/lib requires an argument"); Environment.Exit (1); } libdirs = value.Split (argument_value_separator); foreach (string dir in libdirs) link_paths.Add (dir); return true; } case "/debug-": want_debugging_support = false; return true; case "/debug": if (value == "full" || value == "") want_debugging_support = true; return true; case "/debug+": want_debugging_support = true; return true; case "/checked": case "/checked+": RootContext.Checked = true; return true; case "/checked-": RootContext.Checked = false; return true; case "/clscheck": case "/clscheck+": return true; case "/clscheck-": RootContext.VerifyClsCompliance = false; return true; case "/unsafe": case "/unsafe+": RootContext.Unsafe = true; return true; case "/unsafe-": RootContext.Unsafe = false; return true; case "/warnaserror": case "/warnaserror+": if (value.Length == 0) { Report.WarningsAreErrors = true; } else { foreach (string wid in value.Split (argument_value_separator)) Report.AddWarningAsError (wid); } return true; case "/warnaserror-": if (value.Length == 0) { Report.WarningsAreErrors = false; } else { foreach (string wid in value.Split (argument_value_separator)) Report.RemoveWarningAsError (wid); } return true; case "/warn": SetWarningLevel (value); return true; case "/nowarn": { string [] warns; if (value.Length == 0){ Report.Error (5, "/nowarn requires an argument"); Environment.Exit (1); } warns = value.Split (argument_value_separator); foreach (string wc in warns){ try { if (wc.Trim ().Length == 0) continue; int warn = Int32.Parse (wc); if (warn < 1) { throw new ArgumentOutOfRangeException("warn"); } Report.SetIgnoreWarning (warn); } catch { Report.Error (1904, String.Format("`{0}' is not a valid warning number", wc)); } } return true; } case "/noconfig": load_default_config = false; return true; case "/platform": switch (value.ToLower (CultureInfo.InvariantCulture)) { case "anycpu": RootContext.Platform = Platform.AnyCPU; break; case "x86": RootContext.Platform = Platform.X86; break; case "x64": RootContext.Platform = Platform.X64; break; case "itanium": RootContext.Platform = Platform.IA64; break; default: Report.Error (1672, "Invalid platform type for -platform. Valid options are `anycpu', `x86', `x64' or `itanium'"); break; } return true; // We just ignore this. case "/errorreport": case "/filealign": return true; case "/help2": OtherFlags (); Environment.Exit(0); return true; case "/help": case "/?": Usage (); Environment.Exit (0); return true; case "/main": case "/m": if (value.Length == 0){ Report.Error (5, arg + " requires an argument"); Environment.Exit (1); } RootContext.MainClass = value; return true; case "/nostdlib": case "/nostdlib+": RootContext.StdLib = false; return true; case "/nostdlib-": RootContext.StdLib = true; return true; case "/fullpaths": return true; case "/keyfile": if (value == String.Empty) { Report.Error (5, arg + " requires an argument"); Environment.Exit (1); } RootContext.StrongNameKeyFile = value; return true; case "/keycontainer": if (value == String.Empty) { Report.Error (5, arg + " requires an argument"); Environment.Exit (1); } RootContext.StrongNameKeyContainer = value; return true; case "/delaysign+": RootContext.StrongNameDelaySign = true; return true; case "/delaysign-": RootContext.StrongNameDelaySign = false; return true; case "/langversion": switch (value.ToLower (CultureInfo.InvariantCulture)) { case "iso-1": RootContext.Version = LanguageVersion.ISO_1; return true; case "default": RootContext.Version = LanguageVersion.Default; RootContext.AddConditional ("__V2__"); return true; case "iso-2": RootContext.Version = LanguageVersion.ISO_2; return true; case "3": RootContext.Version = LanguageVersion.V_3; return true; case "future": RootContext.Version = LanguageVersion.Future; return true; } Report.Error (1617, "Invalid -langversion option `{0}'. It must be `ISO-1', `ISO-2', `3' or `Default'", value); return true; case "/codepage": switch (value) { case "utf8": encoding = new UTF8Encoding(); break; case "reset": encoding = Encoding.Default; break; default: try { encoding = Encoding.GetEncoding ( Int32.Parse (value)); } catch { Report.Error (2016, "Code page `{0}' is invalid or not installed", value); } break; } return true; } return false; }
// // Currently handles the Unix-like command line options, but will be // deprecated in favor of the CSCParseOption, which will also handle the // options that start with a dash in the future. // bool UnixParseOption (string arg, ref string [] args, ref int i) { switch (arg){ case "-v": CSharpParser.yacc_verbose_flag++; return true; case "--version": Version (); return true; case "--parse": parse_only = true; return true; case "--main": case "-m": Report.Warning (-29, 1, "Compatibility: Use -main:CLASS instead of --main CLASS or -m CLASS"); if ((i + 1) >= args.Length){ Usage (); Environment.Exit (1); } RootContext.MainClass = args [++i]; return true; case "--unsafe": Report.Warning (-29, 1, "Compatibility: Use -unsafe instead of --unsafe"); RootContext.Unsafe = true; return true; case "/?": case "/h": case "/help": case "--help": Usage (); Environment.Exit (0); return true; case "--define": Report.Warning (-29, 1, "Compatibility: Use -d:SYMBOL instead of --define SYMBOL"); if ((i + 1) >= args.Length){ Usage (); Environment.Exit (1); } RootContext.AddConditional (args [++i]); return true; case "--tokenize": tokenize = true; return true; case "-o": case "--output": Report.Warning (-29, 1, "Compatibility: Use -out:FILE instead of --output FILE or -o FILE"); if ((i + 1) >= args.Length){ Usage (); Environment.Exit (1); } OutputFile = args [++i]; return true; case "--checked": Report.Warning (-29, 1, "Compatibility: Use -checked instead of --checked"); RootContext.Checked = true; return true; case "--stacktrace": Report.Printer.Stacktrace = true; return true; case "--linkresource": case "--linkres": Report.Warning (-29, 1, "Compatibility: Use -linkres:VALUE instead of --linkres VALUE"); if ((i + 1) >= args.Length){ Usage (); Report.Error (5, "Missing argument to --linkres"); Environment.Exit (1); } if (embedded_resources == null) embedded_resources = new Resources (ctx); embedded_resources.Add (false, args [++i], args [i]); return true; case "--resource": case "--res": Report.Warning (-29, 1, "Compatibility: Use -res:VALUE instead of --res VALUE"); if ((i + 1) >= args.Length){ Usage (); Report.Error (5, "Missing argument to --resource"); Environment.Exit (1); } if (embedded_resources == null) embedded_resources = new Resources (ctx); embedded_resources.Add (true, args [++i], args [i]); return true; case "--target": Report.Warning (-29, 1, "Compatibility: Use -target:KIND instead of --target KIND"); if ((i + 1) >= args.Length){ Environment.Exit (1); return true; } string type = args [++i]; switch (type){ case "library": RootContext.Target = Target.Library; RootContext.TargetExt = ".dll"; break; case "exe": RootContext.Target = Target.Exe; break; case "winexe": RootContext.Target = Target.WinExe; break; case "module": RootContext.Target = Target.Module; RootContext.TargetExt = ".dll"; break; default: TargetUsage (); break; } return true; case "-r": Report.Warning (-29, 1, "Compatibility: Use -r:LIBRARY instead of -r library"); if ((i + 1) >= args.Length){ Usage (); Environment.Exit (1); } string val = args [++i]; int idx = val.IndexOf ('='); if (idx > -1) { string alias = val.Substring (0, idx); string assembly = val.Substring (idx + 1); AddExternAlias (alias, assembly); return true; } references.Add (val); return true; case "-L": Report.Warning (-29, 1, "Compatibility: Use -lib:ARG instead of --L arg"); if ((i + 1) >= args.Length){ Usage (); Environment.Exit (1); } link_paths.Add (args [++i]); return true; case "--lint": RootContext.EnhancedWarnings = true; return true; case "--nostdlib": Report.Warning (-29, 1, "Compatibility: Use -nostdlib instead of --nostdlib"); RootContext.StdLib = false; return true; case "--nowarn": Report.Warning (-29, 1, "Compatibility: Use -nowarn instead of --nowarn"); if ((i + 1) >= args.Length){ Usage (); Environment.Exit (1); } int warn = 0; try { warn = Int32.Parse (args [++i]); } catch { Usage (); Environment.Exit (1); } Report.SetIgnoreWarning (warn); return true; case "--wlevel": Report.Warning (-29, 1, "Compatibility: Use -warn:LEVEL instead of --wlevel LEVEL"); if ((i + 1) >= args.Length){ Report.Error ( 1900, "--wlevel requires a value from 0 to 4"); Environment.Exit (1); } SetWarningLevel (args [++i]); return true; case "--mcs-debug": if ((i + 1) >= args.Length){ Report.Error (5, "--mcs-debug requires an argument"); Environment.Exit (1); } try { Report.DebugFlags = Int32.Parse (args [++i]); } catch { Report.Error (5, "Invalid argument to --mcs-debug"); Environment.Exit (1); } return true; case "--about": About (); return true; case "--recurse": Report.Warning (-29, 1, "Compatibility: Use -recurse:PATTERN option instead --recurse PATTERN"); if ((i + 1) >= args.Length){ Report.Error (5, "--recurse requires an argument"); Environment.Exit (1); } ProcessSourceFiles (args [++i], true); return true; case "--timestamp": timestamps = true; return true; case "--debug": case "-g": Report.Warning (-29, 1, "Compatibility: Use -debug option instead of -g or --debug"); want_debugging_support = true; return true; case "--noconfig": Report.Warning (-29, 1, "Compatibility: Use -noconfig option instead of --noconfig"); load_default_config = false; return true; default: if (arg.StartsWith ("--fatal")){ if (arg.StartsWith ("--fatal=")){ if (!Int32.TryParse (arg.Substring (8), out fatal_errors)) fatal_errors = 1; } else fatal_errors = 1; return true; } break; } return false; }
static public void Reset () { embedded_resources = null; win32ResourceFile = win32IconFile = null; output_file = null; }