Пример #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));
            }
Пример #2
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));
            }