blob: 68551187bb4a1298166c56b6e6fcf9ac03e57c0b [file] [log] [blame]
Joe Onorato37f900c2023-07-18 16:58:16 -07001// Copyright 2023 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
Yu Liueae7b362023-11-16 17:05:47 -080015package codegen
Joe Onorato37f900c2023-07-18 16:58:16 -070016
17import (
Yu Liueae7b362023-11-16 17:05:47 -080018 "android/soong/aconfig"
Joe Onorato37f900c2023-07-18 16:58:16 -070019 "android/soong/android"
Yu Liu855cfc22023-09-14 15:10:03 -070020 "android/soong/bazel"
Joe Onorato37f900c2023-07-18 16:58:16 -070021 "android/soong/cc"
Dennis Shenc5e39f52023-09-14 18:52:49 +000022
Joe Onorato37f900c2023-07-18 16:58:16 -070023 "github.com/google/blueprint"
Dennis Shenc5e39f52023-09-14 18:52:49 +000024 "github.com/google/blueprint/proptools"
Joe Onorato37f900c2023-07-18 16:58:16 -070025
26 "fmt"
27 "strings"
28)
29
30type ccDeclarationsTagType struct {
31 blueprint.BaseDependencyTag
32}
33
34var ccDeclarationsTag = ccDeclarationsTagType{}
35
Yu Liu855cfc22023-09-14 15:10:03 -070036const baseLibDep = "server_configurable_flags"
37
Joe Onorato37f900c2023-07-18 16:58:16 -070038type CcAconfigLibraryProperties struct {
39 // name of the aconfig_declarations module to generate a library for
40 Aconfig_declarations string
Dennis Shenc5e39f52023-09-14 18:52:49 +000041
Zi Wang275f6542023-11-09 14:59:31 -080042 // default mode is "production", the other accepted modes are:
43 // "test": to generate test mode version of the library
44 // "exported": to generate exported mode version of the library
45 // an error will be thrown if the mode is not supported
46 Mode *string
Joe Onorato37f900c2023-07-18 16:58:16 -070047}
48
49type CcAconfigLibraryCallbacks struct {
50 properties *CcAconfigLibraryProperties
51
52 generatedDir android.WritablePath
53 headerDir android.WritablePath
54 generatedCpp android.WritablePath
55 generatedH android.WritablePath
56}
57
58func CcAconfigLibraryFactory() android.Module {
59 callbacks := &CcAconfigLibraryCallbacks{
60 properties: &CcAconfigLibraryProperties{},
61 }
62 return cc.GeneratedCcLibraryModuleFactory("cc_aconfig_library", callbacks)
63}
64
65func (this *CcAconfigLibraryCallbacks) GeneratorInit(ctx cc.BaseModuleContext) {
66}
67
68func (this *CcAconfigLibraryCallbacks) GeneratorProps() []interface{} {
69 return []interface{}{this.properties}
70}
71
72func (this *CcAconfigLibraryCallbacks) GeneratorDeps(ctx cc.DepsContext, deps cc.Deps) cc.Deps {
73 // Add a dependency for the declarations module
74 declarations := this.properties.Aconfig_declarations
75 if len(declarations) == 0 {
76 ctx.PropertyErrorf("aconfig_declarations", "aconfig_declarations property required")
77 } else {
78 ctx.AddDependency(ctx.Module(), ccDeclarationsTag, declarations)
79 }
80
81 // Add a dependency for the aconfig flags base library
Yu Liu855cfc22023-09-14 15:10:03 -070082 deps.SharedLibs = append(deps.SharedLibs, baseLibDep)
Joe Onorato37f900c2023-07-18 16:58:16 -070083 // TODO: It'd be really nice if we could reexport this library and not make everyone do it.
84
85 return deps
86}
87
88func (this *CcAconfigLibraryCallbacks) GeneratorSources(ctx cc.ModuleContext) cc.GeneratedSource {
89 result := cc.GeneratedSource{}
90
91 // Get the values that came from the global RELEASE_ACONFIG_VALUE_SETS flag
92 declarationsModules := ctx.GetDirectDepsWithTag(ccDeclarationsTag)
93 if len(declarationsModules) != 1 {
94 panic(fmt.Errorf("Exactly one aconfig_declarations property required"))
95 }
Yu Liueae7b362023-11-16 17:05:47 -080096 declarations := ctx.OtherModuleProvider(declarationsModules[0], aconfig.DeclarationsProviderKey).(aconfig.DeclarationsProviderData)
Joe Onorato37f900c2023-07-18 16:58:16 -070097
98 // Figure out the generated file paths. This has to match aconfig's codegen_cpp.rs.
99 this.generatedDir = android.PathForModuleGen(ctx)
100
101 this.headerDir = android.PathForModuleGen(ctx, "include")
102 result.IncludeDirs = []android.Path{this.headerDir}
103 result.ReexportedDirs = []android.Path{this.headerDir}
104
105 basename := strings.ReplaceAll(declarations.Package, ".", "_")
106
107 this.generatedCpp = android.PathForModuleGen(ctx, basename+".cc")
108 result.Sources = []android.Path{this.generatedCpp}
109
110 this.generatedH = android.PathForModuleGen(ctx, "include", basename+".h")
111 result.Headers = []android.Path{this.generatedH}
112
113 return result
114}
115
116func (this *CcAconfigLibraryCallbacks) GeneratorFlags(ctx cc.ModuleContext, flags cc.Flags, deps cc.PathDeps) cc.Flags {
117 return flags
118}
119
120func (this *CcAconfigLibraryCallbacks) GeneratorBuildActions(ctx cc.ModuleContext, flags cc.Flags, deps cc.PathDeps) {
121 // Get the values that came from the global RELEASE_ACONFIG_VALUE_SETS flag
122 declarationsModules := ctx.GetDirectDepsWithTag(ccDeclarationsTag)
123 if len(declarationsModules) != 1 {
124 panic(fmt.Errorf("Exactly one aconfig_declarations property required"))
125 }
Yu Liueae7b362023-11-16 17:05:47 -0800126 declarations := ctx.OtherModuleProvider(declarationsModules[0], aconfig.DeclarationsProviderKey).(aconfig.DeclarationsProviderData)
Joe Onorato37f900c2023-07-18 16:58:16 -0700127
Zi Wang275f6542023-11-09 14:59:31 -0800128 mode := proptools.StringDefault(this.properties.Mode, "production")
129 if !isModeSupported(mode) {
130 ctx.PropertyErrorf("mode", "%q is not a supported mode", mode)
131 }
Zi Wangd72e2db2023-11-13 16:01:13 -0800132
Joe Onorato37f900c2023-07-18 16:58:16 -0700133 ctx.Build(pctx, android.BuildParams{
134 Rule: cppRule,
Jihoon Kangcca3e0c2023-11-29 19:35:29 +0000135 Input: declarations.IntermediateCacheOutputPath,
Joe Onorato37f900c2023-07-18 16:58:16 -0700136 Outputs: []android.WritablePath{
137 this.generatedCpp,
138 this.generatedH,
139 },
140 Description: "cc_aconfig_library",
141 Args: map[string]string{
142 "gendir": this.generatedDir.String(),
Dennis Shenc5e39f52023-09-14 18:52:49 +0000143 "mode": mode,
Joe Onorato37f900c2023-07-18 16:58:16 -0700144 },
145 })
146}
Yu Liu855cfc22023-09-14 15:10:03 -0700147
148type bazelCcAconfigLibraryAttributes struct {
Yu Liuf11b7c32023-10-20 19:15:51 +0000149 cc.SdkAttributes
Yu Liu855cfc22023-09-14 15:10:03 -0700150 Aconfig_declarations bazel.LabelAttribute
151 Dynamic_deps bazel.LabelListAttribute
152}
153
154// Convert the cc_aconfig_library module to bazel.
155//
156// This method is called from cc.ConvertWithBp2build to actually convert the
157// cc_aconfig_library module. This is necessary since the factory method of this
158// module type returns a cc library and the bp2build conversion is called on the
159// cc library type.
160
Yu Liuf11b7c32023-10-20 19:15:51 +0000161func (this *CcAconfigLibraryCallbacks) GeneratorBp2build(ctx android.Bp2buildMutatorContext, module *cc.Module) bool {
Yu Liu855cfc22023-09-14 15:10:03 -0700162 if ctx.ModuleType() != "cc_aconfig_library" {
163 return false
164 }
165
166 attrs := bazelCcAconfigLibraryAttributes{
Yu Liuf11b7c32023-10-20 19:15:51 +0000167 SdkAttributes: cc.Bp2BuildParseSdkAttributes(module),
Yu Liu855cfc22023-09-14 15:10:03 -0700168 Aconfig_declarations: *bazel.MakeLabelAttribute(android.BazelLabelForModuleDepSingle(ctx, this.properties.Aconfig_declarations).Label),
169 Dynamic_deps: bazel.MakeLabelListAttribute(android.BazelLabelForModuleDeps(ctx, []string{baseLibDep})),
170 }
171 props := bazel.BazelTargetModuleProperties{
172 Rule_class: "cc_aconfig_library",
173 Bzl_load_location: "//build/bazel/rules/cc:cc_aconfig_library.bzl",
174 }
175
Yu Liuf11b7c32023-10-20 19:15:51 +0000176 ctx.CreateBazelTargetModule(
177 props,
178 android.CommonAttributes{
179 Name: ctx.ModuleName(),
180 Tags: android.ApexAvailableTagsWithoutTestApexes(ctx, module),
181 },
182 &attrs)
Yu Liu855cfc22023-09-14 15:10:03 -0700183 return true
184}