| // Copyright (C) 2018 The Android Open Source Project |
| // |
| // 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 configs |
| |
| import ( |
| "strings" |
| |
| "github.com/google/blueprint" |
| "github.com/google/blueprint/proptools" |
| |
| "android/soong/android" |
| ) |
| |
| var ( |
| pctx = android.NewPackageContext("android/soong/kernel/configs") |
| |
| kconfigXmlFixupRule = pctx.AndroidStaticRule("kconfig_xml_fixup", blueprint.RuleParams{ |
| Command: `${kconfigXmlFixupCmd} --input ${in} --output-version ${outputVersion} --output-matrix ${out}`, |
| CommandDeps: []string{"${kconfigXmlFixupCmd}"}, |
| Description: "kconfig_xml_fixup ${in}", |
| }, "outputVersion") |
| |
| assembleVintfRule = pctx.AndroidStaticRule("assemble_vintf", blueprint.RuleParams{ |
| Command: `${assembleVintfCmd} ${flags} -i ${in} -o ${out}`, |
| CommandDeps: []string{"${assembleVintfCmd}"}, |
| Description: "assemble_vintf -i ${in}", |
| }, "flags") |
| ) |
| |
| type KernelConfigProperties struct { |
| // List of source files. There should be: |
| // 1. Exactly One "android-base.config" as common requirements. |
| // 2. Zero or more file with names that does NOT start with "android-base-" as extra common requirements. |
| // 3. Zero or more "android-base-foo.config" for requirements on condition CONFIG_FOO=y. |
| // (deprecated; use Meta to express conditional requirements instead.) |
| Srcs []string |
| |
| // metadata XML file that contains minlts and complex conditional requirements. |
| Meta *string |
| |
| // list of source files to replace Srcs on debuggable builds. See docs for Srcs. |
| Debuggable_srcs []string |
| } |
| |
| type KernelConfigRule struct { |
| android.ModuleBase |
| properties KernelConfigProperties |
| |
| outputPath android.WritablePath |
| } |
| |
| func init() { |
| pctx.HostBinToolVariable("assembleVintfCmd", "assemble_vintf") |
| pctx.HostBinToolVariable("kconfigXmlFixupCmd", "kconfig_xml_fixup") |
| android.RegisterModuleType("kernel_config", kernelConfigFactory) |
| } |
| |
| func kernelConfigFactory() android.Module { |
| g := &KernelConfigRule{} |
| g.AddProperties(&g.properties) |
| android.InitAndroidModule(g) |
| return g |
| } |
| |
| func (g *KernelConfigRule) OutputPath() android.Path { |
| return g.outputPath |
| } |
| |
| func (g *KernelConfigRule) realSrcs(ctx android.BaseModuleContext) []string { |
| if ctx.Config().Debuggable() && len(g.properties.Debuggable_srcs) > 0 { |
| return g.properties.Debuggable_srcs |
| } else { |
| return g.properties.Srcs |
| } |
| } |
| |
| func (g *KernelConfigRule) DepsMutator(ctx android.BottomUpMutatorContext) { |
| android.ExtractSourcesDeps(ctx, g.realSrcs(ctx)) |
| android.ExtractSourceDeps(ctx, g.properties.Meta) |
| } |
| |
| func (g *KernelConfigRule) GenerateAndroidBuildActions(ctx android.ModuleContext) { |
| g.outputPath = android.PathForModuleOut(ctx, "matrix_" + g.Name() + ".xml") |
| genVersion := android.PathForModuleGen(ctx, "version.txt") |
| genConditionals := android.PathForModuleGen(ctx, "conditional.xml") |
| inputMeta := android.PathForModuleSrc(ctx, proptools.String(g.properties.Meta)) |
| |
| if proptools.String(g.properties.Meta) == "" { |
| ctx.PropertyErrorf("kernel_config", "Missing meta field") |
| } |
| |
| ctx.Build(pctx, android.BuildParams{ |
| Rule: kconfigXmlFixupRule, |
| Description: "Fixup kernel config meta", |
| Input: inputMeta, |
| Output: genConditionals, |
| ImplicitOutput: genVersion, |
| Args: map[string]string{ |
| "outputVersion": genVersion.String(), |
| }, |
| }) |
| |
| var kernelArg string |
| inputConfigs := android.PathsForModuleSrc(ctx, g.realSrcs(ctx)) |
| implicitInputs := append(inputConfigs, genVersion) |
| if len(inputConfigs) > 0 { |
| kernelArg = "--kernel=$$(cat " + genVersion.String() + "):" + |
| strings.Join(inputConfigs.Strings(), ":") |
| } |
| |
| ctx.Build(pctx, android.BuildParams{ |
| Rule: assembleVintfRule, |
| Description: "Framework Compatibility Matrix kernel fragment", |
| Input: genConditionals, |
| Implicits: implicitInputs, |
| Output: g.outputPath, |
| Args: map[string]string{ |
| "flags": kernelArg, |
| }, |
| }) |
| |
| } |