xref: /aosp_15_r20/build/soong/rust/androidmk.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright 2019 The Android Open Source Project
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 rust
16*333d2b36SAndroid Build Coastguard Worker
17*333d2b36SAndroid Build Coastguard Workerimport (
18*333d2b36SAndroid Build Coastguard Worker	"path/filepath"
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 Workertype AndroidMkContext interface {
24*333d2b36SAndroid Build Coastguard Worker	Name() string
25*333d2b36SAndroid Build Coastguard Worker	Target() android.Target
26*333d2b36SAndroid Build Coastguard Worker	SubAndroidMk(*android.AndroidMkEntries, interface{})
27*333d2b36SAndroid Build Coastguard Worker}
28*333d2b36SAndroid Build Coastguard Worker
29*333d2b36SAndroid Build Coastguard Workertype SubAndroidMkProvider interface {
30*333d2b36SAndroid Build Coastguard Worker	AndroidMk(AndroidMkContext, *android.AndroidMkEntries)
31*333d2b36SAndroid Build Coastguard Worker}
32*333d2b36SAndroid Build Coastguard Worker
33*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) SubAndroidMk(data *android.AndroidMkEntries, obj interface{}) {
34*333d2b36SAndroid Build Coastguard Worker	if mod.subAndroidMkOnce == nil {
35*333d2b36SAndroid Build Coastguard Worker		mod.subAndroidMkOnce = make(map[SubAndroidMkProvider]bool)
36*333d2b36SAndroid Build Coastguard Worker	}
37*333d2b36SAndroid Build Coastguard Worker	if androidmk, ok := obj.(SubAndroidMkProvider); ok {
38*333d2b36SAndroid Build Coastguard Worker		if !mod.subAndroidMkOnce[androidmk] {
39*333d2b36SAndroid Build Coastguard Worker			mod.subAndroidMkOnce[androidmk] = true
40*333d2b36SAndroid Build Coastguard Worker			androidmk.AndroidMk(mod, data)
41*333d2b36SAndroid Build Coastguard Worker		}
42*333d2b36SAndroid Build Coastguard Worker	}
43*333d2b36SAndroid Build Coastguard Worker}
44*333d2b36SAndroid Build Coastguard Worker
45*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) AndroidMkSuffix() string {
46*333d2b36SAndroid Build Coastguard Worker	return mod.Properties.RustSubName + mod.Properties.SubName
47*333d2b36SAndroid Build Coastguard Worker}
48*333d2b36SAndroid Build Coastguard Worker
49*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) AndroidMkEntries() []android.AndroidMkEntries {
50*333d2b36SAndroid Build Coastguard Worker	if mod.Properties.HideFromMake || mod.hideApexVariantFromMake {
51*333d2b36SAndroid Build Coastguard Worker
52*333d2b36SAndroid Build Coastguard Worker		return []android.AndroidMkEntries{android.AndroidMkEntries{Disabled: true}}
53*333d2b36SAndroid Build Coastguard Worker	}
54*333d2b36SAndroid Build Coastguard Worker
55*333d2b36SAndroid Build Coastguard Worker	ret := android.AndroidMkEntries{
56*333d2b36SAndroid Build Coastguard Worker		OutputFile: android.OptionalPathForPath(mod.UnstrippedOutputFile()),
57*333d2b36SAndroid Build Coastguard Worker		Include:    "$(BUILD_SYSTEM)/soong_cc_rust_prebuilt.mk",
58*333d2b36SAndroid Build Coastguard Worker		ExtraEntries: []android.AndroidMkExtraEntriesFunc{
59*333d2b36SAndroid Build Coastguard Worker			func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) {
60*333d2b36SAndroid Build Coastguard Worker				entries.AddStrings("LOCAL_RLIB_LIBRARIES", mod.Properties.AndroidMkRlibs...)
61*333d2b36SAndroid Build Coastguard Worker				entries.AddStrings("LOCAL_DYLIB_LIBRARIES", mod.Properties.AndroidMkDylibs...)
62*333d2b36SAndroid Build Coastguard Worker				entries.AddStrings("LOCAL_PROC_MACRO_LIBRARIES", mod.Properties.AndroidMkProcMacroLibs...)
63*333d2b36SAndroid Build Coastguard Worker				entries.AddStrings("LOCAL_SHARED_LIBRARIES", mod.transitiveAndroidMkSharedLibs.ToList()...)
64*333d2b36SAndroid Build Coastguard Worker				entries.AddStrings("LOCAL_STATIC_LIBRARIES", mod.Properties.AndroidMkStaticLibs...)
65*333d2b36SAndroid Build Coastguard Worker				entries.AddStrings("LOCAL_HEADER_LIBRARIES", mod.Properties.AndroidMkHeaderLibs...)
66*333d2b36SAndroid Build Coastguard Worker				entries.AddStrings("LOCAL_SOONG_LINK_TYPE", mod.makeLinkType)
67*333d2b36SAndroid Build Coastguard Worker				if mod.InVendor() {
68*333d2b36SAndroid Build Coastguard Worker					entries.SetBool("LOCAL_IN_VENDOR", true)
69*333d2b36SAndroid Build Coastguard Worker				} else if mod.InProduct() {
70*333d2b36SAndroid Build Coastguard Worker					entries.SetBool("LOCAL_IN_PRODUCT", true)
71*333d2b36SAndroid Build Coastguard Worker				}
72*333d2b36SAndroid Build Coastguard Worker			},
73*333d2b36SAndroid Build Coastguard Worker		},
74*333d2b36SAndroid Build Coastguard Worker	}
75*333d2b36SAndroid Build Coastguard Worker
76*333d2b36SAndroid Build Coastguard Worker	if mod.compiler != nil && !mod.compiler.Disabled() {
77*333d2b36SAndroid Build Coastguard Worker		mod.SubAndroidMk(&ret, mod.compiler)
78*333d2b36SAndroid Build Coastguard Worker	} else if mod.sourceProvider != nil {
79*333d2b36SAndroid Build Coastguard Worker		// If the compiler is disabled, this is a SourceProvider.
80*333d2b36SAndroid Build Coastguard Worker		mod.SubAndroidMk(&ret, mod.sourceProvider)
81*333d2b36SAndroid Build Coastguard Worker	}
82*333d2b36SAndroid Build Coastguard Worker
83*333d2b36SAndroid Build Coastguard Worker	if mod.sanitize != nil {
84*333d2b36SAndroid Build Coastguard Worker		mod.SubAndroidMk(&ret, mod.sanitize)
85*333d2b36SAndroid Build Coastguard Worker	}
86*333d2b36SAndroid Build Coastguard Worker
87*333d2b36SAndroid Build Coastguard Worker	ret.SubName += mod.AndroidMkSuffix()
88*333d2b36SAndroid Build Coastguard Worker
89*333d2b36SAndroid Build Coastguard Worker	return []android.AndroidMkEntries{ret}
90*333d2b36SAndroid Build Coastguard Worker}
91*333d2b36SAndroid Build Coastguard Worker
92*333d2b36SAndroid Build Coastguard Workerfunc (binary *binaryDecorator) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkEntries) {
93*333d2b36SAndroid Build Coastguard Worker	ctx.SubAndroidMk(ret, binary.baseCompiler)
94*333d2b36SAndroid Build Coastguard Worker
95*333d2b36SAndroid Build Coastguard Worker	if binary.distFile.Valid() {
96*333d2b36SAndroid Build Coastguard Worker		ret.DistFiles = android.MakeDefaultDistFiles(binary.distFile.Path())
97*333d2b36SAndroid Build Coastguard Worker	}
98*333d2b36SAndroid Build Coastguard Worker	ret.Class = "EXECUTABLES"
99*333d2b36SAndroid Build Coastguard Worker}
100*333d2b36SAndroid Build Coastguard Worker
101*333d2b36SAndroid Build Coastguard Workerfunc (test *testDecorator) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkEntries) {
102*333d2b36SAndroid Build Coastguard Worker	ctx.SubAndroidMk(ret, test.binaryDecorator)
103*333d2b36SAndroid Build Coastguard Worker
104*333d2b36SAndroid Build Coastguard Worker	ret.Class = "NATIVE_TESTS"
105*333d2b36SAndroid Build Coastguard Worker	ret.ExtraEntries = append(ret.ExtraEntries,
106*333d2b36SAndroid Build Coastguard Worker		func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) {
107*333d2b36SAndroid Build Coastguard Worker			entries.AddCompatibilityTestSuites(test.Properties.Test_suites...)
108*333d2b36SAndroid Build Coastguard Worker			if test.testConfig != nil {
109*333d2b36SAndroid Build Coastguard Worker				entries.SetString("LOCAL_FULL_TEST_CONFIG", test.testConfig.String())
110*333d2b36SAndroid Build Coastguard Worker			}
111*333d2b36SAndroid Build Coastguard Worker			entries.SetBoolIfTrue("LOCAL_DISABLE_AUTO_GENERATE_TEST_CONFIG", !BoolDefault(test.Properties.Auto_gen_config, true))
112*333d2b36SAndroid Build Coastguard Worker			if test.Properties.Data_bins != nil {
113*333d2b36SAndroid Build Coastguard Worker				entries.AddStrings("LOCAL_TEST_DATA_BINS", test.Properties.Data_bins...)
114*333d2b36SAndroid Build Coastguard Worker			}
115*333d2b36SAndroid Build Coastguard Worker
116*333d2b36SAndroid Build Coastguard Worker			test.Properties.Test_options.SetAndroidMkEntries(entries)
117*333d2b36SAndroid Build Coastguard Worker		})
118*333d2b36SAndroid Build Coastguard Worker}
119*333d2b36SAndroid Build Coastguard Worker
120*333d2b36SAndroid Build Coastguard Workerfunc (benchmark *benchmarkDecorator) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkEntries) {
121*333d2b36SAndroid Build Coastguard Worker	benchmark.binaryDecorator.AndroidMk(ctx, ret)
122*333d2b36SAndroid Build Coastguard Worker	ret.Class = "NATIVE_TESTS"
123*333d2b36SAndroid Build Coastguard Worker	ret.ExtraEntries = append(ret.ExtraEntries,
124*333d2b36SAndroid Build Coastguard Worker		func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) {
125*333d2b36SAndroid Build Coastguard Worker			entries.AddCompatibilityTestSuites(benchmark.Properties.Test_suites...)
126*333d2b36SAndroid Build Coastguard Worker			if benchmark.testConfig != nil {
127*333d2b36SAndroid Build Coastguard Worker				entries.SetString("LOCAL_FULL_TEST_CONFIG", benchmark.testConfig.String())
128*333d2b36SAndroid Build Coastguard Worker			}
129*333d2b36SAndroid Build Coastguard Worker			entries.SetBool("LOCAL_NATIVE_BENCHMARK", true)
130*333d2b36SAndroid Build Coastguard Worker			entries.SetBoolIfTrue("LOCAL_DISABLE_AUTO_GENERATE_TEST_CONFIG", !BoolDefault(benchmark.Properties.Auto_gen_config, true))
131*333d2b36SAndroid Build Coastguard Worker		})
132*333d2b36SAndroid Build Coastguard Worker}
133*333d2b36SAndroid Build Coastguard Worker
134*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkEntries) {
135*333d2b36SAndroid Build Coastguard Worker	ctx.SubAndroidMk(ret, library.baseCompiler)
136*333d2b36SAndroid Build Coastguard Worker
137*333d2b36SAndroid Build Coastguard Worker	if library.rlib() {
138*333d2b36SAndroid Build Coastguard Worker		ret.Class = "RLIB_LIBRARIES"
139*333d2b36SAndroid Build Coastguard Worker	} else if library.dylib() {
140*333d2b36SAndroid Build Coastguard Worker		ret.Class = "DYLIB_LIBRARIES"
141*333d2b36SAndroid Build Coastguard Worker	} else if library.static() {
142*333d2b36SAndroid Build Coastguard Worker		ret.Class = "STATIC_LIBRARIES"
143*333d2b36SAndroid Build Coastguard Worker	} else if library.shared() {
144*333d2b36SAndroid Build Coastguard Worker		ret.Class = "SHARED_LIBRARIES"
145*333d2b36SAndroid Build Coastguard Worker	}
146*333d2b36SAndroid Build Coastguard Worker	if library.distFile.Valid() {
147*333d2b36SAndroid Build Coastguard Worker		ret.DistFiles = android.MakeDefaultDistFiles(library.distFile.Path())
148*333d2b36SAndroid Build Coastguard Worker	}
149*333d2b36SAndroid Build Coastguard Worker	ret.ExtraEntries = append(ret.ExtraEntries,
150*333d2b36SAndroid Build Coastguard Worker		func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) {
151*333d2b36SAndroid Build Coastguard Worker			if library.tocFile.Valid() {
152*333d2b36SAndroid Build Coastguard Worker				entries.SetString("LOCAL_SOONG_TOC", library.tocFile.String())
153*333d2b36SAndroid Build Coastguard Worker			}
154*333d2b36SAndroid Build Coastguard Worker		})
155*333d2b36SAndroid Build Coastguard Worker}
156*333d2b36SAndroid Build Coastguard Worker
157*333d2b36SAndroid Build Coastguard Workerfunc (procMacro *procMacroDecorator) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkEntries) {
158*333d2b36SAndroid Build Coastguard Worker	ctx.SubAndroidMk(ret, procMacro.baseCompiler)
159*333d2b36SAndroid Build Coastguard Worker
160*333d2b36SAndroid Build Coastguard Worker	ret.Class = "PROC_MACRO_LIBRARIES"
161*333d2b36SAndroid Build Coastguard Worker	if procMacro.distFile.Valid() {
162*333d2b36SAndroid Build Coastguard Worker		ret.DistFiles = android.MakeDefaultDistFiles(procMacro.distFile.Path())
163*333d2b36SAndroid Build Coastguard Worker	}
164*333d2b36SAndroid Build Coastguard Worker
165*333d2b36SAndroid Build Coastguard Worker}
166*333d2b36SAndroid Build Coastguard Worker
167*333d2b36SAndroid Build Coastguard Workerfunc (sourceProvider *BaseSourceProvider) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkEntries) {
168*333d2b36SAndroid Build Coastguard Worker	outFile := sourceProvider.OutputFiles[0]
169*333d2b36SAndroid Build Coastguard Worker	ret.Class = "ETC"
170*333d2b36SAndroid Build Coastguard Worker	ret.OutputFile = android.OptionalPathForPath(outFile)
171*333d2b36SAndroid Build Coastguard Worker	ret.SubName += sourceProvider.subName
172*333d2b36SAndroid Build Coastguard Worker	ret.ExtraEntries = append(ret.ExtraEntries,
173*333d2b36SAndroid Build Coastguard Worker		func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) {
174*333d2b36SAndroid Build Coastguard Worker			_, file := filepath.Split(outFile.String())
175*333d2b36SAndroid Build Coastguard Worker			stem, suffix, _ := android.SplitFileExt(file)
176*333d2b36SAndroid Build Coastguard Worker			entries.SetString("LOCAL_MODULE_SUFFIX", suffix)
177*333d2b36SAndroid Build Coastguard Worker			entries.SetString("LOCAL_MODULE_STEM", stem)
178*333d2b36SAndroid Build Coastguard Worker			entries.SetBool("LOCAL_UNINSTALLABLE_MODULE", true)
179*333d2b36SAndroid Build Coastguard Worker		})
180*333d2b36SAndroid Build Coastguard Worker}
181*333d2b36SAndroid Build Coastguard Worker
182*333d2b36SAndroid Build Coastguard Workerfunc (bindgen *bindgenDecorator) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkEntries) {
183*333d2b36SAndroid Build Coastguard Worker	ctx.SubAndroidMk(ret, bindgen.BaseSourceProvider)
184*333d2b36SAndroid Build Coastguard Worker}
185*333d2b36SAndroid Build Coastguard Worker
186*333d2b36SAndroid Build Coastguard Workerfunc (proto *protobufDecorator) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkEntries) {
187*333d2b36SAndroid Build Coastguard Worker	ctx.SubAndroidMk(ret, proto.BaseSourceProvider)
188*333d2b36SAndroid Build Coastguard Worker}
189*333d2b36SAndroid Build Coastguard Worker
190*333d2b36SAndroid Build Coastguard Workerfunc (compiler *baseCompiler) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkEntries) {
191*333d2b36SAndroid Build Coastguard Worker	if compiler.path == (android.InstallPath{}) {
192*333d2b36SAndroid Build Coastguard Worker		return
193*333d2b36SAndroid Build Coastguard Worker	}
194*333d2b36SAndroid Build Coastguard Worker
195*333d2b36SAndroid Build Coastguard Worker	if compiler.strippedOutputFile.Valid() {
196*333d2b36SAndroid Build Coastguard Worker		ret.OutputFile = compiler.strippedOutputFile
197*333d2b36SAndroid Build Coastguard Worker	}
198*333d2b36SAndroid Build Coastguard Worker
199*333d2b36SAndroid Build Coastguard Worker	ret.ExtraEntries = append(ret.ExtraEntries,
200*333d2b36SAndroid Build Coastguard Worker		func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) {
201*333d2b36SAndroid Build Coastguard Worker			entries.SetPath("LOCAL_SOONG_UNSTRIPPED_BINARY", compiler.unstrippedOutputFile)
202*333d2b36SAndroid Build Coastguard Worker			path, file := filepath.Split(compiler.path.String())
203*333d2b36SAndroid Build Coastguard Worker			stem, suffix, _ := android.SplitFileExt(file)
204*333d2b36SAndroid Build Coastguard Worker			entries.SetString("LOCAL_MODULE_SUFFIX", suffix)
205*333d2b36SAndroid Build Coastguard Worker			entries.SetString("LOCAL_MODULE_PATH", path)
206*333d2b36SAndroid Build Coastguard Worker			entries.SetString("LOCAL_MODULE_STEM", stem)
207*333d2b36SAndroid Build Coastguard Worker		})
208*333d2b36SAndroid Build Coastguard Worker}
209*333d2b36SAndroid Build Coastguard Worker
210*333d2b36SAndroid Build Coastguard Workerfunc (fuzz *fuzzDecorator) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkEntries) {
211*333d2b36SAndroid Build Coastguard Worker	ctx.SubAndroidMk(ret, fuzz.binaryDecorator)
212*333d2b36SAndroid Build Coastguard Worker
213*333d2b36SAndroid Build Coastguard Worker	ret.ExtraEntries = append(ret.ExtraEntries, func(ctx android.AndroidMkExtraEntriesContext,
214*333d2b36SAndroid Build Coastguard Worker		entries *android.AndroidMkEntries) {
215*333d2b36SAndroid Build Coastguard Worker		entries.SetBool("LOCAL_IS_FUZZ_TARGET", true)
216*333d2b36SAndroid Build Coastguard Worker		if fuzz.installedSharedDeps != nil {
217*333d2b36SAndroid Build Coastguard Worker			entries.AddStrings("LOCAL_FUZZ_INSTALLED_SHARED_DEPS", fuzz.installedSharedDeps...)
218*333d2b36SAndroid Build Coastguard Worker		}
219*333d2b36SAndroid Build Coastguard Worker	})
220*333d2b36SAndroid Build Coastguard Worker}
221