androidmk.go 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635
  1. // Copyright 2015 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. package cc
  15. import (
  16. "github.com/google/blueprint/proptools"
  17. "fmt"
  18. "io"
  19. "path/filepath"
  20. "strings"
  21. "android/soong/android"
  22. )
  23. var (
  24. NativeBridgeSuffix = ".native_bridge"
  25. ProductSuffix = ".product"
  26. VendorSuffix = ".vendor"
  27. RamdiskSuffix = ".ramdisk"
  28. VendorRamdiskSuffix = ".vendor_ramdisk"
  29. RecoverySuffix = ".recovery"
  30. sdkSuffix = ".sdk"
  31. )
  32. type AndroidMkContext interface {
  33. BaseModuleName() string
  34. Target() android.Target
  35. subAndroidMk(*android.AndroidMkEntries, interface{})
  36. Arch() android.Arch
  37. Os() android.OsType
  38. Host() bool
  39. UseVndk() bool
  40. VndkVersion() string
  41. static() bool
  42. InRamdisk() bool
  43. InVendorRamdisk() bool
  44. InRecovery() bool
  45. NotInPlatform() bool
  46. }
  47. type subAndroidMkProvider interface {
  48. AndroidMkEntries(AndroidMkContext, *android.AndroidMkEntries)
  49. }
  50. func (c *Module) subAndroidMk(entries *android.AndroidMkEntries, obj interface{}) {
  51. if c.subAndroidMkOnce == nil {
  52. c.subAndroidMkOnce = make(map[subAndroidMkProvider]bool)
  53. }
  54. if androidmk, ok := obj.(subAndroidMkProvider); ok {
  55. if !c.subAndroidMkOnce[androidmk] {
  56. c.subAndroidMkOnce[androidmk] = true
  57. androidmk.AndroidMkEntries(c, entries)
  58. }
  59. }
  60. }
  61. func (c *Module) AndroidMkEntries() []android.AndroidMkEntries {
  62. if c.hideApexVariantFromMake || c.Properties.HideFromMake {
  63. return []android.AndroidMkEntries{{
  64. Disabled: true,
  65. }}
  66. }
  67. entries := android.AndroidMkEntries{
  68. OutputFile: c.outputFile,
  69. // TODO(jiyong): add the APEXes providing shared libs to the required
  70. // modules Currently, adding c.Properties.ApexesProvidingSharedLibs is
  71. // causing multiple ART APEXes (com.android.art and com.android.art.debug)
  72. // to be installed. And this is breaking some older devices (like marlin)
  73. // where system.img is small.
  74. Required: c.Properties.AndroidMkRuntimeLibs,
  75. Include: "$(BUILD_SYSTEM)/soong_cc_rust_prebuilt.mk",
  76. ExtraEntries: []android.AndroidMkExtraEntriesFunc{
  77. func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) {
  78. if len(c.Properties.Logtags) > 0 {
  79. entries.AddStrings("LOCAL_LOGTAGS_FILES", c.Properties.Logtags...)
  80. }
  81. // Note: Pass the exact value of AndroidMkSystemSharedLibs to the Make
  82. // world, even if it is an empty list. In the Make world,
  83. // LOCAL_SYSTEM_SHARED_LIBRARIES defaults to "none", which is expanded
  84. // to the default list of system shared libs by the build system.
  85. // Soong computes the exact list of system shared libs, so we have to
  86. // override the default value when the list of libs is actually empty.
  87. entries.SetString("LOCAL_SYSTEM_SHARED_LIBRARIES", strings.Join(c.Properties.AndroidMkSystemSharedLibs, " "))
  88. if len(c.Properties.AndroidMkSharedLibs) > 0 {
  89. entries.AddStrings("LOCAL_SHARED_LIBRARIES", c.Properties.AndroidMkSharedLibs...)
  90. }
  91. if len(c.Properties.AndroidMkStaticLibs) > 0 {
  92. entries.AddStrings("LOCAL_STATIC_LIBRARIES", c.Properties.AndroidMkStaticLibs...)
  93. }
  94. if len(c.Properties.AndroidMkWholeStaticLibs) > 0 {
  95. entries.AddStrings("LOCAL_WHOLE_STATIC_LIBRARIES", c.Properties.AndroidMkWholeStaticLibs...)
  96. }
  97. if len(c.Properties.AndroidMkHeaderLibs) > 0 {
  98. entries.AddStrings("LOCAL_HEADER_LIBRARIES", c.Properties.AndroidMkHeaderLibs...)
  99. }
  100. if len(c.Properties.AndroidMkRuntimeLibs) > 0 {
  101. entries.AddStrings("LOCAL_RUNTIME_LIBRARIES", c.Properties.AndroidMkRuntimeLibs...)
  102. }
  103. entries.SetString("LOCAL_SOONG_LINK_TYPE", c.makeLinkType)
  104. if c.UseVndk() {
  105. entries.SetBool("LOCAL_USE_VNDK", true)
  106. if c.IsVndk() && !c.static() {
  107. entries.SetString("LOCAL_SOONG_VNDK_VERSION", c.VndkVersion())
  108. // VNDK libraries available to vendor are not installed because
  109. // they are packaged in VNDK APEX and installed by APEX packages (apex/apex.go)
  110. if !c.IsVndkExt() {
  111. entries.SetBool("LOCAL_UNINSTALLABLE_MODULE", true)
  112. }
  113. }
  114. }
  115. if c.Properties.IsSdkVariant && c.Properties.SdkAndPlatformVariantVisibleToMake {
  116. // Make the SDK variant uninstallable so that there are not two rules to install
  117. // to the same location.
  118. entries.SetBool("LOCAL_UNINSTALLABLE_MODULE", true)
  119. // Add the unsuffixed name to SOONG_SDK_VARIANT_MODULES so that Make can rewrite
  120. // dependencies to the .sdk suffix when building a module that uses the SDK.
  121. entries.SetString("SOONG_SDK_VARIANT_MODULES",
  122. "$(SOONG_SDK_VARIANT_MODULES) $(patsubst %.sdk,%,$(LOCAL_MODULE))")
  123. }
  124. },
  125. },
  126. ExtraFooters: []android.AndroidMkExtraFootersFunc{
  127. func(w io.Writer, name, prefix, moduleDir string) {
  128. if c.Properties.IsSdkVariant && c.Properties.SdkAndPlatformVariantVisibleToMake &&
  129. c.CcLibraryInterface() && c.Shared() {
  130. // Using the SDK variant as a JNI library needs a copy of the .so that
  131. // is not named .sdk.so so that it can be packaged into the APK with
  132. // the right name.
  133. fmt.Fprintln(w, "$(eval $(call copy-one-file,",
  134. "$(LOCAL_BUILT_MODULE),",
  135. "$(patsubst %.sdk.so,%.so,$(LOCAL_BUILT_MODULE))))")
  136. }
  137. },
  138. },
  139. }
  140. for _, feature := range c.features {
  141. c.subAndroidMk(&entries, feature)
  142. }
  143. c.subAndroidMk(&entries, c.compiler)
  144. c.subAndroidMk(&entries, c.linker)
  145. if c.sanitize != nil {
  146. c.subAndroidMk(&entries, c.sanitize)
  147. }
  148. c.subAndroidMk(&entries, c.installer)
  149. entries.SubName += c.Properties.SubName
  150. return []android.AndroidMkEntries{entries}
  151. }
  152. func androidMkWriteExtraTestConfigs(extraTestConfigs android.Paths, entries *android.AndroidMkEntries) {
  153. if len(extraTestConfigs) > 0 {
  154. entries.ExtraEntries = append(entries.ExtraEntries,
  155. func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) {
  156. entries.AddStrings("LOCAL_EXTRA_FULL_TEST_CONFIGS", extraTestConfigs.Strings()...)
  157. })
  158. }
  159. }
  160. func AndroidMkWriteTestData(data []android.DataPath, entries *android.AndroidMkEntries) {
  161. testFiles := android.AndroidMkDataPaths(data)
  162. if len(testFiles) > 0 {
  163. entries.ExtraEntries = append(entries.ExtraEntries, func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) {
  164. entries.AddStrings("LOCAL_TEST_DATA", testFiles...)
  165. })
  166. }
  167. }
  168. func makeOverrideModuleNames(ctx AndroidMkContext, overrides []string) []string {
  169. if ctx.Target().NativeBridge == android.NativeBridgeEnabled {
  170. var result []string
  171. for _, override := range overrides {
  172. result = append(result, override+NativeBridgeSuffix)
  173. }
  174. return result
  175. }
  176. return overrides
  177. }
  178. func (library *libraryDecorator) androidMkWriteExportedFlags(entries *android.AndroidMkEntries) {
  179. var exportedFlags []string
  180. var includeDirs android.Paths
  181. var systemIncludeDirs android.Paths
  182. var exportedDeps android.Paths
  183. if library.flagExporterInfo != nil {
  184. exportedFlags = library.flagExporterInfo.Flags
  185. includeDirs = library.flagExporterInfo.IncludeDirs
  186. systemIncludeDirs = library.flagExporterInfo.SystemIncludeDirs
  187. exportedDeps = library.flagExporterInfo.Deps
  188. } else {
  189. exportedFlags = library.flagExporter.flags
  190. includeDirs = library.flagExporter.dirs
  191. systemIncludeDirs = library.flagExporter.systemDirs
  192. exportedDeps = library.flagExporter.deps
  193. }
  194. for _, dir := range includeDirs {
  195. exportedFlags = append(exportedFlags, "-I"+dir.String())
  196. }
  197. for _, dir := range systemIncludeDirs {
  198. exportedFlags = append(exportedFlags, "-isystem "+dir.String())
  199. }
  200. if len(exportedFlags) > 0 {
  201. entries.AddStrings("LOCAL_EXPORT_CFLAGS", exportedFlags...)
  202. }
  203. if len(exportedDeps) > 0 {
  204. entries.AddStrings("LOCAL_EXPORT_C_INCLUDE_DEPS", exportedDeps.Strings()...)
  205. }
  206. }
  207. func (library *libraryDecorator) getAbiDiffsForAndroidMkDeps() []string {
  208. if library.static() {
  209. return nil
  210. }
  211. var abiDiffs []string
  212. if library.sAbiDiff.Valid() {
  213. abiDiffs = append(abiDiffs, library.sAbiDiff.String())
  214. }
  215. if library.prevSAbiDiff.Valid() {
  216. abiDiffs = append(abiDiffs, library.prevSAbiDiff.String())
  217. }
  218. return abiDiffs
  219. }
  220. func (library *libraryDecorator) androidMkEntriesWriteAdditionalDependenciesForSourceAbiDiff(entries *android.AndroidMkEntries) {
  221. entries.AddStrings("LOCAL_ADDITIONAL_DEPENDENCIES", library.getAbiDiffsForAndroidMkDeps()...)
  222. }
  223. // TODO(ccross): remove this once apex/androidmk.go is converted to AndroidMkEntries
  224. func (library *libraryDecorator) androidMkWriteAdditionalDependenciesForSourceAbiDiff(w io.Writer) {
  225. fmt.Fprintln(w, "LOCAL_ADDITIONAL_DEPENDENCIES +=", strings.Join(library.getAbiDiffsForAndroidMkDeps(), " "))
  226. }
  227. func (library *libraryDecorator) AndroidMkEntries(ctx AndroidMkContext, entries *android.AndroidMkEntries) {
  228. if library.static() {
  229. entries.Class = "STATIC_LIBRARIES"
  230. } else if library.shared() {
  231. entries.Class = "SHARED_LIBRARIES"
  232. entries.ExtraEntries = append(entries.ExtraEntries, func(_ android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) {
  233. entries.SetString("LOCAL_SOONG_TOC", library.toc().String())
  234. if !library.buildStubs() && library.unstrippedOutputFile != nil {
  235. entries.SetString("LOCAL_SOONG_UNSTRIPPED_BINARY", library.unstrippedOutputFile.String())
  236. }
  237. if len(library.Properties.Overrides) > 0 {
  238. entries.SetString("LOCAL_OVERRIDES_MODULES", strings.Join(makeOverrideModuleNames(ctx, library.Properties.Overrides), " "))
  239. }
  240. if len(library.postInstallCmds) > 0 {
  241. entries.SetString("LOCAL_POST_INSTALL_CMD", strings.Join(library.postInstallCmds, "&& "))
  242. }
  243. })
  244. } else if library.header() {
  245. entries.Class = "HEADER_LIBRARIES"
  246. }
  247. if library.distFile != nil {
  248. entries.DistFiles = android.MakeDefaultDistFiles(library.distFile)
  249. }
  250. entries.ExtraEntries = append(entries.ExtraEntries, func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) {
  251. library.androidMkWriteExportedFlags(entries)
  252. library.androidMkEntriesWriteAdditionalDependenciesForSourceAbiDiff(entries)
  253. if entries.OutputFile.Valid() {
  254. _, _, ext := android.SplitFileExt(entries.OutputFile.Path().Base())
  255. entries.SetString("LOCAL_BUILT_MODULE_STEM", "$(LOCAL_MODULE)"+ext)
  256. }
  257. if library.coverageOutputFile.Valid() {
  258. entries.SetString("LOCAL_PREBUILT_COVERAGE_ARCHIVE", library.coverageOutputFile.String())
  259. }
  260. if library.useCoreVariant {
  261. entries.SetBool("LOCAL_UNINSTALLABLE_MODULE", true)
  262. entries.SetBool("LOCAL_NO_NOTICE_FILE", true)
  263. entries.SetBool("LOCAL_VNDK_DEPEND_ON_CORE_VARIANT", true)
  264. }
  265. if library.checkSameCoreVariant {
  266. entries.SetBool("LOCAL_CHECK_SAME_VNDK_VARIANTS", true)
  267. }
  268. })
  269. if library.shared() && !library.buildStubs() {
  270. ctx.subAndroidMk(entries, library.baseInstaller)
  271. } else {
  272. if library.buildStubs() && library.stubsVersion() != "" {
  273. entries.SubName = "." + library.stubsVersion()
  274. }
  275. entries.ExtraEntries = append(entries.ExtraEntries, func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) {
  276. // library.makeUninstallable() depends on this to bypass HideFromMake() for
  277. // static libraries.
  278. entries.SetBool("LOCAL_UNINSTALLABLE_MODULE", true)
  279. if library.buildStubs() {
  280. entries.SetBool("LOCAL_NO_NOTICE_FILE", true)
  281. }
  282. })
  283. }
  284. // If a library providing a stub is included in an APEX, the private APIs of the library
  285. // is accessible only inside the APEX. From outside of the APEX, clients can only use the
  286. // public APIs via the stub. To enforce this, the (latest version of the) stub gets the
  287. // name of the library. The impl library instead gets the `.bootstrap` suffix to so that
  288. // they can be exceptionally used directly when APEXes are not available (e.g. during the
  289. // very early stage in the boot process).
  290. if len(library.Properties.Stubs.Versions) > 0 && !ctx.Host() && ctx.NotInPlatform() &&
  291. !ctx.InRamdisk() && !ctx.InVendorRamdisk() && !ctx.InRecovery() && !ctx.UseVndk() && !ctx.static() {
  292. if library.buildStubs() && library.isLatestStubVersion() {
  293. entries.SubName = ""
  294. }
  295. if !library.buildStubs() {
  296. entries.SubName = ".bootstrap"
  297. }
  298. }
  299. }
  300. func (object *objectLinker) AndroidMkEntries(ctx AndroidMkContext, entries *android.AndroidMkEntries) {
  301. entries.Class = "STATIC_LIBRARIES"
  302. entries.ExtraFooters = append(entries.ExtraFooters,
  303. func(w io.Writer, name, prefix, moduleDir string) {
  304. out := entries.OutputFile.Path()
  305. varname := fmt.Sprintf("SOONG_%sOBJECT_%s%s", prefix, name, entries.SubName)
  306. fmt.Fprintf(w, "\n%s := %s\n", varname, out.String())
  307. fmt.Fprintln(w, ".KATI_READONLY: "+varname)
  308. })
  309. }
  310. func (test *testDecorator) AndroidMkEntries(ctx AndroidMkContext, entries *android.AndroidMkEntries) {
  311. entries.ExtraEntries = append(entries.ExtraEntries, func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) {
  312. if len(test.InstallerProperties.Test_suites) > 0 {
  313. entries.AddCompatibilityTestSuites(test.InstallerProperties.Test_suites...)
  314. }
  315. })
  316. }
  317. func (binary *binaryDecorator) AndroidMkEntries(ctx AndroidMkContext, entries *android.AndroidMkEntries) {
  318. ctx.subAndroidMk(entries, binary.baseInstaller)
  319. entries.Class = "EXECUTABLES"
  320. entries.DistFiles = binary.distFiles
  321. entries.ExtraEntries = append(entries.ExtraEntries, func(_ android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) {
  322. entries.SetString("LOCAL_SOONG_UNSTRIPPED_BINARY", binary.unstrippedOutputFile.String())
  323. if len(binary.symlinks) > 0 {
  324. entries.AddStrings("LOCAL_MODULE_SYMLINKS", binary.symlinks...)
  325. }
  326. if binary.coverageOutputFile.Valid() {
  327. entries.SetString("LOCAL_PREBUILT_COVERAGE_ARCHIVE", binary.coverageOutputFile.String())
  328. }
  329. if len(binary.Properties.Overrides) > 0 {
  330. entries.SetString("LOCAL_OVERRIDES_MODULES", strings.Join(makeOverrideModuleNames(ctx, binary.Properties.Overrides), " "))
  331. }
  332. if len(binary.postInstallCmds) > 0 {
  333. entries.SetString("LOCAL_POST_INSTALL_CMD", strings.Join(binary.postInstallCmds, "&& "))
  334. }
  335. })
  336. }
  337. func (benchmark *benchmarkDecorator) AndroidMkEntries(ctx AndroidMkContext, entries *android.AndroidMkEntries) {
  338. ctx.subAndroidMk(entries, benchmark.binaryDecorator)
  339. entries.Class = "NATIVE_TESTS"
  340. entries.ExtraEntries = append(entries.ExtraEntries, func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) {
  341. if len(benchmark.Properties.Test_suites) > 0 {
  342. entries.AddCompatibilityTestSuites(benchmark.Properties.Test_suites...)
  343. }
  344. if benchmark.testConfig != nil {
  345. entries.SetString("LOCAL_FULL_TEST_CONFIG", benchmark.testConfig.String())
  346. }
  347. entries.SetBool("LOCAL_NATIVE_BENCHMARK", true)
  348. if !BoolDefault(benchmark.Properties.Auto_gen_config, true) {
  349. entries.SetBool("LOCAL_DISABLE_AUTO_GENERATE_TEST_CONFIG", true)
  350. }
  351. })
  352. dataPaths := []android.DataPath{}
  353. for _, srcPath := range benchmark.data {
  354. dataPaths = append(dataPaths, android.DataPath{SrcPath: srcPath})
  355. }
  356. AndroidMkWriteTestData(dataPaths, entries)
  357. }
  358. func (test *testBinary) AndroidMkEntries(ctx AndroidMkContext, entries *android.AndroidMkEntries) {
  359. ctx.subAndroidMk(entries, test.binaryDecorator)
  360. ctx.subAndroidMk(entries, test.testDecorator)
  361. entries.Class = "NATIVE_TESTS"
  362. if Bool(test.Properties.Test_per_src) {
  363. entries.SubName = "_" + String(test.binaryDecorator.Properties.Stem)
  364. }
  365. entries.ExtraEntries = append(entries.ExtraEntries, func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) {
  366. if test.testConfig != nil {
  367. entries.SetString("LOCAL_FULL_TEST_CONFIG", test.testConfig.String())
  368. }
  369. if !BoolDefault(test.Properties.Auto_gen_config, true) {
  370. entries.SetBool("LOCAL_DISABLE_AUTO_GENERATE_TEST_CONFIG", true)
  371. }
  372. entries.AddStrings("LOCAL_TEST_MAINLINE_MODULES", test.Properties.Test_mainline_modules...)
  373. entries.SetBoolIfTrue("LOCAL_COMPATIBILITY_PER_TESTCASE_DIRECTORY", Bool(test.Properties.Per_testcase_directory))
  374. if len(test.Properties.Data_bins) > 0 {
  375. entries.AddStrings("LOCAL_TEST_DATA_BINS", test.Properties.Data_bins...)
  376. }
  377. test.Properties.Test_options.CommonTestOptions.SetAndroidMkEntries(entries)
  378. })
  379. AndroidMkWriteTestData(test.data, entries)
  380. androidMkWriteExtraTestConfigs(test.extraTestConfigs, entries)
  381. }
  382. func (fuzz *fuzzBinary) AndroidMkEntries(ctx AndroidMkContext, entries *android.AndroidMkEntries) {
  383. ctx.subAndroidMk(entries, fuzz.binaryDecorator)
  384. var fuzzFiles []string
  385. for _, d := range fuzz.fuzzPackagedModule.Corpus {
  386. fuzzFiles = append(fuzzFiles,
  387. filepath.Dir(fuzz.fuzzPackagedModule.CorpusIntermediateDir.String())+":corpus/"+d.Base())
  388. }
  389. for _, d := range fuzz.fuzzPackagedModule.Data {
  390. fuzzFiles = append(fuzzFiles,
  391. filepath.Dir(fuzz.fuzzPackagedModule.DataIntermediateDir.String())+":data/"+d.Rel())
  392. }
  393. if fuzz.fuzzPackagedModule.Dictionary != nil {
  394. fuzzFiles = append(fuzzFiles,
  395. filepath.Dir(fuzz.fuzzPackagedModule.Dictionary.String())+":"+fuzz.fuzzPackagedModule.Dictionary.Base())
  396. }
  397. if fuzz.fuzzPackagedModule.Config != nil {
  398. fuzzFiles = append(fuzzFiles,
  399. filepath.Dir(fuzz.fuzzPackagedModule.Config.String())+":config.json")
  400. }
  401. entries.ExtraEntries = append(entries.ExtraEntries, func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) {
  402. entries.SetBool("LOCAL_IS_FUZZ_TARGET", true)
  403. if len(fuzzFiles) > 0 {
  404. entries.AddStrings("LOCAL_TEST_DATA", fuzzFiles...)
  405. }
  406. if fuzz.installedSharedDeps != nil {
  407. entries.AddStrings("LOCAL_FUZZ_INSTALLED_SHARED_DEPS", fuzz.installedSharedDeps...)
  408. }
  409. })
  410. }
  411. func (test *testLibrary) AndroidMkEntries(ctx AndroidMkContext, entries *android.AndroidMkEntries) {
  412. ctx.subAndroidMk(entries, test.libraryDecorator)
  413. ctx.subAndroidMk(entries, test.testDecorator)
  414. }
  415. func (installer *baseInstaller) AndroidMkEntries(ctx AndroidMkContext, entries *android.AndroidMkEntries) {
  416. if installer.path == (android.InstallPath{}) {
  417. return
  418. }
  419. entries.ExtraEntries = append(entries.ExtraEntries, func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) {
  420. path, file := filepath.Split(installer.path.String())
  421. stem, suffix, _ := android.SplitFileExt(file)
  422. entries.SetString("LOCAL_MODULE_SUFFIX", suffix)
  423. entries.SetString("LOCAL_MODULE_PATH", path)
  424. entries.SetString("LOCAL_MODULE_STEM", stem)
  425. })
  426. }
  427. func (c *stubDecorator) AndroidMkEntries(ctx AndroidMkContext, entries *android.AndroidMkEntries) {
  428. entries.SubName = ndkLibrarySuffix + "." + c.apiLevel.String()
  429. entries.Class = "SHARED_LIBRARIES"
  430. if !c.buildStubs() {
  431. entries.Disabled = true
  432. return
  433. }
  434. entries.ExtraEntries = append(entries.ExtraEntries, func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) {
  435. path, file := filepath.Split(c.installPath.String())
  436. stem, suffix, _ := android.SplitFileExt(file)
  437. entries.SetString("LOCAL_MODULE_SUFFIX", suffix)
  438. entries.SetString("LOCAL_MODULE_PATH", path)
  439. entries.SetString("LOCAL_MODULE_STEM", stem)
  440. entries.SetBool("LOCAL_NO_NOTICE_FILE", true)
  441. if c.parsedCoverageXmlPath.String() != "" {
  442. entries.SetString("SOONG_NDK_API_XML", "$(SOONG_NDK_API_XML) "+c.parsedCoverageXmlPath.String())
  443. }
  444. })
  445. }
  446. func (c *vndkPrebuiltLibraryDecorator) AndroidMkEntries(ctx AndroidMkContext, entries *android.AndroidMkEntries) {
  447. entries.Class = "SHARED_LIBRARIES"
  448. entries.SubName = c.androidMkSuffix
  449. entries.ExtraEntries = append(entries.ExtraEntries, func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) {
  450. c.libraryDecorator.androidMkWriteExportedFlags(entries)
  451. // Specifying stem is to pass check_elf_files when vendor modules link against vndk prebuilt.
  452. // We can't use install path because VNDKs are not installed. Instead, Srcs is directly used.
  453. _, file := filepath.Split(c.properties.Srcs[0])
  454. stem, suffix, ext := android.SplitFileExt(file)
  455. entries.SetString("LOCAL_BUILT_MODULE_STEM", "$(LOCAL_MODULE)"+ext)
  456. entries.SetString("LOCAL_MODULE_SUFFIX", suffix)
  457. entries.SetString("LOCAL_MODULE_STEM", stem)
  458. if c.tocFile.Valid() {
  459. entries.SetString("LOCAL_SOONG_TOC", c.tocFile.String())
  460. }
  461. // VNDK libraries available to vendor are not installed because
  462. // they are packaged in VNDK APEX and installed by APEX packages (apex/apex.go)
  463. entries.SetBool("LOCAL_UNINSTALLABLE_MODULE", true)
  464. })
  465. }
  466. func (c *snapshotLibraryDecorator) AndroidMkEntries(ctx AndroidMkContext, entries *android.AndroidMkEntries) {
  467. // Each vendor snapshot is exported to androidMk only when BOARD_VNDK_VERSION != current
  468. // and the version of the prebuilt is same as BOARD_VNDK_VERSION.
  469. if c.shared() {
  470. entries.Class = "SHARED_LIBRARIES"
  471. } else if c.static() {
  472. entries.Class = "STATIC_LIBRARIES"
  473. } else if c.header() {
  474. entries.Class = "HEADER_LIBRARIES"
  475. }
  476. entries.SubName = ""
  477. if c.sanitizerProperties.CfiEnabled {
  478. entries.SubName += ".cfi"
  479. }
  480. entries.SubName += c.baseProperties.Androidmk_suffix
  481. entries.ExtraEntries = append(entries.ExtraEntries, func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) {
  482. c.libraryDecorator.androidMkWriteExportedFlags(entries)
  483. if c.shared() || c.static() {
  484. src := c.path.String()
  485. // For static libraries which aren't installed, directly use Src to extract filename.
  486. // This is safe: generated snapshot modules have a real path as Src, not a module
  487. if c.static() {
  488. src = proptools.String(c.properties.Src)
  489. }
  490. path, file := filepath.Split(src)
  491. stem, suffix, ext := android.SplitFileExt(file)
  492. entries.SetString("LOCAL_BUILT_MODULE_STEM", "$(LOCAL_MODULE)"+ext)
  493. entries.SetString("LOCAL_MODULE_SUFFIX", suffix)
  494. entries.SetString("LOCAL_MODULE_STEM", stem)
  495. if c.shared() {
  496. entries.SetString("LOCAL_MODULE_PATH", path)
  497. }
  498. if c.tocFile.Valid() {
  499. entries.SetString("LOCAL_SOONG_TOC", c.tocFile.String())
  500. }
  501. }
  502. if !c.shared() { // static or header
  503. entries.SetBool("LOCAL_UNINSTALLABLE_MODULE", true)
  504. }
  505. })
  506. }
  507. func (c *snapshotBinaryDecorator) AndroidMkEntries(ctx AndroidMkContext, entries *android.AndroidMkEntries) {
  508. entries.Class = "EXECUTABLES"
  509. entries.SubName = c.baseProperties.Androidmk_suffix
  510. }
  511. func (c *snapshotObjectLinker) AndroidMkEntries(ctx AndroidMkContext, entries *android.AndroidMkEntries) {
  512. entries.Class = "STATIC_LIBRARIES"
  513. entries.SubName = c.baseProperties.Androidmk_suffix
  514. entries.ExtraFooters = append(entries.ExtraFooters,
  515. func(w io.Writer, name, prefix, moduleDir string) {
  516. out := entries.OutputFile.Path()
  517. varname := fmt.Sprintf("SOONG_%sOBJECT_%s%s", prefix, name, entries.SubName)
  518. fmt.Fprintf(w, "\n%s := %s\n", varname, out.String())
  519. fmt.Fprintln(w, ".KATI_READONLY: "+varname)
  520. })
  521. }
  522. func (c *ndkPrebuiltStlLinker) AndroidMkEntries(ctx AndroidMkContext, entries *android.AndroidMkEntries) {
  523. entries.Class = "SHARED_LIBRARIES"
  524. }
  525. func (p *prebuiltLinker) AndroidMkEntries(ctx AndroidMkContext, entries *android.AndroidMkEntries) {
  526. entries.ExtraEntries = append(entries.ExtraEntries, func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) {
  527. if p.properties.Check_elf_files != nil {
  528. entries.SetBool("LOCAL_CHECK_ELF_FILES", *p.properties.Check_elf_files)
  529. } else {
  530. // soong_cc_rust_prebuilt.mk does not include check_elf_file.mk by default
  531. // because cc_library_shared and cc_binary use soong_cc_rust_prebuilt.mk as well.
  532. // In order to turn on prebuilt ABI checker, set `LOCAL_CHECK_ELF_FILES` to
  533. // true if `p.properties.Check_elf_files` is not specified.
  534. entries.SetBool("LOCAL_CHECK_ELF_FILES", true)
  535. }
  536. })
  537. }
  538. func (p *prebuiltLibraryLinker) AndroidMkEntries(ctx AndroidMkContext, entries *android.AndroidMkEntries) {
  539. ctx.subAndroidMk(entries, p.libraryDecorator)
  540. if p.shared() {
  541. ctx.subAndroidMk(entries, &p.prebuiltLinker)
  542. androidMkWriteAllowUndefinedSymbols(p.baseLinker, entries)
  543. }
  544. }
  545. func (p *prebuiltBinaryLinker) AndroidMkEntries(ctx AndroidMkContext, entries *android.AndroidMkEntries) {
  546. ctx.subAndroidMk(entries, p.binaryDecorator)
  547. ctx.subAndroidMk(entries, &p.prebuiltLinker)
  548. androidMkWriteAllowUndefinedSymbols(p.baseLinker, entries)
  549. }
  550. func androidMkWriteAllowUndefinedSymbols(linker *baseLinker, entries *android.AndroidMkEntries) {
  551. allow := linker.Properties.Allow_undefined_symbols
  552. if allow != nil {
  553. entries.ExtraEntries = append(entries.ExtraEntries, func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) {
  554. entries.SetBool("LOCAL_ALLOW_UNDEFINED_SYMBOLS", *allow)
  555. })
  556. }
  557. }