1*333d2b36SAndroid Build Coastguard Worker// Copyright 2015 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 Worker// This file offers AndroidMkEntriesProvider, which individual modules implement to output 16*333d2b36SAndroid Build Coastguard Worker// Android.mk entries that contain information about the modules built through Soong. Kati reads 17*333d2b36SAndroid Build Coastguard Worker// and combines them with the legacy Make-based module definitions to produce the complete view of 18*333d2b36SAndroid Build Coastguard Worker// the source tree, which makes this a critical point of Make-Soong interoperability. 19*333d2b36SAndroid Build Coastguard Worker// 20*333d2b36SAndroid Build Coastguard Worker// Naturally, Soong-only builds do not rely on this mechanism. 21*333d2b36SAndroid Build Coastguard Worker 22*333d2b36SAndroid Build Coastguard Workerpackage android 23*333d2b36SAndroid Build Coastguard Worker 24*333d2b36SAndroid Build Coastguard Workerimport ( 25*333d2b36SAndroid Build Coastguard Worker "bytes" 26*333d2b36SAndroid Build Coastguard Worker "fmt" 27*333d2b36SAndroid Build Coastguard Worker "io" 28*333d2b36SAndroid Build Coastguard Worker "os" 29*333d2b36SAndroid Build Coastguard Worker "path/filepath" 30*333d2b36SAndroid Build Coastguard Worker "reflect" 31*333d2b36SAndroid Build Coastguard Worker "runtime" 32*333d2b36SAndroid Build Coastguard Worker "sort" 33*333d2b36SAndroid Build Coastguard Worker "strconv" 34*333d2b36SAndroid Build Coastguard Worker "strings" 35*333d2b36SAndroid Build Coastguard Worker 36*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint" 37*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint/pathtools" 38*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint/proptools" 39*333d2b36SAndroid Build Coastguard Worker) 40*333d2b36SAndroid Build Coastguard Worker 41*333d2b36SAndroid Build Coastguard Workerfunc init() { 42*333d2b36SAndroid Build Coastguard Worker RegisterAndroidMkBuildComponents(InitRegistrationContext) 43*333d2b36SAndroid Build Coastguard Worker} 44*333d2b36SAndroid Build Coastguard Worker 45*333d2b36SAndroid Build Coastguard Workerfunc RegisterAndroidMkBuildComponents(ctx RegistrationContext) { 46*333d2b36SAndroid Build Coastguard Worker ctx.RegisterParallelSingletonType("androidmk", AndroidMkSingleton) 47*333d2b36SAndroid Build Coastguard Worker} 48*333d2b36SAndroid Build Coastguard Worker 49*333d2b36SAndroid Build Coastguard Worker// Enable androidmk support. 50*333d2b36SAndroid Build Coastguard Worker// * Register the singleton 51*333d2b36SAndroid Build Coastguard Worker// * Configure that we are inside make 52*333d2b36SAndroid Build Coastguard Workervar PrepareForTestWithAndroidMk = GroupFixturePreparers( 53*333d2b36SAndroid Build Coastguard Worker FixtureRegisterWithContext(RegisterAndroidMkBuildComponents), 54*333d2b36SAndroid Build Coastguard Worker FixtureModifyConfig(SetKatiEnabledForTests), 55*333d2b36SAndroid Build Coastguard Worker) 56*333d2b36SAndroid Build Coastguard Worker 57*333d2b36SAndroid Build Coastguard Worker// Deprecated: Use AndroidMkEntriesProvider instead, especially if you're not going to use the 58*333d2b36SAndroid Build Coastguard Worker// Custom function. It's easier to use and test. 59*333d2b36SAndroid Build Coastguard Workertype AndroidMkDataProvider interface { 60*333d2b36SAndroid Build Coastguard Worker AndroidMk() AndroidMkData 61*333d2b36SAndroid Build Coastguard Worker BaseModuleName() string 62*333d2b36SAndroid Build Coastguard Worker} 63*333d2b36SAndroid Build Coastguard Worker 64*333d2b36SAndroid Build Coastguard Workertype AndroidMkData struct { 65*333d2b36SAndroid Build Coastguard Worker Class string 66*333d2b36SAndroid Build Coastguard Worker SubName string 67*333d2b36SAndroid Build Coastguard Worker DistFiles TaggedDistFiles 68*333d2b36SAndroid Build Coastguard Worker OutputFile OptionalPath 69*333d2b36SAndroid Build Coastguard Worker Disabled bool 70*333d2b36SAndroid Build Coastguard Worker Include string 71*333d2b36SAndroid Build Coastguard Worker Required []string 72*333d2b36SAndroid Build Coastguard Worker Host_required []string 73*333d2b36SAndroid Build Coastguard Worker Target_required []string 74*333d2b36SAndroid Build Coastguard Worker 75*333d2b36SAndroid Build Coastguard Worker Custom func(w io.Writer, name, prefix, moduleDir string, data AndroidMkData) 76*333d2b36SAndroid Build Coastguard Worker 77*333d2b36SAndroid Build Coastguard Worker Extra []AndroidMkExtraFunc 78*333d2b36SAndroid Build Coastguard Worker 79*333d2b36SAndroid Build Coastguard Worker Entries AndroidMkEntries 80*333d2b36SAndroid Build Coastguard Worker} 81*333d2b36SAndroid Build Coastguard Worker 82*333d2b36SAndroid Build Coastguard Workertype AndroidMkExtraFunc func(w io.Writer, outputFile Path) 83*333d2b36SAndroid Build Coastguard Worker 84*333d2b36SAndroid Build Coastguard Worker// Interface for modules to declare their Android.mk outputs. Note that every module needs to 85*333d2b36SAndroid Build Coastguard Worker// implement this in order to be included in the final Android-<product_name>.mk output, even if 86*333d2b36SAndroid Build Coastguard Worker// they only need to output the common set of entries without any customizations. 87*333d2b36SAndroid Build Coastguard Workertype AndroidMkEntriesProvider interface { 88*333d2b36SAndroid Build Coastguard Worker // Returns AndroidMkEntries objects that contain all basic info plus extra customization data 89*333d2b36SAndroid Build Coastguard Worker // if needed. This is the core func to implement. 90*333d2b36SAndroid Build Coastguard Worker // Note that one can return multiple objects. For example, java_library may return an additional 91*333d2b36SAndroid Build Coastguard Worker // AndroidMkEntries object for its hostdex sub-module. 92*333d2b36SAndroid Build Coastguard Worker AndroidMkEntries() []AndroidMkEntries 93*333d2b36SAndroid Build Coastguard Worker // Modules don't need to implement this as it's already implemented by ModuleBase. 94*333d2b36SAndroid Build Coastguard Worker // AndroidMkEntries uses BaseModuleName() instead of ModuleName() because certain modules 95*333d2b36SAndroid Build Coastguard Worker // e.g. Prebuilts, override the Name() func and return modified names. 96*333d2b36SAndroid Build Coastguard Worker // If a different name is preferred, use SubName or OverrideName in AndroidMkEntries. 97*333d2b36SAndroid Build Coastguard Worker BaseModuleName() string 98*333d2b36SAndroid Build Coastguard Worker} 99*333d2b36SAndroid Build Coastguard Worker 100*333d2b36SAndroid Build Coastguard Worker// The core data struct that modules use to provide their Android.mk data. 101*333d2b36SAndroid Build Coastguard Workertype AndroidMkEntries struct { 102*333d2b36SAndroid Build Coastguard Worker // Android.mk class string, e.g EXECUTABLES, JAVA_LIBRARIES, ETC 103*333d2b36SAndroid Build Coastguard Worker Class string 104*333d2b36SAndroid Build Coastguard Worker // Optional suffix to append to the module name. Useful when a module wants to return multiple 105*333d2b36SAndroid Build Coastguard Worker // AndroidMkEntries objects. For example, when a java_library returns an additional entry for 106*333d2b36SAndroid Build Coastguard Worker // its hostdex sub-module, this SubName field is set to "-hostdex" so that it can have a 107*333d2b36SAndroid Build Coastguard Worker // different name than the parent's. 108*333d2b36SAndroid Build Coastguard Worker SubName string 109*333d2b36SAndroid Build Coastguard Worker // If set, this value overrides the base module name. SubName is still appended. 110*333d2b36SAndroid Build Coastguard Worker OverrideName string 111*333d2b36SAndroid Build Coastguard Worker // Dist files to output 112*333d2b36SAndroid Build Coastguard Worker DistFiles TaggedDistFiles 113*333d2b36SAndroid Build Coastguard Worker // The output file for Kati to process and/or install. If absent, the module is skipped. 114*333d2b36SAndroid Build Coastguard Worker OutputFile OptionalPath 115*333d2b36SAndroid Build Coastguard Worker // If true, the module is skipped and does not appear on the final Android-<product name>.mk 116*333d2b36SAndroid Build Coastguard Worker // file. Useful when a module needs to be skipped conditionally. 117*333d2b36SAndroid Build Coastguard Worker Disabled bool 118*333d2b36SAndroid Build Coastguard Worker // The postprocessing mk file to include, e.g. $(BUILD_SYSTEM)/soong_cc_rust_prebuilt.mk 119*333d2b36SAndroid Build Coastguard Worker // If not set, $(BUILD_SYSTEM)/prebuilt.mk is used. 120*333d2b36SAndroid Build Coastguard Worker Include string 121*333d2b36SAndroid Build Coastguard Worker // Required modules that need to be built and included in the final build output when building 122*333d2b36SAndroid Build Coastguard Worker // this module. 123*333d2b36SAndroid Build Coastguard Worker Required []string 124*333d2b36SAndroid Build Coastguard Worker // Required host modules that need to be built and included in the final build output when 125*333d2b36SAndroid Build Coastguard Worker // building this module. 126*333d2b36SAndroid Build Coastguard Worker Host_required []string 127*333d2b36SAndroid Build Coastguard Worker // Required device modules that need to be built and included in the final build output when 128*333d2b36SAndroid Build Coastguard Worker // building this module. 129*333d2b36SAndroid Build Coastguard Worker Target_required []string 130*333d2b36SAndroid Build Coastguard Worker 131*333d2b36SAndroid Build Coastguard Worker header bytes.Buffer 132*333d2b36SAndroid Build Coastguard Worker footer bytes.Buffer 133*333d2b36SAndroid Build Coastguard Worker 134*333d2b36SAndroid Build Coastguard Worker // Funcs to append additional Android.mk entries or modify the common ones. Multiple funcs are 135*333d2b36SAndroid Build Coastguard Worker // accepted so that common logic can be factored out as a shared func. 136*333d2b36SAndroid Build Coastguard Worker ExtraEntries []AndroidMkExtraEntriesFunc 137*333d2b36SAndroid Build Coastguard Worker // Funcs to add extra lines to the module's Android.mk output. Unlike AndroidMkExtraEntriesFunc, 138*333d2b36SAndroid Build Coastguard Worker // which simply sets Make variable values, this can be used for anything since it can write any 139*333d2b36SAndroid Build Coastguard Worker // Make statements directly to the final Android-*.mk file. 140*333d2b36SAndroid Build Coastguard Worker // Primarily used to call macros or declare/update Make targets. 141*333d2b36SAndroid Build Coastguard Worker ExtraFooters []AndroidMkExtraFootersFunc 142*333d2b36SAndroid Build Coastguard Worker 143*333d2b36SAndroid Build Coastguard Worker // A map that holds the up-to-date Make variable values. Can be accessed from tests. 144*333d2b36SAndroid Build Coastguard Worker EntryMap map[string][]string 145*333d2b36SAndroid Build Coastguard Worker // A list of EntryMap keys in insertion order. This serves a few purposes: 146*333d2b36SAndroid Build Coastguard Worker // 1. Prevents churns. Golang map doesn't provide consistent iteration order, so without this, 147*333d2b36SAndroid Build Coastguard Worker // the outputted Android-*.mk file may change even though there have been no content changes. 148*333d2b36SAndroid Build Coastguard Worker // 2. Allows modules to refer to other variables, like LOCAL_BAR_VAR := $(LOCAL_FOO_VAR), 149*333d2b36SAndroid Build Coastguard Worker // without worrying about the variables being mixed up in the actual mk file. 150*333d2b36SAndroid Build Coastguard Worker // 3. Makes troubleshooting and spotting errors easier. 151*333d2b36SAndroid Build Coastguard Worker entryOrder []string 152*333d2b36SAndroid Build Coastguard Worker 153*333d2b36SAndroid Build Coastguard Worker // Provides data typically stored by Context objects that are commonly needed by 154*333d2b36SAndroid Build Coastguard Worker //AndroidMkEntries objects. 155*333d2b36SAndroid Build Coastguard Worker entryContext AndroidMkEntriesContext 156*333d2b36SAndroid Build Coastguard Worker} 157*333d2b36SAndroid Build Coastguard Worker 158*333d2b36SAndroid Build Coastguard Workertype AndroidMkEntriesContext interface { 159*333d2b36SAndroid Build Coastguard Worker OtherModuleProviderContext 160*333d2b36SAndroid Build Coastguard Worker Config() Config 161*333d2b36SAndroid Build Coastguard Worker} 162*333d2b36SAndroid Build Coastguard Worker 163*333d2b36SAndroid Build Coastguard Workertype AndroidMkExtraEntriesContext interface { 164*333d2b36SAndroid Build Coastguard Worker Provider(provider blueprint.AnyProviderKey) (any, bool) 165*333d2b36SAndroid Build Coastguard Worker} 166*333d2b36SAndroid Build Coastguard Worker 167*333d2b36SAndroid Build Coastguard Workertype androidMkExtraEntriesContext struct { 168*333d2b36SAndroid Build Coastguard Worker ctx fillInEntriesContext 169*333d2b36SAndroid Build Coastguard Worker mod blueprint.Module 170*333d2b36SAndroid Build Coastguard Worker} 171*333d2b36SAndroid Build Coastguard Worker 172*333d2b36SAndroid Build Coastguard Workerfunc (a *androidMkExtraEntriesContext) Provider(provider blueprint.AnyProviderKey) (any, bool) { 173*333d2b36SAndroid Build Coastguard Worker return a.ctx.otherModuleProvider(a.mod, provider) 174*333d2b36SAndroid Build Coastguard Worker} 175*333d2b36SAndroid Build Coastguard Worker 176*333d2b36SAndroid Build Coastguard Workertype AndroidMkExtraEntriesFunc func(ctx AndroidMkExtraEntriesContext, entries *AndroidMkEntries) 177*333d2b36SAndroid Build Coastguard Workertype AndroidMkExtraFootersFunc func(w io.Writer, name, prefix, moduleDir string) 178*333d2b36SAndroid Build Coastguard Worker 179*333d2b36SAndroid Build Coastguard Worker// Utility funcs to manipulate Android.mk variable entries. 180*333d2b36SAndroid Build Coastguard Worker 181*333d2b36SAndroid Build Coastguard Worker// SetString sets a Make variable with the given name to the given value. 182*333d2b36SAndroid Build Coastguard Workerfunc (a *AndroidMkEntries) SetString(name, value string) { 183*333d2b36SAndroid Build Coastguard Worker if _, ok := a.EntryMap[name]; !ok { 184*333d2b36SAndroid Build Coastguard Worker a.entryOrder = append(a.entryOrder, name) 185*333d2b36SAndroid Build Coastguard Worker } 186*333d2b36SAndroid Build Coastguard Worker a.EntryMap[name] = []string{value} 187*333d2b36SAndroid Build Coastguard Worker} 188*333d2b36SAndroid Build Coastguard Worker 189*333d2b36SAndroid Build Coastguard Worker// SetPath sets a Make variable with the given name to the given path string. 190*333d2b36SAndroid Build Coastguard Workerfunc (a *AndroidMkEntries) SetPath(name string, path Path) { 191*333d2b36SAndroid Build Coastguard Worker if _, ok := a.EntryMap[name]; !ok { 192*333d2b36SAndroid Build Coastguard Worker a.entryOrder = append(a.entryOrder, name) 193*333d2b36SAndroid Build Coastguard Worker } 194*333d2b36SAndroid Build Coastguard Worker a.EntryMap[name] = []string{path.String()} 195*333d2b36SAndroid Build Coastguard Worker} 196*333d2b36SAndroid Build Coastguard Worker 197*333d2b36SAndroid Build Coastguard Worker// SetOptionalPath sets a Make variable with the given name to the given path string if it is valid. 198*333d2b36SAndroid Build Coastguard Worker// It is a no-op if the given path is invalid. 199*333d2b36SAndroid Build Coastguard Workerfunc (a *AndroidMkEntries) SetOptionalPath(name string, path OptionalPath) { 200*333d2b36SAndroid Build Coastguard Worker if path.Valid() { 201*333d2b36SAndroid Build Coastguard Worker a.SetPath(name, path.Path()) 202*333d2b36SAndroid Build Coastguard Worker } 203*333d2b36SAndroid Build Coastguard Worker} 204*333d2b36SAndroid Build Coastguard Worker 205*333d2b36SAndroid Build Coastguard Worker// AddPath appends the given path string to a Make variable with the given name. 206*333d2b36SAndroid Build Coastguard Workerfunc (a *AndroidMkEntries) AddPath(name string, path Path) { 207*333d2b36SAndroid Build Coastguard Worker if _, ok := a.EntryMap[name]; !ok { 208*333d2b36SAndroid Build Coastguard Worker a.entryOrder = append(a.entryOrder, name) 209*333d2b36SAndroid Build Coastguard Worker } 210*333d2b36SAndroid Build Coastguard Worker a.EntryMap[name] = append(a.EntryMap[name], path.String()) 211*333d2b36SAndroid Build Coastguard Worker} 212*333d2b36SAndroid Build Coastguard Worker 213*333d2b36SAndroid Build Coastguard Worker// AddOptionalPath appends the given path string to a Make variable with the given name if it is 214*333d2b36SAndroid Build Coastguard Worker// valid. It is a no-op if the given path is invalid. 215*333d2b36SAndroid Build Coastguard Workerfunc (a *AndroidMkEntries) AddOptionalPath(name string, path OptionalPath) { 216*333d2b36SAndroid Build Coastguard Worker if path.Valid() { 217*333d2b36SAndroid Build Coastguard Worker a.AddPath(name, path.Path()) 218*333d2b36SAndroid Build Coastguard Worker } 219*333d2b36SAndroid Build Coastguard Worker} 220*333d2b36SAndroid Build Coastguard Worker 221*333d2b36SAndroid Build Coastguard Worker// SetPaths sets a Make variable with the given name to a slice of the given path strings. 222*333d2b36SAndroid Build Coastguard Workerfunc (a *AndroidMkEntries) SetPaths(name string, paths Paths) { 223*333d2b36SAndroid Build Coastguard Worker if _, ok := a.EntryMap[name]; !ok { 224*333d2b36SAndroid Build Coastguard Worker a.entryOrder = append(a.entryOrder, name) 225*333d2b36SAndroid Build Coastguard Worker } 226*333d2b36SAndroid Build Coastguard Worker a.EntryMap[name] = paths.Strings() 227*333d2b36SAndroid Build Coastguard Worker} 228*333d2b36SAndroid Build Coastguard Worker 229*333d2b36SAndroid Build Coastguard Worker// SetOptionalPaths sets a Make variable with the given name to a slice of the given path strings 230*333d2b36SAndroid Build Coastguard Worker// only if there are a non-zero amount of paths. 231*333d2b36SAndroid Build Coastguard Workerfunc (a *AndroidMkEntries) SetOptionalPaths(name string, paths Paths) { 232*333d2b36SAndroid Build Coastguard Worker if len(paths) > 0 { 233*333d2b36SAndroid Build Coastguard Worker a.SetPaths(name, paths) 234*333d2b36SAndroid Build Coastguard Worker } 235*333d2b36SAndroid Build Coastguard Worker} 236*333d2b36SAndroid Build Coastguard Worker 237*333d2b36SAndroid Build Coastguard Worker// AddPaths appends the given path strings to a Make variable with the given name. 238*333d2b36SAndroid Build Coastguard Workerfunc (a *AndroidMkEntries) AddPaths(name string, paths Paths) { 239*333d2b36SAndroid Build Coastguard Worker if _, ok := a.EntryMap[name]; !ok { 240*333d2b36SAndroid Build Coastguard Worker a.entryOrder = append(a.entryOrder, name) 241*333d2b36SAndroid Build Coastguard Worker } 242*333d2b36SAndroid Build Coastguard Worker a.EntryMap[name] = append(a.EntryMap[name], paths.Strings()...) 243*333d2b36SAndroid Build Coastguard Worker} 244*333d2b36SAndroid Build Coastguard Worker 245*333d2b36SAndroid Build Coastguard Worker// SetBoolIfTrue sets a Make variable with the given name to true if the given flag is true. 246*333d2b36SAndroid Build Coastguard Worker// It is a no-op if the given flag is false. 247*333d2b36SAndroid Build Coastguard Workerfunc (a *AndroidMkEntries) SetBoolIfTrue(name string, flag bool) { 248*333d2b36SAndroid Build Coastguard Worker if flag { 249*333d2b36SAndroid Build Coastguard Worker if _, ok := a.EntryMap[name]; !ok { 250*333d2b36SAndroid Build Coastguard Worker a.entryOrder = append(a.entryOrder, name) 251*333d2b36SAndroid Build Coastguard Worker } 252*333d2b36SAndroid Build Coastguard Worker a.EntryMap[name] = []string{"true"} 253*333d2b36SAndroid Build Coastguard Worker } 254*333d2b36SAndroid Build Coastguard Worker} 255*333d2b36SAndroid Build Coastguard Worker 256*333d2b36SAndroid Build Coastguard Worker// SetBool sets a Make variable with the given name to if the given bool flag value. 257*333d2b36SAndroid Build Coastguard Workerfunc (a *AndroidMkEntries) SetBool(name string, flag bool) { 258*333d2b36SAndroid Build Coastguard Worker if _, ok := a.EntryMap[name]; !ok { 259*333d2b36SAndroid Build Coastguard Worker a.entryOrder = append(a.entryOrder, name) 260*333d2b36SAndroid Build Coastguard Worker } 261*333d2b36SAndroid Build Coastguard Worker if flag { 262*333d2b36SAndroid Build Coastguard Worker a.EntryMap[name] = []string{"true"} 263*333d2b36SAndroid Build Coastguard Worker } else { 264*333d2b36SAndroid Build Coastguard Worker a.EntryMap[name] = []string{"false"} 265*333d2b36SAndroid Build Coastguard Worker } 266*333d2b36SAndroid Build Coastguard Worker} 267*333d2b36SAndroid Build Coastguard Worker 268*333d2b36SAndroid Build Coastguard Worker// AddStrings appends the given strings to a Make variable with the given name. 269*333d2b36SAndroid Build Coastguard Workerfunc (a *AndroidMkEntries) AddStrings(name string, value ...string) { 270*333d2b36SAndroid Build Coastguard Worker if len(value) == 0 { 271*333d2b36SAndroid Build Coastguard Worker return 272*333d2b36SAndroid Build Coastguard Worker } 273*333d2b36SAndroid Build Coastguard Worker if _, ok := a.EntryMap[name]; !ok { 274*333d2b36SAndroid Build Coastguard Worker a.entryOrder = append(a.entryOrder, name) 275*333d2b36SAndroid Build Coastguard Worker } 276*333d2b36SAndroid Build Coastguard Worker a.EntryMap[name] = append(a.EntryMap[name], value...) 277*333d2b36SAndroid Build Coastguard Worker} 278*333d2b36SAndroid Build Coastguard Worker 279*333d2b36SAndroid Build Coastguard Worker// AddCompatibilityTestSuites adds the supplied test suites to the EntryMap, with special handling 280*333d2b36SAndroid Build Coastguard Worker// for partial MTS and MCTS test suites. 281*333d2b36SAndroid Build Coastguard Workerfunc (a *AndroidMkEntries) AddCompatibilityTestSuites(suites ...string) { 282*333d2b36SAndroid Build Coastguard Worker // M(C)TS supports a full test suite and partial per-module MTS test suites, with naming mts-${MODULE}. 283*333d2b36SAndroid Build Coastguard Worker // To reduce repetition, if we find a partial M(C)TS test suite without an full M(C)TS test suite, 284*333d2b36SAndroid Build Coastguard Worker // we add the full test suite to our list. 285*333d2b36SAndroid Build Coastguard Worker if PrefixInList(suites, "mts-") && !InList("mts", suites) { 286*333d2b36SAndroid Build Coastguard Worker suites = append(suites, "mts") 287*333d2b36SAndroid Build Coastguard Worker } 288*333d2b36SAndroid Build Coastguard Worker if PrefixInList(suites, "mcts-") && !InList("mcts", suites) { 289*333d2b36SAndroid Build Coastguard Worker suites = append(suites, "mcts") 290*333d2b36SAndroid Build Coastguard Worker } 291*333d2b36SAndroid Build Coastguard Worker a.AddStrings("LOCAL_COMPATIBILITY_SUITE", suites...) 292*333d2b36SAndroid Build Coastguard Worker} 293*333d2b36SAndroid Build Coastguard Worker 294*333d2b36SAndroid Build Coastguard Worker// The contributions to the dist. 295*333d2b36SAndroid Build Coastguard Workertype distContributions struct { 296*333d2b36SAndroid Build Coastguard Worker // Path to license metadata file. 297*333d2b36SAndroid Build Coastguard Worker licenseMetadataFile Path 298*333d2b36SAndroid Build Coastguard Worker // List of goals and the dist copy instructions. 299*333d2b36SAndroid Build Coastguard Worker copiesForGoals []*copiesForGoals 300*333d2b36SAndroid Build Coastguard Worker} 301*333d2b36SAndroid Build Coastguard Worker 302*333d2b36SAndroid Build Coastguard Worker// getCopiesForGoals returns a copiesForGoals into which copy instructions that 303*333d2b36SAndroid Build Coastguard Worker// must be processed when building one or more of those goals can be added. 304*333d2b36SAndroid Build Coastguard Workerfunc (d *distContributions) getCopiesForGoals(goals string) *copiesForGoals { 305*333d2b36SAndroid Build Coastguard Worker copiesForGoals := &copiesForGoals{goals: goals} 306*333d2b36SAndroid Build Coastguard Worker d.copiesForGoals = append(d.copiesForGoals, copiesForGoals) 307*333d2b36SAndroid Build Coastguard Worker return copiesForGoals 308*333d2b36SAndroid Build Coastguard Worker} 309*333d2b36SAndroid Build Coastguard Worker 310*333d2b36SAndroid Build Coastguard Worker// Associates a list of dist copy instructions with a set of goals for which they 311*333d2b36SAndroid Build Coastguard Worker// should be run. 312*333d2b36SAndroid Build Coastguard Workertype copiesForGoals struct { 313*333d2b36SAndroid Build Coastguard Worker // goals are a space separated list of build targets that will trigger the 314*333d2b36SAndroid Build Coastguard Worker // copy instructions. 315*333d2b36SAndroid Build Coastguard Worker goals string 316*333d2b36SAndroid Build Coastguard Worker 317*333d2b36SAndroid Build Coastguard Worker // A list of instructions to copy a module's output files to somewhere in the 318*333d2b36SAndroid Build Coastguard Worker // dist directory. 319*333d2b36SAndroid Build Coastguard Worker copies []distCopy 320*333d2b36SAndroid Build Coastguard Worker} 321*333d2b36SAndroid Build Coastguard Worker 322*333d2b36SAndroid Build Coastguard Worker// Adds a copy instruction. 323*333d2b36SAndroid Build Coastguard Workerfunc (d *copiesForGoals) addCopyInstruction(from Path, dest string) { 324*333d2b36SAndroid Build Coastguard Worker d.copies = append(d.copies, distCopy{from, dest}) 325*333d2b36SAndroid Build Coastguard Worker} 326*333d2b36SAndroid Build Coastguard Worker 327*333d2b36SAndroid Build Coastguard Worker// Instruction on a path that must be copied into the dist. 328*333d2b36SAndroid Build Coastguard Workertype distCopy struct { 329*333d2b36SAndroid Build Coastguard Worker // The path to copy from. 330*333d2b36SAndroid Build Coastguard Worker from Path 331*333d2b36SAndroid Build Coastguard Worker 332*333d2b36SAndroid Build Coastguard Worker // The destination within the dist directory to copy to. 333*333d2b36SAndroid Build Coastguard Worker dest string 334*333d2b36SAndroid Build Coastguard Worker} 335*333d2b36SAndroid Build Coastguard Worker 336*333d2b36SAndroid Build Coastguard Worker// Compute the contributions that the module makes to the dist. 337*333d2b36SAndroid Build Coastguard Workerfunc (a *AndroidMkEntries) getDistContributions(mod blueprint.Module) *distContributions { 338*333d2b36SAndroid Build Coastguard Worker amod := mod.(Module).base() 339*333d2b36SAndroid Build Coastguard Worker name := amod.BaseModuleName() 340*333d2b36SAndroid Build Coastguard Worker 341*333d2b36SAndroid Build Coastguard Worker // Collate the set of associated tag/paths available for copying to the dist. 342*333d2b36SAndroid Build Coastguard Worker // Start with an empty (nil) set. 343*333d2b36SAndroid Build Coastguard Worker var availableTaggedDists TaggedDistFiles 344*333d2b36SAndroid Build Coastguard Worker 345*333d2b36SAndroid Build Coastguard Worker // Then merge in any that are provided explicitly by the module. 346*333d2b36SAndroid Build Coastguard Worker if a.DistFiles != nil { 347*333d2b36SAndroid Build Coastguard Worker // Merge the DistFiles into the set. 348*333d2b36SAndroid Build Coastguard Worker availableTaggedDists = availableTaggedDists.merge(a.DistFiles) 349*333d2b36SAndroid Build Coastguard Worker } 350*333d2b36SAndroid Build Coastguard Worker 351*333d2b36SAndroid Build Coastguard Worker // If no paths have been provided for the DefaultDistTag and the output file is 352*333d2b36SAndroid Build Coastguard Worker // valid then add that as the default dist path. 353*333d2b36SAndroid Build Coastguard Worker if _, ok := availableTaggedDists[DefaultDistTag]; !ok && a.OutputFile.Valid() { 354*333d2b36SAndroid Build Coastguard Worker availableTaggedDists = availableTaggedDists.addPathsForTag(DefaultDistTag, a.OutputFile.Path()) 355*333d2b36SAndroid Build Coastguard Worker } 356*333d2b36SAndroid Build Coastguard Worker 357*333d2b36SAndroid Build Coastguard Worker info := OtherModuleProviderOrDefault(a.entryContext, mod, InstallFilesProvider) 358*333d2b36SAndroid Build Coastguard Worker // If the distFiles created by GenerateTaggedDistFiles contains paths for the 359*333d2b36SAndroid Build Coastguard Worker // DefaultDistTag then that takes priority so delete any existing paths. 360*333d2b36SAndroid Build Coastguard Worker if _, ok := info.DistFiles[DefaultDistTag]; ok { 361*333d2b36SAndroid Build Coastguard Worker delete(availableTaggedDists, DefaultDistTag) 362*333d2b36SAndroid Build Coastguard Worker } 363*333d2b36SAndroid Build Coastguard Worker 364*333d2b36SAndroid Build Coastguard Worker // Finally, merge the distFiles created by GenerateTaggedDistFiles. 365*333d2b36SAndroid Build Coastguard Worker availableTaggedDists = availableTaggedDists.merge(info.DistFiles) 366*333d2b36SAndroid Build Coastguard Worker 367*333d2b36SAndroid Build Coastguard Worker if len(availableTaggedDists) == 0 { 368*333d2b36SAndroid Build Coastguard Worker // Nothing dist-able for this module. 369*333d2b36SAndroid Build Coastguard Worker return nil 370*333d2b36SAndroid Build Coastguard Worker } 371*333d2b36SAndroid Build Coastguard Worker 372*333d2b36SAndroid Build Coastguard Worker // Collate the contributions this module makes to the dist. 373*333d2b36SAndroid Build Coastguard Worker distContributions := &distContributions{} 374*333d2b36SAndroid Build Coastguard Worker 375*333d2b36SAndroid Build Coastguard Worker if !exemptFromRequiredApplicableLicensesProperty(mod.(Module)) { 376*333d2b36SAndroid Build Coastguard Worker distContributions.licenseMetadataFile = info.LicenseMetadataFile 377*333d2b36SAndroid Build Coastguard Worker } 378*333d2b36SAndroid Build Coastguard Worker 379*333d2b36SAndroid Build Coastguard Worker // Iterate over this module's dist structs, merged from the dist and dists properties. 380*333d2b36SAndroid Build Coastguard Worker for _, dist := range amod.Dists() { 381*333d2b36SAndroid Build Coastguard Worker // Get the list of goals this dist should be enabled for. e.g. sdk, droidcore 382*333d2b36SAndroid Build Coastguard Worker goals := strings.Join(dist.Targets, " ") 383*333d2b36SAndroid Build Coastguard Worker 384*333d2b36SAndroid Build Coastguard Worker // Get the tag representing the output files to be dist'd. e.g. ".jar", ".proguard_map" 385*333d2b36SAndroid Build Coastguard Worker var tag string 386*333d2b36SAndroid Build Coastguard Worker if dist.Tag == nil { 387*333d2b36SAndroid Build Coastguard Worker // If the dist struct does not specify a tag, use the default output files tag. 388*333d2b36SAndroid Build Coastguard Worker tag = DefaultDistTag 389*333d2b36SAndroid Build Coastguard Worker } else { 390*333d2b36SAndroid Build Coastguard Worker tag = *dist.Tag 391*333d2b36SAndroid Build Coastguard Worker } 392*333d2b36SAndroid Build Coastguard Worker 393*333d2b36SAndroid Build Coastguard Worker // Get the paths of the output files to be dist'd, represented by the tag. 394*333d2b36SAndroid Build Coastguard Worker // Can be an empty list. 395*333d2b36SAndroid Build Coastguard Worker tagPaths := availableTaggedDists[tag] 396*333d2b36SAndroid Build Coastguard Worker if len(tagPaths) == 0 { 397*333d2b36SAndroid Build Coastguard Worker // Nothing to dist for this tag, continue to the next dist. 398*333d2b36SAndroid Build Coastguard Worker continue 399*333d2b36SAndroid Build Coastguard Worker } 400*333d2b36SAndroid Build Coastguard Worker 401*333d2b36SAndroid Build Coastguard Worker if len(tagPaths) > 1 && (dist.Dest != nil || dist.Suffix != nil) { 402*333d2b36SAndroid Build Coastguard Worker errorMessage := "%s: Cannot apply dest/suffix for more than one dist " + 403*333d2b36SAndroid Build Coastguard Worker "file for %q goals tag %q in module %s. The list of dist files, " + 404*333d2b36SAndroid Build Coastguard Worker "which should have a single element, is:\n%s" 405*333d2b36SAndroid Build Coastguard Worker panic(fmt.Errorf(errorMessage, mod, goals, tag, name, tagPaths)) 406*333d2b36SAndroid Build Coastguard Worker } 407*333d2b36SAndroid Build Coastguard Worker 408*333d2b36SAndroid Build Coastguard Worker copiesForGoals := distContributions.getCopiesForGoals(goals) 409*333d2b36SAndroid Build Coastguard Worker 410*333d2b36SAndroid Build Coastguard Worker // Iterate over each path adding a copy instruction to copiesForGoals 411*333d2b36SAndroid Build Coastguard Worker for _, path := range tagPaths { 412*333d2b36SAndroid Build Coastguard Worker // It's possible that the Path is nil from errant modules. Be defensive here. 413*333d2b36SAndroid Build Coastguard Worker if path == nil { 414*333d2b36SAndroid Build Coastguard Worker tagName := "default" // for error message readability 415*333d2b36SAndroid Build Coastguard Worker if dist.Tag != nil { 416*333d2b36SAndroid Build Coastguard Worker tagName = *dist.Tag 417*333d2b36SAndroid Build Coastguard Worker } 418*333d2b36SAndroid Build Coastguard Worker panic(fmt.Errorf("Dist file should not be nil for the %s tag in %s", tagName, name)) 419*333d2b36SAndroid Build Coastguard Worker } 420*333d2b36SAndroid Build Coastguard Worker 421*333d2b36SAndroid Build Coastguard Worker dest := filepath.Base(path.String()) 422*333d2b36SAndroid Build Coastguard Worker 423*333d2b36SAndroid Build Coastguard Worker if dist.Dest != nil { 424*333d2b36SAndroid Build Coastguard Worker var err error 425*333d2b36SAndroid Build Coastguard Worker if dest, err = validateSafePath(*dist.Dest); err != nil { 426*333d2b36SAndroid Build Coastguard Worker // This was checked in ModuleBase.GenerateBuildActions 427*333d2b36SAndroid Build Coastguard Worker panic(err) 428*333d2b36SAndroid Build Coastguard Worker } 429*333d2b36SAndroid Build Coastguard Worker } 430*333d2b36SAndroid Build Coastguard Worker 431*333d2b36SAndroid Build Coastguard Worker ext := filepath.Ext(dest) 432*333d2b36SAndroid Build Coastguard Worker suffix := "" 433*333d2b36SAndroid Build Coastguard Worker if dist.Suffix != nil { 434*333d2b36SAndroid Build Coastguard Worker suffix = *dist.Suffix 435*333d2b36SAndroid Build Coastguard Worker } 436*333d2b36SAndroid Build Coastguard Worker 437*333d2b36SAndroid Build Coastguard Worker productString := "" 438*333d2b36SAndroid Build Coastguard Worker if dist.Append_artifact_with_product != nil && *dist.Append_artifact_with_product { 439*333d2b36SAndroid Build Coastguard Worker productString = fmt.Sprintf("_%s", a.entryContext.Config().DeviceProduct()) 440*333d2b36SAndroid Build Coastguard Worker } 441*333d2b36SAndroid Build Coastguard Worker 442*333d2b36SAndroid Build Coastguard Worker if suffix != "" || productString != "" { 443*333d2b36SAndroid Build Coastguard Worker dest = strings.TrimSuffix(dest, ext) + suffix + productString + ext 444*333d2b36SAndroid Build Coastguard Worker } 445*333d2b36SAndroid Build Coastguard Worker 446*333d2b36SAndroid Build Coastguard Worker if dist.Dir != nil { 447*333d2b36SAndroid Build Coastguard Worker var err error 448*333d2b36SAndroid Build Coastguard Worker if dest, err = validateSafePath(*dist.Dir, dest); err != nil { 449*333d2b36SAndroid Build Coastguard Worker // This was checked in ModuleBase.GenerateBuildActions 450*333d2b36SAndroid Build Coastguard Worker panic(err) 451*333d2b36SAndroid Build Coastguard Worker } 452*333d2b36SAndroid Build Coastguard Worker } 453*333d2b36SAndroid Build Coastguard Worker 454*333d2b36SAndroid Build Coastguard Worker copiesForGoals.addCopyInstruction(path, dest) 455*333d2b36SAndroid Build Coastguard Worker } 456*333d2b36SAndroid Build Coastguard Worker } 457*333d2b36SAndroid Build Coastguard Worker 458*333d2b36SAndroid Build Coastguard Worker return distContributions 459*333d2b36SAndroid Build Coastguard Worker} 460*333d2b36SAndroid Build Coastguard Worker 461*333d2b36SAndroid Build Coastguard Worker// generateDistContributionsForMake generates make rules that will generate the 462*333d2b36SAndroid Build Coastguard Worker// dist according to the instructions in the supplied distContribution. 463*333d2b36SAndroid Build Coastguard Workerfunc generateDistContributionsForMake(distContributions *distContributions) []string { 464*333d2b36SAndroid Build Coastguard Worker var ret []string 465*333d2b36SAndroid Build Coastguard Worker for _, d := range distContributions.copiesForGoals { 466*333d2b36SAndroid Build Coastguard Worker ret = append(ret, fmt.Sprintf(".PHONY: %s", d.goals)) 467*333d2b36SAndroid Build Coastguard Worker // Create dist-for-goals calls for each of the copy instructions. 468*333d2b36SAndroid Build Coastguard Worker for _, c := range d.copies { 469*333d2b36SAndroid Build Coastguard Worker if distContributions.licenseMetadataFile != nil { 470*333d2b36SAndroid Build Coastguard Worker ret = append( 471*333d2b36SAndroid Build Coastguard Worker ret, 472*333d2b36SAndroid Build Coastguard Worker fmt.Sprintf("$(if $(strip $(ALL_TARGETS.%s.META_LIC)),,$(eval ALL_TARGETS.%s.META_LIC := %s))", 473*333d2b36SAndroid Build Coastguard Worker c.from.String(), c.from.String(), distContributions.licenseMetadataFile.String())) 474*333d2b36SAndroid Build Coastguard Worker } 475*333d2b36SAndroid Build Coastguard Worker ret = append( 476*333d2b36SAndroid Build Coastguard Worker ret, 477*333d2b36SAndroid Build Coastguard Worker fmt.Sprintf("$(call dist-for-goals,%s,%s:%s)", d.goals, c.from.String(), c.dest)) 478*333d2b36SAndroid Build Coastguard Worker } 479*333d2b36SAndroid Build Coastguard Worker } 480*333d2b36SAndroid Build Coastguard Worker 481*333d2b36SAndroid Build Coastguard Worker return ret 482*333d2b36SAndroid Build Coastguard Worker} 483*333d2b36SAndroid Build Coastguard Worker 484*333d2b36SAndroid Build Coastguard Worker// Compute the list of Make strings to declare phony goals and dist-for-goals 485*333d2b36SAndroid Build Coastguard Worker// calls from the module's dist and dists properties. 486*333d2b36SAndroid Build Coastguard Workerfunc (a *AndroidMkEntries) GetDistForGoals(mod blueprint.Module) []string { 487*333d2b36SAndroid Build Coastguard Worker distContributions := a.getDistContributions(mod) 488*333d2b36SAndroid Build Coastguard Worker if distContributions == nil { 489*333d2b36SAndroid Build Coastguard Worker return nil 490*333d2b36SAndroid Build Coastguard Worker } 491*333d2b36SAndroid Build Coastguard Worker 492*333d2b36SAndroid Build Coastguard Worker return generateDistContributionsForMake(distContributions) 493*333d2b36SAndroid Build Coastguard Worker} 494*333d2b36SAndroid Build Coastguard Worker 495*333d2b36SAndroid Build Coastguard Worker// fillInEntries goes through the common variable processing and calls the extra data funcs to 496*333d2b36SAndroid Build Coastguard Worker// generate and fill in AndroidMkEntries's in-struct data, ready to be flushed to a file. 497*333d2b36SAndroid Build Coastguard Workertype fillInEntriesContext interface { 498*333d2b36SAndroid Build Coastguard Worker ModuleDir(module blueprint.Module) string 499*333d2b36SAndroid Build Coastguard Worker ModuleSubDir(module blueprint.Module) string 500*333d2b36SAndroid Build Coastguard Worker Config() Config 501*333d2b36SAndroid Build Coastguard Worker otherModuleProvider(module blueprint.Module, provider blueprint.AnyProviderKey) (any, bool) 502*333d2b36SAndroid Build Coastguard Worker ModuleType(module blueprint.Module) string 503*333d2b36SAndroid Build Coastguard Worker OtherModulePropertyErrorf(module Module, property string, fmt string, args ...interface{}) 504*333d2b36SAndroid Build Coastguard Worker HasMutatorFinished(mutatorName string) bool 505*333d2b36SAndroid Build Coastguard Worker} 506*333d2b36SAndroid Build Coastguard Worker 507*333d2b36SAndroid Build Coastguard Workerfunc (a *AndroidMkEntries) fillInEntries(ctx fillInEntriesContext, mod blueprint.Module) { 508*333d2b36SAndroid Build Coastguard Worker a.entryContext = ctx 509*333d2b36SAndroid Build Coastguard Worker a.EntryMap = make(map[string][]string) 510*333d2b36SAndroid Build Coastguard Worker amod := mod.(Module) 511*333d2b36SAndroid Build Coastguard Worker base := amod.base() 512*333d2b36SAndroid Build Coastguard Worker name := base.BaseModuleName() 513*333d2b36SAndroid Build Coastguard Worker if a.OverrideName != "" { 514*333d2b36SAndroid Build Coastguard Worker name = a.OverrideName 515*333d2b36SAndroid Build Coastguard Worker } 516*333d2b36SAndroid Build Coastguard Worker 517*333d2b36SAndroid Build Coastguard Worker if a.Include == "" { 518*333d2b36SAndroid Build Coastguard Worker a.Include = "$(BUILD_PREBUILT)" 519*333d2b36SAndroid Build Coastguard Worker } 520*333d2b36SAndroid Build Coastguard Worker a.Required = append(a.Required, amod.RequiredModuleNames(ctx)...) 521*333d2b36SAndroid Build Coastguard Worker a.Required = append(a.Required, amod.VintfFragmentModuleNames(ctx)...) 522*333d2b36SAndroid Build Coastguard Worker a.Host_required = append(a.Host_required, amod.HostRequiredModuleNames()...) 523*333d2b36SAndroid Build Coastguard Worker a.Target_required = append(a.Target_required, amod.TargetRequiredModuleNames()...) 524*333d2b36SAndroid Build Coastguard Worker 525*333d2b36SAndroid Build Coastguard Worker for _, distString := range a.GetDistForGoals(mod) { 526*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(&a.header, distString) 527*333d2b36SAndroid Build Coastguard Worker } 528*333d2b36SAndroid Build Coastguard Worker 529*333d2b36SAndroid Build Coastguard Worker fmt.Fprintf(&a.header, "\ninclude $(CLEAR_VARS) # type: %s, name: %s, variant: %s\n", ctx.ModuleType(mod), base.BaseModuleName(), ctx.ModuleSubDir(mod)) 530*333d2b36SAndroid Build Coastguard Worker 531*333d2b36SAndroid Build Coastguard Worker // Collect make variable assignment entries. 532*333d2b36SAndroid Build Coastguard Worker a.SetString("LOCAL_PATH", ctx.ModuleDir(mod)) 533*333d2b36SAndroid Build Coastguard Worker a.SetString("LOCAL_MODULE", name+a.SubName) 534*333d2b36SAndroid Build Coastguard Worker a.SetString("LOCAL_MODULE_CLASS", a.Class) 535*333d2b36SAndroid Build Coastguard Worker a.SetString("LOCAL_PREBUILT_MODULE_FILE", a.OutputFile.String()) 536*333d2b36SAndroid Build Coastguard Worker a.AddStrings("LOCAL_REQUIRED_MODULES", a.Required...) 537*333d2b36SAndroid Build Coastguard Worker a.AddStrings("LOCAL_HOST_REQUIRED_MODULES", a.Host_required...) 538*333d2b36SAndroid Build Coastguard Worker a.AddStrings("LOCAL_TARGET_REQUIRED_MODULES", a.Target_required...) 539*333d2b36SAndroid Build Coastguard Worker a.AddStrings("LOCAL_SOONG_MODULE_TYPE", ctx.ModuleType(amod)) 540*333d2b36SAndroid Build Coastguard Worker 541*333d2b36SAndroid Build Coastguard Worker // If the install rule was generated by Soong tell Make about it. 542*333d2b36SAndroid Build Coastguard Worker info := OtherModuleProviderOrDefault(ctx, mod, InstallFilesProvider) 543*333d2b36SAndroid Build Coastguard Worker if len(info.KatiInstalls) > 0 { 544*333d2b36SAndroid Build Coastguard Worker // Assume the primary install file is last since it probably needs to depend on any other 545*333d2b36SAndroid Build Coastguard Worker // installed files. If that is not the case we can add a method to specify the primary 546*333d2b36SAndroid Build Coastguard Worker // installed file. 547*333d2b36SAndroid Build Coastguard Worker a.SetPath("LOCAL_SOONG_INSTALLED_MODULE", info.KatiInstalls[len(info.KatiInstalls)-1].to) 548*333d2b36SAndroid Build Coastguard Worker a.SetString("LOCAL_SOONG_INSTALL_PAIRS", info.KatiInstalls.BuiltInstalled()) 549*333d2b36SAndroid Build Coastguard Worker a.SetPaths("LOCAL_SOONG_INSTALL_SYMLINKS", info.KatiSymlinks.InstallPaths().Paths()) 550*333d2b36SAndroid Build Coastguard Worker } else { 551*333d2b36SAndroid Build Coastguard Worker // Soong may not have generated the install rule also when `no_full_install: true`. 552*333d2b36SAndroid Build Coastguard Worker // Mark this module as uninstallable in order to prevent Make from creating an 553*333d2b36SAndroid Build Coastguard Worker // install rule there. 554*333d2b36SAndroid Build Coastguard Worker a.SetBoolIfTrue("LOCAL_UNINSTALLABLE_MODULE", proptools.Bool(base.commonProperties.No_full_install)) 555*333d2b36SAndroid Build Coastguard Worker } 556*333d2b36SAndroid Build Coastguard Worker 557*333d2b36SAndroid Build Coastguard Worker if info.UncheckedModule { 558*333d2b36SAndroid Build Coastguard Worker a.SetBool("LOCAL_DONT_CHECK_MODULE", true) 559*333d2b36SAndroid Build Coastguard Worker } else if info.CheckbuildTarget != nil { 560*333d2b36SAndroid Build Coastguard Worker a.SetPath("LOCAL_CHECKED_MODULE", info.CheckbuildTarget) 561*333d2b36SAndroid Build Coastguard Worker } else { 562*333d2b36SAndroid Build Coastguard Worker a.SetOptionalPath("LOCAL_CHECKED_MODULE", a.OutputFile) 563*333d2b36SAndroid Build Coastguard Worker } 564*333d2b36SAndroid Build Coastguard Worker 565*333d2b36SAndroid Build Coastguard Worker if len(info.TestData) > 0 { 566*333d2b36SAndroid Build Coastguard Worker a.AddStrings("LOCAL_TEST_DATA", androidMkDataPaths(info.TestData)...) 567*333d2b36SAndroid Build Coastguard Worker } 568*333d2b36SAndroid Build Coastguard Worker 569*333d2b36SAndroid Build Coastguard Worker if am, ok := mod.(ApexModule); ok { 570*333d2b36SAndroid Build Coastguard Worker a.SetBoolIfTrue("LOCAL_NOT_AVAILABLE_FOR_PLATFORM", am.NotAvailableForPlatform()) 571*333d2b36SAndroid Build Coastguard Worker } 572*333d2b36SAndroid Build Coastguard Worker 573*333d2b36SAndroid Build Coastguard Worker archStr := base.Arch().ArchType.String() 574*333d2b36SAndroid Build Coastguard Worker host := false 575*333d2b36SAndroid Build Coastguard Worker switch base.Os().Class { 576*333d2b36SAndroid Build Coastguard Worker case Host: 577*333d2b36SAndroid Build Coastguard Worker if base.Target().HostCross { 578*333d2b36SAndroid Build Coastguard Worker // Make cannot identify LOCAL_MODULE_HOST_CROSS_ARCH:= common. 579*333d2b36SAndroid Build Coastguard Worker if base.Arch().ArchType != Common { 580*333d2b36SAndroid Build Coastguard Worker a.SetString("LOCAL_MODULE_HOST_CROSS_ARCH", archStr) 581*333d2b36SAndroid Build Coastguard Worker } 582*333d2b36SAndroid Build Coastguard Worker } else { 583*333d2b36SAndroid Build Coastguard Worker // Make cannot identify LOCAL_MODULE_HOST_ARCH:= common. 584*333d2b36SAndroid Build Coastguard Worker if base.Arch().ArchType != Common { 585*333d2b36SAndroid Build Coastguard Worker a.SetString("LOCAL_MODULE_HOST_ARCH", archStr) 586*333d2b36SAndroid Build Coastguard Worker } 587*333d2b36SAndroid Build Coastguard Worker } 588*333d2b36SAndroid Build Coastguard Worker host = true 589*333d2b36SAndroid Build Coastguard Worker case Device: 590*333d2b36SAndroid Build Coastguard Worker // Make cannot identify LOCAL_MODULE_TARGET_ARCH:= common. 591*333d2b36SAndroid Build Coastguard Worker if base.Arch().ArchType != Common { 592*333d2b36SAndroid Build Coastguard Worker if base.Target().NativeBridge { 593*333d2b36SAndroid Build Coastguard Worker hostArchStr := base.Target().NativeBridgeHostArchName 594*333d2b36SAndroid Build Coastguard Worker if hostArchStr != "" { 595*333d2b36SAndroid Build Coastguard Worker a.SetString("LOCAL_MODULE_TARGET_ARCH", hostArchStr) 596*333d2b36SAndroid Build Coastguard Worker } 597*333d2b36SAndroid Build Coastguard Worker } else { 598*333d2b36SAndroid Build Coastguard Worker a.SetString("LOCAL_MODULE_TARGET_ARCH", archStr) 599*333d2b36SAndroid Build Coastguard Worker } 600*333d2b36SAndroid Build Coastguard Worker } 601*333d2b36SAndroid Build Coastguard Worker 602*333d2b36SAndroid Build Coastguard Worker if !base.InVendorRamdisk() { 603*333d2b36SAndroid Build Coastguard Worker a.AddPaths("LOCAL_FULL_INIT_RC", info.InitRcPaths) 604*333d2b36SAndroid Build Coastguard Worker } 605*333d2b36SAndroid Build Coastguard Worker if len(info.VintfFragmentsPaths) > 0 { 606*333d2b36SAndroid Build Coastguard Worker a.AddPaths("LOCAL_FULL_VINTF_FRAGMENTS", info.VintfFragmentsPaths) 607*333d2b36SAndroid Build Coastguard Worker } 608*333d2b36SAndroid Build Coastguard Worker a.SetBoolIfTrue("LOCAL_PROPRIETARY_MODULE", Bool(base.commonProperties.Proprietary)) 609*333d2b36SAndroid Build Coastguard Worker if Bool(base.commonProperties.Vendor) || Bool(base.commonProperties.Soc_specific) { 610*333d2b36SAndroid Build Coastguard Worker a.SetString("LOCAL_VENDOR_MODULE", "true") 611*333d2b36SAndroid Build Coastguard Worker } 612*333d2b36SAndroid Build Coastguard Worker a.SetBoolIfTrue("LOCAL_ODM_MODULE", Bool(base.commonProperties.Device_specific)) 613*333d2b36SAndroid Build Coastguard Worker a.SetBoolIfTrue("LOCAL_PRODUCT_MODULE", Bool(base.commonProperties.Product_specific)) 614*333d2b36SAndroid Build Coastguard Worker a.SetBoolIfTrue("LOCAL_SYSTEM_EXT_MODULE", Bool(base.commonProperties.System_ext_specific)) 615*333d2b36SAndroid Build Coastguard Worker if base.commonProperties.Owner != nil { 616*333d2b36SAndroid Build Coastguard Worker a.SetString("LOCAL_MODULE_OWNER", *base.commonProperties.Owner) 617*333d2b36SAndroid Build Coastguard Worker } 618*333d2b36SAndroid Build Coastguard Worker } 619*333d2b36SAndroid Build Coastguard Worker 620*333d2b36SAndroid Build Coastguard Worker if host { 621*333d2b36SAndroid Build Coastguard Worker makeOs := base.Os().String() 622*333d2b36SAndroid Build Coastguard Worker if base.Os() == Linux || base.Os() == LinuxBionic || base.Os() == LinuxMusl { 623*333d2b36SAndroid Build Coastguard Worker makeOs = "linux" 624*333d2b36SAndroid Build Coastguard Worker } 625*333d2b36SAndroid Build Coastguard Worker a.SetString("LOCAL_MODULE_HOST_OS", makeOs) 626*333d2b36SAndroid Build Coastguard Worker a.SetString("LOCAL_IS_HOST_MODULE", "true") 627*333d2b36SAndroid Build Coastguard Worker } 628*333d2b36SAndroid Build Coastguard Worker 629*333d2b36SAndroid Build Coastguard Worker prefix := "" 630*333d2b36SAndroid Build Coastguard Worker if base.ArchSpecific() { 631*333d2b36SAndroid Build Coastguard Worker switch base.Os().Class { 632*333d2b36SAndroid Build Coastguard Worker case Host: 633*333d2b36SAndroid Build Coastguard Worker if base.Target().HostCross { 634*333d2b36SAndroid Build Coastguard Worker prefix = "HOST_CROSS_" 635*333d2b36SAndroid Build Coastguard Worker } else { 636*333d2b36SAndroid Build Coastguard Worker prefix = "HOST_" 637*333d2b36SAndroid Build Coastguard Worker } 638*333d2b36SAndroid Build Coastguard Worker case Device: 639*333d2b36SAndroid Build Coastguard Worker prefix = "TARGET_" 640*333d2b36SAndroid Build Coastguard Worker 641*333d2b36SAndroid Build Coastguard Worker } 642*333d2b36SAndroid Build Coastguard Worker 643*333d2b36SAndroid Build Coastguard Worker if base.Arch().ArchType != ctx.Config().Targets[base.Os()][0].Arch.ArchType { 644*333d2b36SAndroid Build Coastguard Worker prefix = "2ND_" + prefix 645*333d2b36SAndroid Build Coastguard Worker } 646*333d2b36SAndroid Build Coastguard Worker } 647*333d2b36SAndroid Build Coastguard Worker 648*333d2b36SAndroid Build Coastguard Worker if licenseMetadata, ok := OtherModuleProvider(ctx, mod, LicenseMetadataProvider); ok { 649*333d2b36SAndroid Build Coastguard Worker a.SetPath("LOCAL_SOONG_LICENSE_METADATA", licenseMetadata.LicenseMetadataPath) 650*333d2b36SAndroid Build Coastguard Worker } 651*333d2b36SAndroid Build Coastguard Worker 652*333d2b36SAndroid Build Coastguard Worker if _, ok := OtherModuleProvider(ctx, mod, ModuleInfoJSONProvider); ok { 653*333d2b36SAndroid Build Coastguard Worker a.SetBool("LOCAL_SOONG_MODULE_INFO_JSON", true) 654*333d2b36SAndroid Build Coastguard Worker } 655*333d2b36SAndroid Build Coastguard Worker 656*333d2b36SAndroid Build Coastguard Worker extraCtx := &androidMkExtraEntriesContext{ 657*333d2b36SAndroid Build Coastguard Worker ctx: ctx, 658*333d2b36SAndroid Build Coastguard Worker mod: mod, 659*333d2b36SAndroid Build Coastguard Worker } 660*333d2b36SAndroid Build Coastguard Worker 661*333d2b36SAndroid Build Coastguard Worker for _, extra := range a.ExtraEntries { 662*333d2b36SAndroid Build Coastguard Worker extra(extraCtx, a) 663*333d2b36SAndroid Build Coastguard Worker } 664*333d2b36SAndroid Build Coastguard Worker 665*333d2b36SAndroid Build Coastguard Worker // Write to footer. 666*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(&a.footer, "include "+a.Include) 667*333d2b36SAndroid Build Coastguard Worker blueprintDir := ctx.ModuleDir(mod) 668*333d2b36SAndroid Build Coastguard Worker for _, footerFunc := range a.ExtraFooters { 669*333d2b36SAndroid Build Coastguard Worker footerFunc(&a.footer, name, prefix, blueprintDir) 670*333d2b36SAndroid Build Coastguard Worker } 671*333d2b36SAndroid Build Coastguard Worker} 672*333d2b36SAndroid Build Coastguard Worker 673*333d2b36SAndroid Build Coastguard Workerfunc (a *AndroidMkEntries) disabled() bool { 674*333d2b36SAndroid Build Coastguard Worker return a.Disabled || !a.OutputFile.Valid() 675*333d2b36SAndroid Build Coastguard Worker} 676*333d2b36SAndroid Build Coastguard Worker 677*333d2b36SAndroid Build Coastguard Worker// write flushes the AndroidMkEntries's in-struct data populated by AndroidMkEntries into the 678*333d2b36SAndroid Build Coastguard Worker// given Writer object. 679*333d2b36SAndroid Build Coastguard Workerfunc (a *AndroidMkEntries) write(w io.Writer) { 680*333d2b36SAndroid Build Coastguard Worker if a.disabled() { 681*333d2b36SAndroid Build Coastguard Worker return 682*333d2b36SAndroid Build Coastguard Worker } 683*333d2b36SAndroid Build Coastguard Worker 684*333d2b36SAndroid Build Coastguard Worker w.Write(a.header.Bytes()) 685*333d2b36SAndroid Build Coastguard Worker for _, name := range a.entryOrder { 686*333d2b36SAndroid Build Coastguard Worker AndroidMkEmitAssignList(w, name, a.EntryMap[name]) 687*333d2b36SAndroid Build Coastguard Worker } 688*333d2b36SAndroid Build Coastguard Worker w.Write(a.footer.Bytes()) 689*333d2b36SAndroid Build Coastguard Worker} 690*333d2b36SAndroid Build Coastguard Worker 691*333d2b36SAndroid Build Coastguard Workerfunc (a *AndroidMkEntries) FooterLinesForTests() []string { 692*333d2b36SAndroid Build Coastguard Worker return strings.Split(string(a.footer.Bytes()), "\n") 693*333d2b36SAndroid Build Coastguard Worker} 694*333d2b36SAndroid Build Coastguard Worker 695*333d2b36SAndroid Build Coastguard Worker// AndroidMkSingleton is a singleton to collect Android.mk data from all modules and dump them into 696*333d2b36SAndroid Build Coastguard Worker// the final Android-<product_name>.mk file output. 697*333d2b36SAndroid Build Coastguard Workerfunc AndroidMkSingleton() Singleton { 698*333d2b36SAndroid Build Coastguard Worker return &androidMkSingleton{} 699*333d2b36SAndroid Build Coastguard Worker} 700*333d2b36SAndroid Build Coastguard Worker 701*333d2b36SAndroid Build Coastguard Workertype androidMkSingleton struct{} 702*333d2b36SAndroid Build Coastguard Worker 703*333d2b36SAndroid Build Coastguard Workerfunc (c *androidMkSingleton) GenerateBuildActions(ctx SingletonContext) { 704*333d2b36SAndroid Build Coastguard Worker // Skip if Soong wasn't invoked from Make. 705*333d2b36SAndroid Build Coastguard Worker if !ctx.Config().KatiEnabled() { 706*333d2b36SAndroid Build Coastguard Worker return 707*333d2b36SAndroid Build Coastguard Worker } 708*333d2b36SAndroid Build Coastguard Worker 709*333d2b36SAndroid Build Coastguard Worker var androidMkModulesList []blueprint.Module 710*333d2b36SAndroid Build Coastguard Worker 711*333d2b36SAndroid Build Coastguard Worker ctx.VisitAllModulesBlueprint(func(module blueprint.Module) { 712*333d2b36SAndroid Build Coastguard Worker androidMkModulesList = append(androidMkModulesList, module) 713*333d2b36SAndroid Build Coastguard Worker }) 714*333d2b36SAndroid Build Coastguard Worker 715*333d2b36SAndroid Build Coastguard Worker // Sort the module list by the module names to eliminate random churns, which may erroneously 716*333d2b36SAndroid Build Coastguard Worker // invoke additional build processes. 717*333d2b36SAndroid Build Coastguard Worker sort.SliceStable(androidMkModulesList, func(i, j int) bool { 718*333d2b36SAndroid Build Coastguard Worker return ctx.ModuleName(androidMkModulesList[i]) < ctx.ModuleName(androidMkModulesList[j]) 719*333d2b36SAndroid Build Coastguard Worker }) 720*333d2b36SAndroid Build Coastguard Worker 721*333d2b36SAndroid Build Coastguard Worker transMk := PathForOutput(ctx, "Android"+String(ctx.Config().productVariables.Make_suffix)+".mk") 722*333d2b36SAndroid Build Coastguard Worker if ctx.Failed() { 723*333d2b36SAndroid Build Coastguard Worker return 724*333d2b36SAndroid Build Coastguard Worker } 725*333d2b36SAndroid Build Coastguard Worker 726*333d2b36SAndroid Build Coastguard Worker moduleInfoJSON := PathForOutput(ctx, "module-info"+String(ctx.Config().productVariables.Make_suffix)+".json") 727*333d2b36SAndroid Build Coastguard Worker 728*333d2b36SAndroid Build Coastguard Worker err := translateAndroidMk(ctx, absolutePath(transMk.String()), moduleInfoJSON, androidMkModulesList) 729*333d2b36SAndroid Build Coastguard Worker if err != nil { 730*333d2b36SAndroid Build Coastguard Worker ctx.Errorf(err.Error()) 731*333d2b36SAndroid Build Coastguard Worker } 732*333d2b36SAndroid Build Coastguard Worker 733*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, BuildParams{ 734*333d2b36SAndroid Build Coastguard Worker Rule: blueprint.Phony, 735*333d2b36SAndroid Build Coastguard Worker Output: transMk, 736*333d2b36SAndroid Build Coastguard Worker }) 737*333d2b36SAndroid Build Coastguard Worker} 738*333d2b36SAndroid Build Coastguard Worker 739*333d2b36SAndroid Build Coastguard Workerfunc translateAndroidMk(ctx SingletonContext, absMkFile string, moduleInfoJSONPath WritablePath, mods []blueprint.Module) error { 740*333d2b36SAndroid Build Coastguard Worker buf := &bytes.Buffer{} 741*333d2b36SAndroid Build Coastguard Worker 742*333d2b36SAndroid Build Coastguard Worker var moduleInfoJSONs []*ModuleInfoJSON 743*333d2b36SAndroid Build Coastguard Worker 744*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(buf, "LOCAL_MODULE_MAKEFILE := $(lastword $(MAKEFILE_LIST))") 745*333d2b36SAndroid Build Coastguard Worker 746*333d2b36SAndroid Build Coastguard Worker typeStats := make(map[string]int) 747*333d2b36SAndroid Build Coastguard Worker for _, mod := range mods { 748*333d2b36SAndroid Build Coastguard Worker err := translateAndroidMkModule(ctx, buf, &moduleInfoJSONs, mod) 749*333d2b36SAndroid Build Coastguard Worker if err != nil { 750*333d2b36SAndroid Build Coastguard Worker os.Remove(absMkFile) 751*333d2b36SAndroid Build Coastguard Worker return err 752*333d2b36SAndroid Build Coastguard Worker } 753*333d2b36SAndroid Build Coastguard Worker 754*333d2b36SAndroid Build Coastguard Worker if amod, ok := mod.(Module); ok && ctx.PrimaryModule(amod) == amod { 755*333d2b36SAndroid Build Coastguard Worker typeStats[ctx.ModuleType(amod)] += 1 756*333d2b36SAndroid Build Coastguard Worker } 757*333d2b36SAndroid Build Coastguard Worker } 758*333d2b36SAndroid Build Coastguard Worker 759*333d2b36SAndroid Build Coastguard Worker keys := []string{} 760*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(buf, "\nSTATS.SOONG_MODULE_TYPE :=") 761*333d2b36SAndroid Build Coastguard Worker for k := range typeStats { 762*333d2b36SAndroid Build Coastguard Worker keys = append(keys, k) 763*333d2b36SAndroid Build Coastguard Worker } 764*333d2b36SAndroid Build Coastguard Worker sort.Strings(keys) 765*333d2b36SAndroid Build Coastguard Worker for _, mod_type := range keys { 766*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(buf, "STATS.SOONG_MODULE_TYPE +=", mod_type) 767*333d2b36SAndroid Build Coastguard Worker fmt.Fprintf(buf, "STATS.SOONG_MODULE_TYPE.%s := %d\n", mod_type, typeStats[mod_type]) 768*333d2b36SAndroid Build Coastguard Worker } 769*333d2b36SAndroid Build Coastguard Worker 770*333d2b36SAndroid Build Coastguard Worker err := pathtools.WriteFileIfChanged(absMkFile, buf.Bytes(), 0666) 771*333d2b36SAndroid Build Coastguard Worker if err != nil { 772*333d2b36SAndroid Build Coastguard Worker return err 773*333d2b36SAndroid Build Coastguard Worker } 774*333d2b36SAndroid Build Coastguard Worker 775*333d2b36SAndroid Build Coastguard Worker return writeModuleInfoJSON(ctx, moduleInfoJSONs, moduleInfoJSONPath) 776*333d2b36SAndroid Build Coastguard Worker} 777*333d2b36SAndroid Build Coastguard Worker 778*333d2b36SAndroid Build Coastguard Workerfunc writeModuleInfoJSON(ctx SingletonContext, moduleInfoJSONs []*ModuleInfoJSON, moduleInfoJSONPath WritablePath) error { 779*333d2b36SAndroid Build Coastguard Worker moduleInfoJSONBuf := &strings.Builder{} 780*333d2b36SAndroid Build Coastguard Worker moduleInfoJSONBuf.WriteString("[") 781*333d2b36SAndroid Build Coastguard Worker for i, moduleInfoJSON := range moduleInfoJSONs { 782*333d2b36SAndroid Build Coastguard Worker if i != 0 { 783*333d2b36SAndroid Build Coastguard Worker moduleInfoJSONBuf.WriteString(",\n") 784*333d2b36SAndroid Build Coastguard Worker } 785*333d2b36SAndroid Build Coastguard Worker moduleInfoJSONBuf.WriteString("{") 786*333d2b36SAndroid Build Coastguard Worker moduleInfoJSONBuf.WriteString(strconv.Quote(moduleInfoJSON.core.RegisterName)) 787*333d2b36SAndroid Build Coastguard Worker moduleInfoJSONBuf.WriteString(":") 788*333d2b36SAndroid Build Coastguard Worker err := encodeModuleInfoJSON(moduleInfoJSONBuf, moduleInfoJSON) 789*333d2b36SAndroid Build Coastguard Worker moduleInfoJSONBuf.WriteString("}") 790*333d2b36SAndroid Build Coastguard Worker if err != nil { 791*333d2b36SAndroid Build Coastguard Worker return err 792*333d2b36SAndroid Build Coastguard Worker } 793*333d2b36SAndroid Build Coastguard Worker } 794*333d2b36SAndroid Build Coastguard Worker moduleInfoJSONBuf.WriteString("]") 795*333d2b36SAndroid Build Coastguard Worker WriteFileRule(ctx, moduleInfoJSONPath, moduleInfoJSONBuf.String()) 796*333d2b36SAndroid Build Coastguard Worker return nil 797*333d2b36SAndroid Build Coastguard Worker} 798*333d2b36SAndroid Build Coastguard Worker 799*333d2b36SAndroid Build Coastguard Workerfunc translateAndroidMkModule(ctx SingletonContext, w io.Writer, moduleInfoJSONs *[]*ModuleInfoJSON, mod blueprint.Module) error { 800*333d2b36SAndroid Build Coastguard Worker defer func() { 801*333d2b36SAndroid Build Coastguard Worker if r := recover(); r != nil { 802*333d2b36SAndroid Build Coastguard Worker panic(fmt.Errorf("%s in translateAndroidMkModule for module %s variant %s", 803*333d2b36SAndroid Build Coastguard Worker r, ctx.ModuleName(mod), ctx.ModuleSubDir(mod))) 804*333d2b36SAndroid Build Coastguard Worker } 805*333d2b36SAndroid Build Coastguard Worker }() 806*333d2b36SAndroid Build Coastguard Worker 807*333d2b36SAndroid Build Coastguard Worker // Additional cases here require review for correct license propagation to make. 808*333d2b36SAndroid Build Coastguard Worker var err error 809*333d2b36SAndroid Build Coastguard Worker 810*333d2b36SAndroid Build Coastguard Worker if info, ok := OtherModuleProvider(ctx, mod, AndroidMkInfoProvider); ok { 811*333d2b36SAndroid Build Coastguard Worker err = translateAndroidMkEntriesInfoModule(ctx, w, moduleInfoJSONs, mod, info) 812*333d2b36SAndroid Build Coastguard Worker } else { 813*333d2b36SAndroid Build Coastguard Worker switch x := mod.(type) { 814*333d2b36SAndroid Build Coastguard Worker case AndroidMkDataProvider: 815*333d2b36SAndroid Build Coastguard Worker err = translateAndroidModule(ctx, w, moduleInfoJSONs, mod, x) 816*333d2b36SAndroid Build Coastguard Worker case AndroidMkEntriesProvider: 817*333d2b36SAndroid Build Coastguard Worker err = translateAndroidMkEntriesModule(ctx, w, moduleInfoJSONs, mod, x) 818*333d2b36SAndroid Build Coastguard Worker default: 819*333d2b36SAndroid Build Coastguard Worker // Not exported to make so no make variables to set. 820*333d2b36SAndroid Build Coastguard Worker } 821*333d2b36SAndroid Build Coastguard Worker } 822*333d2b36SAndroid Build Coastguard Worker 823*333d2b36SAndroid Build Coastguard Worker if err != nil { 824*333d2b36SAndroid Build Coastguard Worker return err 825*333d2b36SAndroid Build Coastguard Worker } 826*333d2b36SAndroid Build Coastguard Worker 827*333d2b36SAndroid Build Coastguard Worker return err 828*333d2b36SAndroid Build Coastguard Worker} 829*333d2b36SAndroid Build Coastguard Worker 830*333d2b36SAndroid Build Coastguard Workerfunc (data *AndroidMkData) fillInData(ctx fillInEntriesContext, mod blueprint.Module) { 831*333d2b36SAndroid Build Coastguard Worker // Get the preamble content through AndroidMkEntries logic. 832*333d2b36SAndroid Build Coastguard Worker data.Entries = AndroidMkEntries{ 833*333d2b36SAndroid Build Coastguard Worker Class: data.Class, 834*333d2b36SAndroid Build Coastguard Worker SubName: data.SubName, 835*333d2b36SAndroid Build Coastguard Worker DistFiles: data.DistFiles, 836*333d2b36SAndroid Build Coastguard Worker OutputFile: data.OutputFile, 837*333d2b36SAndroid Build Coastguard Worker Disabled: data.Disabled, 838*333d2b36SAndroid Build Coastguard Worker Include: data.Include, 839*333d2b36SAndroid Build Coastguard Worker Required: data.Required, 840*333d2b36SAndroid Build Coastguard Worker Host_required: data.Host_required, 841*333d2b36SAndroid Build Coastguard Worker Target_required: data.Target_required, 842*333d2b36SAndroid Build Coastguard Worker } 843*333d2b36SAndroid Build Coastguard Worker data.Entries.fillInEntries(ctx, mod) 844*333d2b36SAndroid Build Coastguard Worker 845*333d2b36SAndroid Build Coastguard Worker // copy entries back to data since it is used in Custom 846*333d2b36SAndroid Build Coastguard Worker data.Required = data.Entries.Required 847*333d2b36SAndroid Build Coastguard Worker data.Host_required = data.Entries.Host_required 848*333d2b36SAndroid Build Coastguard Worker data.Target_required = data.Entries.Target_required 849*333d2b36SAndroid Build Coastguard Worker} 850*333d2b36SAndroid Build Coastguard Worker 851*333d2b36SAndroid Build Coastguard Worker// A support func for the deprecated AndroidMkDataProvider interface. Use AndroidMkEntryProvider 852*333d2b36SAndroid Build Coastguard Worker// instead. 853*333d2b36SAndroid Build Coastguard Workerfunc translateAndroidModule(ctx SingletonContext, w io.Writer, moduleInfoJSONs *[]*ModuleInfoJSON, 854*333d2b36SAndroid Build Coastguard Worker mod blueprint.Module, provider AndroidMkDataProvider) error { 855*333d2b36SAndroid Build Coastguard Worker 856*333d2b36SAndroid Build Coastguard Worker amod := mod.(Module).base() 857*333d2b36SAndroid Build Coastguard Worker if shouldSkipAndroidMkProcessing(ctx, amod) { 858*333d2b36SAndroid Build Coastguard Worker return nil 859*333d2b36SAndroid Build Coastguard Worker } 860*333d2b36SAndroid Build Coastguard Worker 861*333d2b36SAndroid Build Coastguard Worker data := provider.AndroidMk() 862*333d2b36SAndroid Build Coastguard Worker 863*333d2b36SAndroid Build Coastguard Worker if data.Include == "" { 864*333d2b36SAndroid Build Coastguard Worker data.Include = "$(BUILD_PREBUILT)" 865*333d2b36SAndroid Build Coastguard Worker } 866*333d2b36SAndroid Build Coastguard Worker 867*333d2b36SAndroid Build Coastguard Worker data.fillInData(ctx, mod) 868*333d2b36SAndroid Build Coastguard Worker aconfigUpdateAndroidMkData(ctx, mod.(Module), &data) 869*333d2b36SAndroid Build Coastguard Worker 870*333d2b36SAndroid Build Coastguard Worker prefix := "" 871*333d2b36SAndroid Build Coastguard Worker if amod.ArchSpecific() { 872*333d2b36SAndroid Build Coastguard Worker switch amod.Os().Class { 873*333d2b36SAndroid Build Coastguard Worker case Host: 874*333d2b36SAndroid Build Coastguard Worker if amod.Target().HostCross { 875*333d2b36SAndroid Build Coastguard Worker prefix = "HOST_CROSS_" 876*333d2b36SAndroid Build Coastguard Worker } else { 877*333d2b36SAndroid Build Coastguard Worker prefix = "HOST_" 878*333d2b36SAndroid Build Coastguard Worker } 879*333d2b36SAndroid Build Coastguard Worker case Device: 880*333d2b36SAndroid Build Coastguard Worker prefix = "TARGET_" 881*333d2b36SAndroid Build Coastguard Worker 882*333d2b36SAndroid Build Coastguard Worker } 883*333d2b36SAndroid Build Coastguard Worker 884*333d2b36SAndroid Build Coastguard Worker if amod.Arch().ArchType != ctx.Config().Targets[amod.Os()][0].Arch.ArchType { 885*333d2b36SAndroid Build Coastguard Worker prefix = "2ND_" + prefix 886*333d2b36SAndroid Build Coastguard Worker } 887*333d2b36SAndroid Build Coastguard Worker } 888*333d2b36SAndroid Build Coastguard Worker 889*333d2b36SAndroid Build Coastguard Worker name := provider.BaseModuleName() 890*333d2b36SAndroid Build Coastguard Worker blueprintDir := filepath.Dir(ctx.BlueprintFile(mod)) 891*333d2b36SAndroid Build Coastguard Worker 892*333d2b36SAndroid Build Coastguard Worker if data.Custom != nil { 893*333d2b36SAndroid Build Coastguard Worker // List of module types allowed to use .Custom(...) 894*333d2b36SAndroid Build Coastguard Worker // Additions to the list require careful review for proper license handling. 895*333d2b36SAndroid Build Coastguard Worker switch reflect.TypeOf(mod).String() { // ctx.ModuleType(mod) doesn't work: aidl_interface creates phony without type 896*333d2b36SAndroid Build Coastguard Worker case "*aidl.aidlApi": // writes non-custom before adding .phony 897*333d2b36SAndroid Build Coastguard Worker case "*aidl.aidlMapping": // writes non-custom before adding .phony 898*333d2b36SAndroid Build Coastguard Worker case "*android.customModule": // appears in tests only 899*333d2b36SAndroid Build Coastguard Worker case "*android_sdk.sdkRepoHost": // doesn't go through base_rules 900*333d2b36SAndroid Build Coastguard Worker case "*apex.apexBundle": // license properties written 901*333d2b36SAndroid Build Coastguard Worker case "*bpf.bpf": // license properties written (both for module and objs) 902*333d2b36SAndroid Build Coastguard Worker case "*libbpf_prog.libbpfProg": // license properties written (both for module and objs) 903*333d2b36SAndroid Build Coastguard Worker case "*genrule.Module": // writes non-custom before adding .phony 904*333d2b36SAndroid Build Coastguard Worker case "*java.SystemModules": // doesn't go through base_rules 905*333d2b36SAndroid Build Coastguard Worker case "*java.systemModulesImport": // doesn't go through base_rules 906*333d2b36SAndroid Build Coastguard Worker case "*phony.phony": // license properties written 907*333d2b36SAndroid Build Coastguard Worker case "*phony.PhonyRule": // writes phony deps and acts like `.PHONY` 908*333d2b36SAndroid Build Coastguard Worker case "*selinux.selinuxContextsModule": // license properties written 909*333d2b36SAndroid Build Coastguard Worker case "*sysprop.syspropLibrary": // license properties written 910*333d2b36SAndroid Build Coastguard Worker case "*vintf.vintfCompatibilityMatrixRule": // use case like phony 911*333d2b36SAndroid Build Coastguard Worker default: 912*333d2b36SAndroid Build Coastguard Worker if !ctx.Config().IsEnvFalse("ANDROID_REQUIRE_LICENSES") { 913*333d2b36SAndroid Build Coastguard Worker return fmt.Errorf("custom make rules not allowed for %q (%q) module %q", ctx.ModuleType(mod), reflect.TypeOf(mod), ctx.ModuleName(mod)) 914*333d2b36SAndroid Build Coastguard Worker } 915*333d2b36SAndroid Build Coastguard Worker } 916*333d2b36SAndroid Build Coastguard Worker data.Custom(w, name, prefix, blueprintDir, data) 917*333d2b36SAndroid Build Coastguard Worker } else { 918*333d2b36SAndroid Build Coastguard Worker WriteAndroidMkData(w, data) 919*333d2b36SAndroid Build Coastguard Worker } 920*333d2b36SAndroid Build Coastguard Worker 921*333d2b36SAndroid Build Coastguard Worker if !data.Entries.disabled() { 922*333d2b36SAndroid Build Coastguard Worker if moduleInfoJSON, ok := OtherModuleProvider(ctx, mod, ModuleInfoJSONProvider); ok { 923*333d2b36SAndroid Build Coastguard Worker *moduleInfoJSONs = append(*moduleInfoJSONs, moduleInfoJSON) 924*333d2b36SAndroid Build Coastguard Worker } 925*333d2b36SAndroid Build Coastguard Worker } 926*333d2b36SAndroid Build Coastguard Worker 927*333d2b36SAndroid Build Coastguard Worker return nil 928*333d2b36SAndroid Build Coastguard Worker} 929*333d2b36SAndroid Build Coastguard Worker 930*333d2b36SAndroid Build Coastguard Worker// A support func for the deprecated AndroidMkDataProvider interface. Use AndroidMkEntryProvider 931*333d2b36SAndroid Build Coastguard Worker// instead. 932*333d2b36SAndroid Build Coastguard Workerfunc WriteAndroidMkData(w io.Writer, data AndroidMkData) { 933*333d2b36SAndroid Build Coastguard Worker if data.Entries.disabled() { 934*333d2b36SAndroid Build Coastguard Worker return 935*333d2b36SAndroid Build Coastguard Worker } 936*333d2b36SAndroid Build Coastguard Worker 937*333d2b36SAndroid Build Coastguard Worker // write preamble via Entries 938*333d2b36SAndroid Build Coastguard Worker data.Entries.footer = bytes.Buffer{} 939*333d2b36SAndroid Build Coastguard Worker data.Entries.write(w) 940*333d2b36SAndroid Build Coastguard Worker 941*333d2b36SAndroid Build Coastguard Worker for _, extra := range data.Extra { 942*333d2b36SAndroid Build Coastguard Worker extra(w, data.OutputFile.Path()) 943*333d2b36SAndroid Build Coastguard Worker } 944*333d2b36SAndroid Build Coastguard Worker 945*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "include "+data.Include) 946*333d2b36SAndroid Build Coastguard Worker} 947*333d2b36SAndroid Build Coastguard Worker 948*333d2b36SAndroid Build Coastguard Workerfunc translateAndroidMkEntriesModule(ctx SingletonContext, w io.Writer, moduleInfoJSONs *[]*ModuleInfoJSON, 949*333d2b36SAndroid Build Coastguard Worker mod blueprint.Module, provider AndroidMkEntriesProvider) error { 950*333d2b36SAndroid Build Coastguard Worker if shouldSkipAndroidMkProcessing(ctx, mod.(Module).base()) { 951*333d2b36SAndroid Build Coastguard Worker return nil 952*333d2b36SAndroid Build Coastguard Worker } 953*333d2b36SAndroid Build Coastguard Worker 954*333d2b36SAndroid Build Coastguard Worker entriesList := provider.AndroidMkEntries() 955*333d2b36SAndroid Build Coastguard Worker aconfigUpdateAndroidMkEntries(ctx, mod.(Module), &entriesList) 956*333d2b36SAndroid Build Coastguard Worker 957*333d2b36SAndroid Build Coastguard Worker // Any new or special cases here need review to verify correct propagation of license information. 958*333d2b36SAndroid Build Coastguard Worker for _, entries := range entriesList { 959*333d2b36SAndroid Build Coastguard Worker entries.fillInEntries(ctx, mod) 960*333d2b36SAndroid Build Coastguard Worker entries.write(w) 961*333d2b36SAndroid Build Coastguard Worker } 962*333d2b36SAndroid Build Coastguard Worker 963*333d2b36SAndroid Build Coastguard Worker if len(entriesList) > 0 && !entriesList[0].disabled() { 964*333d2b36SAndroid Build Coastguard Worker if moduleInfoJSON, ok := OtherModuleProvider(ctx, mod, ModuleInfoJSONProvider); ok { 965*333d2b36SAndroid Build Coastguard Worker *moduleInfoJSONs = append(*moduleInfoJSONs, moduleInfoJSON) 966*333d2b36SAndroid Build Coastguard Worker } 967*333d2b36SAndroid Build Coastguard Worker } 968*333d2b36SAndroid Build Coastguard Worker 969*333d2b36SAndroid Build Coastguard Worker return nil 970*333d2b36SAndroid Build Coastguard Worker} 971*333d2b36SAndroid Build Coastguard Worker 972*333d2b36SAndroid Build Coastguard Workerfunc ShouldSkipAndroidMkProcessing(ctx ConfigurableEvaluatorContext, module Module) bool { 973*333d2b36SAndroid Build Coastguard Worker return shouldSkipAndroidMkProcessing(ctx, module.base()) 974*333d2b36SAndroid Build Coastguard Worker} 975*333d2b36SAndroid Build Coastguard Worker 976*333d2b36SAndroid Build Coastguard Workerfunc shouldSkipAndroidMkProcessing(ctx ConfigurableEvaluatorContext, module *ModuleBase) bool { 977*333d2b36SAndroid Build Coastguard Worker if !module.commonProperties.NamespaceExportedToMake { 978*333d2b36SAndroid Build Coastguard Worker // TODO(jeffrygaston) do we want to validate that there are no modules being 979*333d2b36SAndroid Build Coastguard Worker // exported to Kati that depend on this module? 980*333d2b36SAndroid Build Coastguard Worker return true 981*333d2b36SAndroid Build Coastguard Worker } 982*333d2b36SAndroid Build Coastguard Worker 983*333d2b36SAndroid Build Coastguard Worker // On Mac, only expose host darwin modules to Make, as that's all we claim to support. 984*333d2b36SAndroid Build Coastguard Worker // In reality, some of them depend on device-built (Java) modules, so we can't disable all 985*333d2b36SAndroid Build Coastguard Worker // device modules in Soong, but we can hide them from Make (and thus the build user interface) 986*333d2b36SAndroid Build Coastguard Worker if runtime.GOOS == "darwin" && module.Os() != Darwin { 987*333d2b36SAndroid Build Coastguard Worker return true 988*333d2b36SAndroid Build Coastguard Worker } 989*333d2b36SAndroid Build Coastguard Worker 990*333d2b36SAndroid Build Coastguard Worker // Only expose the primary Darwin target, as Make does not understand Darwin+Arm64 991*333d2b36SAndroid Build Coastguard Worker if module.Os() == Darwin && module.Target().HostCross { 992*333d2b36SAndroid Build Coastguard Worker return true 993*333d2b36SAndroid Build Coastguard Worker } 994*333d2b36SAndroid Build Coastguard Worker 995*333d2b36SAndroid Build Coastguard Worker return !module.Enabled(ctx) || 996*333d2b36SAndroid Build Coastguard Worker module.commonProperties.HideFromMake || 997*333d2b36SAndroid Build Coastguard Worker // Make does not understand LinuxBionic 998*333d2b36SAndroid Build Coastguard Worker module.Os() == LinuxBionic || 999*333d2b36SAndroid Build Coastguard Worker // Make does not understand LinuxMusl, except when we are building with USE_HOST_MUSL=true 1000*333d2b36SAndroid Build Coastguard Worker // and all host binaries are LinuxMusl 1001*333d2b36SAndroid Build Coastguard Worker (module.Os() == LinuxMusl && module.Target().HostCross) 1002*333d2b36SAndroid Build Coastguard Worker} 1003*333d2b36SAndroid Build Coastguard Worker 1004*333d2b36SAndroid Build Coastguard Worker// A utility func to format LOCAL_TEST_DATA outputs. See the comments on DataPath to understand how 1005*333d2b36SAndroid Build Coastguard Worker// to use this func. 1006*333d2b36SAndroid Build Coastguard Workerfunc androidMkDataPaths(data []DataPath) []string { 1007*333d2b36SAndroid Build Coastguard Worker var testFiles []string 1008*333d2b36SAndroid Build Coastguard Worker for _, d := range data { 1009*333d2b36SAndroid Build Coastguard Worker rel := d.SrcPath.Rel() 1010*333d2b36SAndroid Build Coastguard Worker if d.WithoutRel { 1011*333d2b36SAndroid Build Coastguard Worker rel = d.SrcPath.Base() 1012*333d2b36SAndroid Build Coastguard Worker } 1013*333d2b36SAndroid Build Coastguard Worker path := d.SrcPath.String() 1014*333d2b36SAndroid Build Coastguard Worker // LOCAL_TEST_DATA requires the rel portion of the path to be removed from the path. 1015*333d2b36SAndroid Build Coastguard Worker if !strings.HasSuffix(path, rel) { 1016*333d2b36SAndroid Build Coastguard Worker panic(fmt.Errorf("path %q does not end with %q", path, rel)) 1017*333d2b36SAndroid Build Coastguard Worker } 1018*333d2b36SAndroid Build Coastguard Worker path = strings.TrimSuffix(path, rel) 1019*333d2b36SAndroid Build Coastguard Worker testFileString := path + ":" + rel 1020*333d2b36SAndroid Build Coastguard Worker if len(d.RelativeInstallPath) > 0 { 1021*333d2b36SAndroid Build Coastguard Worker testFileString += ":" + d.RelativeInstallPath 1022*333d2b36SAndroid Build Coastguard Worker } 1023*333d2b36SAndroid Build Coastguard Worker testFiles = append(testFiles, testFileString) 1024*333d2b36SAndroid Build Coastguard Worker } 1025*333d2b36SAndroid Build Coastguard Worker return testFiles 1026*333d2b36SAndroid Build Coastguard Worker} 1027*333d2b36SAndroid Build Coastguard Worker 1028*333d2b36SAndroid Build Coastguard Worker// AndroidMkEmitAssignList emits the line 1029*333d2b36SAndroid Build Coastguard Worker// 1030*333d2b36SAndroid Build Coastguard Worker// VAR := ITEM ... 1031*333d2b36SAndroid Build Coastguard Worker// 1032*333d2b36SAndroid Build Coastguard Worker// Items are the elements to the given set of lists 1033*333d2b36SAndroid Build Coastguard Worker// If all the passed lists are empty, no line will be emitted 1034*333d2b36SAndroid Build Coastguard Workerfunc AndroidMkEmitAssignList(w io.Writer, varName string, lists ...[]string) { 1035*333d2b36SAndroid Build Coastguard Worker doPrint := false 1036*333d2b36SAndroid Build Coastguard Worker for _, l := range lists { 1037*333d2b36SAndroid Build Coastguard Worker if doPrint = len(l) > 0; doPrint { 1038*333d2b36SAndroid Build Coastguard Worker break 1039*333d2b36SAndroid Build Coastguard Worker } 1040*333d2b36SAndroid Build Coastguard Worker } 1041*333d2b36SAndroid Build Coastguard Worker if !doPrint { 1042*333d2b36SAndroid Build Coastguard Worker return 1043*333d2b36SAndroid Build Coastguard Worker } 1044*333d2b36SAndroid Build Coastguard Worker fmt.Fprint(w, varName, " :=") 1045*333d2b36SAndroid Build Coastguard Worker for _, l := range lists { 1046*333d2b36SAndroid Build Coastguard Worker for _, item := range l { 1047*333d2b36SAndroid Build Coastguard Worker fmt.Fprint(w, " ", item) 1048*333d2b36SAndroid Build Coastguard Worker } 1049*333d2b36SAndroid Build Coastguard Worker } 1050*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w) 1051*333d2b36SAndroid Build Coastguard Worker} 1052*333d2b36SAndroid Build Coastguard Worker 1053*333d2b36SAndroid Build Coastguard Workertype AndroidMkProviderInfo struct { 1054*333d2b36SAndroid Build Coastguard Worker PrimaryInfo AndroidMkInfo 1055*333d2b36SAndroid Build Coastguard Worker ExtraInfo []AndroidMkInfo 1056*333d2b36SAndroid Build Coastguard Worker} 1057*333d2b36SAndroid Build Coastguard Worker 1058*333d2b36SAndroid Build Coastguard Workertype AndroidMkInfo struct { 1059*333d2b36SAndroid Build Coastguard Worker // Android.mk class string, e.g. EXECUTABLES, JAVA_LIBRARIES, ETC 1060*333d2b36SAndroid Build Coastguard Worker Class string 1061*333d2b36SAndroid Build Coastguard Worker // Optional suffix to append to the module name. Useful when a module wants to return multiple 1062*333d2b36SAndroid Build Coastguard Worker // AndroidMkEntries objects. For example, when a java_library returns an additional entry for 1063*333d2b36SAndroid Build Coastguard Worker // its hostdex sub-module, this SubName field is set to "-hostdex" so that it can have a 1064*333d2b36SAndroid Build Coastguard Worker // different name than the parent's. 1065*333d2b36SAndroid Build Coastguard Worker SubName string 1066*333d2b36SAndroid Build Coastguard Worker // If set, this value overrides the base module name. SubName is still appended. 1067*333d2b36SAndroid Build Coastguard Worker OverrideName string 1068*333d2b36SAndroid Build Coastguard Worker // Dist files to output 1069*333d2b36SAndroid Build Coastguard Worker DistFiles TaggedDistFiles 1070*333d2b36SAndroid Build Coastguard Worker // The output file for Kati to process and/or install. If absent, the module is skipped. 1071*333d2b36SAndroid Build Coastguard Worker OutputFile OptionalPath 1072*333d2b36SAndroid Build Coastguard Worker // If true, the module is skipped and does not appear on the final Android-<product name>.mk 1073*333d2b36SAndroid Build Coastguard Worker // file. Useful when a module needs to be skipped conditionally. 1074*333d2b36SAndroid Build Coastguard Worker Disabled bool 1075*333d2b36SAndroid Build Coastguard Worker // The postprocessing mk file to include, e.g. $(BUILD_SYSTEM)/soong_cc_rust_prebuilt.mk 1076*333d2b36SAndroid Build Coastguard Worker // If not set, $(BUILD_SYSTEM)/prebuilt.mk is used. 1077*333d2b36SAndroid Build Coastguard Worker Include string 1078*333d2b36SAndroid Build Coastguard Worker // Required modules that need to be built and included in the final build output when building 1079*333d2b36SAndroid Build Coastguard Worker // this module. 1080*333d2b36SAndroid Build Coastguard Worker Required []string 1081*333d2b36SAndroid Build Coastguard Worker // Required host modules that need to be built and included in the final build output when 1082*333d2b36SAndroid Build Coastguard Worker // building this module. 1083*333d2b36SAndroid Build Coastguard Worker Host_required []string 1084*333d2b36SAndroid Build Coastguard Worker // Required device modules that need to be built and included in the final build output when 1085*333d2b36SAndroid Build Coastguard Worker // building this module. 1086*333d2b36SAndroid Build Coastguard Worker Target_required []string 1087*333d2b36SAndroid Build Coastguard Worker 1088*333d2b36SAndroid Build Coastguard Worker HeaderStrings []string 1089*333d2b36SAndroid Build Coastguard Worker FooterStrings []string 1090*333d2b36SAndroid Build Coastguard Worker 1091*333d2b36SAndroid Build Coastguard Worker // A map that holds the up-to-date Make variable values. Can be accessed from tests. 1092*333d2b36SAndroid Build Coastguard Worker EntryMap map[string][]string 1093*333d2b36SAndroid Build Coastguard Worker // A list of EntryMap keys in insertion order. This serves a few purposes: 1094*333d2b36SAndroid Build Coastguard Worker // 1. Prevents churns. Golang map doesn't provide consistent iteration order, so without this, 1095*333d2b36SAndroid Build Coastguard Worker // the outputted Android-*.mk file may change even though there have been no content changes. 1096*333d2b36SAndroid Build Coastguard Worker // 2. Allows modules to refer to other variables, like LOCAL_BAR_VAR := $(LOCAL_FOO_VAR), 1097*333d2b36SAndroid Build Coastguard Worker // without worrying about the variables being mixed up in the actual mk file. 1098*333d2b36SAndroid Build Coastguard Worker // 3. Makes troubleshooting and spotting errors easier. 1099*333d2b36SAndroid Build Coastguard Worker EntryOrder []string 1100*333d2b36SAndroid Build Coastguard Worker} 1101*333d2b36SAndroid Build Coastguard Worker 1102*333d2b36SAndroid Build Coastguard Workertype AndroidMkProviderInfoProducer interface { 1103*333d2b36SAndroid Build Coastguard Worker PrepareAndroidMKProviderInfo(config Config) *AndroidMkProviderInfo 1104*333d2b36SAndroid Build Coastguard Worker} 1105*333d2b36SAndroid Build Coastguard Worker 1106*333d2b36SAndroid Build Coastguard Worker// TODO: rename it to AndroidMkEntriesProvider after AndroidMkEntriesProvider interface is gone. 1107*333d2b36SAndroid Build Coastguard Workervar AndroidMkInfoProvider = blueprint.NewProvider[*AndroidMkProviderInfo]() 1108*333d2b36SAndroid Build Coastguard Worker 1109*333d2b36SAndroid Build Coastguard Workerfunc translateAndroidMkEntriesInfoModule(ctx SingletonContext, w io.Writer, moduleInfoJSONs *[]*ModuleInfoJSON, 1110*333d2b36SAndroid Build Coastguard Worker mod blueprint.Module, providerInfo *AndroidMkProviderInfo) error { 1111*333d2b36SAndroid Build Coastguard Worker if shouldSkipAndroidMkProcessing(ctx, mod.(Module).base()) { 1112*333d2b36SAndroid Build Coastguard Worker return nil 1113*333d2b36SAndroid Build Coastguard Worker } 1114*333d2b36SAndroid Build Coastguard Worker 1115*333d2b36SAndroid Build Coastguard Worker // Deep copy the provider info since we need to modify the info later 1116*333d2b36SAndroid Build Coastguard Worker info := deepCopyAndroidMkProviderInfo(providerInfo) 1117*333d2b36SAndroid Build Coastguard Worker 1118*333d2b36SAndroid Build Coastguard Worker aconfigUpdateAndroidMkInfos(ctx, mod.(Module), &info) 1119*333d2b36SAndroid Build Coastguard Worker 1120*333d2b36SAndroid Build Coastguard Worker // Any new or special cases here need review to verify correct propagation of license information. 1121*333d2b36SAndroid Build Coastguard Worker info.PrimaryInfo.fillInEntries(ctx, mod) 1122*333d2b36SAndroid Build Coastguard Worker info.PrimaryInfo.write(w) 1123*333d2b36SAndroid Build Coastguard Worker if len(info.ExtraInfo) > 0 { 1124*333d2b36SAndroid Build Coastguard Worker for _, ei := range info.ExtraInfo { 1125*333d2b36SAndroid Build Coastguard Worker ei.fillInEntries(ctx, mod) 1126*333d2b36SAndroid Build Coastguard Worker ei.write(w) 1127*333d2b36SAndroid Build Coastguard Worker } 1128*333d2b36SAndroid Build Coastguard Worker } 1129*333d2b36SAndroid Build Coastguard Worker 1130*333d2b36SAndroid Build Coastguard Worker if !info.PrimaryInfo.disabled() { 1131*333d2b36SAndroid Build Coastguard Worker if moduleInfoJSON, ok := OtherModuleProvider(ctx, mod, ModuleInfoJSONProvider); ok { 1132*333d2b36SAndroid Build Coastguard Worker *moduleInfoJSONs = append(*moduleInfoJSONs, moduleInfoJSON) 1133*333d2b36SAndroid Build Coastguard Worker } 1134*333d2b36SAndroid Build Coastguard Worker } 1135*333d2b36SAndroid Build Coastguard Worker 1136*333d2b36SAndroid Build Coastguard Worker return nil 1137*333d2b36SAndroid Build Coastguard Worker} 1138*333d2b36SAndroid Build Coastguard Worker 1139*333d2b36SAndroid Build Coastguard Worker// Utility funcs to manipulate Android.mk variable entries. 1140*333d2b36SAndroid Build Coastguard Worker 1141*333d2b36SAndroid Build Coastguard Worker// SetString sets a Make variable with the given name to the given value. 1142*333d2b36SAndroid Build Coastguard Workerfunc (a *AndroidMkInfo) SetString(name, value string) { 1143*333d2b36SAndroid Build Coastguard Worker if _, ok := a.EntryMap[name]; !ok { 1144*333d2b36SAndroid Build Coastguard Worker a.EntryOrder = append(a.EntryOrder, name) 1145*333d2b36SAndroid Build Coastguard Worker } 1146*333d2b36SAndroid Build Coastguard Worker a.EntryMap[name] = []string{value} 1147*333d2b36SAndroid Build Coastguard Worker} 1148*333d2b36SAndroid Build Coastguard Worker 1149*333d2b36SAndroid Build Coastguard Worker// SetPath sets a Make variable with the given name to the given path string. 1150*333d2b36SAndroid Build Coastguard Workerfunc (a *AndroidMkInfo) SetPath(name string, path Path) { 1151*333d2b36SAndroid Build Coastguard Worker if _, ok := a.EntryMap[name]; !ok { 1152*333d2b36SAndroid Build Coastguard Worker a.EntryOrder = append(a.EntryOrder, name) 1153*333d2b36SAndroid Build Coastguard Worker } 1154*333d2b36SAndroid Build Coastguard Worker a.EntryMap[name] = []string{path.String()} 1155*333d2b36SAndroid Build Coastguard Worker} 1156*333d2b36SAndroid Build Coastguard Worker 1157*333d2b36SAndroid Build Coastguard Worker// SetOptionalPath sets a Make variable with the given name to the given path string if it is valid. 1158*333d2b36SAndroid Build Coastguard Worker// It is a no-op if the given path is invalid. 1159*333d2b36SAndroid Build Coastguard Workerfunc (a *AndroidMkInfo) SetOptionalPath(name string, path OptionalPath) { 1160*333d2b36SAndroid Build Coastguard Worker if path.Valid() { 1161*333d2b36SAndroid Build Coastguard Worker a.SetPath(name, path.Path()) 1162*333d2b36SAndroid Build Coastguard Worker } 1163*333d2b36SAndroid Build Coastguard Worker} 1164*333d2b36SAndroid Build Coastguard Worker 1165*333d2b36SAndroid Build Coastguard Worker// AddPath appends the given path string to a Make variable with the given name. 1166*333d2b36SAndroid Build Coastguard Workerfunc (a *AndroidMkInfo) AddPath(name string, path Path) { 1167*333d2b36SAndroid Build Coastguard Worker if _, ok := a.EntryMap[name]; !ok { 1168*333d2b36SAndroid Build Coastguard Worker a.EntryOrder = append(a.EntryOrder, name) 1169*333d2b36SAndroid Build Coastguard Worker } 1170*333d2b36SAndroid Build Coastguard Worker a.EntryMap[name] = append(a.EntryMap[name], path.String()) 1171*333d2b36SAndroid Build Coastguard Worker} 1172*333d2b36SAndroid Build Coastguard Worker 1173*333d2b36SAndroid Build Coastguard Worker// AddOptionalPath appends the given path string to a Make variable with the given name if it is 1174*333d2b36SAndroid Build Coastguard Worker// valid. It is a no-op if the given path is invalid. 1175*333d2b36SAndroid Build Coastguard Workerfunc (a *AndroidMkInfo) AddOptionalPath(name string, path OptionalPath) { 1176*333d2b36SAndroid Build Coastguard Worker if path.Valid() { 1177*333d2b36SAndroid Build Coastguard Worker a.AddPath(name, path.Path()) 1178*333d2b36SAndroid Build Coastguard Worker } 1179*333d2b36SAndroid Build Coastguard Worker} 1180*333d2b36SAndroid Build Coastguard Worker 1181*333d2b36SAndroid Build Coastguard Worker// SetPaths sets a Make variable with the given name to a slice of the given path strings. 1182*333d2b36SAndroid Build Coastguard Workerfunc (a *AndroidMkInfo) SetPaths(name string, paths Paths) { 1183*333d2b36SAndroid Build Coastguard Worker if _, ok := a.EntryMap[name]; !ok { 1184*333d2b36SAndroid Build Coastguard Worker a.EntryOrder = append(a.EntryOrder, name) 1185*333d2b36SAndroid Build Coastguard Worker } 1186*333d2b36SAndroid Build Coastguard Worker a.EntryMap[name] = paths.Strings() 1187*333d2b36SAndroid Build Coastguard Worker} 1188*333d2b36SAndroid Build Coastguard Worker 1189*333d2b36SAndroid Build Coastguard Worker// SetOptionalPaths sets a Make variable with the given name to a slice of the given path strings 1190*333d2b36SAndroid Build Coastguard Worker// only if there are a non-zero amount of paths. 1191*333d2b36SAndroid Build Coastguard Workerfunc (a *AndroidMkInfo) SetOptionalPaths(name string, paths Paths) { 1192*333d2b36SAndroid Build Coastguard Worker if len(paths) > 0 { 1193*333d2b36SAndroid Build Coastguard Worker a.SetPaths(name, paths) 1194*333d2b36SAndroid Build Coastguard Worker } 1195*333d2b36SAndroid Build Coastguard Worker} 1196*333d2b36SAndroid Build Coastguard Worker 1197*333d2b36SAndroid Build Coastguard Worker// AddPaths appends the given path strings to a Make variable with the given name. 1198*333d2b36SAndroid Build Coastguard Workerfunc (a *AndroidMkInfo) AddPaths(name string, paths Paths) { 1199*333d2b36SAndroid Build Coastguard Worker if _, ok := a.EntryMap[name]; !ok { 1200*333d2b36SAndroid Build Coastguard Worker a.EntryOrder = append(a.EntryOrder, name) 1201*333d2b36SAndroid Build Coastguard Worker } 1202*333d2b36SAndroid Build Coastguard Worker a.EntryMap[name] = append(a.EntryMap[name], paths.Strings()...) 1203*333d2b36SAndroid Build Coastguard Worker} 1204*333d2b36SAndroid Build Coastguard Worker 1205*333d2b36SAndroid Build Coastguard Worker// SetBoolIfTrue sets a Make variable with the given name to true if the given flag is true. 1206*333d2b36SAndroid Build Coastguard Worker// It is a no-op if the given flag is false. 1207*333d2b36SAndroid Build Coastguard Workerfunc (a *AndroidMkInfo) SetBoolIfTrue(name string, flag bool) { 1208*333d2b36SAndroid Build Coastguard Worker if flag { 1209*333d2b36SAndroid Build Coastguard Worker if _, ok := a.EntryMap[name]; !ok { 1210*333d2b36SAndroid Build Coastguard Worker a.EntryOrder = append(a.EntryOrder, name) 1211*333d2b36SAndroid Build Coastguard Worker } 1212*333d2b36SAndroid Build Coastguard Worker a.EntryMap[name] = []string{"true"} 1213*333d2b36SAndroid Build Coastguard Worker } 1214*333d2b36SAndroid Build Coastguard Worker} 1215*333d2b36SAndroid Build Coastguard Worker 1216*333d2b36SAndroid Build Coastguard Worker// SetBool sets a Make variable with the given name to if the given bool flag value. 1217*333d2b36SAndroid Build Coastguard Workerfunc (a *AndroidMkInfo) SetBool(name string, flag bool) { 1218*333d2b36SAndroid Build Coastguard Worker if _, ok := a.EntryMap[name]; !ok { 1219*333d2b36SAndroid Build Coastguard Worker a.EntryOrder = append(a.EntryOrder, name) 1220*333d2b36SAndroid Build Coastguard Worker } 1221*333d2b36SAndroid Build Coastguard Worker if flag { 1222*333d2b36SAndroid Build Coastguard Worker a.EntryMap[name] = []string{"true"} 1223*333d2b36SAndroid Build Coastguard Worker } else { 1224*333d2b36SAndroid Build Coastguard Worker a.EntryMap[name] = []string{"false"} 1225*333d2b36SAndroid Build Coastguard Worker } 1226*333d2b36SAndroid Build Coastguard Worker} 1227*333d2b36SAndroid Build Coastguard Worker 1228*333d2b36SAndroid Build Coastguard Worker// AddStrings appends the given strings to a Make variable with the given name. 1229*333d2b36SAndroid Build Coastguard Workerfunc (a *AndroidMkInfo) AddStrings(name string, value ...string) { 1230*333d2b36SAndroid Build Coastguard Worker if len(value) == 0 { 1231*333d2b36SAndroid Build Coastguard Worker return 1232*333d2b36SAndroid Build Coastguard Worker } 1233*333d2b36SAndroid Build Coastguard Worker if _, ok := a.EntryMap[name]; !ok { 1234*333d2b36SAndroid Build Coastguard Worker a.EntryOrder = append(a.EntryOrder, name) 1235*333d2b36SAndroid Build Coastguard Worker } 1236*333d2b36SAndroid Build Coastguard Worker a.EntryMap[name] = append(a.EntryMap[name], value...) 1237*333d2b36SAndroid Build Coastguard Worker} 1238*333d2b36SAndroid Build Coastguard Worker 1239*333d2b36SAndroid Build Coastguard Worker// AddCompatibilityTestSuites adds the supplied test suites to the EntryMap, with special handling 1240*333d2b36SAndroid Build Coastguard Worker// for partial MTS and MCTS test suites. 1241*333d2b36SAndroid Build Coastguard Workerfunc (a *AndroidMkInfo) AddCompatibilityTestSuites(suites ...string) { 1242*333d2b36SAndroid Build Coastguard Worker // M(C)TS supports a full test suite and partial per-module MTS test suites, with naming mts-${MODULE}. 1243*333d2b36SAndroid Build Coastguard Worker // To reduce repetition, if we find a partial M(C)TS test suite without an full M(C)TS test suite, 1244*333d2b36SAndroid Build Coastguard Worker // we add the full test suite to our list. 1245*333d2b36SAndroid Build Coastguard Worker if PrefixInList(suites, "mts-") && !InList("mts", suites) { 1246*333d2b36SAndroid Build Coastguard Worker suites = append(suites, "mts") 1247*333d2b36SAndroid Build Coastguard Worker } 1248*333d2b36SAndroid Build Coastguard Worker if PrefixInList(suites, "mcts-") && !InList("mcts", suites) { 1249*333d2b36SAndroid Build Coastguard Worker suites = append(suites, "mcts") 1250*333d2b36SAndroid Build Coastguard Worker } 1251*333d2b36SAndroid Build Coastguard Worker a.AddStrings("LOCAL_COMPATIBILITY_SUITE", suites...) 1252*333d2b36SAndroid Build Coastguard Worker} 1253*333d2b36SAndroid Build Coastguard Worker 1254*333d2b36SAndroid Build Coastguard Workerfunc (a *AndroidMkInfo) fillInEntries(ctx fillInEntriesContext, mod blueprint.Module) { 1255*333d2b36SAndroid Build Coastguard Worker helperInfo := AndroidMkInfo{ 1256*333d2b36SAndroid Build Coastguard Worker EntryMap: make(map[string][]string), 1257*333d2b36SAndroid Build Coastguard Worker } 1258*333d2b36SAndroid Build Coastguard Worker 1259*333d2b36SAndroid Build Coastguard Worker amod := mod.(Module) 1260*333d2b36SAndroid Build Coastguard Worker base := amod.base() 1261*333d2b36SAndroid Build Coastguard Worker name := base.BaseModuleName() 1262*333d2b36SAndroid Build Coastguard Worker if a.OverrideName != "" { 1263*333d2b36SAndroid Build Coastguard Worker name = a.OverrideName 1264*333d2b36SAndroid Build Coastguard Worker } 1265*333d2b36SAndroid Build Coastguard Worker 1266*333d2b36SAndroid Build Coastguard Worker if a.Include == "" { 1267*333d2b36SAndroid Build Coastguard Worker a.Include = "$(BUILD_PREBUILT)" 1268*333d2b36SAndroid Build Coastguard Worker } 1269*333d2b36SAndroid Build Coastguard Worker a.Required = append(a.Required, amod.RequiredModuleNames(ctx)...) 1270*333d2b36SAndroid Build Coastguard Worker a.Required = append(a.Required, amod.VintfFragmentModuleNames(ctx)...) 1271*333d2b36SAndroid Build Coastguard Worker a.Host_required = append(a.Host_required, amod.HostRequiredModuleNames()...) 1272*333d2b36SAndroid Build Coastguard Worker a.Target_required = append(a.Target_required, amod.TargetRequiredModuleNames()...) 1273*333d2b36SAndroid Build Coastguard Worker 1274*333d2b36SAndroid Build Coastguard Worker for _, distString := range a.GetDistForGoals(ctx, mod) { 1275*333d2b36SAndroid Build Coastguard Worker a.HeaderStrings = append(a.HeaderStrings, distString) 1276*333d2b36SAndroid Build Coastguard Worker } 1277*333d2b36SAndroid Build Coastguard Worker 1278*333d2b36SAndroid Build Coastguard Worker a.HeaderStrings = append(a.HeaderStrings, fmt.Sprintf("\ninclude $(CLEAR_VARS) # type: %s, name: %s, variant: %s", ctx.ModuleType(mod), base.BaseModuleName(), ctx.ModuleSubDir(mod))) 1279*333d2b36SAndroid Build Coastguard Worker 1280*333d2b36SAndroid Build Coastguard Worker // Collect make variable assignment entries. 1281*333d2b36SAndroid Build Coastguard Worker helperInfo.SetString("LOCAL_PATH", ctx.ModuleDir(mod)) 1282*333d2b36SAndroid Build Coastguard Worker helperInfo.SetString("LOCAL_MODULE", name+a.SubName) 1283*333d2b36SAndroid Build Coastguard Worker helperInfo.SetString("LOCAL_MODULE_CLASS", a.Class) 1284*333d2b36SAndroid Build Coastguard Worker helperInfo.SetString("LOCAL_PREBUILT_MODULE_FILE", a.OutputFile.String()) 1285*333d2b36SAndroid Build Coastguard Worker helperInfo.AddStrings("LOCAL_REQUIRED_MODULES", a.Required...) 1286*333d2b36SAndroid Build Coastguard Worker helperInfo.AddStrings("LOCAL_HOST_REQUIRED_MODULES", a.Host_required...) 1287*333d2b36SAndroid Build Coastguard Worker helperInfo.AddStrings("LOCAL_TARGET_REQUIRED_MODULES", a.Target_required...) 1288*333d2b36SAndroid Build Coastguard Worker helperInfo.AddStrings("LOCAL_SOONG_MODULE_TYPE", ctx.ModuleType(amod)) 1289*333d2b36SAndroid Build Coastguard Worker 1290*333d2b36SAndroid Build Coastguard Worker // If the install rule was generated by Soong tell Make about it. 1291*333d2b36SAndroid Build Coastguard Worker info := OtherModuleProviderOrDefault(ctx, mod, InstallFilesProvider) 1292*333d2b36SAndroid Build Coastguard Worker if len(info.KatiInstalls) > 0 { 1293*333d2b36SAndroid Build Coastguard Worker // Assume the primary install file is last since it probably needs to depend on any other 1294*333d2b36SAndroid Build Coastguard Worker // installed files. If that is not the case we can add a method to specify the primary 1295*333d2b36SAndroid Build Coastguard Worker // installed file. 1296*333d2b36SAndroid Build Coastguard Worker helperInfo.SetPath("LOCAL_SOONG_INSTALLED_MODULE", info.KatiInstalls[len(info.KatiInstalls)-1].to) 1297*333d2b36SAndroid Build Coastguard Worker helperInfo.SetString("LOCAL_SOONG_INSTALL_PAIRS", info.KatiInstalls.BuiltInstalled()) 1298*333d2b36SAndroid Build Coastguard Worker helperInfo.SetPaths("LOCAL_SOONG_INSTALL_SYMLINKS", info.KatiSymlinks.InstallPaths().Paths()) 1299*333d2b36SAndroid Build Coastguard Worker } else { 1300*333d2b36SAndroid Build Coastguard Worker // Soong may not have generated the install rule also when `no_full_install: true`. 1301*333d2b36SAndroid Build Coastguard Worker // Mark this module as uninstallable in order to prevent Make from creating an 1302*333d2b36SAndroid Build Coastguard Worker // install rule there. 1303*333d2b36SAndroid Build Coastguard Worker helperInfo.SetBoolIfTrue("LOCAL_UNINSTALLABLE_MODULE", proptools.Bool(base.commonProperties.No_full_install)) 1304*333d2b36SAndroid Build Coastguard Worker } 1305*333d2b36SAndroid Build Coastguard Worker 1306*333d2b36SAndroid Build Coastguard Worker if info.UncheckedModule { 1307*333d2b36SAndroid Build Coastguard Worker helperInfo.SetBool("LOCAL_DONT_CHECK_MODULE", true) 1308*333d2b36SAndroid Build Coastguard Worker } else if info.CheckbuildTarget != nil { 1309*333d2b36SAndroid Build Coastguard Worker helperInfo.SetPath("LOCAL_CHECKED_MODULE", info.CheckbuildTarget) 1310*333d2b36SAndroid Build Coastguard Worker } else { 1311*333d2b36SAndroid Build Coastguard Worker helperInfo.SetOptionalPath("LOCAL_CHECKED_MODULE", a.OutputFile) 1312*333d2b36SAndroid Build Coastguard Worker } 1313*333d2b36SAndroid Build Coastguard Worker 1314*333d2b36SAndroid Build Coastguard Worker if len(info.TestData) > 0 { 1315*333d2b36SAndroid Build Coastguard Worker helperInfo.AddStrings("LOCAL_TEST_DATA", androidMkDataPaths(info.TestData)...) 1316*333d2b36SAndroid Build Coastguard Worker } 1317*333d2b36SAndroid Build Coastguard Worker 1318*333d2b36SAndroid Build Coastguard Worker if am, ok := mod.(ApexModule); ok { 1319*333d2b36SAndroid Build Coastguard Worker helperInfo.SetBoolIfTrue("LOCAL_NOT_AVAILABLE_FOR_PLATFORM", am.NotAvailableForPlatform()) 1320*333d2b36SAndroid Build Coastguard Worker } 1321*333d2b36SAndroid Build Coastguard Worker 1322*333d2b36SAndroid Build Coastguard Worker archStr := base.Arch().ArchType.String() 1323*333d2b36SAndroid Build Coastguard Worker host := false 1324*333d2b36SAndroid Build Coastguard Worker switch base.Os().Class { 1325*333d2b36SAndroid Build Coastguard Worker case Host: 1326*333d2b36SAndroid Build Coastguard Worker if base.Target().HostCross { 1327*333d2b36SAndroid Build Coastguard Worker // Make cannot identify LOCAL_MODULE_HOST_CROSS_ARCH:= common. 1328*333d2b36SAndroid Build Coastguard Worker if base.Arch().ArchType != Common { 1329*333d2b36SAndroid Build Coastguard Worker helperInfo.SetString("LOCAL_MODULE_HOST_CROSS_ARCH", archStr) 1330*333d2b36SAndroid Build Coastguard Worker } 1331*333d2b36SAndroid Build Coastguard Worker } else { 1332*333d2b36SAndroid Build Coastguard Worker // Make cannot identify LOCAL_MODULE_HOST_ARCH:= common. 1333*333d2b36SAndroid Build Coastguard Worker if base.Arch().ArchType != Common { 1334*333d2b36SAndroid Build Coastguard Worker helperInfo.SetString("LOCAL_MODULE_HOST_ARCH", archStr) 1335*333d2b36SAndroid Build Coastguard Worker } 1336*333d2b36SAndroid Build Coastguard Worker } 1337*333d2b36SAndroid Build Coastguard Worker host = true 1338*333d2b36SAndroid Build Coastguard Worker case Device: 1339*333d2b36SAndroid Build Coastguard Worker // Make cannot identify LOCAL_MODULE_TARGET_ARCH:= common. 1340*333d2b36SAndroid Build Coastguard Worker if base.Arch().ArchType != Common { 1341*333d2b36SAndroid Build Coastguard Worker if base.Target().NativeBridge { 1342*333d2b36SAndroid Build Coastguard Worker hostArchStr := base.Target().NativeBridgeHostArchName 1343*333d2b36SAndroid Build Coastguard Worker if hostArchStr != "" { 1344*333d2b36SAndroid Build Coastguard Worker helperInfo.SetString("LOCAL_MODULE_TARGET_ARCH", hostArchStr) 1345*333d2b36SAndroid Build Coastguard Worker } 1346*333d2b36SAndroid Build Coastguard Worker } else { 1347*333d2b36SAndroid Build Coastguard Worker helperInfo.SetString("LOCAL_MODULE_TARGET_ARCH", archStr) 1348*333d2b36SAndroid Build Coastguard Worker } 1349*333d2b36SAndroid Build Coastguard Worker } 1350*333d2b36SAndroid Build Coastguard Worker 1351*333d2b36SAndroid Build Coastguard Worker if !base.InVendorRamdisk() { 1352*333d2b36SAndroid Build Coastguard Worker helperInfo.AddPaths("LOCAL_FULL_INIT_RC", info.InitRcPaths) 1353*333d2b36SAndroid Build Coastguard Worker } 1354*333d2b36SAndroid Build Coastguard Worker if len(info.VintfFragmentsPaths) > 0 { 1355*333d2b36SAndroid Build Coastguard Worker helperInfo.AddPaths("LOCAL_FULL_VINTF_FRAGMENTS", info.VintfFragmentsPaths) 1356*333d2b36SAndroid Build Coastguard Worker } 1357*333d2b36SAndroid Build Coastguard Worker helperInfo.SetBoolIfTrue("LOCAL_PROPRIETARY_MODULE", Bool(base.commonProperties.Proprietary)) 1358*333d2b36SAndroid Build Coastguard Worker if Bool(base.commonProperties.Vendor) || Bool(base.commonProperties.Soc_specific) { 1359*333d2b36SAndroid Build Coastguard Worker helperInfo.SetString("LOCAL_VENDOR_MODULE", "true") 1360*333d2b36SAndroid Build Coastguard Worker } 1361*333d2b36SAndroid Build Coastguard Worker helperInfo.SetBoolIfTrue("LOCAL_ODM_MODULE", Bool(base.commonProperties.Device_specific)) 1362*333d2b36SAndroid Build Coastguard Worker helperInfo.SetBoolIfTrue("LOCAL_PRODUCT_MODULE", Bool(base.commonProperties.Product_specific)) 1363*333d2b36SAndroid Build Coastguard Worker helperInfo.SetBoolIfTrue("LOCAL_SYSTEM_EXT_MODULE", Bool(base.commonProperties.System_ext_specific)) 1364*333d2b36SAndroid Build Coastguard Worker if base.commonProperties.Owner != nil { 1365*333d2b36SAndroid Build Coastguard Worker helperInfo.SetString("LOCAL_MODULE_OWNER", *base.commonProperties.Owner) 1366*333d2b36SAndroid Build Coastguard Worker } 1367*333d2b36SAndroid Build Coastguard Worker } 1368*333d2b36SAndroid Build Coastguard Worker 1369*333d2b36SAndroid Build Coastguard Worker if host { 1370*333d2b36SAndroid Build Coastguard Worker makeOs := base.Os().String() 1371*333d2b36SAndroid Build Coastguard Worker if base.Os() == Linux || base.Os() == LinuxBionic || base.Os() == LinuxMusl { 1372*333d2b36SAndroid Build Coastguard Worker makeOs = "linux" 1373*333d2b36SAndroid Build Coastguard Worker } 1374*333d2b36SAndroid Build Coastguard Worker helperInfo.SetString("LOCAL_MODULE_HOST_OS", makeOs) 1375*333d2b36SAndroid Build Coastguard Worker helperInfo.SetString("LOCAL_IS_HOST_MODULE", "true") 1376*333d2b36SAndroid Build Coastguard Worker } 1377*333d2b36SAndroid Build Coastguard Worker 1378*333d2b36SAndroid Build Coastguard Worker if licenseMetadata, ok := OtherModuleProvider(ctx, mod, LicenseMetadataProvider); ok { 1379*333d2b36SAndroid Build Coastguard Worker helperInfo.SetPath("LOCAL_SOONG_LICENSE_METADATA", licenseMetadata.LicenseMetadataPath) 1380*333d2b36SAndroid Build Coastguard Worker } 1381*333d2b36SAndroid Build Coastguard Worker 1382*333d2b36SAndroid Build Coastguard Worker if _, ok := OtherModuleProvider(ctx, mod, ModuleInfoJSONProvider); ok { 1383*333d2b36SAndroid Build Coastguard Worker helperInfo.SetBool("LOCAL_SOONG_MODULE_INFO_JSON", true) 1384*333d2b36SAndroid Build Coastguard Worker } 1385*333d2b36SAndroid Build Coastguard Worker 1386*333d2b36SAndroid Build Coastguard Worker a.mergeEntries(&helperInfo) 1387*333d2b36SAndroid Build Coastguard Worker 1388*333d2b36SAndroid Build Coastguard Worker // Write to footer. 1389*333d2b36SAndroid Build Coastguard Worker a.FooterStrings = append([]string{"include " + a.Include}, a.FooterStrings...) 1390*333d2b36SAndroid Build Coastguard Worker} 1391*333d2b36SAndroid Build Coastguard Worker 1392*333d2b36SAndroid Build Coastguard Worker// This method merges the entries to helperInfo, then replaces a's EntryMap and 1393*333d2b36SAndroid Build Coastguard Worker// EntryOrder with helperInfo's 1394*333d2b36SAndroid Build Coastguard Workerfunc (a *AndroidMkInfo) mergeEntries(helperInfo *AndroidMkInfo) { 1395*333d2b36SAndroid Build Coastguard Worker for _, extraEntry := range a.EntryOrder { 1396*333d2b36SAndroid Build Coastguard Worker if v, ok := helperInfo.EntryMap[extraEntry]; ok { 1397*333d2b36SAndroid Build Coastguard Worker v = append(v, a.EntryMap[extraEntry]...) 1398*333d2b36SAndroid Build Coastguard Worker } else { 1399*333d2b36SAndroid Build Coastguard Worker helperInfo.EntryMap[extraEntry] = a.EntryMap[extraEntry] 1400*333d2b36SAndroid Build Coastguard Worker helperInfo.EntryOrder = append(helperInfo.EntryOrder, extraEntry) 1401*333d2b36SAndroid Build Coastguard Worker } 1402*333d2b36SAndroid Build Coastguard Worker } 1403*333d2b36SAndroid Build Coastguard Worker a.EntryOrder = helperInfo.EntryOrder 1404*333d2b36SAndroid Build Coastguard Worker a.EntryMap = helperInfo.EntryMap 1405*333d2b36SAndroid Build Coastguard Worker} 1406*333d2b36SAndroid Build Coastguard Worker 1407*333d2b36SAndroid Build Coastguard Workerfunc (a *AndroidMkInfo) disabled() bool { 1408*333d2b36SAndroid Build Coastguard Worker return a.Disabled || !a.OutputFile.Valid() 1409*333d2b36SAndroid Build Coastguard Worker} 1410*333d2b36SAndroid Build Coastguard Worker 1411*333d2b36SAndroid Build Coastguard Worker// write flushes the AndroidMkEntries's in-struct data populated by AndroidMkEntries into the 1412*333d2b36SAndroid Build Coastguard Worker// given Writer object. 1413*333d2b36SAndroid Build Coastguard Workerfunc (a *AndroidMkInfo) write(w io.Writer) { 1414*333d2b36SAndroid Build Coastguard Worker if a.disabled() { 1415*333d2b36SAndroid Build Coastguard Worker return 1416*333d2b36SAndroid Build Coastguard Worker } 1417*333d2b36SAndroid Build Coastguard Worker 1418*333d2b36SAndroid Build Coastguard Worker combinedHeaderString := strings.Join(a.HeaderStrings, "\n") + "\n" 1419*333d2b36SAndroid Build Coastguard Worker combinedFooterString := strings.Join(a.FooterStrings, "\n") + "\n" 1420*333d2b36SAndroid Build Coastguard Worker w.Write([]byte(combinedHeaderString)) 1421*333d2b36SAndroid Build Coastguard Worker for _, name := range a.EntryOrder { 1422*333d2b36SAndroid Build Coastguard Worker AndroidMkEmitAssignList(w, name, a.EntryMap[name]) 1423*333d2b36SAndroid Build Coastguard Worker } 1424*333d2b36SAndroid Build Coastguard Worker w.Write([]byte(combinedFooterString)) 1425*333d2b36SAndroid Build Coastguard Worker} 1426*333d2b36SAndroid Build Coastguard Worker 1427*333d2b36SAndroid Build Coastguard Worker// Compute the list of Make strings to declare phony goals and dist-for-goals 1428*333d2b36SAndroid Build Coastguard Worker// calls from the module's dist and dists properties. 1429*333d2b36SAndroid Build Coastguard Workerfunc (a *AndroidMkInfo) GetDistForGoals(ctx fillInEntriesContext, mod blueprint.Module) []string { 1430*333d2b36SAndroid Build Coastguard Worker distContributions := a.getDistContributions(ctx, mod) 1431*333d2b36SAndroid Build Coastguard Worker if distContributions == nil { 1432*333d2b36SAndroid Build Coastguard Worker return nil 1433*333d2b36SAndroid Build Coastguard Worker } 1434*333d2b36SAndroid Build Coastguard Worker 1435*333d2b36SAndroid Build Coastguard Worker return generateDistContributionsForMake(distContributions) 1436*333d2b36SAndroid Build Coastguard Worker} 1437*333d2b36SAndroid Build Coastguard Worker 1438*333d2b36SAndroid Build Coastguard Worker// Compute the contributions that the module makes to the dist. 1439*333d2b36SAndroid Build Coastguard Workerfunc (a *AndroidMkInfo) getDistContributions(ctx fillInEntriesContext, mod blueprint.Module) *distContributions { 1440*333d2b36SAndroid Build Coastguard Worker amod := mod.(Module).base() 1441*333d2b36SAndroid Build Coastguard Worker name := amod.BaseModuleName() 1442*333d2b36SAndroid Build Coastguard Worker 1443*333d2b36SAndroid Build Coastguard Worker // Collate the set of associated tag/paths available for copying to the dist. 1444*333d2b36SAndroid Build Coastguard Worker // Start with an empty (nil) set. 1445*333d2b36SAndroid Build Coastguard Worker var availableTaggedDists TaggedDistFiles 1446*333d2b36SAndroid Build Coastguard Worker 1447*333d2b36SAndroid Build Coastguard Worker // Then merge in any that are provided explicitly by the module. 1448*333d2b36SAndroid Build Coastguard Worker if a.DistFiles != nil { 1449*333d2b36SAndroid Build Coastguard Worker // Merge the DistFiles into the set. 1450*333d2b36SAndroid Build Coastguard Worker availableTaggedDists = availableTaggedDists.merge(a.DistFiles) 1451*333d2b36SAndroid Build Coastguard Worker } 1452*333d2b36SAndroid Build Coastguard Worker 1453*333d2b36SAndroid Build Coastguard Worker // If no paths have been provided for the DefaultDistTag and the output file is 1454*333d2b36SAndroid Build Coastguard Worker // valid then add that as the default dist path. 1455*333d2b36SAndroid Build Coastguard Worker if _, ok := availableTaggedDists[DefaultDistTag]; !ok && a.OutputFile.Valid() { 1456*333d2b36SAndroid Build Coastguard Worker availableTaggedDists = availableTaggedDists.addPathsForTag(DefaultDistTag, a.OutputFile.Path()) 1457*333d2b36SAndroid Build Coastguard Worker } 1458*333d2b36SAndroid Build Coastguard Worker 1459*333d2b36SAndroid Build Coastguard Worker info := OtherModuleProviderOrDefault(ctx, mod, InstallFilesProvider) 1460*333d2b36SAndroid Build Coastguard Worker // If the distFiles created by GenerateTaggedDistFiles contains paths for the 1461*333d2b36SAndroid Build Coastguard Worker // DefaultDistTag then that takes priority so delete any existing paths. 1462*333d2b36SAndroid Build Coastguard Worker if _, ok := info.DistFiles[DefaultDistTag]; ok { 1463*333d2b36SAndroid Build Coastguard Worker delete(availableTaggedDists, DefaultDistTag) 1464*333d2b36SAndroid Build Coastguard Worker } 1465*333d2b36SAndroid Build Coastguard Worker 1466*333d2b36SAndroid Build Coastguard Worker // Finally, merge the distFiles created by GenerateTaggedDistFiles. 1467*333d2b36SAndroid Build Coastguard Worker availableTaggedDists = availableTaggedDists.merge(info.DistFiles) 1468*333d2b36SAndroid Build Coastguard Worker 1469*333d2b36SAndroid Build Coastguard Worker if len(availableTaggedDists) == 0 { 1470*333d2b36SAndroid Build Coastguard Worker // Nothing dist-able for this module. 1471*333d2b36SAndroid Build Coastguard Worker return nil 1472*333d2b36SAndroid Build Coastguard Worker } 1473*333d2b36SAndroid Build Coastguard Worker 1474*333d2b36SAndroid Build Coastguard Worker // Collate the contributions this module makes to the dist. 1475*333d2b36SAndroid Build Coastguard Worker distContributions := &distContributions{} 1476*333d2b36SAndroid Build Coastguard Worker 1477*333d2b36SAndroid Build Coastguard Worker if !exemptFromRequiredApplicableLicensesProperty(mod.(Module)) { 1478*333d2b36SAndroid Build Coastguard Worker distContributions.licenseMetadataFile = info.LicenseMetadataFile 1479*333d2b36SAndroid Build Coastguard Worker } 1480*333d2b36SAndroid Build Coastguard Worker 1481*333d2b36SAndroid Build Coastguard Worker // Iterate over this module's dist structs, merged from the dist and dists properties. 1482*333d2b36SAndroid Build Coastguard Worker for _, dist := range amod.Dists() { 1483*333d2b36SAndroid Build Coastguard Worker // Get the list of goals this dist should be enabled for. e.g. sdk, droidcore 1484*333d2b36SAndroid Build Coastguard Worker goals := strings.Join(dist.Targets, " ") 1485*333d2b36SAndroid Build Coastguard Worker 1486*333d2b36SAndroid Build Coastguard Worker // Get the tag representing the output files to be dist'd. e.g. ".jar", ".proguard_map" 1487*333d2b36SAndroid Build Coastguard Worker var tag string 1488*333d2b36SAndroid Build Coastguard Worker if dist.Tag == nil { 1489*333d2b36SAndroid Build Coastguard Worker // If the dist struct does not specify a tag, use the default output files tag. 1490*333d2b36SAndroid Build Coastguard Worker tag = DefaultDistTag 1491*333d2b36SAndroid Build Coastguard Worker } else { 1492*333d2b36SAndroid Build Coastguard Worker tag = *dist.Tag 1493*333d2b36SAndroid Build Coastguard Worker } 1494*333d2b36SAndroid Build Coastguard Worker 1495*333d2b36SAndroid Build Coastguard Worker // Get the paths of the output files to be dist'd, represented by the tag. 1496*333d2b36SAndroid Build Coastguard Worker // Can be an empty list. 1497*333d2b36SAndroid Build Coastguard Worker tagPaths := availableTaggedDists[tag] 1498*333d2b36SAndroid Build Coastguard Worker if len(tagPaths) == 0 { 1499*333d2b36SAndroid Build Coastguard Worker // Nothing to dist for this tag, continue to the next dist. 1500*333d2b36SAndroid Build Coastguard Worker continue 1501*333d2b36SAndroid Build Coastguard Worker } 1502*333d2b36SAndroid Build Coastguard Worker 1503*333d2b36SAndroid Build Coastguard Worker if len(tagPaths) > 1 && (dist.Dest != nil || dist.Suffix != nil) { 1504*333d2b36SAndroid Build Coastguard Worker errorMessage := "%s: Cannot apply dest/suffix for more than one dist " + 1505*333d2b36SAndroid Build Coastguard Worker "file for %q goals tag %q in module %s. The list of dist files, " + 1506*333d2b36SAndroid Build Coastguard Worker "which should have a single element, is:\n%s" 1507*333d2b36SAndroid Build Coastguard Worker panic(fmt.Errorf(errorMessage, mod, goals, tag, name, tagPaths)) 1508*333d2b36SAndroid Build Coastguard Worker } 1509*333d2b36SAndroid Build Coastguard Worker 1510*333d2b36SAndroid Build Coastguard Worker copiesForGoals := distContributions.getCopiesForGoals(goals) 1511*333d2b36SAndroid Build Coastguard Worker 1512*333d2b36SAndroid Build Coastguard Worker // Iterate over each path adding a copy instruction to copiesForGoals 1513*333d2b36SAndroid Build Coastguard Worker for _, path := range tagPaths { 1514*333d2b36SAndroid Build Coastguard Worker // It's possible that the Path is nil from errant modules. Be defensive here. 1515*333d2b36SAndroid Build Coastguard Worker if path == nil { 1516*333d2b36SAndroid Build Coastguard Worker tagName := "default" // for error message readability 1517*333d2b36SAndroid Build Coastguard Worker if dist.Tag != nil { 1518*333d2b36SAndroid Build Coastguard Worker tagName = *dist.Tag 1519*333d2b36SAndroid Build Coastguard Worker } 1520*333d2b36SAndroid Build Coastguard Worker panic(fmt.Errorf("Dist file should not be nil for the %s tag in %s", tagName, name)) 1521*333d2b36SAndroid Build Coastguard Worker } 1522*333d2b36SAndroid Build Coastguard Worker 1523*333d2b36SAndroid Build Coastguard Worker dest := filepath.Base(path.String()) 1524*333d2b36SAndroid Build Coastguard Worker 1525*333d2b36SAndroid Build Coastguard Worker if dist.Dest != nil { 1526*333d2b36SAndroid Build Coastguard Worker var err error 1527*333d2b36SAndroid Build Coastguard Worker if dest, err = validateSafePath(*dist.Dest); err != nil { 1528*333d2b36SAndroid Build Coastguard Worker // This was checked in ModuleBase.GenerateBuildActions 1529*333d2b36SAndroid Build Coastguard Worker panic(err) 1530*333d2b36SAndroid Build Coastguard Worker } 1531*333d2b36SAndroid Build Coastguard Worker } 1532*333d2b36SAndroid Build Coastguard Worker 1533*333d2b36SAndroid Build Coastguard Worker ext := filepath.Ext(dest) 1534*333d2b36SAndroid Build Coastguard Worker suffix := "" 1535*333d2b36SAndroid Build Coastguard Worker if dist.Suffix != nil { 1536*333d2b36SAndroid Build Coastguard Worker suffix = *dist.Suffix 1537*333d2b36SAndroid Build Coastguard Worker } 1538*333d2b36SAndroid Build Coastguard Worker 1539*333d2b36SAndroid Build Coastguard Worker productString := "" 1540*333d2b36SAndroid Build Coastguard Worker if dist.Append_artifact_with_product != nil && *dist.Append_artifact_with_product { 1541*333d2b36SAndroid Build Coastguard Worker productString = fmt.Sprintf("_%s", ctx.Config().DeviceProduct()) 1542*333d2b36SAndroid Build Coastguard Worker } 1543*333d2b36SAndroid Build Coastguard Worker 1544*333d2b36SAndroid Build Coastguard Worker if suffix != "" || productString != "" { 1545*333d2b36SAndroid Build Coastguard Worker dest = strings.TrimSuffix(dest, ext) + suffix + productString + ext 1546*333d2b36SAndroid Build Coastguard Worker } 1547*333d2b36SAndroid Build Coastguard Worker 1548*333d2b36SAndroid Build Coastguard Worker if dist.Dir != nil { 1549*333d2b36SAndroid Build Coastguard Worker var err error 1550*333d2b36SAndroid Build Coastguard Worker if dest, err = validateSafePath(*dist.Dir, dest); err != nil { 1551*333d2b36SAndroid Build Coastguard Worker // This was checked in ModuleBase.GenerateBuildActions 1552*333d2b36SAndroid Build Coastguard Worker panic(err) 1553*333d2b36SAndroid Build Coastguard Worker } 1554*333d2b36SAndroid Build Coastguard Worker } 1555*333d2b36SAndroid Build Coastguard Worker 1556*333d2b36SAndroid Build Coastguard Worker copiesForGoals.addCopyInstruction(path, dest) 1557*333d2b36SAndroid Build Coastguard Worker } 1558*333d2b36SAndroid Build Coastguard Worker } 1559*333d2b36SAndroid Build Coastguard Worker 1560*333d2b36SAndroid Build Coastguard Worker return distContributions 1561*333d2b36SAndroid Build Coastguard Worker} 1562*333d2b36SAndroid Build Coastguard Worker 1563*333d2b36SAndroid Build Coastguard Workerfunc deepCopyAndroidMkProviderInfo(providerInfo *AndroidMkProviderInfo) AndroidMkProviderInfo { 1564*333d2b36SAndroid Build Coastguard Worker info := AndroidMkProviderInfo{ 1565*333d2b36SAndroid Build Coastguard Worker PrimaryInfo: deepCopyAndroidMkInfo(&providerInfo.PrimaryInfo), 1566*333d2b36SAndroid Build Coastguard Worker } 1567*333d2b36SAndroid Build Coastguard Worker if len(providerInfo.ExtraInfo) > 0 { 1568*333d2b36SAndroid Build Coastguard Worker for _, i := range providerInfo.ExtraInfo { 1569*333d2b36SAndroid Build Coastguard Worker info.ExtraInfo = append(info.ExtraInfo, deepCopyAndroidMkInfo(&i)) 1570*333d2b36SAndroid Build Coastguard Worker } 1571*333d2b36SAndroid Build Coastguard Worker } 1572*333d2b36SAndroid Build Coastguard Worker return info 1573*333d2b36SAndroid Build Coastguard Worker} 1574*333d2b36SAndroid Build Coastguard Worker 1575*333d2b36SAndroid Build Coastguard Workerfunc deepCopyAndroidMkInfo(mkinfo *AndroidMkInfo) AndroidMkInfo { 1576*333d2b36SAndroid Build Coastguard Worker info := AndroidMkInfo{ 1577*333d2b36SAndroid Build Coastguard Worker Class: mkinfo.Class, 1578*333d2b36SAndroid Build Coastguard Worker SubName: mkinfo.SubName, 1579*333d2b36SAndroid Build Coastguard Worker OverrideName: mkinfo.OverrideName, 1580*333d2b36SAndroid Build Coastguard Worker // There is no modification on DistFiles or OutputFile, so no need to 1581*333d2b36SAndroid Build Coastguard Worker // make their deep copy. 1582*333d2b36SAndroid Build Coastguard Worker DistFiles: mkinfo.DistFiles, 1583*333d2b36SAndroid Build Coastguard Worker OutputFile: mkinfo.OutputFile, 1584*333d2b36SAndroid Build Coastguard Worker Disabled: mkinfo.Disabled, 1585*333d2b36SAndroid Build Coastguard Worker Include: mkinfo.Include, 1586*333d2b36SAndroid Build Coastguard Worker Required: deepCopyStringSlice(mkinfo.Required), 1587*333d2b36SAndroid Build Coastguard Worker Host_required: deepCopyStringSlice(mkinfo.Host_required), 1588*333d2b36SAndroid Build Coastguard Worker Target_required: deepCopyStringSlice(mkinfo.Target_required), 1589*333d2b36SAndroid Build Coastguard Worker HeaderStrings: deepCopyStringSlice(mkinfo.HeaderStrings), 1590*333d2b36SAndroid Build Coastguard Worker FooterStrings: deepCopyStringSlice(mkinfo.FooterStrings), 1591*333d2b36SAndroid Build Coastguard Worker EntryOrder: deepCopyStringSlice(mkinfo.EntryOrder), 1592*333d2b36SAndroid Build Coastguard Worker } 1593*333d2b36SAndroid Build Coastguard Worker info.EntryMap = make(map[string][]string) 1594*333d2b36SAndroid Build Coastguard Worker for k, v := range mkinfo.EntryMap { 1595*333d2b36SAndroid Build Coastguard Worker info.EntryMap[k] = deepCopyStringSlice(v) 1596*333d2b36SAndroid Build Coastguard Worker } 1597*333d2b36SAndroid Build Coastguard Worker 1598*333d2b36SAndroid Build Coastguard Worker return info 1599*333d2b36SAndroid Build Coastguard Worker} 1600*333d2b36SAndroid Build Coastguard Worker 1601*333d2b36SAndroid Build Coastguard Workerfunc deepCopyStringSlice(original []string) []string { 1602*333d2b36SAndroid Build Coastguard Worker result := make([]string, len(original)) 1603*333d2b36SAndroid Build Coastguard Worker copy(result, original) 1604*333d2b36SAndroid Build Coastguard Worker return result 1605*333d2b36SAndroid Build Coastguard Worker} 1606