xref: /aosp_15_r20/build/soong/cc/vndk_prebuilt.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright 2017 Google Inc. All rights reserved.
2*333d2b36SAndroid Build Coastguard Worker//
3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License");
4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License.
5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at
6*333d2b36SAndroid Build Coastguard Worker//
7*333d2b36SAndroid Build Coastguard Worker//     http://www.apache.org/licenses/LICENSE-2.0
8*333d2b36SAndroid Build Coastguard Worker//
9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS,
11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and
13*333d2b36SAndroid Build Coastguard Worker// limitations under the License.
14*333d2b36SAndroid Build Coastguard Worker
15*333d2b36SAndroid Build Coastguard Workerpackage cc
16*333d2b36SAndroid Build Coastguard Worker
17*333d2b36SAndroid Build Coastguard Workerimport (
18*333d2b36SAndroid Build Coastguard Worker	"strings"
19*333d2b36SAndroid Build Coastguard Worker
20*333d2b36SAndroid Build Coastguard Worker	"android/soong/android"
21*333d2b36SAndroid Build Coastguard Worker)
22*333d2b36SAndroid Build Coastguard Worker
23*333d2b36SAndroid Build Coastguard Workervar (
24*333d2b36SAndroid Build Coastguard Worker	vndkSuffix     = ".vndk."
25*333d2b36SAndroid Build Coastguard Worker	binder32Suffix = ".binder32"
26*333d2b36SAndroid Build Coastguard Worker)
27*333d2b36SAndroid Build Coastguard Worker
28*333d2b36SAndroid Build Coastguard Worker// Creates vndk prebuilts that include the VNDK version.
29*333d2b36SAndroid Build Coastguard Worker//
30*333d2b36SAndroid Build Coastguard Worker// Example:
31*333d2b36SAndroid Build Coastguard Worker//
32*333d2b36SAndroid Build Coastguard Worker//	vndk_prebuilt_shared {
33*333d2b36SAndroid Build Coastguard Worker//	    name: "libfoo",
34*333d2b36SAndroid Build Coastguard Worker//	    version: "27",
35*333d2b36SAndroid Build Coastguard Worker//	    target_arch: "arm64",
36*333d2b36SAndroid Build Coastguard Worker//	    vendor_available: true,
37*333d2b36SAndroid Build Coastguard Worker//	    product_available: true,
38*333d2b36SAndroid Build Coastguard Worker//	    vndk: {
39*333d2b36SAndroid Build Coastguard Worker//	        enabled: true,
40*333d2b36SAndroid Build Coastguard Worker//	    },
41*333d2b36SAndroid Build Coastguard Worker//	    export_include_dirs: ["include/external/libfoo/vndk_include"],
42*333d2b36SAndroid Build Coastguard Worker//	    arch: {
43*333d2b36SAndroid Build Coastguard Worker//	        arm64: {
44*333d2b36SAndroid Build Coastguard Worker//	            srcs: ["arm/lib64/libfoo.so"],
45*333d2b36SAndroid Build Coastguard Worker//	        },
46*333d2b36SAndroid Build Coastguard Worker//	        arm: {
47*333d2b36SAndroid Build Coastguard Worker//	            srcs: ["arm/lib/libfoo.so"],
48*333d2b36SAndroid Build Coastguard Worker//	        },
49*333d2b36SAndroid Build Coastguard Worker//	    },
50*333d2b36SAndroid Build Coastguard Worker//	}
51*333d2b36SAndroid Build Coastguard Workertype vndkPrebuiltProperties struct {
52*333d2b36SAndroid Build Coastguard Worker	VndkProperties
53*333d2b36SAndroid Build Coastguard Worker
54*333d2b36SAndroid Build Coastguard Worker	// VNDK snapshot version.
55*333d2b36SAndroid Build Coastguard Worker	Version *string
56*333d2b36SAndroid Build Coastguard Worker
57*333d2b36SAndroid Build Coastguard Worker	// Target arch name of the snapshot (e.g. 'arm64' for variant 'aosp_arm64')
58*333d2b36SAndroid Build Coastguard Worker	Target_arch *string
59*333d2b36SAndroid Build Coastguard Worker
60*333d2b36SAndroid Build Coastguard Worker	// If the prebuilt snapshot lib is built with 32 bit binder, this must be set to true.
61*333d2b36SAndroid Build Coastguard Worker	// The lib with 64 bit binder does not need to set this property.
62*333d2b36SAndroid Build Coastguard Worker	Binder32bit *bool
63*333d2b36SAndroid Build Coastguard Worker
64*333d2b36SAndroid Build Coastguard Worker	// Prebuilt files for each arch.
65*333d2b36SAndroid Build Coastguard Worker	Srcs []string `android:"arch_variant"`
66*333d2b36SAndroid Build Coastguard Worker
67*333d2b36SAndroid Build Coastguard Worker	// list of flags that will be used for any module that links against this module.
68*333d2b36SAndroid Build Coastguard Worker	Export_flags []string `android:"arch_variant"`
69*333d2b36SAndroid Build Coastguard Worker
70*333d2b36SAndroid Build Coastguard Worker	// Check the prebuilt ELF files (e.g. DT_SONAME, DT_NEEDED, resolution of undefined symbols,
71*333d2b36SAndroid Build Coastguard Worker	// etc).
72*333d2b36SAndroid Build Coastguard Worker	Check_elf_files *bool
73*333d2b36SAndroid Build Coastguard Worker}
74*333d2b36SAndroid Build Coastguard Worker
75*333d2b36SAndroid Build Coastguard Workertype vndkPrebuiltLibraryDecorator struct {
76*333d2b36SAndroid Build Coastguard Worker	*libraryDecorator
77*333d2b36SAndroid Build Coastguard Worker	properties      vndkPrebuiltProperties
78*333d2b36SAndroid Build Coastguard Worker	androidMkSuffix string
79*333d2b36SAndroid Build Coastguard Worker}
80*333d2b36SAndroid Build Coastguard Worker
81*333d2b36SAndroid Build Coastguard Workerfunc (p *vndkPrebuiltLibraryDecorator) Name(name string) string {
82*333d2b36SAndroid Build Coastguard Worker	return name + p.NameSuffix()
83*333d2b36SAndroid Build Coastguard Worker}
84*333d2b36SAndroid Build Coastguard Worker
85*333d2b36SAndroid Build Coastguard Workerfunc (p *vndkPrebuiltLibraryDecorator) NameSuffix() string {
86*333d2b36SAndroid Build Coastguard Worker	suffix := p.Version()
87*333d2b36SAndroid Build Coastguard Worker	if p.arch() != "" {
88*333d2b36SAndroid Build Coastguard Worker		suffix += "." + p.arch()
89*333d2b36SAndroid Build Coastguard Worker	}
90*333d2b36SAndroid Build Coastguard Worker	if Bool(p.properties.Binder32bit) {
91*333d2b36SAndroid Build Coastguard Worker		suffix += binder32Suffix
92*333d2b36SAndroid Build Coastguard Worker	}
93*333d2b36SAndroid Build Coastguard Worker	return vndkSuffix + suffix
94*333d2b36SAndroid Build Coastguard Worker}
95*333d2b36SAndroid Build Coastguard Worker
96*333d2b36SAndroid Build Coastguard Workerfunc (p *vndkPrebuiltLibraryDecorator) Version() string {
97*333d2b36SAndroid Build Coastguard Worker	return String(p.properties.Version)
98*333d2b36SAndroid Build Coastguard Worker}
99*333d2b36SAndroid Build Coastguard Worker
100*333d2b36SAndroid Build Coastguard Workerfunc (p *vndkPrebuiltLibraryDecorator) arch() string {
101*333d2b36SAndroid Build Coastguard Worker	return String(p.properties.Target_arch)
102*333d2b36SAndroid Build Coastguard Worker}
103*333d2b36SAndroid Build Coastguard Worker
104*333d2b36SAndroid Build Coastguard Workerfunc (p *vndkPrebuiltLibraryDecorator) binderBit() string {
105*333d2b36SAndroid Build Coastguard Worker	if Bool(p.properties.Binder32bit) {
106*333d2b36SAndroid Build Coastguard Worker		return "32"
107*333d2b36SAndroid Build Coastguard Worker	}
108*333d2b36SAndroid Build Coastguard Worker	return "64"
109*333d2b36SAndroid Build Coastguard Worker}
110*333d2b36SAndroid Build Coastguard Worker
111*333d2b36SAndroid Build Coastguard Workerfunc (p *vndkPrebuiltLibraryDecorator) SnapshotAndroidMkSuffix() string {
112*333d2b36SAndroid Build Coastguard Worker	return ".vendor"
113*333d2b36SAndroid Build Coastguard Worker}
114*333d2b36SAndroid Build Coastguard Worker
115*333d2b36SAndroid Build Coastguard Workerfunc (p *vndkPrebuiltLibraryDecorator) linkerFlags(ctx ModuleContext, flags Flags) Flags {
116*333d2b36SAndroid Build Coastguard Worker	p.libraryDecorator.libName = strings.TrimSuffix(ctx.ModuleName(), p.NameSuffix())
117*333d2b36SAndroid Build Coastguard Worker	return p.libraryDecorator.linkerFlags(ctx, flags)
118*333d2b36SAndroid Build Coastguard Worker}
119*333d2b36SAndroid Build Coastguard Worker
120*333d2b36SAndroid Build Coastguard Workerfunc (p *vndkPrebuiltLibraryDecorator) singleSourcePath(ctx ModuleContext) android.Path {
121*333d2b36SAndroid Build Coastguard Worker	if len(p.properties.Srcs) == 0 {
122*333d2b36SAndroid Build Coastguard Worker		ctx.PropertyErrorf("srcs", "missing prebuilt source file")
123*333d2b36SAndroid Build Coastguard Worker		return nil
124*333d2b36SAndroid Build Coastguard Worker	}
125*333d2b36SAndroid Build Coastguard Worker
126*333d2b36SAndroid Build Coastguard Worker	if len(p.properties.Srcs) > 1 {
127*333d2b36SAndroid Build Coastguard Worker		ctx.PropertyErrorf("srcs", "multiple prebuilt source files")
128*333d2b36SAndroid Build Coastguard Worker		return nil
129*333d2b36SAndroid Build Coastguard Worker	}
130*333d2b36SAndroid Build Coastguard Worker
131*333d2b36SAndroid Build Coastguard Worker	return android.PathForModuleSrc(ctx, p.properties.Srcs[0])
132*333d2b36SAndroid Build Coastguard Worker}
133*333d2b36SAndroid Build Coastguard Worker
134*333d2b36SAndroid Build Coastguard Workerfunc (p *vndkPrebuiltLibraryDecorator) link(ctx ModuleContext,
135*333d2b36SAndroid Build Coastguard Worker	flags Flags, deps PathDeps, objs Objects) android.Path {
136*333d2b36SAndroid Build Coastguard Worker	if !p.MatchesWithDevice(ctx.DeviceConfig()) {
137*333d2b36SAndroid Build Coastguard Worker		ctx.Module().HideFromMake()
138*333d2b36SAndroid Build Coastguard Worker		return nil
139*333d2b36SAndroid Build Coastguard Worker	}
140*333d2b36SAndroid Build Coastguard Worker
141*333d2b36SAndroid Build Coastguard Worker	if len(p.properties.Srcs) > 0 && p.shared() {
142*333d2b36SAndroid Build Coastguard Worker		p.libraryDecorator.exportIncludes(ctx)
143*333d2b36SAndroid Build Coastguard Worker		p.libraryDecorator.reexportFlags(p.properties.Export_flags...)
144*333d2b36SAndroid Build Coastguard Worker		// current VNDK prebuilts are only shared libs.
145*333d2b36SAndroid Build Coastguard Worker
146*333d2b36SAndroid Build Coastguard Worker		in := p.singleSourcePath(ctx)
147*333d2b36SAndroid Build Coastguard Worker		p.unstrippedOutputFile = in
148*333d2b36SAndroid Build Coastguard Worker		libName := in.Base()
149*333d2b36SAndroid Build Coastguard Worker		if p.stripper.NeedsStrip(ctx) {
150*333d2b36SAndroid Build Coastguard Worker			stripFlags := flagsToStripFlags(flags)
151*333d2b36SAndroid Build Coastguard Worker			stripped := android.PathForModuleOut(ctx, "stripped", libName)
152*333d2b36SAndroid Build Coastguard Worker			p.stripper.StripExecutableOrSharedLib(ctx, in, stripped, stripFlags)
153*333d2b36SAndroid Build Coastguard Worker			in = stripped
154*333d2b36SAndroid Build Coastguard Worker		}
155*333d2b36SAndroid Build Coastguard Worker
156*333d2b36SAndroid Build Coastguard Worker		// Optimize out relinking against shared libraries whose interface hasn't changed by
157*333d2b36SAndroid Build Coastguard Worker		// depending on a table of contents file instead of the library itself.
158*333d2b36SAndroid Build Coastguard Worker		tocFile := android.PathForModuleOut(ctx, libName+".toc")
159*333d2b36SAndroid Build Coastguard Worker		p.tocFile = android.OptionalPathForPath(tocFile)
160*333d2b36SAndroid Build Coastguard Worker		TransformSharedObjectToToc(ctx, in, tocFile)
161*333d2b36SAndroid Build Coastguard Worker
162*333d2b36SAndroid Build Coastguard Worker		p.androidMkSuffix = p.NameSuffix()
163*333d2b36SAndroid Build Coastguard Worker
164*333d2b36SAndroid Build Coastguard Worker		android.SetProvider(ctx, SharedLibraryInfoProvider, SharedLibraryInfo{
165*333d2b36SAndroid Build Coastguard Worker			SharedLibrary: in,
166*333d2b36SAndroid Build Coastguard Worker			Target:        ctx.Target(),
167*333d2b36SAndroid Build Coastguard Worker
168*333d2b36SAndroid Build Coastguard Worker			TableOfContents: p.tocFile,
169*333d2b36SAndroid Build Coastguard Worker			IsStubs:         false,
170*333d2b36SAndroid Build Coastguard Worker		})
171*333d2b36SAndroid Build Coastguard Worker
172*333d2b36SAndroid Build Coastguard Worker		p.libraryDecorator.flagExporter.setProvider(ctx)
173*333d2b36SAndroid Build Coastguard Worker
174*333d2b36SAndroid Build Coastguard Worker		return in
175*333d2b36SAndroid Build Coastguard Worker	}
176*333d2b36SAndroid Build Coastguard Worker
177*333d2b36SAndroid Build Coastguard Worker	ctx.Module().HideFromMake()
178*333d2b36SAndroid Build Coastguard Worker	return nil
179*333d2b36SAndroid Build Coastguard Worker}
180*333d2b36SAndroid Build Coastguard Worker
181*333d2b36SAndroid Build Coastguard Workerfunc (p *vndkPrebuiltLibraryDecorator) moduleInfoJSON(ctx ModuleContext, moduleInfoJSON *android.ModuleInfoJSON) {
182*333d2b36SAndroid Build Coastguard Worker	p.libraryDecorator.moduleInfoJSON(ctx, moduleInfoJSON)
183*333d2b36SAndroid Build Coastguard Worker	moduleInfoJSON.SubName += p.androidMkSuffix
184*333d2b36SAndroid Build Coastguard Worker}
185*333d2b36SAndroid Build Coastguard Worker
186*333d2b36SAndroid Build Coastguard Workerfunc (p *vndkPrebuiltLibraryDecorator) MatchesWithDevice(config android.DeviceConfig) bool {
187*333d2b36SAndroid Build Coastguard Worker	arches := config.Arches()
188*333d2b36SAndroid Build Coastguard Worker	if len(arches) == 0 || arches[0].ArchType.String() != p.arch() {
189*333d2b36SAndroid Build Coastguard Worker		return false
190*333d2b36SAndroid Build Coastguard Worker	}
191*333d2b36SAndroid Build Coastguard Worker	if config.BinderBitness() != p.binderBit() {
192*333d2b36SAndroid Build Coastguard Worker		return false
193*333d2b36SAndroid Build Coastguard Worker	}
194*333d2b36SAndroid Build Coastguard Worker	if len(p.properties.Srcs) == 0 {
195*333d2b36SAndroid Build Coastguard Worker		return false
196*333d2b36SAndroid Build Coastguard Worker	}
197*333d2b36SAndroid Build Coastguard Worker	return true
198*333d2b36SAndroid Build Coastguard Worker}
199*333d2b36SAndroid Build Coastguard Worker
200*333d2b36SAndroid Build Coastguard Workerfunc (p *vndkPrebuiltLibraryDecorator) nativeCoverage() bool {
201*333d2b36SAndroid Build Coastguard Worker	return false
202*333d2b36SAndroid Build Coastguard Worker}
203*333d2b36SAndroid Build Coastguard Worker
204*333d2b36SAndroid Build Coastguard Workerfunc (p *vndkPrebuiltLibraryDecorator) IsSnapshotPrebuilt() bool {
205*333d2b36SAndroid Build Coastguard Worker	return true
206*333d2b36SAndroid Build Coastguard Worker}
207*333d2b36SAndroid Build Coastguard Worker
208*333d2b36SAndroid Build Coastguard Workerfunc (p *vndkPrebuiltLibraryDecorator) install(ctx ModuleContext, file android.Path) {
209*333d2b36SAndroid Build Coastguard Worker	// do not install vndk libs
210*333d2b36SAndroid Build Coastguard Worker}
211*333d2b36SAndroid Build Coastguard Worker
212*333d2b36SAndroid Build Coastguard Workerfunc vndkPrebuiltSharedLibrary() *Module {
213*333d2b36SAndroid Build Coastguard Worker	module, library := NewLibrary(android.DeviceSupported)
214*333d2b36SAndroid Build Coastguard Worker	library.BuildOnlyShared()
215*333d2b36SAndroid Build Coastguard Worker	module.stl = nil
216*333d2b36SAndroid Build Coastguard Worker	module.sanitize = nil
217*333d2b36SAndroid Build Coastguard Worker	library.disableStripping()
218*333d2b36SAndroid Build Coastguard Worker
219*333d2b36SAndroid Build Coastguard Worker	prebuilt := &vndkPrebuiltLibraryDecorator{
220*333d2b36SAndroid Build Coastguard Worker		libraryDecorator: library,
221*333d2b36SAndroid Build Coastguard Worker	}
222*333d2b36SAndroid Build Coastguard Worker
223*333d2b36SAndroid Build Coastguard Worker	prebuilt.properties.Check_elf_files = BoolPtr(false)
224*333d2b36SAndroid Build Coastguard Worker	prebuilt.baseLinker.Properties.No_libcrt = BoolPtr(true)
225*333d2b36SAndroid Build Coastguard Worker	prebuilt.baseLinker.Properties.Nocrt = BoolPtr(true)
226*333d2b36SAndroid Build Coastguard Worker	prebuilt.baseLinker.Properties.No_crt_pad_segment = BoolPtr(true)
227*333d2b36SAndroid Build Coastguard Worker
228*333d2b36SAndroid Build Coastguard Worker	// Prevent default system libs (libc, libm, and libdl) from being linked
229*333d2b36SAndroid Build Coastguard Worker	if prebuilt.baseLinker.Properties.System_shared_libs == nil {
230*333d2b36SAndroid Build Coastguard Worker		prebuilt.baseLinker.Properties.System_shared_libs = []string{}
231*333d2b36SAndroid Build Coastguard Worker	}
232*333d2b36SAndroid Build Coastguard Worker
233*333d2b36SAndroid Build Coastguard Worker	module.compiler = nil
234*333d2b36SAndroid Build Coastguard Worker	module.linker = prebuilt
235*333d2b36SAndroid Build Coastguard Worker	module.installer = prebuilt
236*333d2b36SAndroid Build Coastguard Worker
237*333d2b36SAndroid Build Coastguard Worker	module.AddProperties(
238*333d2b36SAndroid Build Coastguard Worker		&prebuilt.properties,
239*333d2b36SAndroid Build Coastguard Worker	)
240*333d2b36SAndroid Build Coastguard Worker
241*333d2b36SAndroid Build Coastguard Worker	return module
242*333d2b36SAndroid Build Coastguard Worker}
243*333d2b36SAndroid Build Coastguard Worker
244*333d2b36SAndroid Build Coastguard Worker// vndk_prebuilt_shared installs Vendor Native Development kit (VNDK) snapshot
245*333d2b36SAndroid Build Coastguard Worker// shared libraries for system build. Example:
246*333d2b36SAndroid Build Coastguard Worker//
247*333d2b36SAndroid Build Coastguard Worker//	vndk_prebuilt_shared {
248*333d2b36SAndroid Build Coastguard Worker//	    name: "libfoo",
249*333d2b36SAndroid Build Coastguard Worker//	    version: "27",
250*333d2b36SAndroid Build Coastguard Worker//	    target_arch: "arm64",
251*333d2b36SAndroid Build Coastguard Worker//	    vendor_available: true,
252*333d2b36SAndroid Build Coastguard Worker//	    product_available: true,
253*333d2b36SAndroid Build Coastguard Worker//	    vndk: {
254*333d2b36SAndroid Build Coastguard Worker//	        enabled: true,
255*333d2b36SAndroid Build Coastguard Worker//	    },
256*333d2b36SAndroid Build Coastguard Worker//	    export_include_dirs: ["include/external/libfoo/vndk_include"],
257*333d2b36SAndroid Build Coastguard Worker//	    arch: {
258*333d2b36SAndroid Build Coastguard Worker//	        arm64: {
259*333d2b36SAndroid Build Coastguard Worker//	            srcs: ["arm/lib64/libfoo.so"],
260*333d2b36SAndroid Build Coastguard Worker//	        },
261*333d2b36SAndroid Build Coastguard Worker//	        arm: {
262*333d2b36SAndroid Build Coastguard Worker//	            srcs: ["arm/lib/libfoo.so"],
263*333d2b36SAndroid Build Coastguard Worker//	        },
264*333d2b36SAndroid Build Coastguard Worker//	    },
265*333d2b36SAndroid Build Coastguard Worker//	}
266*333d2b36SAndroid Build Coastguard Workerfunc VndkPrebuiltSharedFactory() android.Module {
267*333d2b36SAndroid Build Coastguard Worker	module := vndkPrebuiltSharedLibrary()
268*333d2b36SAndroid Build Coastguard Worker	return module.Init()
269*333d2b36SAndroid Build Coastguard Worker}
270*333d2b36SAndroid Build Coastguard Worker
271*333d2b36SAndroid Build Coastguard Workerfunc init() {
272*333d2b36SAndroid Build Coastguard Worker	android.RegisterModuleType("vndk_prebuilt_shared", VndkPrebuiltSharedFactory)
273*333d2b36SAndroid Build Coastguard Worker}
274*333d2b36SAndroid Build Coastguard Worker
275*333d2b36SAndroid Build Coastguard Workerfunc IsForVndkApex(mctx android.BottomUpMutatorContext, m *Module) bool {
276*333d2b36SAndroid Build Coastguard Worker	if !m.Enabled(mctx) {
277*333d2b36SAndroid Build Coastguard Worker		return true
278*333d2b36SAndroid Build Coastguard Worker	}
279*333d2b36SAndroid Build Coastguard Worker
280*333d2b36SAndroid Build Coastguard Worker	if p, ok := m.linker.(*vndkPrebuiltLibraryDecorator); ok {
281*333d2b36SAndroid Build Coastguard Worker		return p.MatchesWithDevice(mctx.DeviceConfig()) && Bool(p.properties.Vndk.Enabled)
282*333d2b36SAndroid Build Coastguard Worker	}
283*333d2b36SAndroid Build Coastguard Worker	return false
284*333d2b36SAndroid Build Coastguard Worker}
285