1*333d2b36SAndroid Build Coastguard Worker// Copyright (C) 2018 The Android Open Source Project 2*333d2b36SAndroid Build Coastguard Worker// 3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License"); 4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License. 5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at 6*333d2b36SAndroid Build Coastguard Worker// 7*333d2b36SAndroid Build Coastguard Worker// http://www.apache.org/licenses/LICENSE-2.0 8*333d2b36SAndroid Build Coastguard Worker// 9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software 10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS, 11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and 13*333d2b36SAndroid Build Coastguard Worker// limitations under the License. 14*333d2b36SAndroid Build Coastguard Worker 15*333d2b36SAndroid Build Coastguard Workerpackage bpf 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 "path/filepath" 21*333d2b36SAndroid Build Coastguard Worker "runtime" 22*333d2b36SAndroid Build Coastguard Worker "strings" 23*333d2b36SAndroid Build Coastguard Worker 24*333d2b36SAndroid Build Coastguard Worker "android/soong/android" 25*333d2b36SAndroid Build Coastguard Worker "android/soong/cc" 26*333d2b36SAndroid Build Coastguard Worker 27*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint" 28*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint/proptools" 29*333d2b36SAndroid Build Coastguard Worker) 30*333d2b36SAndroid Build Coastguard Worker 31*333d2b36SAndroid Build Coastguard Workerfunc init() { 32*333d2b36SAndroid Build Coastguard Worker registerBpfBuildComponents(android.InitRegistrationContext) 33*333d2b36SAndroid Build Coastguard Worker pctx.Import("android/soong/cc/config") 34*333d2b36SAndroid Build Coastguard Worker pctx.StaticVariable("relPwd", cc.PwdPrefix()) 35*333d2b36SAndroid Build Coastguard Worker} 36*333d2b36SAndroid Build Coastguard Worker 37*333d2b36SAndroid Build Coastguard Workervar ( 38*333d2b36SAndroid Build Coastguard Worker pctx = android.NewPackageContext("android/soong/bpf") 39*333d2b36SAndroid Build Coastguard Worker 40*333d2b36SAndroid Build Coastguard Worker ccRule = pctx.AndroidRemoteStaticRule("ccRule", android.RemoteRuleSupports{Goma: true}, 41*333d2b36SAndroid Build Coastguard Worker blueprint.RuleParams{ 42*333d2b36SAndroid Build Coastguard Worker Depfile: "${out}.d", 43*333d2b36SAndroid Build Coastguard Worker Deps: blueprint.DepsGCC, 44*333d2b36SAndroid Build Coastguard Worker Command: "$relPwd $ccCmd --target=bpf -c $cFlags -MD -MF ${out}.d -o $out $in", 45*333d2b36SAndroid Build Coastguard Worker CommandDeps: []string{"$ccCmd"}, 46*333d2b36SAndroid Build Coastguard Worker }, 47*333d2b36SAndroid Build Coastguard Worker "ccCmd", "cFlags") 48*333d2b36SAndroid Build Coastguard Worker 49*333d2b36SAndroid Build Coastguard Worker stripRule = pctx.AndroidStaticRule("stripRule", 50*333d2b36SAndroid Build Coastguard Worker blueprint.RuleParams{ 51*333d2b36SAndroid Build Coastguard Worker Command: `$stripCmd --strip-unneeded --remove-section=.rel.BTF ` + 52*333d2b36SAndroid Build Coastguard Worker `--remove-section=.rel.BTF.ext --remove-section=.BTF.ext $in -o $out`, 53*333d2b36SAndroid Build Coastguard Worker CommandDeps: []string{"$stripCmd"}, 54*333d2b36SAndroid Build Coastguard Worker }, 55*333d2b36SAndroid Build Coastguard Worker "stripCmd") 56*333d2b36SAndroid Build Coastguard Worker) 57*333d2b36SAndroid Build Coastguard Worker 58*333d2b36SAndroid Build Coastguard Workerfunc registerBpfBuildComponents(ctx android.RegistrationContext) { 59*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("bpf_defaults", defaultsFactory) 60*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("bpf", BpfFactory) 61*333d2b36SAndroid Build Coastguard Worker} 62*333d2b36SAndroid Build Coastguard Worker 63*333d2b36SAndroid Build Coastguard Workervar PrepareForTestWithBpf = android.FixtureRegisterWithContext(registerBpfBuildComponents) 64*333d2b36SAndroid Build Coastguard Worker 65*333d2b36SAndroid Build Coastguard Worker// BpfModule interface is used by the apex package to gather information from a bpf module. 66*333d2b36SAndroid Build Coastguard Workertype BpfModule interface { 67*333d2b36SAndroid Build Coastguard Worker android.Module 68*333d2b36SAndroid Build Coastguard Worker 69*333d2b36SAndroid Build Coastguard Worker // Returns the sub install directory if the bpf module is included by apex. 70*333d2b36SAndroid Build Coastguard Worker SubDir() string 71*333d2b36SAndroid Build Coastguard Worker} 72*333d2b36SAndroid Build Coastguard Worker 73*333d2b36SAndroid Build Coastguard Workertype BpfProperties struct { 74*333d2b36SAndroid Build Coastguard Worker // source paths to the files. 75*333d2b36SAndroid Build Coastguard Worker Srcs []string `android:"path"` 76*333d2b36SAndroid Build Coastguard Worker 77*333d2b36SAndroid Build Coastguard Worker // additional cflags that should be used to build the bpf variant of 78*333d2b36SAndroid Build Coastguard Worker // the C/C++ module. 79*333d2b36SAndroid Build Coastguard Worker Cflags []string 80*333d2b36SAndroid Build Coastguard Worker 81*333d2b36SAndroid Build Coastguard Worker // list of directories relative to the root of the source tree that 82*333d2b36SAndroid Build Coastguard Worker // will be added to the include paths using -I. 83*333d2b36SAndroid Build Coastguard Worker // If possible, don't use this. If adding paths from the current 84*333d2b36SAndroid Build Coastguard Worker // directory, use local_include_dirs. If adding paths from other 85*333d2b36SAndroid Build Coastguard Worker // modules, use export_include_dirs in that module. 86*333d2b36SAndroid Build Coastguard Worker Include_dirs []string 87*333d2b36SAndroid Build Coastguard Worker 88*333d2b36SAndroid Build Coastguard Worker // list of directories relative to the Blueprint file that will be 89*333d2b36SAndroid Build Coastguard Worker // added to the include path using -I. 90*333d2b36SAndroid Build Coastguard Worker Local_include_dirs []string 91*333d2b36SAndroid Build Coastguard Worker // optional subdirectory under which this module is installed into. 92*333d2b36SAndroid Build Coastguard Worker Sub_dir string 93*333d2b36SAndroid Build Coastguard Worker 94*333d2b36SAndroid Build Coastguard Worker // if set to true, generate BTF debug info for maps & programs. 95*333d2b36SAndroid Build Coastguard Worker Btf *bool 96*333d2b36SAndroid Build Coastguard Worker 97*333d2b36SAndroid Build Coastguard Worker Vendor *bool 98*333d2b36SAndroid Build Coastguard Worker 99*333d2b36SAndroid Build Coastguard Worker VendorInternal bool `blueprint:"mutated"` 100*333d2b36SAndroid Build Coastguard Worker} 101*333d2b36SAndroid Build Coastguard Worker 102*333d2b36SAndroid Build Coastguard Workertype bpf struct { 103*333d2b36SAndroid Build Coastguard Worker android.ModuleBase 104*333d2b36SAndroid Build Coastguard Worker android.DefaultableModuleBase 105*333d2b36SAndroid Build Coastguard Worker properties BpfProperties 106*333d2b36SAndroid Build Coastguard Worker 107*333d2b36SAndroid Build Coastguard Worker objs android.Paths 108*333d2b36SAndroid Build Coastguard Worker} 109*333d2b36SAndroid Build Coastguard Worker 110*333d2b36SAndroid Build Coastguard Workervar _ android.ImageInterface = (*bpf)(nil) 111*333d2b36SAndroid Build Coastguard Worker 112*333d2b36SAndroid Build Coastguard Workerfunc (bpf *bpf) ImageMutatorBegin(ctx android.ImageInterfaceContext) {} 113*333d2b36SAndroid Build Coastguard Worker 114*333d2b36SAndroid Build Coastguard Workerfunc (bpf *bpf) VendorVariantNeeded(ctx android.ImageInterfaceContext) bool { 115*333d2b36SAndroid Build Coastguard Worker return proptools.Bool(bpf.properties.Vendor) 116*333d2b36SAndroid Build Coastguard Worker} 117*333d2b36SAndroid Build Coastguard Worker 118*333d2b36SAndroid Build Coastguard Workerfunc (bpf *bpf) ProductVariantNeeded(ctx android.ImageInterfaceContext) bool { 119*333d2b36SAndroid Build Coastguard Worker return false 120*333d2b36SAndroid Build Coastguard Worker} 121*333d2b36SAndroid Build Coastguard Worker 122*333d2b36SAndroid Build Coastguard Workerfunc (bpf *bpf) CoreVariantNeeded(ctx android.ImageInterfaceContext) bool { 123*333d2b36SAndroid Build Coastguard Worker return !proptools.Bool(bpf.properties.Vendor) 124*333d2b36SAndroid Build Coastguard Worker} 125*333d2b36SAndroid Build Coastguard Worker 126*333d2b36SAndroid Build Coastguard Workerfunc (bpf *bpf) RamdiskVariantNeeded(ctx android.ImageInterfaceContext) bool { 127*333d2b36SAndroid Build Coastguard Worker return false 128*333d2b36SAndroid Build Coastguard Worker} 129*333d2b36SAndroid Build Coastguard Worker 130*333d2b36SAndroid Build Coastguard Workerfunc (bpf *bpf) VendorRamdiskVariantNeeded(ctx android.ImageInterfaceContext) bool { 131*333d2b36SAndroid Build Coastguard Worker return false 132*333d2b36SAndroid Build Coastguard Worker} 133*333d2b36SAndroid Build Coastguard Worker 134*333d2b36SAndroid Build Coastguard Workerfunc (bpf *bpf) DebugRamdiskVariantNeeded(ctx android.ImageInterfaceContext) bool { 135*333d2b36SAndroid Build Coastguard Worker return false 136*333d2b36SAndroid Build Coastguard Worker} 137*333d2b36SAndroid Build Coastguard Worker 138*333d2b36SAndroid Build Coastguard Workerfunc (bpf *bpf) RecoveryVariantNeeded(ctx android.ImageInterfaceContext) bool { 139*333d2b36SAndroid Build Coastguard Worker return false 140*333d2b36SAndroid Build Coastguard Worker} 141*333d2b36SAndroid Build Coastguard Worker 142*333d2b36SAndroid Build Coastguard Workerfunc (bpf *bpf) ExtraImageVariations(ctx android.ImageInterfaceContext) []string { 143*333d2b36SAndroid Build Coastguard Worker return nil 144*333d2b36SAndroid Build Coastguard Worker} 145*333d2b36SAndroid Build Coastguard Worker 146*333d2b36SAndroid Build Coastguard Workerfunc (bpf *bpf) SetImageVariation(ctx android.ImageInterfaceContext, variation string) { 147*333d2b36SAndroid Build Coastguard Worker bpf.properties.VendorInternal = variation == "vendor" 148*333d2b36SAndroid Build Coastguard Worker} 149*333d2b36SAndroid Build Coastguard Worker 150*333d2b36SAndroid Build Coastguard Workerfunc (bpf *bpf) GenerateAndroidBuildActions(ctx android.ModuleContext) { 151*333d2b36SAndroid Build Coastguard Worker cflags := []string{ 152*333d2b36SAndroid Build Coastguard Worker "-nostdlibinc", 153*333d2b36SAndroid Build Coastguard Worker 154*333d2b36SAndroid Build Coastguard Worker // Make paths in deps files relative 155*333d2b36SAndroid Build Coastguard Worker "-no-canonical-prefixes", 156*333d2b36SAndroid Build Coastguard Worker 157*333d2b36SAndroid Build Coastguard Worker "-O2", 158*333d2b36SAndroid Build Coastguard Worker "-Wall", 159*333d2b36SAndroid Build Coastguard Worker "-Werror", 160*333d2b36SAndroid Build Coastguard Worker "-Wextra", 161*333d2b36SAndroid Build Coastguard Worker 162*333d2b36SAndroid Build Coastguard Worker "-isystem bionic/libc/include", 163*333d2b36SAndroid Build Coastguard Worker "-isystem bionic/libc/kernel/uapi", 164*333d2b36SAndroid Build Coastguard Worker // The architecture doesn't matter here, but asm/types.h is included by linux/types.h. 165*333d2b36SAndroid Build Coastguard Worker "-isystem bionic/libc/kernel/uapi/asm-arm64", 166*333d2b36SAndroid Build Coastguard Worker "-isystem bionic/libc/kernel/android/uapi", 167*333d2b36SAndroid Build Coastguard Worker "-I packages/modules/Connectivity/bpf/headers/include", 168*333d2b36SAndroid Build Coastguard Worker // TODO(b/149785767): only give access to specific file with AID_* constants 169*333d2b36SAndroid Build Coastguard Worker "-I system/core/libcutils/include", 170*333d2b36SAndroid Build Coastguard Worker "-I " + ctx.ModuleDir(), 171*333d2b36SAndroid Build Coastguard Worker } 172*333d2b36SAndroid Build Coastguard Worker 173*333d2b36SAndroid Build Coastguard Worker for _, dir := range android.PathsForModuleSrc(ctx, bpf.properties.Local_include_dirs) { 174*333d2b36SAndroid Build Coastguard Worker cflags = append(cflags, "-I "+dir.String()) 175*333d2b36SAndroid Build Coastguard Worker } 176*333d2b36SAndroid Build Coastguard Worker 177*333d2b36SAndroid Build Coastguard Worker for _, dir := range android.PathsForSource(ctx, bpf.properties.Include_dirs) { 178*333d2b36SAndroid Build Coastguard Worker cflags = append(cflags, "-I "+dir.String()) 179*333d2b36SAndroid Build Coastguard Worker } 180*333d2b36SAndroid Build Coastguard Worker 181*333d2b36SAndroid Build Coastguard Worker cflags = append(cflags, bpf.properties.Cflags...) 182*333d2b36SAndroid Build Coastguard Worker 183*333d2b36SAndroid Build Coastguard Worker if proptools.BoolDefault(bpf.properties.Btf, true) { 184*333d2b36SAndroid Build Coastguard Worker cflags = append(cflags, "-g") 185*333d2b36SAndroid Build Coastguard Worker if runtime.GOOS != "darwin" { 186*333d2b36SAndroid Build Coastguard Worker cflags = append(cflags, "-fdebug-prefix-map=/proc/self/cwd=") 187*333d2b36SAndroid Build Coastguard Worker } 188*333d2b36SAndroid Build Coastguard Worker } 189*333d2b36SAndroid Build Coastguard Worker 190*333d2b36SAndroid Build Coastguard Worker srcs := android.PathsForModuleSrc(ctx, bpf.properties.Srcs) 191*333d2b36SAndroid Build Coastguard Worker 192*333d2b36SAndroid Build Coastguard Worker for _, src := range srcs { 193*333d2b36SAndroid Build Coastguard Worker if strings.ContainsRune(filepath.Base(src.String()), '_') { 194*333d2b36SAndroid Build Coastguard Worker ctx.ModuleErrorf("invalid character '_' in source name") 195*333d2b36SAndroid Build Coastguard Worker } 196*333d2b36SAndroid Build Coastguard Worker obj := android.ObjPathWithExt(ctx, "unstripped", src, "o") 197*333d2b36SAndroid Build Coastguard Worker 198*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 199*333d2b36SAndroid Build Coastguard Worker Rule: ccRule, 200*333d2b36SAndroid Build Coastguard Worker Input: src, 201*333d2b36SAndroid Build Coastguard Worker Output: obj, 202*333d2b36SAndroid Build Coastguard Worker Args: map[string]string{ 203*333d2b36SAndroid Build Coastguard Worker "cFlags": strings.Join(cflags, " "), 204*333d2b36SAndroid Build Coastguard Worker "ccCmd": "${config.ClangBin}/clang", 205*333d2b36SAndroid Build Coastguard Worker }, 206*333d2b36SAndroid Build Coastguard Worker }) 207*333d2b36SAndroid Build Coastguard Worker 208*333d2b36SAndroid Build Coastguard Worker if proptools.BoolDefault(bpf.properties.Btf, true) { 209*333d2b36SAndroid Build Coastguard Worker objStripped := android.ObjPathWithExt(ctx, "", src, "o") 210*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 211*333d2b36SAndroid Build Coastguard Worker Rule: stripRule, 212*333d2b36SAndroid Build Coastguard Worker Input: obj, 213*333d2b36SAndroid Build Coastguard Worker Output: objStripped, 214*333d2b36SAndroid Build Coastguard Worker Args: map[string]string{ 215*333d2b36SAndroid Build Coastguard Worker "stripCmd": "${config.ClangBin}/llvm-strip", 216*333d2b36SAndroid Build Coastguard Worker }, 217*333d2b36SAndroid Build Coastguard Worker }) 218*333d2b36SAndroid Build Coastguard Worker bpf.objs = append(bpf.objs, objStripped.WithoutRel()) 219*333d2b36SAndroid Build Coastguard Worker } else { 220*333d2b36SAndroid Build Coastguard Worker bpf.objs = append(bpf.objs, obj.WithoutRel()) 221*333d2b36SAndroid Build Coastguard Worker } 222*333d2b36SAndroid Build Coastguard Worker 223*333d2b36SAndroid Build Coastguard Worker } 224*333d2b36SAndroid Build Coastguard Worker 225*333d2b36SAndroid Build Coastguard Worker installDir := android.PathForModuleInstall(ctx, "etc", "bpf") 226*333d2b36SAndroid Build Coastguard Worker if len(bpf.properties.Sub_dir) > 0 { 227*333d2b36SAndroid Build Coastguard Worker installDir = installDir.Join(ctx, bpf.properties.Sub_dir) 228*333d2b36SAndroid Build Coastguard Worker } 229*333d2b36SAndroid Build Coastguard Worker for _, obj := range bpf.objs { 230*333d2b36SAndroid Build Coastguard Worker ctx.PackageFile(installDir, obj.Base(), obj) 231*333d2b36SAndroid Build Coastguard Worker } 232*333d2b36SAndroid Build Coastguard Worker 233*333d2b36SAndroid Build Coastguard Worker android.SetProvider(ctx, blueprint.SrcsFileProviderKey, blueprint.SrcsFileProviderData{SrcPaths: srcs.Strings()}) 234*333d2b36SAndroid Build Coastguard Worker 235*333d2b36SAndroid Build Coastguard Worker ctx.SetOutputFiles(bpf.objs, "") 236*333d2b36SAndroid Build Coastguard Worker} 237*333d2b36SAndroid Build Coastguard Worker 238*333d2b36SAndroid Build Coastguard Workerfunc (bpf *bpf) AndroidMk() android.AndroidMkData { 239*333d2b36SAndroid Build Coastguard Worker return android.AndroidMkData{ 240*333d2b36SAndroid Build Coastguard Worker Custom: func(w io.Writer, name, prefix, moduleDir string, data android.AndroidMkData) { 241*333d2b36SAndroid Build Coastguard Worker var names []string 242*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w) 243*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "LOCAL_PATH :=", moduleDir) 244*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w) 245*333d2b36SAndroid Build Coastguard Worker var localModulePath string 246*333d2b36SAndroid Build Coastguard Worker if bpf.properties.VendorInternal { 247*333d2b36SAndroid Build Coastguard Worker localModulePath = "LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR_ETC)/bpf" 248*333d2b36SAndroid Build Coastguard Worker } else { 249*333d2b36SAndroid Build Coastguard Worker localModulePath = "LOCAL_MODULE_PATH := $(TARGET_OUT_ETC)/bpf" 250*333d2b36SAndroid Build Coastguard Worker } 251*333d2b36SAndroid Build Coastguard Worker if len(bpf.properties.Sub_dir) > 0 { 252*333d2b36SAndroid Build Coastguard Worker localModulePath += "/" + bpf.properties.Sub_dir 253*333d2b36SAndroid Build Coastguard Worker } 254*333d2b36SAndroid Build Coastguard Worker for _, obj := range bpf.objs { 255*333d2b36SAndroid Build Coastguard Worker objName := name + "_" + obj.Base() 256*333d2b36SAndroid Build Coastguard Worker names = append(names, objName) 257*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "include $(CLEAR_VARS)", " # bpf.bpf.obj") 258*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "LOCAL_MODULE := ", objName) 259*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "LOCAL_PREBUILT_MODULE_FILE :=", obj.String()) 260*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "LOCAL_MODULE_STEM :=", obj.Base()) 261*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "LOCAL_MODULE_CLASS := ETC") 262*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, localModulePath) 263*333d2b36SAndroid Build Coastguard Worker // AconfigUpdateAndroidMkData may have added elements to Extra. Process them here. 264*333d2b36SAndroid Build Coastguard Worker for _, extra := range data.Extra { 265*333d2b36SAndroid Build Coastguard Worker extra(w, nil) 266*333d2b36SAndroid Build Coastguard Worker } 267*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "include $(BUILD_PREBUILT)") 268*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w) 269*333d2b36SAndroid Build Coastguard Worker } 270*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "include $(CLEAR_VARS)", " # bpf.bpf") 271*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "LOCAL_MODULE := ", name) 272*333d2b36SAndroid Build Coastguard Worker android.AndroidMkEmitAssignList(w, "LOCAL_REQUIRED_MODULES", names) 273*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "include $(BUILD_PHONY_PACKAGE)") 274*333d2b36SAndroid Build Coastguard Worker }, 275*333d2b36SAndroid Build Coastguard Worker } 276*333d2b36SAndroid Build Coastguard Worker} 277*333d2b36SAndroid Build Coastguard Worker 278*333d2b36SAndroid Build Coastguard Workertype Defaults struct { 279*333d2b36SAndroid Build Coastguard Worker android.ModuleBase 280*333d2b36SAndroid Build Coastguard Worker android.DefaultsModuleBase 281*333d2b36SAndroid Build Coastguard Worker} 282*333d2b36SAndroid Build Coastguard Worker 283*333d2b36SAndroid Build Coastguard Workerfunc defaultsFactory() android.Module { 284*333d2b36SAndroid Build Coastguard Worker return DefaultsFactory() 285*333d2b36SAndroid Build Coastguard Worker} 286*333d2b36SAndroid Build Coastguard Worker 287*333d2b36SAndroid Build Coastguard Workerfunc DefaultsFactory(props ...interface{}) android.Module { 288*333d2b36SAndroid Build Coastguard Worker module := &Defaults{} 289*333d2b36SAndroid Build Coastguard Worker 290*333d2b36SAndroid Build Coastguard Worker module.AddProperties(props...) 291*333d2b36SAndroid Build Coastguard Worker module.AddProperties(&BpfProperties{}) 292*333d2b36SAndroid Build Coastguard Worker 293*333d2b36SAndroid Build Coastguard Worker android.InitDefaultsModule(module) 294*333d2b36SAndroid Build Coastguard Worker 295*333d2b36SAndroid Build Coastguard Worker return module 296*333d2b36SAndroid Build Coastguard Worker} 297*333d2b36SAndroid Build Coastguard Worker 298*333d2b36SAndroid Build Coastguard Workerfunc (bpf *bpf) SubDir() string { 299*333d2b36SAndroid Build Coastguard Worker return bpf.properties.Sub_dir 300*333d2b36SAndroid Build Coastguard Worker} 301*333d2b36SAndroid Build Coastguard Worker 302*333d2b36SAndroid Build Coastguard Workerfunc BpfFactory() android.Module { 303*333d2b36SAndroid Build Coastguard Worker module := &bpf{} 304*333d2b36SAndroid Build Coastguard Worker 305*333d2b36SAndroid Build Coastguard Worker module.AddProperties(&module.properties) 306*333d2b36SAndroid Build Coastguard Worker 307*333d2b36SAndroid Build Coastguard Worker android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibCommon) 308*333d2b36SAndroid Build Coastguard Worker android.InitDefaultableModule(module) 309*333d2b36SAndroid Build Coastguard Worker 310*333d2b36SAndroid Build Coastguard Worker return module 311*333d2b36SAndroid Build Coastguard Worker} 312