bpf: support installing to vendor

Bug: 140330870
Test: use bpf{} to install bpf program to vendor and have it
  successfully loaded and installed by Android's bpfloader.

Change-Id: If0aac3098e39498f0238516ec839b6ac910cc61e
This commit is contained in:
Steven Moreland 2019-12-12 14:23:42 -08:00
parent 3e7f5c411d
commit 606c5e9e99

View file

@ -20,7 +20,6 @@ import (
"strings" "strings"
"android/soong/android" "android/soong/android"
_ "android/soong/cc/config"
"github.com/google/blueprint" "github.com/google/blueprint"
"github.com/google/blueprint/proptools" "github.com/google/blueprint/proptools"
@ -74,7 +73,10 @@ type BpfProperties struct {
Include_dirs []string Include_dirs []string
Sub_dir string Sub_dir string
// If set to true, generate BTF debug info for maps & programs // If set to true, generate BTF debug info for maps & programs
Btf *bool Btf *bool
Vendor *bool
VendorInternal bool `blueprint:"mutated"`
} }
type bpf struct { type bpf struct {
@ -85,6 +87,41 @@ type bpf struct {
objs android.Paths objs android.Paths
} }
var _ android.ImageInterface = (*bpf)(nil)
func (bpf *bpf) ImageMutatorBegin(ctx android.BaseModuleContext) {}
func (bpf *bpf) CoreVariantNeeded(ctx android.BaseModuleContext) bool {
return !proptools.Bool(bpf.properties.Vendor)
}
func (bpf *bpf) RamdiskVariantNeeded(ctx android.BaseModuleContext) bool {
return false
}
func (bpf *bpf) VendorRamdiskVariantNeeded(ctx android.BaseModuleContext) bool {
return false
}
func (bpf *bpf) DebugRamdiskVariantNeeded(ctx android.BaseModuleContext) bool {
return false
}
func (bpf *bpf) RecoveryVariantNeeded(ctx android.BaseModuleContext) bool {
return false
}
func (bpf *bpf) ExtraImageVariations(ctx android.BaseModuleContext) []string {
if proptools.Bool(bpf.properties.Vendor) {
return []string{"vendor"}
}
return nil
}
func (bpf *bpf) SetImageVariation(ctx android.BaseModuleContext, variation string, module android.Module) {
bpf.properties.VendorInternal = variation == "vendor"
}
func (bpf *bpf) GenerateAndroidBuildActions(ctx android.ModuleContext) { func (bpf *bpf) GenerateAndroidBuildActions(ctx android.ModuleContext) {
cflags := []string{ cflags := []string{
"-nostdlibinc", "-nostdlibinc",
@ -132,8 +169,8 @@ func (bpf *bpf) GenerateAndroidBuildActions(ctx android.ModuleContext) {
if proptools.Bool(bpf.properties.Btf) { if proptools.Bool(bpf.properties.Btf) {
objStripped := android.ObjPathWithExt(ctx, "", src, "o") objStripped := android.ObjPathWithExt(ctx, "", src, "o")
ctx.Build(pctx, android.BuildParams{ ctx.Build(pctx, android.BuildParams{
Rule: stripRule, Rule: stripRule,
Input: obj, Input: obj,
Output: objStripped, Output: objStripped,
Args: map[string]string{ Args: map[string]string{
"stripCmd": "${config.ClangBin}/llvm-strip", "stripCmd": "${config.ClangBin}/llvm-strip",
@ -154,7 +191,12 @@ func (bpf *bpf) AndroidMk() android.AndroidMkData {
fmt.Fprintln(w) fmt.Fprintln(w)
fmt.Fprintln(w, "LOCAL_PATH :=", moduleDir) fmt.Fprintln(w, "LOCAL_PATH :=", moduleDir)
fmt.Fprintln(w) fmt.Fprintln(w)
localModulePath := "LOCAL_MODULE_PATH := $(TARGET_OUT_ETC)/bpf" var localModulePath string
if bpf.properties.VendorInternal {
localModulePath = "LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR_ETC)/bpf"
} else {
localModulePath = "LOCAL_MODULE_PATH := $(TARGET_OUT_ETC)/bpf"
}
if len(bpf.properties.Sub_dir) > 0 { if len(bpf.properties.Sub_dir) > 0 {
localModulePath += "/" + bpf.properties.Sub_dir localModulePath += "/" + bpf.properties.Sub_dir
} }