newt/extcmd/extcmd.go (50 lines of code) (raw):

/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package extcmd import ( "fmt" "mynewt.apache.org/newt/newt/cfgv" "mynewt.apache.org/newt/newt/pkg" "mynewt.apache.org/newt/newt/stage" "mynewt.apache.org/newt/newt/syscfg" ) // ExtCmdCfg represents an ordered list of external commands that get run // during the build (aka "user scripts"). type ExtCmdCfg struct { // Used in diagnostic messages only (example: "pre_build_cmds"). Name string // Sorted in call order (stage-num,command-string). StageFuncs []stage.StageFunc // Strings describing errors encountered while parsing the extcmd config. InvalidSettings []string } // GetMapFn retrieves a set of ordered external commands from a package. For // example, one GetMapFn instance might retrieve a package's pre-build // commands. type GetMapFn func( lpkg *pkg.LocalPackage, settings *cfgv.Settings) map[string]string func (ecfg *ExtCmdCfg) readOnePkg(lpkg *pkg.LocalPackage, cfg *syscfg.Cfg, getMapCb GetMapFn) { settings := cfg.AllSettingsForLpkg(lpkg) cmdMap := getMapCb(lpkg, settings) for name, stageStr := range cmdMap { sf, err := stage.NewStageFunc(name, stageStr, lpkg, cfg) if err != nil { text := fmt.Sprintf("%s: %s", lpkg.FullName(), err.Error()) ecfg.InvalidSettings = append(ecfg.InvalidSettings, text) } else { ecfg.StageFuncs = append(ecfg.StageFuncs, sf) } } } // Read constructs an external command configuration from a full set of // packages. func Read(name string, lpkgs []*pkg.LocalPackage, cfg *syscfg.Cfg, getMapCb GetMapFn) ExtCmdCfg { ecfg := ExtCmdCfg{ Name: name, } for _, lpkg := range lpkgs { ecfg.readOnePkg(lpkg, cfg, getMapCb) } stage.SortStageFuncs(ecfg.StageFuncs, ecfg.Name) return ecfg } // If any errors were encountered while parsing extcmd definitions, this // function returns a string indicating the errors. If no errors were // encountered, "" is returned. func (ecfg *ExtCmdCfg) ErrorText() string { str := "" if len(ecfg.InvalidSettings) > 0 { str += fmt.Sprintf("Invalid %s definitions detected:", ecfg.Name) for _, e := range ecfg.InvalidSettings { str += "\n " + e } } return str }