github.com/westcoastroms/westcoastroms-build@v0.0.0-20190928114312-2350e5a73030/build/soong/bpf/bpf.go (about) 1 // Copyright (C) 2018 The Android Open Source Project 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package bpf 16 17 import ( 18 "fmt" 19 "io" 20 "strings" 21 22 "android/soong/android" 23 _ "android/soong/cc/config" 24 25 "github.com/google/blueprint" 26 ) 27 28 func init() { 29 android.RegisterModuleType("bpf", bpfFactory) 30 pctx.Import("android/soong/cc/config") 31 } 32 33 var ( 34 pctx = android.NewPackageContext("android/soong/bpf") 35 36 cc = pctx.AndroidGomaStaticRule("cc", 37 blueprint.RuleParams{ 38 Depfile: "${out}.d", 39 Deps: blueprint.DepsGCC, 40 Command: "$ccCmd --target=bpf -c $cFlags -MD -MF ${out}.d -o $out $in", 41 CommandDeps: []string{"$ccCmd"}, 42 }, 43 "ccCmd", "cFlags") 44 ) 45 46 type BpfProperties struct { 47 Srcs []string 48 Cflags []string 49 Include_dirs []string 50 } 51 52 type bpf struct { 53 android.ModuleBase 54 55 properties BpfProperties 56 57 objs android.Paths 58 } 59 60 func (bpf *bpf) GenerateAndroidBuildActions(ctx android.ModuleContext) { 61 cflags := []string{ 62 "-nostdlibinc", 63 "-O2", 64 "-isystem bionic/libc/include", 65 "-isystem bionic/libc/kernel/uapi", 66 // The architecture doesn't matter here, but asm/types.h is included by linux/types.h. 67 "-isystem bionic/libc/kernel/uapi/asm-arm64", 68 "-isystem bionic/libc/kernel/android/uapi", 69 "-I " + ctx.ModuleDir(), 70 } 71 72 for _, dir := range android.PathsForSource(ctx, bpf.properties.Include_dirs) { 73 cflags = append(cflags, "-I "+dir.String()) 74 } 75 76 cflags = append(cflags, bpf.properties.Cflags...) 77 78 srcs := ctx.ExpandSources(bpf.properties.Srcs, nil) 79 80 for _, src := range srcs { 81 obj := android.ObjPathWithExt(ctx, "", src, "o") 82 83 ctx.Build(pctx, android.BuildParams{ 84 Rule: cc, 85 Input: src, 86 Output: obj, 87 Args: map[string]string{ 88 "cFlags": strings.Join(cflags, " "), 89 "ccCmd": "${config.ClangBin}/clang", 90 }, 91 }) 92 93 bpf.objs = append(bpf.objs, obj) 94 } 95 } 96 97 func (bpf *bpf) DepsMutator(ctx android.BottomUpMutatorContext) { 98 android.ExtractSourcesDeps(ctx, bpf.properties.Srcs) 99 } 100 101 func (bpf *bpf) AndroidMk() android.AndroidMkData { 102 return android.AndroidMkData{ 103 Custom: func(w io.Writer, name, prefix, moduleDir string, data android.AndroidMkData) { 104 var names []string 105 fmt.Fprintln(w) 106 fmt.Fprintln(w, "LOCAL_PATH :=", moduleDir) 107 fmt.Fprintln(w) 108 for _, obj := range bpf.objs { 109 objName := name + "_" + obj.Base() 110 names = append(names, objName) 111 fmt.Fprintln(w, "include $(CLEAR_VARS)") 112 fmt.Fprintln(w, "LOCAL_MODULE := ", objName) 113 fmt.Fprintln(w, "LOCAL_PREBUILT_MODULE_FILE :=", obj.String()) 114 fmt.Fprintln(w, "LOCAL_MODULE_STEM :=", obj.Base()) 115 fmt.Fprintln(w, "LOCAL_MODULE_CLASS := ETC") 116 fmt.Fprintln(w, "LOCAL_MODULE_PATH := $(TARGET_OUT_ETC)/bpf") 117 fmt.Fprintln(w, "include $(BUILD_PREBUILT)") 118 fmt.Fprintln(w) 119 } 120 fmt.Fprintln(w, "include $(CLEAR_VARS)") 121 fmt.Fprintln(w, "LOCAL_MODULE := ", name) 122 fmt.Fprintln(w, "LOCAL_REQUIRED_MODULES :=", strings.Join(names, " ")) 123 fmt.Fprintln(w, "include $(BUILD_PHONY_PACKAGE)") 124 }, 125 } 126 } 127 128 func bpfFactory() android.Module { 129 module := &bpf{} 130 131 module.AddProperties(&module.properties) 132 133 android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibCommon) 134 return module 135 }