1*1d3556b8SAndroid Build Coastguard Worker// Copyright (C) 2018 The Android Open Source Project 2*1d3556b8SAndroid Build Coastguard Worker// 3*1d3556b8SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License"); 4*1d3556b8SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License. 5*1d3556b8SAndroid Build Coastguard Worker// You may obtain a copy of the License at 6*1d3556b8SAndroid Build Coastguard Worker// 7*1d3556b8SAndroid Build Coastguard Worker// http://www.apache.org/licenses/LICENSE-2.0 8*1d3556b8SAndroid Build Coastguard Worker// 9*1d3556b8SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software 10*1d3556b8SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS, 11*1d3556b8SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*1d3556b8SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and 13*1d3556b8SAndroid Build Coastguard Worker// limitations under the License. 14*1d3556b8SAndroid Build Coastguard Worker 15*1d3556b8SAndroid Build Coastguard Workerpackage configs 16*1d3556b8SAndroid Build Coastguard Worker 17*1d3556b8SAndroid Build Coastguard Workerimport ( 18*1d3556b8SAndroid Build Coastguard Worker "strings" 19*1d3556b8SAndroid Build Coastguard Worker 20*1d3556b8SAndroid Build Coastguard Worker "github.com/google/blueprint" 21*1d3556b8SAndroid Build Coastguard Worker "github.com/google/blueprint/proptools" 22*1d3556b8SAndroid Build Coastguard Worker 23*1d3556b8SAndroid Build Coastguard Worker "android/soong/android" 24*1d3556b8SAndroid Build Coastguard Worker) 25*1d3556b8SAndroid Build Coastguard Worker 26*1d3556b8SAndroid Build Coastguard Workervar ( 27*1d3556b8SAndroid Build Coastguard Worker pctx = android.NewPackageContext("android/soong/kernel/configs") 28*1d3556b8SAndroid Build Coastguard Worker 29*1d3556b8SAndroid Build Coastguard Worker kconfigXmlFixupRule = pctx.AndroidStaticRule("kconfig_xml_fixup", blueprint.RuleParams{ 30*1d3556b8SAndroid Build Coastguard Worker Command: `${kconfigXmlFixupCmd} --input ${in} --output-version ${outputVersion} --output-matrix ${out}`, 31*1d3556b8SAndroid Build Coastguard Worker CommandDeps: []string{"${kconfigXmlFixupCmd}"}, 32*1d3556b8SAndroid Build Coastguard Worker Description: "kconfig_xml_fixup ${in}", 33*1d3556b8SAndroid Build Coastguard Worker }, "outputVersion") 34*1d3556b8SAndroid Build Coastguard Worker 35*1d3556b8SAndroid Build Coastguard Worker assembleVintfRule = pctx.AndroidStaticRule("assemble_vintf", blueprint.RuleParams{ 36*1d3556b8SAndroid Build Coastguard Worker Command: `${assembleVintfCmd} ${flags} -i ${in} -o ${out}`, 37*1d3556b8SAndroid Build Coastguard Worker CommandDeps: []string{"${assembleVintfCmd}"}, 38*1d3556b8SAndroid Build Coastguard Worker Description: "assemble_vintf -i ${in}", 39*1d3556b8SAndroid Build Coastguard Worker }, "flags") 40*1d3556b8SAndroid Build Coastguard Worker) 41*1d3556b8SAndroid Build Coastguard Worker 42*1d3556b8SAndroid Build Coastguard Workertype KernelConfigProperties struct { 43*1d3556b8SAndroid Build Coastguard Worker // List of source files. There should be: 44*1d3556b8SAndroid Build Coastguard Worker // 1. Exactly One "android-base.config" as common requirements. 45*1d3556b8SAndroid Build Coastguard Worker // 2. Zero or more file with names that does NOT start with "android-base-" as extra common requirements. 46*1d3556b8SAndroid Build Coastguard Worker // 3. Zero or more "android-base-foo.config" for requirements on condition CONFIG_FOO=y. 47*1d3556b8SAndroid Build Coastguard Worker // (deprecated; use Meta to express conditional requirements instead.) 48*1d3556b8SAndroid Build Coastguard Worker Srcs []string 49*1d3556b8SAndroid Build Coastguard Worker 50*1d3556b8SAndroid Build Coastguard Worker // metadata XML file that contains minlts and complex conditional requirements. 51*1d3556b8SAndroid Build Coastguard Worker Meta *string 52*1d3556b8SAndroid Build Coastguard Worker 53*1d3556b8SAndroid Build Coastguard Worker // list of source files to replace Srcs on debuggable builds. See docs for Srcs. 54*1d3556b8SAndroid Build Coastguard Worker Debuggable_srcs []string 55*1d3556b8SAndroid Build Coastguard Worker} 56*1d3556b8SAndroid Build Coastguard Worker 57*1d3556b8SAndroid Build Coastguard Workertype KernelConfigRule struct { 58*1d3556b8SAndroid Build Coastguard Worker android.ModuleBase 59*1d3556b8SAndroid Build Coastguard Worker properties KernelConfigProperties 60*1d3556b8SAndroid Build Coastguard Worker 61*1d3556b8SAndroid Build Coastguard Worker outputPath android.WritablePath 62*1d3556b8SAndroid Build Coastguard Worker} 63*1d3556b8SAndroid Build Coastguard Worker 64*1d3556b8SAndroid Build Coastguard Workerfunc init() { 65*1d3556b8SAndroid Build Coastguard Worker pctx.HostBinToolVariable("assembleVintfCmd", "assemble_vintf") 66*1d3556b8SAndroid Build Coastguard Worker pctx.HostBinToolVariable("kconfigXmlFixupCmd", "kconfig_xml_fixup") 67*1d3556b8SAndroid Build Coastguard Worker android.RegisterModuleType("kernel_config", kernelConfigFactory) 68*1d3556b8SAndroid Build Coastguard Worker} 69*1d3556b8SAndroid Build Coastguard Worker 70*1d3556b8SAndroid Build Coastguard Workerfunc kernelConfigFactory() android.Module { 71*1d3556b8SAndroid Build Coastguard Worker g := &KernelConfigRule{} 72*1d3556b8SAndroid Build Coastguard Worker g.AddProperties(&g.properties) 73*1d3556b8SAndroid Build Coastguard Worker android.InitAndroidModule(g) 74*1d3556b8SAndroid Build Coastguard Worker return g 75*1d3556b8SAndroid Build Coastguard Worker} 76*1d3556b8SAndroid Build Coastguard Worker 77*1d3556b8SAndroid Build Coastguard Workerfunc (g *KernelConfigRule) OutputPath() android.Path { 78*1d3556b8SAndroid Build Coastguard Worker return g.outputPath 79*1d3556b8SAndroid Build Coastguard Worker} 80*1d3556b8SAndroid Build Coastguard Worker 81*1d3556b8SAndroid Build Coastguard Workerfunc (g *KernelConfigRule) realSrcs(ctx android.BaseModuleContext) []string { 82*1d3556b8SAndroid Build Coastguard Worker if ctx.Config().Debuggable() && len(g.properties.Debuggable_srcs) > 0 { 83*1d3556b8SAndroid Build Coastguard Worker return g.properties.Debuggable_srcs 84*1d3556b8SAndroid Build Coastguard Worker } else { 85*1d3556b8SAndroid Build Coastguard Worker return g.properties.Srcs 86*1d3556b8SAndroid Build Coastguard Worker } 87*1d3556b8SAndroid Build Coastguard Worker} 88*1d3556b8SAndroid Build Coastguard Worker 89*1d3556b8SAndroid Build Coastguard Workerfunc (g *KernelConfigRule) DepsMutator(ctx android.BottomUpMutatorContext) { 90*1d3556b8SAndroid Build Coastguard Worker android.ExtractSourcesDeps(ctx, g.realSrcs(ctx)) 91*1d3556b8SAndroid Build Coastguard Worker android.ExtractSourceDeps(ctx, g.properties.Meta) 92*1d3556b8SAndroid Build Coastguard Worker} 93*1d3556b8SAndroid Build Coastguard Worker 94*1d3556b8SAndroid Build Coastguard Workerfunc (g *KernelConfigRule) GenerateAndroidBuildActions(ctx android.ModuleContext) { 95*1d3556b8SAndroid Build Coastguard Worker g.outputPath = android.PathForModuleOut(ctx, "matrix_" + g.Name() + ".xml") 96*1d3556b8SAndroid Build Coastguard Worker genVersion := android.PathForModuleGen(ctx, "version.txt") 97*1d3556b8SAndroid Build Coastguard Worker genConditionals := android.PathForModuleGen(ctx, "conditional.xml") 98*1d3556b8SAndroid Build Coastguard Worker inputMeta := android.PathForModuleSrc(ctx, proptools.String(g.properties.Meta)) 99*1d3556b8SAndroid Build Coastguard Worker 100*1d3556b8SAndroid Build Coastguard Worker if proptools.String(g.properties.Meta) == "" { 101*1d3556b8SAndroid Build Coastguard Worker ctx.PropertyErrorf("kernel_config", "Missing meta field") 102*1d3556b8SAndroid Build Coastguard Worker } 103*1d3556b8SAndroid Build Coastguard Worker 104*1d3556b8SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 105*1d3556b8SAndroid Build Coastguard Worker Rule: kconfigXmlFixupRule, 106*1d3556b8SAndroid Build Coastguard Worker Description: "Fixup kernel config meta", 107*1d3556b8SAndroid Build Coastguard Worker Input: inputMeta, 108*1d3556b8SAndroid Build Coastguard Worker Output: genConditionals, 109*1d3556b8SAndroid Build Coastguard Worker ImplicitOutput: genVersion, 110*1d3556b8SAndroid Build Coastguard Worker Args: map[string]string{ 111*1d3556b8SAndroid Build Coastguard Worker "outputVersion": genVersion.String(), 112*1d3556b8SAndroid Build Coastguard Worker }, 113*1d3556b8SAndroid Build Coastguard Worker }) 114*1d3556b8SAndroid Build Coastguard Worker 115*1d3556b8SAndroid Build Coastguard Worker var kernelArg string 116*1d3556b8SAndroid Build Coastguard Worker inputConfigs := android.PathsForModuleSrc(ctx, g.realSrcs(ctx)) 117*1d3556b8SAndroid Build Coastguard Worker implicitInputs := append(inputConfigs, genVersion) 118*1d3556b8SAndroid Build Coastguard Worker if len(inputConfigs) > 0 { 119*1d3556b8SAndroid Build Coastguard Worker kernelArg = "--kernel=$$(cat " + genVersion.String() + "):" + 120*1d3556b8SAndroid Build Coastguard Worker strings.Join(inputConfigs.Strings(), ":") 121*1d3556b8SAndroid Build Coastguard Worker } 122*1d3556b8SAndroid Build Coastguard Worker 123*1d3556b8SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 124*1d3556b8SAndroid Build Coastguard Worker Rule: assembleVintfRule, 125*1d3556b8SAndroid Build Coastguard Worker Description: "Framework Compatibility Matrix kernel fragment", 126*1d3556b8SAndroid Build Coastguard Worker Input: genConditionals, 127*1d3556b8SAndroid Build Coastguard Worker Implicits: implicitInputs, 128*1d3556b8SAndroid Build Coastguard Worker Output: g.outputPath, 129*1d3556b8SAndroid Build Coastguard Worker Args: map[string]string{ 130*1d3556b8SAndroid Build Coastguard Worker "flags": kernelArg, 131*1d3556b8SAndroid Build Coastguard Worker }, 132*1d3556b8SAndroid Build Coastguard Worker }) 133*1d3556b8SAndroid Build Coastguard Worker 134*1d3556b8SAndroid Build Coastguard Worker} 135