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) { 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)); }