blob: 0d056649ba778182ece6dfc22c9e77bf0c19b3da [file] [log] [blame]
Fumitoshi Ukaif2f84562015-03-30 19:47:45 +09001package main
2
3import (
4 "fmt"
5 "os/exec"
6 "path/filepath"
7 "regexp"
8 "strings"
9)
10
11// Func is a make function.
12// http://www.gnu.org/software/make/manual/make.html#Functions
13// TODO(ukai): *Evaluator -> eval context or so?
14// TODO(ukai): return error instead of panic?
15type Func func(*Evaluator, string) string
16
17// http://www.gnu.org/software/make/manual/make.html#File-Name-Functions
18func funcWildcard(_ *Evaluator, arg string) string {
19 files, err := filepath.Glob(arg)
20 if err != nil {
21 panic(err)
22 }
23 return strings.Join(files, " ")
24}
25
26// http://www.gnu.org/software/make/manual/make.html#Shell-Function
27func funcShell(_ *Evaluator, arg string) string {
28 args := []string{"/bin/sh", "-c", arg}
29 cmd := exec.Cmd{
30 Path: args[0],
31 Args: args,
32 }
33 out, err := cmd.CombinedOutput()
34 if err != nil {
35 panic(err)
36 }
37 re, err := regexp.Compile(`\s`)
38 if err != nil {
39 panic(err)
40 }
41 return string(re.ReplaceAllString(string(out), " "))
42}
43
44// http://www.gnu.org/software/make/manual/make.html#Make-Control-Functions
45func funcWarning(ev *Evaluator, arg string) string {
46 fmt.Printf("%s:%d: %s\n", ev.filename, ev.lineno, arg)
47 return ""
48}