Ejemplo n.º 1
0
            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));
            }
Ejemplo n.º 2
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));
 }
Ejemplo n.º 3
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)));
            }
Ejemplo n.º 4
0
            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));
                }
            }
Ejemplo n.º 5
0
            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));
            }
Ejemplo n.º 6
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);
                }
            }
Ejemplo n.º 7
0
            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);
            }
Ejemplo n.º 8
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();
                }
            }
Ejemplo n.º 9
0
            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);
            }
Ejemplo n.º 10
0
 public MenuOption(string text, MakeState makeState)
 {
     this.makeState = makeState;
     this.text      = text;
 }
Ejemplo n.º 11
0
            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));
                }
            }
Ejemplo n.º 12
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));
        }
Ejemplo n.º 13
0
 public override Expression.EvalResult Run(MakeState s, List <Expression.EvalResult> passed_args)
 {
     return(new Expression.EvalResult(typroject.Program.ref_dir(passed_args[0].strval)));
 }
Ejemplo n.º 14
0
 public void ResolveButtonClick()
 {
     checkstate = MakeState.Resolve;
 }
Ejemplo n.º 15
0
 public void HostButtonClick()
 {
     checkstate = MakeState.Host;
 }