aboutsummaryrefslogtreecommitdiff
path: root/filesystem
diff options
context:
space:
mode:
authorInseob Kim <inseob@google.com>2021-02-09 21:18:31 +0900
committerInseob Kim <inseob@google.com>2021-02-17 14:05:12 +0900
commit14199b07f7403e021d439f3ff743e475d409810c (patch)
treea82428e586143f35691ed9531398c8db370e8642 /filesystem
parent2ce1b5dc3ab59d27ab85825d941d2e4c6bbeb654 (diff)
downloadsoong-14199b07f7403e021d439f3ff743e475d409810c.tar.gz
Add dirs and symlinks property to filesystem
Dirs and symlinks will be created under the root of the filesystem. Basic essential directories like "dev", "proc", "sys" and symlinks like "bin -> /system/bin", "init -> /system/bin/init" can be created with these properties. Bug: 179652970 Test: boot with aosp_cf_x86_64_only_phone, see adb works Change-Id: Ie06dc5a93635ea8b1e18be517ed8615b6c82fee6
Diffstat (limited to 'filesystem')
-rw-r--r--filesystem/filesystem.go40
1 files changed, 39 insertions, 1 deletions
diff --git a/filesystem/filesystem.go b/filesystem/filesystem.go
index 69496c998..3bccde9eb 100644
--- a/filesystem/filesystem.go
+++ b/filesystem/filesystem.go
@@ -16,6 +16,8 @@ package filesystem
import (
"fmt"
+ "path/filepath"
+ "strings"
"android/soong/android"
@@ -37,6 +39,11 @@ type filesystem struct {
installDir android.InstallPath
}
+type symlinkDefinition struct {
+ Target *string
+ Name *string
+}
+
type filesystemProperties struct {
// When set to true, sign the image with avbtool. Default is false.
Use_avb *bool
@@ -58,6 +65,12 @@ type filesystemProperties struct {
// Base directory relative to root, to which deps are installed, e.g. "system". Default is "."
// (root).
Base_dir *string
+
+ // Directories to be created under root. e.g. /dev, /proc, etc.
+ Dirs []string
+
+ // Symbolic links to be created under root with "ln -sf <target> <name>".
+ Symlinks []symlinkDefinition
}
// android_filesystem packages a set of modules and their transitive dependencies into a filesystem
@@ -135,7 +148,32 @@ func (f *filesystem) buildRootZip(ctx android.ModuleContext) android.OutputPath
builder.Command().Text("rm -rf").Text(rootDir.String())
builder.Command().Text("mkdir -p").Text(rootDir.String())
- // Currently root.zip is empty, and just a placeholder now. Dirs and symlinks will be added.
+ // create dirs and symlinks
+ for _, dir := range f.properties.Dirs {
+ // OutputPath.Join verifies dir
+ builder.Command().Text("mkdir -p").Text(rootDir.Join(ctx, dir).String())
+ }
+
+ for _, symlink := range f.properties.Symlinks {
+ name := strings.TrimSpace(proptools.String(symlink.Name))
+ target := strings.TrimSpace(proptools.String(symlink.Target))
+
+ if name == "" {
+ ctx.PropertyErrorf("symlinks", "Name can't be empty")
+ continue
+ }
+
+ if target == "" {
+ ctx.PropertyErrorf("symlinks", "Target can't be empty")
+ continue
+ }
+
+ // OutputPath.Join verifies name. don't need to verify target.
+ dst := rootDir.Join(ctx, name)
+
+ builder.Command().Text("mkdir -p").Text(filepath.Dir(dst.String()))
+ builder.Command().Text("ln -sf").Text(proptools.ShellEscape(target)).Text(dst.String())
+ }
zipOut := android.PathForModuleGen(ctx, "root.zip").OutputPath