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