1*333d2b36SAndroid Build Coastguard Worker// Copyright 2016 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 Workerpackage phony 16*333d2b36SAndroid Build Coastguard Worker 17*333d2b36SAndroid Build Coastguard Workerimport ( 18*333d2b36SAndroid Build Coastguard Worker "fmt" 19*333d2b36SAndroid Build Coastguard Worker "io" 20*333d2b36SAndroid Build Coastguard Worker "strings" 21*333d2b36SAndroid Build Coastguard Worker 22*333d2b36SAndroid Build Coastguard Worker "android/soong/android" 23*333d2b36SAndroid Build Coastguard Worker 24*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint/proptools" 25*333d2b36SAndroid Build Coastguard Worker) 26*333d2b36SAndroid Build Coastguard Worker 27*333d2b36SAndroid Build Coastguard Workerfunc init() { 28*333d2b36SAndroid Build Coastguard Worker registerPhonyModuleTypes(android.InitRegistrationContext) 29*333d2b36SAndroid Build Coastguard Worker} 30*333d2b36SAndroid Build Coastguard Worker 31*333d2b36SAndroid Build Coastguard Workerfunc registerPhonyModuleTypes(ctx android.RegistrationContext) { 32*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("phony", PhonyFactory) 33*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("phony_rule", PhonyRuleFactory) 34*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("phony_rule_defaults", PhonyRuleDefaultsFactory) 35*333d2b36SAndroid Build Coastguard Worker} 36*333d2b36SAndroid Build Coastguard Worker 37*333d2b36SAndroid Build Coastguard Workervar PrepareForTestWithPhony = android.FixtureRegisterWithContext(registerPhonyModuleTypes) 38*333d2b36SAndroid Build Coastguard Worker 39*333d2b36SAndroid Build Coastguard Workertype phony struct { 40*333d2b36SAndroid Build Coastguard Worker android.ModuleBase 41*333d2b36SAndroid Build Coastguard Worker requiredModuleNames []string 42*333d2b36SAndroid Build Coastguard Worker hostRequiredModuleNames []string 43*333d2b36SAndroid Build Coastguard Worker targetRequiredModuleNames []string 44*333d2b36SAndroid Build Coastguard Worker} 45*333d2b36SAndroid Build Coastguard Worker 46*333d2b36SAndroid Build Coastguard Workerfunc PhonyFactory() android.Module { 47*333d2b36SAndroid Build Coastguard Worker module := &phony{} 48*333d2b36SAndroid Build Coastguard Worker 49*333d2b36SAndroid Build Coastguard Worker android.InitAndroidArchModule(module, android.HostAndDeviceSupported, android.MultilibCommon) 50*333d2b36SAndroid Build Coastguard Worker return module 51*333d2b36SAndroid Build Coastguard Worker} 52*333d2b36SAndroid Build Coastguard Worker 53*333d2b36SAndroid Build Coastguard Workerfunc (p *phony) GenerateAndroidBuildActions(ctx android.ModuleContext) { 54*333d2b36SAndroid Build Coastguard Worker p.requiredModuleNames = ctx.RequiredModuleNames(ctx) 55*333d2b36SAndroid Build Coastguard Worker p.hostRequiredModuleNames = ctx.HostRequiredModuleNames() 56*333d2b36SAndroid Build Coastguard Worker p.targetRequiredModuleNames = ctx.TargetRequiredModuleNames() 57*333d2b36SAndroid Build Coastguard Worker} 58*333d2b36SAndroid Build Coastguard Worker 59*333d2b36SAndroid Build Coastguard Workerfunc (p *phony) AndroidMk() android.AndroidMkData { 60*333d2b36SAndroid Build Coastguard Worker return android.AndroidMkData{ 61*333d2b36SAndroid Build Coastguard Worker Custom: func(w io.Writer, name, prefix, moduleDir string, data android.AndroidMkData) { 62*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "\ninclude $(CLEAR_VARS)", " # phony.phony") 63*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "LOCAL_PATH :=", moduleDir) 64*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "LOCAL_MODULE :=", name) 65*333d2b36SAndroid Build Coastguard Worker if p.Host() { 66*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "LOCAL_IS_HOST_MODULE := true") 67*333d2b36SAndroid Build Coastguard Worker } 68*333d2b36SAndroid Build Coastguard Worker if len(p.requiredModuleNames) > 0 { 69*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "LOCAL_REQUIRED_MODULES :=", 70*333d2b36SAndroid Build Coastguard Worker strings.Join(p.requiredModuleNames, " ")) 71*333d2b36SAndroid Build Coastguard Worker } 72*333d2b36SAndroid Build Coastguard Worker if len(p.hostRequiredModuleNames) > 0 { 73*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "LOCAL_HOST_REQUIRED_MODULES :=", 74*333d2b36SAndroid Build Coastguard Worker strings.Join(p.hostRequiredModuleNames, " ")) 75*333d2b36SAndroid Build Coastguard Worker } 76*333d2b36SAndroid Build Coastguard Worker if len(p.targetRequiredModuleNames) > 0 { 77*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "LOCAL_TARGET_REQUIRED_MODULES :=", 78*333d2b36SAndroid Build Coastguard Worker strings.Join(p.targetRequiredModuleNames, " ")) 79*333d2b36SAndroid Build Coastguard Worker } 80*333d2b36SAndroid Build Coastguard Worker // AconfigUpdateAndroidMkData may have added elements to Extra. Process them here. 81*333d2b36SAndroid Build Coastguard Worker for _, extra := range data.Extra { 82*333d2b36SAndroid Build Coastguard Worker extra(w, nil) 83*333d2b36SAndroid Build Coastguard Worker } 84*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "include $(BUILD_PHONY_PACKAGE)") 85*333d2b36SAndroid Build Coastguard Worker }, 86*333d2b36SAndroid Build Coastguard Worker } 87*333d2b36SAndroid Build Coastguard Worker} 88*333d2b36SAndroid Build Coastguard Worker 89*333d2b36SAndroid Build Coastguard Workertype PhonyRule struct { 90*333d2b36SAndroid Build Coastguard Worker android.ModuleBase 91*333d2b36SAndroid Build Coastguard Worker android.DefaultableModuleBase 92*333d2b36SAndroid Build Coastguard Worker 93*333d2b36SAndroid Build Coastguard Worker phonyDepsModuleNames []string 94*333d2b36SAndroid Build Coastguard Worker properties PhonyProperties 95*333d2b36SAndroid Build Coastguard Worker} 96*333d2b36SAndroid Build Coastguard Worker 97*333d2b36SAndroid Build Coastguard Workertype PhonyProperties struct { 98*333d2b36SAndroid Build Coastguard Worker // The Phony_deps is the set of all dependencies for this target, 99*333d2b36SAndroid Build Coastguard Worker // and it can function similarly to .PHONY in a makefile. 100*333d2b36SAndroid Build Coastguard Worker // Additionally, dependencies within it can even include genrule. 101*333d2b36SAndroid Build Coastguard Worker Phony_deps proptools.Configurable[[]string] 102*333d2b36SAndroid Build Coastguard Worker} 103*333d2b36SAndroid Build Coastguard Worker 104*333d2b36SAndroid Build Coastguard Worker// The phony_rule provides functionality similar to the .PHONY in a makefile. 105*333d2b36SAndroid Build Coastguard Worker// It can create a phony target and include relevant dependencies associated with it. 106*333d2b36SAndroid Build Coastguard Workerfunc PhonyRuleFactory() android.Module { 107*333d2b36SAndroid Build Coastguard Worker module := &PhonyRule{} 108*333d2b36SAndroid Build Coastguard Worker android.InitAndroidModule(module) 109*333d2b36SAndroid Build Coastguard Worker module.AddProperties(&module.properties) 110*333d2b36SAndroid Build Coastguard Worker android.InitDefaultableModule(module) 111*333d2b36SAndroid Build Coastguard Worker return module 112*333d2b36SAndroid Build Coastguard Worker} 113*333d2b36SAndroid Build Coastguard Worker 114*333d2b36SAndroid Build Coastguard Workerfunc (p *PhonyRule) GenerateAndroidBuildActions(ctx android.ModuleContext) { 115*333d2b36SAndroid Build Coastguard Worker p.phonyDepsModuleNames = p.properties.Phony_deps.GetOrDefault(ctx, nil) 116*333d2b36SAndroid Build Coastguard Worker} 117*333d2b36SAndroid Build Coastguard Worker 118*333d2b36SAndroid Build Coastguard Workerfunc (p *PhonyRule) AndroidMk() android.AndroidMkData { 119*333d2b36SAndroid Build Coastguard Worker return android.AndroidMkData{ 120*333d2b36SAndroid Build Coastguard Worker Custom: func(w io.Writer, name, prefix, moduleDir string, data android.AndroidMkData) { 121*333d2b36SAndroid Build Coastguard Worker if len(p.phonyDepsModuleNames) > 0 { 122*333d2b36SAndroid Build Coastguard Worker depModulesStr := strings.Join(p.phonyDepsModuleNames, " ") 123*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, ".PHONY:", name) 124*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, name, ":", depModulesStr) 125*333d2b36SAndroid Build Coastguard Worker } 126*333d2b36SAndroid Build Coastguard Worker }, 127*333d2b36SAndroid Build Coastguard Worker } 128*333d2b36SAndroid Build Coastguard Worker} 129*333d2b36SAndroid Build Coastguard Worker 130*333d2b36SAndroid Build Coastguard Worker// PhonyRuleDefaults 131*333d2b36SAndroid Build Coastguard Workertype PhonyRuleDefaults struct { 132*333d2b36SAndroid Build Coastguard Worker android.ModuleBase 133*333d2b36SAndroid Build Coastguard Worker android.DefaultsModuleBase 134*333d2b36SAndroid Build Coastguard Worker} 135*333d2b36SAndroid Build Coastguard Worker 136*333d2b36SAndroid Build Coastguard Worker// phony_rule_defaults provides a set of properties that can be inherited by other phony_rules. 137*333d2b36SAndroid Build Coastguard Worker// 138*333d2b36SAndroid Build Coastguard Worker// A module can use the properties from a phony_rule_defaults module using `defaults: ["defaults_module_name"]`. Each 139*333d2b36SAndroid Build Coastguard Worker// property in the defaults module that exists in the depending module will be prepended to the depending module's 140*333d2b36SAndroid Build Coastguard Worker// value for that property. 141*333d2b36SAndroid Build Coastguard Worker// 142*333d2b36SAndroid Build Coastguard Worker// Example: 143*333d2b36SAndroid Build Coastguard Worker// 144*333d2b36SAndroid Build Coastguard Worker// phony_rule_defaults { 145*333d2b36SAndroid Build Coastguard Worker// name: "add_module1_defaults", 146*333d2b36SAndroid Build Coastguard Worker// phony_deps: [ 147*333d2b36SAndroid Build Coastguard Worker// "module1", 148*333d2b36SAndroid Build Coastguard Worker// ], 149*333d2b36SAndroid Build Coastguard Worker// } 150*333d2b36SAndroid Build Coastguard Worker// 151*333d2b36SAndroid Build Coastguard Worker// phony_rule { 152*333d2b36SAndroid Build Coastguard Worker// name: "example", 153*333d2b36SAndroid Build Coastguard Worker// defaults: ["add_module1_defaults"], 154*333d2b36SAndroid Build Coastguard Worker// } 155*333d2b36SAndroid Build Coastguard Worker// 156*333d2b36SAndroid Build Coastguard Worker// is functionally identical to: 157*333d2b36SAndroid Build Coastguard Worker// 158*333d2b36SAndroid Build Coastguard Worker// phony_rule { 159*333d2b36SAndroid Build Coastguard Worker// name: "example", 160*333d2b36SAndroid Build Coastguard Worker// phony_deps: [ 161*333d2b36SAndroid Build Coastguard Worker// "module1", 162*333d2b36SAndroid Build Coastguard Worker// ], 163*333d2b36SAndroid Build Coastguard Worker// } 164*333d2b36SAndroid Build Coastguard Workerfunc PhonyRuleDefaultsFactory() android.Module { 165*333d2b36SAndroid Build Coastguard Worker module := &PhonyRuleDefaults{} 166*333d2b36SAndroid Build Coastguard Worker module.AddProperties(&PhonyProperties{}) 167*333d2b36SAndroid Build Coastguard Worker android.InitDefaultsModule(module) 168*333d2b36SAndroid Build Coastguard Worker 169*333d2b36SAndroid Build Coastguard Worker return module 170*333d2b36SAndroid Build Coastguard Worker} 171