// Copyright 2021 Google LLC // // Licensed 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 mk2rbc import ( "bytes" "fmt" "io/ioutil" "os" "strings" mkparser "android/soong/androidmk/parser" ) // Extracts the list of product config variables from a file, calling // given registrar for each variable. func FindConfigVariables(mkFile string, vr variableRegistrar) error { mkContents, err := ioutil.ReadFile(mkFile) if err != nil { return err } parser := mkparser.NewParser(mkFile, bytes.NewBuffer(mkContents)) nodes, errs := parser.Parse() if len(errs) > 0 { for _, e := range errs { fmt.Fprintln(os.Stderr, "ERROR:", e) } return fmt.Errorf("cannot parse %s", mkFile) } for _, node := range nodes { asgn, ok := node.(*mkparser.Assignment) if !ok { continue } // We are looking for a variable called '_product_list_vars' // or '_product_single_value_vars'. if !asgn.Name.Const() { continue } varName := asgn.Name.Strings[0] var starType starlarkType if varName == "_product_list_vars" { starType = starlarkTypeList } else if varName == "_product_single_value_vars" { starType = starlarkTypeUnknown } else { continue } for _, name := range strings.Fields(asgn.Value.Dump()) { vr.NewVariable(name, VarClassConfig, starType) } } return nil }