From 6f0f688c4bcc599fb9c4fecd6ac74e1b828f5255 Mon Sep 17 00:00:00 2001 From: Jiyong Park Date: Thu, 12 Nov 2020 13:14:30 +0900 Subject: [PATCH] add android_filesystem android_filesystem is a module type that can be used to create filesystem images out of binaries built for Android. Its initial use will be for creating an Android-like OS image to run on virtual machines, but the use is not limited to it. The module type currently lacks a lot of features like the support for other filesystem types, and the ability to do something like signing the image using avbtool, etc. Those will be added in follow-up CLs as we have actual demands. Bug: 172414391 Test: m Change-Id: I4b779d4586e04d9a960688e73b711166708558ab --- filesystem/Android.bp | 15 ++++++++ filesystem/filesystem.go | 76 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+) create mode 100644 filesystem/Android.bp create mode 100644 filesystem/filesystem.go diff --git a/filesystem/Android.bp b/filesystem/Android.bp new file mode 100644 index 000000000..926df6e38 --- /dev/null +++ b/filesystem/Android.bp @@ -0,0 +1,15 @@ +bootstrap_go_package { + name: "soong-filesystem", + pkgPath: "android/soong/filesystem", + deps: [ + "blueprint", + "soong", + "soong-android", + ], + srcs: [ + "filesystem.go", + ], + testSrcs: [ + ], + pluginFor: ["soong_build"], +} diff --git a/filesystem/filesystem.go b/filesystem/filesystem.go new file mode 100644 index 000000000..a1605b449 --- /dev/null +++ b/filesystem/filesystem.go @@ -0,0 +1,76 @@ +// Copyright (C) 2020 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package filesystem + +import ( + "fmt" + + "android/soong/android" +) + +func init() { + android.RegisterModuleType("android_filesystem", filesystemFactory) +} + +type filesystem struct { + android.ModuleBase + android.PackagingBase +} + +func filesystemFactory() android.Module { + module := &filesystem{} + android.InitPackageModule(module) + android.InitAndroidMultiTargetsArchModule(module, android.DeviceSupported, android.MultilibCommon) + return module +} + +func (f *filesystem) DepsMutator(ctx android.BottomUpMutatorContext) { + f.AddDeps(ctx) +} + +var pctx = android.NewPackageContext("android/soong/filesystem") + +func (f *filesystem) GenerateAndroidBuildActions(ctx android.ModuleContext) { + zipFile := android.PathForModuleOut(ctx, "temp.zip").OutputPath + f.CopyDepsToZip(ctx, zipFile) + + rootDir := android.PathForModuleOut(ctx, "root").OutputPath + builder := android.NewRuleBuilder() + builder.Command(). + BuiltTool(ctx, "zipsync"). + FlagWithArg("-d ", rootDir.String()). // zipsync wipes this. No need to clear. + Input(zipFile) + + mkuserimg := ctx.Config().HostToolPath(ctx, "mkuserimg_mke2fs") + propFile := android.PathForModuleOut(ctx, "prop").OutputPath + // TODO(jiyong): support more filesystem types other than ext4 + propsText := fmt.Sprintf(`mount_point=system\n`+ + `fs_type=ext4\n`+ + `use_dynamic_partition_size=true\n`+ + `ext_mkuserimg=%s\n`, mkuserimg.String()) + builder.Command().Text("echo").Flag("-e").Flag(`"` + propsText + `"`). + Text(">").Output(propFile). + Implicit(mkuserimg) + + image := android.PathForModuleOut(ctx, "filesystem.img").OutputPath + builder.Command().BuiltTool(ctx, "build_image"). + Text(rootDir.String()). // input directory + Input(propFile). + Output(image). + Text(rootDir.String()) // directory where to find fs_config_files|dirs + + // rootDir is not deleted. Might be useful for quick inspection. + builder.Build(pctx, ctx, "build_filesystem_image", fmt.Sprintf("Creating filesystem %s", f.BaseModuleName())) +}