xref: /aosp_15_r20/build/soong/bpf/libbpf/libbpf_prog.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
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