diff options
author | Jiyong Park <jiyong@google.com> | 2018-12-07 00:42:25 +0900 |
---|---|---|
committer | Jiyong Park <jiyong@google.com> | 2018-12-07 14:29:59 +0900 |
commit | 7c2ee713ec59e3592fd4af8a759d0fbcb7181dbd (patch) | |
tree | 132b602ecb0734e36428bf41b65961f8f9f66037 /apex | |
parent | 33b03f71054fd1bb91528cfb8afa4dcacaf550ed (diff) | |
download | build_soong-7c2ee713ec59e3592fd4af8a759d0fbcb7181dbd.tar.gz build_soong-7c2ee713ec59e3592fd4af8a759d0fbcb7181dbd.tar.bz2 build_soong-7c2ee713ec59e3592fd4af8a759d0fbcb7181dbd.zip |
Fix: a module with sub_dir can't be placed in APEX
This change fixes the bug that when a module is defined with sub_dir,
then build breaks when the module is included in an APEX.
This was happening because, for example when we have a prebuilt_etc
module having sub_dir set to "foo/bar", then only etc/foo/bar is added
to the canned_fs_config file and other intermediate directories (etc,
etc/foo) are not added. e2fsdroid however expects that every directories
to be listed.
Fixing the problem by adding parent directories when adding a directory
to canned_fs_config.
Bug: 120600179
Test: m (a new test case added to apex_test)
Change-Id: If712ff65761a7e1e3216371bb2eb7acf9cb5dc9e
Diffstat (limited to 'apex')
-rw-r--r-- | apex/apex.go | 10 | ||||
-rw-r--r-- | apex/apex_test.go | 32 |
2 files changed, 40 insertions, 2 deletions
diff --git a/apex/apex.go b/apex/apex.go index fdfcf862..5ce0e057 100644 --- a/apex/apex.go +++ b/apex/apex.go @@ -684,8 +684,14 @@ func (a *apexBundle) buildUnflattenedApex(ctx android.ModuleContext, keyFile and } else { readOnlyPaths = append(readOnlyPaths, pathInApex) } - if !android.InList(f.installDir, executablePaths) { - executablePaths = append(executablePaths, f.installDir) + dir := f.installDir + for !android.InList(dir, executablePaths) && dir != "" { + executablePaths = append(executablePaths, dir) + dir, _ = filepath.Split(dir) // move up to the parent + if len(dir) > 0 { + // remove trailing slash + dir = dir[:len(dir)-1] + } } } sort.Strings(readOnlyPaths) diff --git a/apex/apex_test.go b/apex/apex_test.go index b1788297..c7ef58ef 100644 --- a/apex/apex_test.go +++ b/apex/apex_test.go @@ -40,6 +40,7 @@ func testApex(t *testing.T, bp string) *android.TestContext { ctx.RegisterModuleType("cc_library_shared", android.ModuleFactoryAdaptor(cc.LibrarySharedFactory)) ctx.RegisterModuleType("cc_object", android.ModuleFactoryAdaptor(cc.ObjectFactory)) ctx.RegisterModuleType("toolchain_library", android.ModuleFactoryAdaptor(cc.ToolchainLibraryFactory)) + ctx.RegisterModuleType("prebuilt_etc", android.ModuleFactoryAdaptor(android.PrebuiltEtcFactory)) ctx.PreDepsMutators(func(ctx android.RegisterMutatorsContext) { ctx.BottomUp("link", cc.LinkageMutator).Parallel() ctx.BottomUp("version", cc.VersionMutator).Parallel() @@ -94,6 +95,7 @@ func testApex(t *testing.T, bp string) *android.TestContext { "apex_manifest.json": nil, "system/sepolicy/apex/myapex-file_contexts": nil, "mylib.cpp": nil, + "myprebuilt": nil, }) _, errs := ctx.ParseFileList(".", []string{"Android.bp"}) android.FailIfErrored(t, errs) @@ -415,3 +417,33 @@ func TestApexWithSystemLibsStubs(t *testing.T) { ensureContains(t, mylibCFlags, "__LIBDL_API__=27") ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27") } + +func TestFilesInSubDir(t *testing.T) { + ctx := testApex(t, ` + apex { + name: "myapex", + key: "myapex.key", + prebuilts: ["myetc"], + } + + apex_key { + name: "myapex.key", + public_key: "testkey.avbpubkey", + private_key: "testkey.pem", + } + + prebuilt_etc { + name: "myetc", + src: "myprebuilt", + sub_dir: "foo/bar", + } + `) + + generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("generateFsConfig") + dirs := strings.Split(generateFsRule.Args["exec_paths"], " ") + + // Ensure that etc, etc/foo, and etc/foo/bar are all listed + ensureListContains(t, dirs, "etc") + ensureListContains(t, dirs, "etc/foo") + ensureListContains(t, dirs, "etc/foo/bar") +} |