Include bpf program in APEXes

bpf program is put to an APEX via 'bpfs' property. It is
placed under etc/bpf directory in it.

Fix: 167530625
Test: m

Original change: https://android-review.googlesource.com/c/platform/build/soong/+/1418308

Merged-In: Ia36b486f0cffb619ecc4f7a318cde881abc5baf4
Change-Id: I42631beea4e668d86ba437d3e2edb392137706f0
(cherry picked from commit 05e47c0c5d)
This commit is contained in:
markchien
2020-09-02 16:23:38 +08:00
committed by Mark Chien
parent 440d212be2
commit 80092e30a6
5 changed files with 44 additions and 3 deletions

View File

@@ -5,6 +5,7 @@ bootstrap_go_package {
"blueprint", "blueprint",
"soong", "soong",
"soong-android", "soong-android",
"soong-bpf",
"soong-cc", "soong-cc",
"soong-java", "soong-java",
"soong-python", "soong-python",

View File

@@ -28,6 +28,7 @@ import (
"github.com/google/blueprint/proptools" "github.com/google/blueprint/proptools"
"android/soong/android" "android/soong/android"
"android/soong/bpf"
"android/soong/cc" "android/soong/cc"
prebuilt_etc "android/soong/etc" prebuilt_etc "android/soong/etc"
"android/soong/java" "android/soong/java"
@@ -63,6 +64,7 @@ var (
certificateTag = dependencyTag{name: "certificate"} certificateTag = dependencyTag{name: "certificate"}
usesTag = dependencyTag{name: "uses"} usesTag = dependencyTag{name: "uses"}
androidAppTag = dependencyTag{name: "androidApp", payload: true} androidAppTag = dependencyTag{name: "androidApp", payload: true}
bpfTag = dependencyTag{name: "bpf", payload: true}
apexAvailBaseline = makeApexAvailableBaseline() apexAvailBaseline = makeApexAvailableBaseline()
@@ -1062,6 +1064,9 @@ type apexBundleProperties struct {
// List of tests that are embedded inside this APEX bundle // List of tests that are embedded inside this APEX bundle
Tests []string Tests []string
// List of BPF programs inside APEX
Bpfs []string
// Name of the apex_key module that provides the private key to sign APEX // Name of the apex_key module that provides the private key to sign APEX
Key *string Key *string
@@ -1552,6 +1557,9 @@ func (a *apexBundle) DepsMutator(ctx android.BottomUpMutatorContext) {
ctx.AddFarVariationDependencies(ctx.Config().AndroidCommonTarget.Variations(), ctx.AddFarVariationDependencies(ctx.Config().AndroidCommonTarget.Variations(),
javaLibTag, a.properties.Java_libs...) javaLibTag, a.properties.Java_libs...)
ctx.AddFarVariationDependencies(ctx.Config().AndroidCommonTarget.Variations(),
bpfTag, a.properties.Bpfs...)
// With EMMA_INSTRUMENT_FRAMEWORK=true the ART boot image includes jacoco library. // With EMMA_INSTRUMENT_FRAMEWORK=true the ART boot image includes jacoco library.
if a.artApex && ctx.Config().IsEnvTrue("EMMA_INSTRUMENT_FRAMEWORK") { if a.artApex && ctx.Config().IsEnvTrue("EMMA_INSTRUMENT_FRAMEWORK") {
ctx.AddFarVariationDependencies(ctx.Config().AndroidCommonTarget.Variations(), ctx.AddFarVariationDependencies(ctx.Config().AndroidCommonTarget.Variations(),
@@ -1813,6 +1821,11 @@ func apexFileForAndroidApp(ctx android.BaseModuleContext, aapp interface {
return af return af
} }
func apexFileForBpfProgram(ctx android.BaseModuleContext, builtFile android.Path, bpfProgram bpf.BpfModule) apexFile {
dirInApex := filepath.Join("etc", "bpf")
return newApexFile(ctx, builtFile, builtFile.Base(), dirInApex, etc, bpfProgram)
}
// Context "decorator", overriding the InstallBypassMake method to always reply `true`. // Context "decorator", overriding the InstallBypassMake method to always reply `true`.
type flattenedApexContext struct { type flattenedApexContext struct {
android.ModuleContext android.ModuleContext
@@ -2079,6 +2092,15 @@ func (a *apexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) {
} else { } else {
ctx.PropertyErrorf("apps", "%q is not an android_app module", depName) ctx.PropertyErrorf("apps", "%q is not an android_app module", depName)
} }
case bpfTag:
if bpfProgram, ok := child.(bpf.BpfModule); ok {
filesToCopy, _ := bpfProgram.OutputFiles("")
for _, bpfFile := range filesToCopy {
filesInfo = append(filesInfo, apexFileForBpfProgram(ctx, bpfFile, bpfProgram))
}
} else {
ctx.PropertyErrorf("bpfs", "%q is not a bpf module", depName)
}
case prebuiltTag: case prebuiltTag:
if prebuilt, ok := child.(prebuilt_etc.PrebuiltEtcModule); ok { if prebuilt, ok := child.(prebuilt_etc.PrebuiltEtcModule); ok {
filesInfo = append(filesInfo, apexFileForPrebuiltEtc(ctx, prebuilt, depName)) filesInfo = append(filesInfo, apexFileForPrebuiltEtc(ctx, prebuilt, depName))

View File

@@ -27,6 +27,7 @@ import (
"github.com/google/blueprint/proptools" "github.com/google/blueprint/proptools"
"android/soong/android" "android/soong/android"
"android/soong/bpf"
"android/soong/cc" "android/soong/cc"
"android/soong/dexpreopt" "android/soong/dexpreopt"
prebuilt_etc "android/soong/etc" prebuilt_etc "android/soong/etc"
@@ -232,6 +233,7 @@ func testApexContext(_ *testing.T, bp string, handlers ...testCustomizer) (*andr
java.RegisterAppBuildComponents(ctx) java.RegisterAppBuildComponents(ctx)
java.RegisterSdkLibraryBuildComponents(ctx) java.RegisterSdkLibraryBuildComponents(ctx)
ctx.RegisterSingletonType("apex_keys_text", apexKeysTextFactory) ctx.RegisterSingletonType("apex_keys_text", apexKeysTextFactory)
ctx.RegisterModuleType("bpf", bpf.BpfFactory)
ctx.PreDepsMutators(RegisterPreDepsMutators) ctx.PreDepsMutators(RegisterPreDepsMutators)
ctx.PostDepsMutators(RegisterPostDepsMutators) ctx.PostDepsMutators(RegisterPostDepsMutators)
@@ -556,6 +558,7 @@ func TestDefaults(t *testing.T) {
native_shared_libs: ["mylib"], native_shared_libs: ["mylib"],
java_libs: ["myjar"], java_libs: ["myjar"],
apps: ["AppFoo"], apps: ["AppFoo"],
bpfs: ["bpf"],
} }
prebuilt_etc { prebuilt_etc {
@@ -596,12 +599,20 @@ func TestDefaults(t *testing.T) {
system_modules: "none", system_modules: "none",
apex_available: [ "myapex" ], apex_available: [ "myapex" ],
} }
bpf {
name: "bpf",
srcs: ["bpf.c", "bpf2.c"],
}
`) `)
ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{ ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
"etc/myetc", "etc/myetc",
"javalib/myjar.jar", "javalib/myjar.jar",
"lib64/mylib.so", "lib64/mylib.so",
"app/AppFoo/AppFoo.apk", "app/AppFoo/AppFoo.apk",
"etc/bpf/bpf.o",
"etc/bpf/bpf2.o",
}) })
} }

View File

@@ -26,7 +26,7 @@ import (
) )
func init() { func init() {
android.RegisterModuleType("bpf", bpfFactory) android.RegisterModuleType("bpf", BpfFactory)
pctx.Import("android/soong/cc/config") pctx.Import("android/soong/cc/config")
} }
@@ -43,6 +43,13 @@ var (
"ccCmd", "cFlags") "ccCmd", "cFlags")
) )
// BpfModule interface is used by the apex package to gather information from a bpf module.
type BpfModule interface {
android.Module
OutputFiles(tag string) (android.Paths, error)
}
type BpfProperties struct { type BpfProperties struct {
Srcs []string `android:"path"` Srcs []string `android:"path"`
Cflags []string Cflags []string
@@ -137,7 +144,7 @@ func (bpf *bpf) OutputFiles(tag string) (android.Paths, error) {
var _ android.OutputFileProducer = (*bpf)(nil) var _ android.OutputFileProducer = (*bpf)(nil)
func bpfFactory() android.Module { func BpfFactory() android.Module {
module := &bpf{} module := &bpf{}
module.AddProperties(&module.properties) module.AddProperties(&module.properties)

View File

@@ -59,7 +59,7 @@ func testConfig(buildDir string, env map[string]string, bp string) android.Confi
func testContext(config android.Config) *android.TestContext { func testContext(config android.Config) *android.TestContext {
ctx := cc.CreateTestContext() ctx := cc.CreateTestContext()
ctx.RegisterModuleType("bpf", bpfFactory) ctx.RegisterModuleType("bpf", BpfFactory)
ctx.Register(config) ctx.Register(config)
return ctx return ctx