xref: /aosp_15_r20/kernel/configs/build/kernel_config.go (revision 1d3556b860e096874ddca674556f5d20fb3a73b0)
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