Separate output from diagnostics in Starlark product configuration.

Some of the product configuration makefiles use `info` and `warning` Make's
builtins for diagnostics. As running Starlark configuration generates the makefile
as its output, this diagnostics has to go elsewhere. Implement `rblf_log` as
the functional equivalent of `print` that writes to stderr instead of stdout
and use it to implement `info` and `warning` counterparts.

Fixes: 201073196
Test: manual
Change-Id: Ib4d9c10566f9b20310fbee41eda67f0a621b0a84
This commit is contained in:
Sasha Smundak
2021-09-24 08:25:17 -07:00
parent ad48e9cb87
commit e8652d4cd1
4 changed files with 35 additions and 3 deletions

View File

@@ -87,3 +87,7 @@ Returns *True* if *text* matches *pattern*.
Runs `sh -c "`*command*`"`, reads its output, converts all newlines into spaces, chops trailing newline returns this
string. This is equivalent to Make's
`shell` builtin function. *This function will be eventually removed*.
#### rblf_log(*arg*,..., sep=' ')
Same as `print` builtin but writes to stderr.

View File

@@ -259,6 +259,28 @@ func structFromEnv(env []string) *starlarkstruct.Struct {
return starlarkstruct.FromStringDict(starlarkstruct.Default, sd)
}
func log(thread *starlark.Thread, fn *starlark.Builtin, args starlark.Tuple, kwargs []starlark.Tuple) (starlark.Value, error) {
sep := " "
if err := starlark.UnpackArgs("print", nil, kwargs, "sep?", &sep); err != nil {
return nil, err
}
for i, v := range args {
if i > 0 {
fmt.Fprint(os.Stderr, sep)
}
if s, ok := starlark.AsString(v); ok {
fmt.Fprint(os.Stderr, s)
} else if b, ok := v.(starlark.Bytes); ok {
fmt.Fprint(os.Stderr, string(b))
} else {
fmt.Fprintf(os.Stderr, "%s", v)
}
}
fmt.Fprintln(os.Stderr)
return starlark.None, nil
}
func setup(env []string) {
// Create the symbols that aid makefile conversion. See README.md
builtins = starlark.StringDict{
@@ -273,6 +295,8 @@ func setup(env []string) {
"rblf_regex": starlark.NewBuiltin("rblf_regex", regexMatch),
// To convert makefile's $(shell cmd)
"rblf_shell": starlark.NewBuiltin("rblf_shell", shell),
// Output to stderr
"rblf_log": starlark.NewBuiltin("rblf_log", log),
// To convert makefile's $(wildcard foo*)
"rblf_wildcard": starlark.NewBuiltin("rblf_wildcard", wildcard),
}