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)) }