From 6ed7cb493d6eecd18fc8539865c9c63a52191994 Mon Sep 17 00:00:00 2001 From: Cole Faust Date: Thu, 7 Oct 2021 17:08:46 -0700 Subject: [PATCH] Generate board-specific launchers in mk2rbc Board config works slightly differently from product config. It requires the product config variables to be passed into it. Currently the only generic way to pass info into an RBC script is via the arguments to rbcrun, which get passed as global variables, not the product (cfg) variables. Add a new form of launcher that reads the product variables from a separate rbc file that is generated in make. The board configuration also doesn't need inheritance, so it doesn't call rblf.product_configuration() either. Bug: 201700692 Test: build/bazel/ci/rbc_product_config.sh -b sdk_phone_x86_64-userdebug Change-Id: I52fd65b33cf99b45a563284e2849da75a8af8688 --- mk2rbc/cmd/mk2rbc.go | 28 +++++++++++++++++++++++----- mk2rbc/mk2rbc.go | 13 +++++++++++++ 2 files changed, 36 insertions(+), 5 deletions(-) diff --git a/mk2rbc/cmd/mk2rbc.go b/mk2rbc/cmd/mk2rbc.go index b089f912a..25507d2d6 100644 --- a/mk2rbc/cmd/mk2rbc.go +++ b/mk2rbc/cmd/mk2rbc.go @@ -53,10 +53,12 @@ var ( // TODO(asmundak): this option is for debugging allInSource = flag.Bool("all", false, "convert all product config makefiles in the tree under //") outputTop = flag.String("outdir", "", "write output files into this directory hierarchy") - launcher = flag.String("launcher", "", "generated launcher path. If set, the non-flag argument is _product_name_") + launcher = flag.String("launcher", "", "generated launcher path.") + boardlauncher = flag.String("boardlauncher", "", "generated board configuration launcher path.") printProductConfigMap = flag.Bool("print_product_config_map", false, "print product config map and exit") cpuProfile = flag.String("cpu_profile", "", "write cpu profile to file") traceCalls = flag.Bool("trace_calls", false, "trace function calls") + inputVariables = flag.String("input_variables", "", "starlark file containing product config and global variables") ) func init() { @@ -87,8 +89,7 @@ func main() { flag.Usage = func() { cmd := filepath.Base(os.Args[0]) fmt.Fprintf(flag.CommandLine.Output(), - "Usage: %[1]s flags file...\n"+ - "or: %[1]s flags --launcher=PATH PRODUCT\n", cmd) + "Usage: %[1]s flags file...\n", cmd) flag.PrintDefaults() } flag.Parse() @@ -177,14 +178,31 @@ func main() { versionDefaultsPath := outputFilePath(versionDefaultsMk) err = writeGenerated(versionDefaultsPath, versionDefaults) if err != nil { - fmt.Fprintf(os.Stderr, "%s:%s", files[0], err) + fmt.Fprintf(os.Stderr, "%s: %s", files[0], err) ok = false } err = writeGenerated(*launcher, mk2rbc.Launcher(outputFilePath(files[0]), versionDefaultsPath, mk2rbc.MakePath2ModuleName(files[0]))) if err != nil { - fmt.Fprintf(os.Stderr, "%s:%s", files[0], err) + fmt.Fprintf(os.Stderr, "%s: %s", files[0], err) + ok = false + } + } + if *boardlauncher != "" { + if len(files) != 1 { + quit(fmt.Errorf("a launcher can be generated only for a single product")) + } + if *inputVariables == "" { + quit(fmt.Errorf("the board launcher requires an input variables file")) + } + if !convertOne(*inputVariables) { + quit(fmt.Errorf("the board launcher input variables file failed to convert")) + } + err := writeGenerated(*boardlauncher, mk2rbc.BoardLauncher( + outputFilePath(files[0]), outputFilePath(*inputVariables))) + if err != nil { + fmt.Fprintf(os.Stderr, "%s: %s", files[0], err) ok = false } } diff --git a/mk2rbc/mk2rbc.go b/mk2rbc/mk2rbc.go index 6227164e1..f2a076032 100644 --- a/mk2rbc/mk2rbc.go +++ b/mk2rbc/mk2rbc.go @@ -52,7 +52,9 @@ const ( // And here are the functions and variables: cfnGetCfg = baseName + ".cfg" cfnMain = baseName + ".product_configuration" + cfnBoardMain = baseName + ".board_configuration" cfnPrintVars = baseName + ".printvars" + cfnPrintGlobals = baseName + ".printglobals" cfnWarning = baseName + ".warning" cfnLocalAppend = baseName + ".local_append" cfnLocalSetDefault = baseName + ".local_set_default" @@ -1702,6 +1704,17 @@ func Launcher(mainModuleUri, versionDefaultsUri, mainModuleName string) string { return buf.String() } +func BoardLauncher(mainModuleUri string, inputVariablesUri string) string { + var buf bytes.Buffer + fmt.Fprintf(&buf, "load(%q, %q)\n", baseUri, baseName) + fmt.Fprintf(&buf, "load(%q, \"init\")\n", mainModuleUri) + fmt.Fprintf(&buf, "load(%q, input_variables_init = \"init\")\n", inputVariablesUri) + fmt.Fprintf(&buf, "globals, cfg, globals_base = %s(init, input_variables_init)\n", cfnBoardMain) + fmt.Fprintf(&buf, "# TODO: Some product config variables need to be printed, but most are readonly so we can't just print cfg here.\n") + fmt.Fprintf(&buf, "%s(globals, globals_base)\n", cfnPrintGlobals) + return buf.String() +} + func MakePath2ModuleName(mkPath string) string { return strings.TrimSuffix(mkPath, filepath.Ext(mkPath)) }