public override Expression.EvalResult Run(MakeState s, List <Expression.EvalResult> passed_args) { // On run, clone the rule as all its member variables are shared by all instances RuleForFunction new_mrs = new RuleForFunction { output_file = output_file, depend_list = depend_list, inputs_list = inputs_list, rules = rules, export = export }; new_mrs.output_file = passed_args[0]; new_mrs.inputs_list = passed_args[1].arrval; new_mrs.depend_list = passed_args[2].arrval; new_mrs.rules = passed_args[3].funcval.code; string ofile = new_mrs.output_file.Evaluate(s).strval; new_mrs.state_at_def = s.Clone(); foreach (var dep in new_mrs.depend_list) { if (dep.Type == Expression.EvalResult.ResultType.Undefined) { throw new SyntaxException("rule for " + new_mrs.output_file.ToString() + " depends on " + dep.strval + " which is undefined", dep.orig_expr); } } foreach (var dep in new_mrs.inputs_list) { if (dep.Type == Expression.EvalResult.ResultType.Undefined) { throw new SyntaxException("rule for " + new_mrs.output_file.ToString() + " requires " + dep.strval + " which is undefined", dep.orig_expr); } } new_mrs.dfiles = FlattenToString(new_mrs.depend_list, s); new_mrs.ifiles = FlattenToString(new_mrs.inputs_list, s); ((TyMakeState)s).AddRule(ofile, new_mrs); return(new Expression.EvalResult(0)); }
public override Expression.EvalResult Run(MakeState s, List <Expression.EvalResult> passed_args) { if (passed_args[0].strval == "default") { typroject.Program.csc_override = null; } else { typroject.Program.csc_override = passed_args[0].strval; } return(new Expression.EvalResult(0)); }
public override Expression.EvalResult Run(MakeState s, List <Expression.EvalResult> passed_args) { var o = passed_args[0].objval; p.assembly_name = o["AssemblyName"].strval; foreach (var kvp in o) { p.properties[kvp.Key] = kvp.Value.strval; } return(new Expression.EvalResult(p.build(new List <string>(), new List <string>(), new List <string>(), do_unsafe))); }
public override Expression.EvalResult Run(MakeState s, List <Expression.EvalResult> passed_args) { TyMakeState tms = s as TyMakeState; string wc_pat; if (tms.GetRule(passed_args[0].strval, out wc_pat) == null) { return(new Expression.EvalResult(0)); } else { return(new Expression.EvalResult(1)); } }
public override Expression.EvalResult Run(MakeState s, List <Expression.EvalResult> passed_args) { System.IO.DirectoryInfo di = new System.IO.DirectoryInfo(passed_args[0].strval); while (di != null) { List <Expression.EvalResult> depend_list = new List <Expression.EvalResult>(); if (di.Parent != null) { depend_list.Add(new Expression.EvalResult(di.Parent.FullName)); } RuleForFunction mr = new RuleForFunction() { fname = fname, scol = scol, sline = sline }; mr.Run(s, new List <Expression.EvalResult> { new Expression.EvalResult(di.FullName), new Expression.EvalResult(new List <Expression.EvalResult>()), new Expression.EvalResult(depend_list), new Expression.EvalResult( new FunctionStatement { code = new ExpressionStatement { expr = new FuncCall { target = "mkdir", args = new List <Expression> { new StringExpression { val = di.FullName } } } }, }) }); di = di.Parent; } return(new Expression.EvalResult(0)); }
public override Expression.EvalResult Run(MakeState s, List <Expression.EvalResult> passed_args) { string target = passed_args[0].strval; try { Uri furi = new Uri(new Uri(Environment.CurrentDirectory + "/"), target); target = furi.AbsolutePath; List <TyMakeState.MakeRuleMatch> matches = ((TyMakeState)s).GetRules(target); matches.Sort(make_compare); foreach (TyMakeState.MakeRuleMatch match in matches) { if (match.mr == null) { return(new Expression.EvalResult(0)); } int ret = match.mr.Build(s, target, match.wc_pattern); if (ret != 0) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("Error building " + target + " (" + ret.ToString() + ")"); Console.ResetColor(); return(new Expression.EvalResult(ret)); } if (ret == 0) { return(new Expression.EvalResult(0)); } } ((TyMakeState)s).GetRules(target); return(new Expression.EvalResult(RUN_NO_RULE)); } catch (UriFormatException) { throw new ParseException("Invalid path: " + Environment.CurrentDirectory + "/" + target, sline, scol); } }
public int Build(MakeState s, string tfile, string wc_match) { #if DEBUG // System.Console.WriteLine("Considering building " + tfile); #endif List <string> depends = new List <string>(); List <string> inputs = new List <string>(); List <string> all_deps = new List <string>(); /*MakeState cur_s = state_at_def.Clone(); * cur_s.Merge(s); * s = cur_s;*/ MakeState cur_s = s.Clone(); cur_s.Merge(state_at_def); s = cur_s; if (depend_list != null) { /* Build a list of dependencies */ //List<string> dfiles = FlattenToString(depend_list, s); foreach (string cur_dfile in dfiles) { string dfile = cur_dfile; int wc_index = -1; for (int i = 0; i < dfile.Length; i++) { if (dfile[i] == '%') { if (i == 0 || dfile[i - 1] != '\\') { wc_index = i; break; } } } if (wc_index != -1) { if (wc_match == null) { throw new Exception("wildcard specified in depends list but not in target name"); } dfile = dfile.Substring(0, wc_index) + wc_match + dfile.Substring(wc_index + 1); } depends.Add(dfile); all_deps.Add(dfile); } } if (inputs_list != null) { //List<string> dfiles = FlattenToString(inputs_list, s); foreach (string cur_dfile in ifiles) { string dfile = cur_dfile; int wc_index = -1; for (int i = 0; i < dfile.Length; i++) { if (dfile[i] == '%') { if (i == 0 || dfile[i - 1] != '\\') { wc_index = i; break; } } } if (wc_index != -1) { if (wc_match == null) { throw new Exception("wildcard specified in inputs list but not in target name"); } dfile = dfile.Substring(0, wc_index) + wc_match + dfile.Substring(wc_index + 1); } inputs.Add(dfile); all_deps.Add(dfile); } } #if DEBUG //System.Console.Write("Dependencies: "); //foreach(var dep in all_deps) // System.Console.Write(dep + ", "); //System.Console.WriteLine(); #endif /* Now ensure all the dependencies are available */ DateTime most_recent_dependency = new DateTime(0); System.IO.FileInfo mrd_fi = null; // store the most recent dependency for debugging purposes foreach (string depend in all_deps) { BuildCommandStatement bc = new BuildCommandStatement(); int dep_ret = (int)bc.Run(s, new List <Expression.EvalResult> { new Expression.EvalResult(depend) }).AsInt; System.IO.FileInfo dep_fi = null; if (dep_ret == BuildCommandStatement.RUN_NO_RULE) { /* No rule to build the file - its still okay as long as the file already exists */ dep_fi = new System.IO.FileInfo(depend); if (!Statement.FileDirExists(depend)) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine(depend + " does not exist and no rule to build it"); Console.ResetColor(); return(-1); } } else if (dep_ret != 0) { return(dep_ret); } dep_fi = new System.IO.FileInfo(depend); if (!Statement.FileDirExists(depend)) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("Error building " + depend); Console.ResetColor(); return(-1); } if ((dep_fi.Attributes & System.IO.FileAttributes.Directory) != System.IO.FileAttributes.Directory) { if (dep_fi.LastWriteTime.CompareTo(most_recent_dependency) > 0) { most_recent_dependency = dep_fi.LastWriteTime; mrd_fi = dep_fi; } } } /* See if we need to build this file */ bool to_build = false; System.IO.FileSystemInfo targ_fi = new System.IO.FileInfo(tfile); DateTime targ_lwt = DateTime.Now; if (s.GetDefine("REBUILD_ALL").AsInt != 0 && ((targ_fi.Attributes & System.IO.FileAttributes.Directory) != System.IO.FileAttributes.Directory)) { to_build = true; Console.ForegroundColor = ConsoleColor.Green; System.Console.WriteLine("Building " + tfile #if DEBUG + " because REBUILD_ALL is set" #endif ); Console.ResetColor(); } else if (!Statement.FileDirExists(tfile)) { to_build = true; Console.ForegroundColor = ConsoleColor.Green; System.Console.WriteLine("Building " + tfile #if DEBUG + " because it does not exist" #endif ); Console.ResetColor(); } else if (most_recent_dependency.CompareTo(targ_lwt = targ_fi.LastWriteTime) > 0) { to_build = true; Console.ForegroundColor = ConsoleColor.Green; System.Console.WriteLine("Building " + tfile #if DEBUG + " because of a newer dependency (" + mrd_fi.FullName + ")" #endif ); Console.ResetColor(); } else if (depend_list == null) { to_build = true; Console.ForegroundColor = ConsoleColor.Green; System.Console.WriteLine("Building " + tfile #if DEBUG + " because dependency list is null" #endif ); Console.ResetColor(); } if (to_build) { MakeState new_s = s.Clone(); if (inputs.Count > 0) { new_s.SetDefine("_RULE_INPUT", new Expression.EvalResult(inputs[0])); } StringBuilder inputs_str = new StringBuilder(); for (int i = 0; i < inputs.Count; i++) { if (i != 0) { inputs_str.Append(" "); } inputs_str.Append(inputs[i]); } StringBuilder deps_str = new StringBuilder(); for (int i = 0; i < depends.Count; i++) { if (i != 0) { deps_str.Append(" "); } deps_str.Append(depends[i]); } new_s.SetDefine("_RULE_INPUTS", new Expression.EvalResult(inputs_str.ToString())); new_s.SetDefine("_RULE_DEPENDS", new Expression.EvalResult(deps_str.ToString())); new_s.SetDefine("_RULE_OUTPUT", new Expression.EvalResult(tfile)); var ret = (int)rules.Execute(new_s).AsInt; /* See if the target failed to build despite success from the rules */ if (ret == 0) { targ_fi = new System.IO.FileInfo(tfile); if ((targ_fi.Attributes & System.IO.FileAttributes.Directory) == System.IO.FileAttributes.Directory) { targ_fi = new System.IO.DirectoryInfo(tfile); } if (targ_fi.Exists == false || targ_fi.LastWriteTime.CompareTo(targ_lwt - new TimeSpan(0, 0, 1)) < 0) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("Rule failed to build " + tfile); Console.ResetColor(); return(-1); } } return(ret); } else { #if DEBUG // System.Console.WriteLine("Not building " + tfile); #endif } return(0); }
private void FlattenToString(Expression.EvalResult er, List <string> ret, MakeState s) { switch (er.Type) { case Expression.EvalResult.ResultType.String: ret.Add(er.strval); break; case Expression.EvalResult.ResultType.Array: foreach (Expression.EvalResult ea in er.arrval) { FlattenToString(ea, ret, s); } break; default: throw new NotSupportedException(); } }
private List <string> FlattenToString(List <Expression.EvalResult> depend_list, MakeState s) { List <string> ret = new List <string>(); foreach (var e in depend_list) { FlattenToString(e, ret, s); } return(ret); }
public MenuOption(string text, MakeState makeState) { this.makeState = makeState; this.text = text; }
public override Expression.EvalResult Run(MakeState s, List <Expression.EvalResult> passed_args) { var cmd = passed_args[0].strval; int first_space = cmd.IndexOf(' '); string fname, args; if (first_space == -1) { fname = cmd; args = ""; } else { fname = cmd.Substring(0, first_space); args = cmd.Substring(first_space + 1); } System.Diagnostics.Process p = new System.Diagnostics.Process(); p.StartInfo.FileName = fname; p.StartInfo.Arguments = args; p.StartInfo.UseShellExecute = false; //p.StartInfo.RedirectStandardError = true; //p.StartInfo.RedirectStandardOutput = true; /* Find the name of the path environment variable */ /*string path = "PATH"; * foreach (string env_key in p.StartInfo.EnvironmentVariables.Keys) * { * if (env_key.ToLower() == "path") * path = env_key; * } * string cur_path = ""; * if (p.StartInfo.EnvironmentVariables.ContainsKey(path)) * cur_path = p.StartInfo.EnvironmentVariables[path]; * if (cur_path != "") * cur_path += ";"; * cur_path += "f:/cygwin64/bin"; * p.StartInfo.EnvironmentVariables[path] = cur_path;*/ Environment.SetEnvironmentVariable("PATH", s.GetDefine("PATH").strval); Console.WriteLine("shellcmd: " + p.StartInfo.FileName + " " + p.StartInfo.Arguments); try { if (p.Start() == false) { throw new Exception("unable to execute " + fname); } } catch (Exception e) { System.Console.WriteLine("error: " + e.ToString()); return(new Expression.EvalResult(-1)); } p.WaitForExit(); if (p.ExitCode != 0) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("Shell command returned error " + p.ExitCode.ToString() + " (" + p.ExitCode.ToString("X8") + ")"); Console.ResetColor(); s.returns = new Expression.EvalResult(-1); return(new Expression.EvalResult(-1)); } else { return(new Expression.EvalResult(0)); } }
public override Expression.EvalResult Run(MakeState s, List <Expression.EvalResult> args) { string fname = args[0].strval; string config = args[1].strval; string tools_ver = args[2].strval; bool do_unsafe = (args[3].intval == 0) ? false : true; string cur_dir = Environment.CurrentDirectory; System.IO.FileInfo fi = new System.IO.FileInfo(fname); if (!fi.Exists) { throw new Exception("_typroject: " + fname + " does not exist"); } /* Extract out imports */ List <string> imports = new List <string>(); foreach (var import in args[4].arrval) { imports.Add(import.strval); } /* Extract out ref overrides */ List <string> ref_overrides = new List <string>(); foreach (var ro in args[5].arrval) { ref_overrides.Add(ro.strval); } typroject.Project p = null; if (fname.ToLower().EndsWith(".csproj")) { p = typroject.Project.xml_read(fi.OpenRead(), config, fi.DirectoryName, cur_dir, imports, ref_overrides); } else if (fname.ToLower().EndsWith(".sources")) { p = typroject.Project.sources_read(fi.OpenRead(), config, fi.DirectoryName, cur_dir); } if (args[6].strval != "") { p.lib_dir = args[6].strval; } Dictionary <string, Expression.EvalResult> ret = new Dictionary <string, Expression.EvalResult>(); ret["OutputFile"] = new Expression.EvalResult(p.OutputFile); ret["OutputType"] = new Expression.EvalResult(p.output_type.ToString()); ret["AssemblyName"] = new Expression.EvalResult(p.assembly_name); ret["Configuration"] = new Expression.EvalResult(p.configuration); ret["Defines"] = new Expression.EvalResult(p.defines); ret["Sources"] = new Expression.EvalResult(p.Sources); ret["Resources"] = new Expression.EvalResult(p.Resources); ret["GACReferences"] = new Expression.EvalResult(p.References); ret["ProjectReferences"] = new Expression.EvalResult(new string[] { }); foreach (typroject.Project pref in p.ProjectReferences) { ret["ProjectReferences"].arrval.Add(new Expression.EvalResult(pref.ProjectFile)); } ret["References"] = new Expression.EvalResult(new string[] { }); foreach (var rref in p.References) { ret["References"].arrval.Add(new Expression.EvalResult(rref)); } ret["ProjectFile"] = new Expression.EvalResult(fi.FullName); ret["ProjectName"] = new Expression.EvalResult(p.ProjectName); BuildFunction build = new BuildFunction(p); ret[build.Mangle()] = new Expression.EvalResult(build); if (do_unsafe) { build.do_unsafe = true; } if (tools_ver != "") { p.tools_ver = tools_ver; } return(new Expression.EvalResult(ret)); }
public override Expression.EvalResult Run(MakeState s, List <Expression.EvalResult> passed_args) { return(new Expression.EvalResult(typroject.Program.ref_dir(passed_args[0].strval))); }
public void ResolveButtonClick() { checkstate = MakeState.Resolve; }
public void HostButtonClick() { checkstate = MakeState.Host; }