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