From 96c7b98bf0f852d7afee9251c4ce9492310e6a87 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Fri, 15 Aug 2003 13:01:45 +0000 Subject: [PATCH] * Argument support in Fix. Arguments can be passed through the builder using the `args' binding: ("args", ["bla", True, IncludeFix("aterm/aterm.fix")]) Note that packages can also be declared as inputs by specifying them in the argument list. --- src/fix.cc | 63 +++++++++++++++++++++++++------------ testpkgs/args/args-build.sh | 11 +++++++ testpkgs/args/args.fix | 7 +++++ 3 files changed, 61 insertions(+), 20 deletions(-) create mode 100755 testpkgs/args/args-build.sh create mode 100644 testpkgs/args/args.fix diff --git a/src/fix.cc b/src/fix.cc index 2a1c09c2a..66ca5f1c2 100644 --- a/src/fix.cc +++ b/src/fix.cc @@ -150,6 +150,30 @@ static Hash hashPackage(EvalState & state, FState fs) } +static string processBinding(EvalState & state, Expr e, FState & fs) +{ + char * s1; + + if (ATmatch(e, "FSId()", &s1)) { + FSId id = parseHash(s1); + Strings paths = fstatePathsCached(state, id); + if (paths.size() != 1) abort(); + string path = *(paths.begin()); + fs.derive.inputs.push_back(id); + return path; + } + + if (ATmatch(e, "", &s1)) + return s1; + + if (ATmatch(e, "True")) return "1"; + + if (ATmatch(e, "False")) return ""; + + throw badTerm("invalid package binding", e); +} + + static Expr evalExpr2(EvalState & state, Expr e) { char * s1; @@ -274,30 +298,29 @@ static Expr evalExpr2(EvalState & state, Expr e) string key = it->first; ATerm value = it->second; - if (ATmatch(value, "FSId()", &s1)) { - FSId id = parseHash(s1); - Strings paths = fstatePathsCached(state, id); - if (paths.size() != 1) abort(); - string path = *(paths.begin()); - fs.derive.inputs.push_back(id); - fs.derive.env.push_back(StringPair(key, path)); - if (key == "build") fs.derive.builder = path; - } - else if (ATmatch(value, "", &s1)) { - if (key == "name") name = s1; + if (key == "args") { + ATermList args; + if (!ATmatch(value, "[]", &args)) + throw badTerm("list expected", value); + + while (!ATisEmpty(args)) { + Expr arg = evalExpr(state, ATgetFirst(args)); + fs.derive.args.push_back(processBinding(state, arg, fs)); + args = ATgetNext(args); + } + } + + else { + string s = processBinding(state, value, fs); + fs.derive.env.push_back(StringPair(key, s)); + + if (key == "build") fs.derive.builder = s; + if (key == "name") name = s; if (key == "id") { - outId = parseHash(s1); + outId = parseHash(s); outIdGiven = true; } - fs.derive.env.push_back(StringPair(key, s1)); } - else if (ATmatch(value, "True")) { - fs.derive.env.push_back(StringPair(key, "1")); - } - else if (ATmatch(value, "False")) { - fs.derive.env.push_back(StringPair(key, "")); - } - else throw badTerm("invalid package argument", value); bnds = ATinsert(bnds, ATmake("(, )", key.c_str(), value)); diff --git a/testpkgs/args/args-build.sh b/testpkgs/args/args-build.sh new file mode 100755 index 000000000..1efcc17fe --- /dev/null +++ b/testpkgs/args/args-build.sh @@ -0,0 +1,11 @@ +#! /bin/sh + +IFS= + +echo "printing list of args" + +for i in $@; do + echo "arg: $i" +done + +touch $out \ No newline at end of file diff --git a/testpkgs/args/args.fix b/testpkgs/args/args.fix new file mode 100644 index 000000000..54a13ddba --- /dev/null +++ b/testpkgs/args/args.fix @@ -0,0 +1,7 @@ +Package( + [ ("name", "args") + , ("build", Relative("args/args-build.sh")) + + , ("args", ["1", "2", "3", IncludeFix("slow2/slow.fix")]) + ] +)