1*333d2b36SAndroid Build Coastguard Worker// Copyright (C) 2024 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 libbpf_prog 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 "runtime" 21*333d2b36SAndroid Build Coastguard Worker "strings" 22*333d2b36SAndroid Build Coastguard Worker 23*333d2b36SAndroid Build Coastguard Worker "android/soong/android" 24*333d2b36SAndroid Build Coastguard Worker "android/soong/cc" 25*333d2b36SAndroid Build Coastguard Worker "android/soong/genrule" 26*333d2b36SAndroid Build Coastguard Worker 27*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint" 28*333d2b36SAndroid Build Coastguard Worker) 29*333d2b36SAndroid Build Coastguard Worker 30*333d2b36SAndroid Build Coastguard Workertype libbpfProgDepType struct { 31*333d2b36SAndroid Build Coastguard Worker blueprint.BaseDependencyTag 32*333d2b36SAndroid Build Coastguard Worker} 33*333d2b36SAndroid Build Coastguard Worker 34*333d2b36SAndroid Build Coastguard Workerfunc init() { 35*333d2b36SAndroid Build Coastguard Worker registerLibbpfProgBuildComponents(android.InitRegistrationContext) 36*333d2b36SAndroid Build Coastguard Worker pctx.Import("android/soong/cc/config") 37*333d2b36SAndroid Build Coastguard Worker pctx.StaticVariable("relPwd", cc.PwdPrefix()) 38*333d2b36SAndroid Build Coastguard Worker} 39*333d2b36SAndroid Build Coastguard Worker 40*333d2b36SAndroid Build Coastguard Workervar ( 41*333d2b36SAndroid Build Coastguard Worker pctx = android.NewPackageContext("android/soong/bpf/libbpf_prog") 42*333d2b36SAndroid Build Coastguard Worker 43*333d2b36SAndroid Build Coastguard Worker libbpfProgCcRule = pctx.AndroidStaticRule("libbpfProgCcRule", 44*333d2b36SAndroid Build Coastguard Worker blueprint.RuleParams{ 45*333d2b36SAndroid Build Coastguard Worker Depfile: "${out}.d", 46*333d2b36SAndroid Build Coastguard Worker Deps: blueprint.DepsGCC, 47*333d2b36SAndroid Build Coastguard Worker Command: "$relPwd $ccCmd --target=bpf -c $cFlags -MD -MF ${out}.d -o $out $in", 48*333d2b36SAndroid Build Coastguard Worker CommandDeps: []string{"$ccCmd"}, 49*333d2b36SAndroid Build Coastguard Worker }, 50*333d2b36SAndroid Build Coastguard Worker "ccCmd", "cFlags") 51*333d2b36SAndroid Build Coastguard Worker 52*333d2b36SAndroid Build Coastguard Worker libbpfProgStripRule = pctx.AndroidStaticRule("libbpfProgStripRule", 53*333d2b36SAndroid Build Coastguard Worker blueprint.RuleParams{ 54*333d2b36SAndroid Build Coastguard Worker Command: `$stripCmd --strip-unneeded --remove-section=.rel.BTF ` + 55*333d2b36SAndroid Build Coastguard Worker `--remove-section=.rel.BTF.ext --remove-section=.BTF.ext $in -o $out`, 56*333d2b36SAndroid Build Coastguard Worker CommandDeps: []string{"$stripCmd"}, 57*333d2b36SAndroid Build Coastguard Worker }, 58*333d2b36SAndroid Build Coastguard Worker "stripCmd") 59*333d2b36SAndroid Build Coastguard Worker 60*333d2b36SAndroid Build Coastguard Worker libbpfProgDepTag = libbpfProgDepType{} 61*333d2b36SAndroid Build Coastguard Worker) 62*333d2b36SAndroid Build Coastguard Worker 63*333d2b36SAndroid Build Coastguard Workerfunc registerLibbpfProgBuildComponents(ctx android.RegistrationContext) { 64*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("libbpf_defaults", defaultsFactory) 65*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("libbpf_prog", LibbpfProgFactory) 66*333d2b36SAndroid Build Coastguard Worker} 67*333d2b36SAndroid Build Coastguard Worker 68*333d2b36SAndroid Build Coastguard Workervar PrepareForTestWithLibbpfProg = android.GroupFixturePreparers( 69*333d2b36SAndroid Build Coastguard Worker android.FixtureRegisterWithContext(registerLibbpfProgBuildComponents), 70*333d2b36SAndroid Build Coastguard Worker android.FixtureAddFile("libbpf_headers/Foo.h", nil), 71*333d2b36SAndroid Build Coastguard Worker android.FixtureAddFile("libbpf_headers/Android.bp", []byte(` 72*333d2b36SAndroid Build Coastguard Worker genrule { 73*333d2b36SAndroid Build Coastguard Worker name: "libbpf_headers", 74*333d2b36SAndroid Build Coastguard Worker out: ["foo.h",], 75*333d2b36SAndroid Build Coastguard Worker } 76*333d2b36SAndroid Build Coastguard Worker `)), 77*333d2b36SAndroid Build Coastguard Worker genrule.PrepareForTestWithGenRuleBuildComponents, 78*333d2b36SAndroid Build Coastguard Worker) 79*333d2b36SAndroid Build Coastguard Worker 80*333d2b36SAndroid Build Coastguard Workertype LibbpfProgProperties struct { 81*333d2b36SAndroid Build Coastguard Worker // source paths to the files. 82*333d2b36SAndroid Build Coastguard Worker Srcs []string `android:"path"` 83*333d2b36SAndroid Build Coastguard Worker 84*333d2b36SAndroid Build Coastguard Worker // additional cflags that should be used to build the libbpf variant of 85*333d2b36SAndroid Build Coastguard Worker // the C/C++ module. 86*333d2b36SAndroid Build Coastguard Worker Cflags []string `android:"arch_variant"` 87*333d2b36SAndroid Build Coastguard Worker 88*333d2b36SAndroid Build Coastguard Worker // list of directories relative to the Blueprint file that will 89*333d2b36SAndroid Build Coastguard Worker // be added to the include path using -I 90*333d2b36SAndroid Build Coastguard Worker Local_include_dirs []string `android:"arch_variant"` 91*333d2b36SAndroid Build Coastguard Worker 92*333d2b36SAndroid Build Coastguard Worker Header_libs []string `android:"arch_variant"` 93*333d2b36SAndroid Build Coastguard Worker 94*333d2b36SAndroid Build Coastguard Worker // optional subdirectory under which this module is installed into. 95*333d2b36SAndroid Build Coastguard Worker Relative_install_path string 96*333d2b36SAndroid Build Coastguard Worker} 97*333d2b36SAndroid Build Coastguard Worker 98*333d2b36SAndroid Build Coastguard Workertype libbpfProg struct { 99*333d2b36SAndroid Build Coastguard Worker android.ModuleBase 100*333d2b36SAndroid Build Coastguard Worker android.DefaultableModuleBase 101*333d2b36SAndroid Build Coastguard Worker properties LibbpfProgProperties 102*333d2b36SAndroid Build Coastguard Worker objs android.Paths 103*333d2b36SAndroid Build Coastguard Worker} 104*333d2b36SAndroid Build Coastguard Worker 105*333d2b36SAndroid Build Coastguard Workervar _ android.ImageInterface = (*libbpfProg)(nil) 106*333d2b36SAndroid Build Coastguard Worker 107*333d2b36SAndroid Build Coastguard Workerfunc (libbpf *libbpfProg) ImageMutatorBegin(ctx android.ImageInterfaceContext) {} 108*333d2b36SAndroid Build Coastguard Worker 109*333d2b36SAndroid Build Coastguard Workerfunc (libbpf *libbpfProg) VendorVariantNeeded(ctx android.ImageInterfaceContext) bool { 110*333d2b36SAndroid Build Coastguard Worker return false 111*333d2b36SAndroid Build Coastguard Worker} 112*333d2b36SAndroid Build Coastguard Worker 113*333d2b36SAndroid Build Coastguard Workerfunc (libbpf *libbpfProg) ProductVariantNeeded(ctx android.ImageInterfaceContext) bool { 114*333d2b36SAndroid Build Coastguard Worker return false 115*333d2b36SAndroid Build Coastguard Worker} 116*333d2b36SAndroid Build Coastguard Worker 117*333d2b36SAndroid Build Coastguard Workerfunc (libbpf *libbpfProg) CoreVariantNeeded(ctx android.ImageInterfaceContext) bool { 118*333d2b36SAndroid Build Coastguard Worker return true 119*333d2b36SAndroid Build Coastguard Worker} 120*333d2b36SAndroid Build Coastguard Worker 121*333d2b36SAndroid Build Coastguard Workerfunc (libbpf *libbpfProg) RamdiskVariantNeeded(ctx android.ImageInterfaceContext) bool { 122*333d2b36SAndroid Build Coastguard Worker return false 123*333d2b36SAndroid Build Coastguard Worker} 124*333d2b36SAndroid Build Coastguard Worker 125*333d2b36SAndroid Build Coastguard Workerfunc (libbpf *libbpfProg) VendorRamdiskVariantNeeded(ctx android.ImageInterfaceContext) bool { 126*333d2b36SAndroid Build Coastguard Worker return false 127*333d2b36SAndroid Build Coastguard Worker} 128*333d2b36SAndroid Build Coastguard Worker 129*333d2b36SAndroid Build Coastguard Workerfunc (libbpf *libbpfProg) DebugRamdiskVariantNeeded(ctx android.ImageInterfaceContext) bool { 130*333d2b36SAndroid Build Coastguard Worker return false 131*333d2b36SAndroid Build Coastguard Worker} 132*333d2b36SAndroid Build Coastguard Worker 133*333d2b36SAndroid Build Coastguard Workerfunc (libbpf *libbpfProg) RecoveryVariantNeeded(ctx android.ImageInterfaceContext) bool { 134*333d2b36SAndroid Build Coastguard Worker return false 135*333d2b36SAndroid Build Coastguard Worker} 136*333d2b36SAndroid Build Coastguard Worker 137*333d2b36SAndroid Build Coastguard Workerfunc (libbpf *libbpfProg) ExtraImageVariations(ctx android.ImageInterfaceContext) []string { 138*333d2b36SAndroid Build Coastguard Worker return nil 139*333d2b36SAndroid Build Coastguard Worker} 140*333d2b36SAndroid Build Coastguard Worker 141*333d2b36SAndroid Build Coastguard Workerfunc (libbpf *libbpfProg) SetImageVariation(ctx android.ImageInterfaceContext, variation string) { 142*333d2b36SAndroid Build Coastguard Worker} 143*333d2b36SAndroid Build Coastguard Worker 144*333d2b36SAndroid Build Coastguard Workerfunc (libbpf *libbpfProg) DepsMutator(ctx android.BottomUpMutatorContext) { 145*333d2b36SAndroid Build Coastguard Worker ctx.AddDependency(ctx.Module(), libbpfProgDepTag, "libbpf_headers") 146*333d2b36SAndroid Build Coastguard Worker ctx.AddVariationDependencies(nil, cc.HeaderDepTag(), libbpf.properties.Header_libs...) 147*333d2b36SAndroid Build Coastguard Worker} 148*333d2b36SAndroid Build Coastguard Worker 149*333d2b36SAndroid Build Coastguard Workerfunc (libbpf *libbpfProg) GenerateAndroidBuildActions(ctx android.ModuleContext) { 150*333d2b36SAndroid Build Coastguard Worker var cFlagsDeps android.Paths 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 // Flag to assist with the transition to libbpf 162*333d2b36SAndroid Build Coastguard Worker "-DENABLE_LIBBPF", 163*333d2b36SAndroid Build Coastguard Worker "-isystem bionic/libc/include", 164*333d2b36SAndroid Build Coastguard Worker "-isystem bionic/libc/kernel/uapi", 165*333d2b36SAndroid Build Coastguard Worker // The architecture doesn't matter here, but asm/types.h is included by linux/types.h. 166*333d2b36SAndroid Build Coastguard Worker "-isystem bionic/libc/kernel/uapi/asm-arm64", 167*333d2b36SAndroid Build Coastguard Worker "-isystem bionic/libc/kernel/android/uapi", 168*333d2b36SAndroid Build Coastguard Worker "-I " + ctx.ModuleDir(), 169*333d2b36SAndroid Build Coastguard Worker "-g", //Libbpf builds require BTF data 170*333d2b36SAndroid Build Coastguard Worker } 171*333d2b36SAndroid Build Coastguard Worker 172*333d2b36SAndroid Build Coastguard Worker if runtime.GOOS != "darwin" { 173*333d2b36SAndroid Build Coastguard Worker cflags = append(cflags, "-fdebug-prefix-map=/proc/self/cwd=") 174*333d2b36SAndroid Build Coastguard Worker } 175*333d2b36SAndroid Build Coastguard Worker 176*333d2b36SAndroid Build Coastguard Worker ctx.VisitDirectDeps(func(dep android.Module) { 177*333d2b36SAndroid Build Coastguard Worker depTag := ctx.OtherModuleDependencyTag(dep) 178*333d2b36SAndroid Build Coastguard Worker if depTag == libbpfProgDepTag { 179*333d2b36SAndroid Build Coastguard Worker if genRule, ok := dep.(genrule.SourceFileGenerator); ok { 180*333d2b36SAndroid Build Coastguard Worker cFlagsDeps = append(cFlagsDeps, genRule.GeneratedDeps()...) 181*333d2b36SAndroid Build Coastguard Worker dirs := genRule.GeneratedHeaderDirs() 182*333d2b36SAndroid Build Coastguard Worker for _, dir := range dirs { 183*333d2b36SAndroid Build Coastguard Worker cflags = append(cflags, "-I "+dir.String()) 184*333d2b36SAndroid Build Coastguard Worker } 185*333d2b36SAndroid Build Coastguard Worker } else { 186*333d2b36SAndroid Build Coastguard Worker depName := ctx.OtherModuleName(dep) 187*333d2b36SAndroid Build Coastguard Worker ctx.ModuleErrorf("module %q is not a genrule", depName) 188*333d2b36SAndroid Build Coastguard Worker } 189*333d2b36SAndroid Build Coastguard Worker } else if depTag == cc.HeaderDepTag() { 190*333d2b36SAndroid Build Coastguard Worker depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, cc.FlagExporterInfoProvider) 191*333d2b36SAndroid Build Coastguard Worker for _, dir := range depExporterInfo.IncludeDirs { 192*333d2b36SAndroid Build Coastguard Worker cflags = append(cflags, "-I "+dir.String()) 193*333d2b36SAndroid Build Coastguard Worker } 194*333d2b36SAndroid Build Coastguard Worker } 195*333d2b36SAndroid Build Coastguard Worker }) 196*333d2b36SAndroid Build Coastguard Worker 197*333d2b36SAndroid Build Coastguard Worker for _, dir := range android.PathsForModuleSrc(ctx, libbpf.properties.Local_include_dirs) { 198*333d2b36SAndroid Build Coastguard Worker cflags = append(cflags, "-I "+dir.String()) 199*333d2b36SAndroid Build Coastguard Worker } 200*333d2b36SAndroid Build Coastguard Worker 201*333d2b36SAndroid Build Coastguard Worker cflags = append(cflags, libbpf.properties.Cflags...) 202*333d2b36SAndroid Build Coastguard Worker 203*333d2b36SAndroid Build Coastguard Worker srcs := android.PathsForModuleSrc(ctx, libbpf.properties.Srcs) 204*333d2b36SAndroid Build Coastguard Worker 205*333d2b36SAndroid Build Coastguard Worker for _, src := range srcs { 206*333d2b36SAndroid Build Coastguard Worker if strings.ContainsRune(src.Base(), '_') { 207*333d2b36SAndroid Build Coastguard Worker ctx.ModuleErrorf("invalid character '_' in source name") 208*333d2b36SAndroid Build Coastguard Worker } 209*333d2b36SAndroid Build Coastguard Worker obj := android.ObjPathWithExt(ctx, "unstripped", src, "bpf") 210*333d2b36SAndroid Build Coastguard Worker 211*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 212*333d2b36SAndroid Build Coastguard Worker Rule: libbpfProgCcRule, 213*333d2b36SAndroid Build Coastguard Worker Input: src, 214*333d2b36SAndroid Build Coastguard Worker Implicits: cFlagsDeps, 215*333d2b36SAndroid Build Coastguard Worker Output: obj, 216*333d2b36SAndroid Build Coastguard Worker Args: map[string]string{ 217*333d2b36SAndroid Build Coastguard Worker "cFlags": strings.Join(cflags, " "), 218*333d2b36SAndroid Build Coastguard Worker "ccCmd": "${config.ClangBin}/clang", 219*333d2b36SAndroid Build Coastguard Worker }, 220*333d2b36SAndroid Build Coastguard Worker }) 221*333d2b36SAndroid Build Coastguard Worker 222*333d2b36SAndroid Build Coastguard Worker objStripped := android.ObjPathWithExt(ctx, "", src, "bpf") 223*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 224*333d2b36SAndroid Build Coastguard Worker Rule: libbpfProgStripRule, 225*333d2b36SAndroid Build Coastguard Worker Input: obj, 226*333d2b36SAndroid Build Coastguard Worker Output: objStripped, 227*333d2b36SAndroid Build Coastguard Worker Args: map[string]string{ 228*333d2b36SAndroid Build Coastguard Worker "stripCmd": "${config.ClangBin}/llvm-strip", 229*333d2b36SAndroid Build Coastguard Worker }, 230*333d2b36SAndroid Build Coastguard Worker }) 231*333d2b36SAndroid Build Coastguard Worker libbpf.objs = append(libbpf.objs, objStripped.WithoutRel()) 232*333d2b36SAndroid Build Coastguard Worker } 233*333d2b36SAndroid Build Coastguard Worker 234*333d2b36SAndroid Build Coastguard Worker installDir := android.PathForModuleInstall(ctx, "etc", "bpf") 235*333d2b36SAndroid Build Coastguard Worker if len(libbpf.properties.Relative_install_path) > 0 { 236*333d2b36SAndroid Build Coastguard Worker installDir = installDir.Join(ctx, libbpf.properties.Relative_install_path) 237*333d2b36SAndroid Build Coastguard Worker } 238*333d2b36SAndroid Build Coastguard Worker for _, obj := range libbpf.objs { 239*333d2b36SAndroid Build Coastguard Worker ctx.PackageFile(installDir, obj.Base(), obj) 240*333d2b36SAndroid Build Coastguard Worker } 241*333d2b36SAndroid Build Coastguard Worker 242*333d2b36SAndroid Build Coastguard Worker android.SetProvider(ctx, blueprint.SrcsFileProviderKey, blueprint.SrcsFileProviderData{SrcPaths: srcs.Strings()}) 243*333d2b36SAndroid Build Coastguard Worker 244*333d2b36SAndroid Build Coastguard Worker ctx.SetOutputFiles(libbpf.objs, "") 245*333d2b36SAndroid Build Coastguard Worker} 246*333d2b36SAndroid Build Coastguard Worker 247*333d2b36SAndroid Build Coastguard Workerfunc (libbpf *libbpfProg) AndroidMk() android.AndroidMkData { 248*333d2b36SAndroid Build Coastguard Worker return android.AndroidMkData{ 249*333d2b36SAndroid Build Coastguard Worker Custom: func(w io.Writer, name, prefix, moduleDir string, data android.AndroidMkData) { 250*333d2b36SAndroid Build Coastguard Worker var names []string 251*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w) 252*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "LOCAL_PATH :=", moduleDir) 253*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w) 254*333d2b36SAndroid Build Coastguard Worker var localModulePath string 255*333d2b36SAndroid Build Coastguard Worker localModulePath = "LOCAL_MODULE_PATH := $(TARGET_OUT_ETC)/bpf" 256*333d2b36SAndroid Build Coastguard Worker if len(libbpf.properties.Relative_install_path) > 0 { 257*333d2b36SAndroid Build Coastguard Worker localModulePath += "/" + libbpf.properties.Relative_install_path 258*333d2b36SAndroid Build Coastguard Worker } 259*333d2b36SAndroid Build Coastguard Worker for _, obj := range libbpf.objs { 260*333d2b36SAndroid Build Coastguard Worker objName := name + "_" + obj.Base() 261*333d2b36SAndroid Build Coastguard Worker names = append(names, objName) 262*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "include $(CLEAR_VARS)", " # libbpf.libbpf.obj") 263*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "LOCAL_MODULE := ", objName) 264*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "LOCAL_PREBUILT_MODULE_FILE :=", obj.String()) 265*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "LOCAL_MODULE_STEM :=", obj.Base()) 266*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "LOCAL_MODULE_CLASS := ETC") 267*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, localModulePath) 268*333d2b36SAndroid Build Coastguard Worker // AconfigUpdateAndroidMkData may have added elements to Extra. Process them here. 269*333d2b36SAndroid Build Coastguard Worker for _, extra := range data.Extra { 270*333d2b36SAndroid Build Coastguard Worker extra(w, nil) 271*333d2b36SAndroid Build Coastguard Worker } 272*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "include $(BUILD_PREBUILT)") 273*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w) 274*333d2b36SAndroid Build Coastguard Worker } 275*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "include $(CLEAR_VARS)", " # libbpf.libbpf") 276*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "LOCAL_MODULE := ", name) 277*333d2b36SAndroid Build Coastguard Worker android.AndroidMkEmitAssignList(w, "LOCAL_REQUIRED_MODULES", names) 278*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "include $(BUILD_PHONY_PACKAGE)") 279*333d2b36SAndroid Build Coastguard Worker }, 280*333d2b36SAndroid Build Coastguard Worker } 281*333d2b36SAndroid Build Coastguard Worker} 282*333d2b36SAndroid Build Coastguard Worker 283*333d2b36SAndroid Build Coastguard Workertype Defaults struct { 284*333d2b36SAndroid Build Coastguard Worker android.ModuleBase 285*333d2b36SAndroid Build Coastguard Worker android.DefaultsModuleBase 286*333d2b36SAndroid Build Coastguard Worker} 287*333d2b36SAndroid Build Coastguard Worker 288*333d2b36SAndroid Build Coastguard Workerfunc defaultsFactory() android.Module { 289*333d2b36SAndroid Build Coastguard Worker return DefaultsFactory() 290*333d2b36SAndroid Build Coastguard Worker} 291*333d2b36SAndroid Build Coastguard Worker 292*333d2b36SAndroid Build Coastguard Workerfunc DefaultsFactory(props ...interface{}) android.Module { 293*333d2b36SAndroid Build Coastguard Worker module := &Defaults{} 294*333d2b36SAndroid Build Coastguard Worker 295*333d2b36SAndroid Build Coastguard Worker module.AddProperties(props...) 296*333d2b36SAndroid Build Coastguard Worker module.AddProperties(&LibbpfProgProperties{}) 297*333d2b36SAndroid Build Coastguard Worker 298*333d2b36SAndroid Build Coastguard Worker android.InitDefaultsModule(module) 299*333d2b36SAndroid Build Coastguard Worker 300*333d2b36SAndroid Build Coastguard Worker return module 301*333d2b36SAndroid Build Coastguard Worker} 302*333d2b36SAndroid Build Coastguard Worker 303*333d2b36SAndroid Build Coastguard Workerfunc LibbpfProgFactory() android.Module { 304*333d2b36SAndroid Build Coastguard Worker module := &libbpfProg{} 305*333d2b36SAndroid Build Coastguard Worker 306*333d2b36SAndroid Build Coastguard Worker module.AddProperties(&module.properties) 307*333d2b36SAndroid Build Coastguard Worker android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibFirst) 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