From e8652d4cd1b38b91dd8bdf5bf55468cd4d829d89 Mon Sep 17 00:00:00 2001 From: Sasha Smundak Date: Fri, 24 Sep 2021 08:25:17 -0700 Subject: [PATCH] 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 --- core/product_config.mk | 6 +++++- core/product_config.rbc | 4 ++-- tools/rbcrun/README.md | 4 ++++ tools/rbcrun/host.go | 24 ++++++++++++++++++++++++ 4 files changed, 35 insertions(+), 3 deletions(-) diff --git a/core/product_config.mk b/core/product_config.mk index 08974efd2c..3b02acf3e2 100644 --- a/core/product_config.mk +++ b/core/product_config.mk @@ -200,7 +200,11 @@ ifndef RBC_PRODUCT_CONFIG $(call import-products, $(current_product_makefile)) else rbcscript=build/soong/scripts/rbc-run - rc := $(shell $(rbcscript) $(TARGET_PRODUCT)-$(TARGET_BUILD_VARIANT) >$(OUT_DIR)/rbctemp.mk || echo $$?) + rc := $(shell $(rbcscript) $(TARGET_PRODUCT)-$(TARGET_BUILD_VARIANT) >$(OUT_DIR)/rbctemp.mk 2>$(OUT_DIR)/rbctemp.stderr || echo $$?) + rbcerrors := $(file <(OUT_DIR)/rbctemp.stderr) + ifneq (,$(rbcerrors)) + $(info $(rbcerrors)) + endif ifneq (,$(rc)) $(error product configuration converter failed: $(rc)) endif diff --git a/core/product_config.rbc b/core/product_config.rbc index 62777f9b51..710957b06d 100644 --- a/core/product_config.rbc +++ b/core/product_config.rbc @@ -462,11 +462,11 @@ def _mkerror(file, message = ""): def _mkwarning(file, message = ""): """Prints warning.""" - print("%s: warning: %s" % (file, message)) + rblf_log(file, "warning", message, sep = ':') def _mkinfo(file, message = ""): """Prints info.""" - print(message) + rblf_log(message) def __mkparse_pattern(pattern): diff --git a/tools/rbcrun/README.md b/tools/rbcrun/README.md index ecf8a24a0b..7f40597edd 100644 --- a/tools/rbcrun/README.md +++ b/tools/rbcrun/README.md @@ -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. \ No newline at end of file diff --git a/tools/rbcrun/host.go b/tools/rbcrun/host.go index 7f4f72dac6..4915de9d07 100644 --- a/tools/rbcrun/host.go +++ b/tools/rbcrun/host.go @@ -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), }