From cf75e9e7b8195ef7b02d4dde4609d30a2ab255fe Mon Sep 17 00:00:00 2001 From: Florian Limberger Date: Thu, 23 Apr 2020 12:36:47 +0200 Subject: [PATCH] Implement variable expansion in includes Signed-off-by: Florian Limberger --- mk.go | 8 +++++++- parse.go | 16 +++++++++++++--- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/mk.go b/mk.go index 915429a..e238ad5 100644 --- a/mk.go +++ b/mk.go @@ -328,7 +328,13 @@ func main() { mkError("unable to find mkfile's absolute path") } - rs := parse(string(input), mkfilepath, abspath) + env := make(map[string][]string) + for _, elem := range os.Environ() { + vals := strings.SplitN(elem, "=", 2) + env[vals[0]] = append(env[vals[0]], vals[1]) + } + + rs := parse(string(input), mkfilepath, abspath, env) if quiet { for i := range rs.rules { rs.rules[i].attributes.quiet = true diff --git a/parse.go b/parse.go index 4e76540..04d6b48 100644 --- a/parse.go +++ b/parse.go @@ -52,8 +52,8 @@ func (p *parser) clear() { type parserStateFun func(*parser, token) parserStateFun // Parse a mkfile, returning a new ruleSet. -func parse(input string, name string, path string) *ruleSet { - rules := &ruleSet{make(map[string][]string), +func parse(input string, name string, path string, env map[string][]string) *ruleSet { + rules := &ruleSet{env, make([]rule, 0), make(map[string][]int)} parseInto(input, name, rules, path) @@ -115,7 +115,12 @@ func parsePipeInclude(p *parser, t token) parserStateFun { args := make([]string, len(p.tokenbuf)) for i := 0; i < len(p.tokenbuf); i++ { - args[i] = p.tokenbuf[i].val + s := p.tokenbuf[i].val + expanded := expand(s, p.rules.vars, false) + if len(expanded) > 0 { + s = expanded[0] + } + args[i] = s } output, success := subprocess("sh", args, "", true) @@ -155,6 +160,11 @@ func parseRedirInclude(p *parser, t token) parserStateFun { for i := range p.tokenbuf { filename += p.tokenbuf[i].val } + expanded := expand(filename, p.rules.vars, false) + if len(expanded) > 0 { + filename = expanded[0] + } + fmt.Printf("parsed filename: %v\nexpanded filename: %v\n", filename, expanded) file, err := os.Open(filename) if err != nil { p.basicErrorAtToken(fmt.Sprintf("cannot open %s", filename), p.tokenbuf[0])