Merge changes Ieb4ffa10,I9458cbc4

* changes:
  soong_ui: Do not clean the OutDir path multiple times.
  soong_ui: Construct the proper MODULES-IN-<dir name> for m* build commands.
This commit is contained in:
Treehugger Robot 2019-07-17 20:53:38 +00:00 committed by Gerrit Code Review
commit ed1f4def5c
2 changed files with 86 additions and 20 deletions

View File

@ -307,12 +307,10 @@ func getConfigArgs(action BuildAction, dir string, buildDependencies bool, ctx C
if topDir == dir {
break
}
// Find the build file from the directory where the build action was triggered by traversing up
// the source tree. If a blank build filename is returned, simply use the directory where the build
// action was invoked.
buildFile := findBuildFile(ctx, relDir)
if buildFile == "" {
buildFile = filepath.Join(relDir, "Android.mk")
ctx.Fatalf("Build file not found for %s directory", relDir)
}
buildFiles = []string{buildFile}
targets = []string{convertToTarget(filepath.Dir(buildFile), targetNamePrefix)}
@ -360,19 +358,43 @@ func hasBuildFile(ctx Context, dir string) bool {
return false
}
// findBuildFile finds a build file (makefile or blueprint file) by looking at dir first. If not
// found, go up one level and repeat again until one is found and the path of that build file
// relative to the root directory of the source tree is returned. The returned filename of build
// file is "Android.mk". If one was not found, a blank string is returned.
// findBuildFile finds a build file (makefile or blueprint file) by looking if there is a build file
// in the current and any sub directory of dir. If a build file is not found, traverse the path
// up by one directory and repeat again until either a build file is found or reached to the root
// source tree. The returned filename of build file is "Android.mk". If one was not found, a blank
// string is returned.
func findBuildFile(ctx Context, dir string) string {
// If the string is empty, assume it is top directory of the source tree.
if dir == "" {
// If the string is empty or ".", assume it is top directory of the source tree.
if dir == "" || dir == "." {
return ""
}
for ; dir != "."; dir = filepath.Dir(dir) {
if hasBuildFile(ctx, dir) {
return filepath.Join(dir, "Android.mk")
found := false
for buildDir := dir; buildDir != "."; buildDir = filepath.Dir(buildDir) {
err := filepath.Walk(buildDir, func(path string, info os.FileInfo, err error) error {
if err != nil {
return err
}
if found {
return filepath.SkipDir
}
if info.IsDir() {
return nil
}
for _, buildFile := range buildFiles {
if info.Name() == buildFile {
found = true
return filepath.SkipDir
}
}
return nil
})
if err != nil {
ctx.Fatalf("Error finding Android build file: %v", err)
}
if found {
return filepath.Join(buildDir, "Android.mk")
}
}
@ -616,7 +638,7 @@ func (c *configImpl) Arguments() []string {
func (c *configImpl) OutDir() string {
if outDir, ok := c.environ.Get("OUT_DIR"); ok {
return filepath.Clean(outDir)
return outDir
}
return "out"
}

View File

@ -545,8 +545,11 @@ func TestConfigFindBuildFile(t *testing.T) {
// Array of build files to create in dir.
buildFiles []string
// Directories that exist in the source tree.
dirsInTrees []string
// ********* Action *********
// Directory to create, also the base directory is where findBuildFile is invoked.
// The base directory is where findBuildFile is invoked.
dir string
// ********* Validation *********
@ -555,38 +558,63 @@ func TestConfigFindBuildFile(t *testing.T) {
}{{
description: "build file exists at leaf directory",
buildFiles: []string{"1/2/3/Android.bp"},
dirsInTrees: []string{"1/2/3"},
dir: "1/2/3",
expectedBuildFile: "1/2/3/Android.mk",
}, {
description: "build file exists in all directory paths",
buildFiles: []string{"1/Android.mk", "1/2/Android.mk", "1/2/3/Android.mk"},
dirsInTrees: []string{"1/2/3"},
dir: "1/2/3",
expectedBuildFile: "1/2/3/Android.mk",
}, {
description: "build file does not exist in all directory paths",
buildFiles: []string{},
dirsInTrees: []string{"1/2/3"},
dir: "1/2/3",
expectedBuildFile: "",
}, {
description: "build file exists only at top directory",
buildFiles: []string{"Android.bp"},
dirsInTrees: []string{"1/2/3"},
dir: "1/2/3",
expectedBuildFile: "",
}, {
description: "build file exist in a subdirectory",
buildFiles: []string{"1/2/Android.bp"},
dirsInTrees: []string{"1/2/3"},
dir: "1/2/3",
expectedBuildFile: "1/2/Android.mk",
}, {
description: "build file exists in a subdirectory",
buildFiles: []string{"1/Android.mk"},
dirsInTrees: []string{"1/2/3"},
dir: "1/2/3",
expectedBuildFile: "1/Android.mk",
}, {
description: "top directory",
buildFiles: []string{"Android.bp"},
dirsInTrees: []string{},
dir: ".",
expectedBuildFile: "",
}, {
description: "build file exists in subdirectory",
buildFiles: []string{"1/2/3/Android.bp", "1/2/4/Android.bp"},
dirsInTrees: []string{"1/2/3", "1/2/4"},
dir: "1/2",
expectedBuildFile: "1/2/Android.mk",
}, {
description: "build file exists in parent subdirectory",
buildFiles: []string{"1/5/Android.bp"},
dirsInTrees: []string{"1/2/3", "1/2/4", "1/5"},
dir: "1/2",
expectedBuildFile: "1/Android.mk",
}, {
description: "build file exists in deep parent's subdirectory.",
buildFiles: []string{"1/5/6/Android.bp"},
dirsInTrees: []string{"1/2/3", "1/2/4", "1/5/6", "1/5/7"},
dir: "1/2",
expectedBuildFile: "1/Android.mk",
}}
for _, tt := range tests {
@ -601,10 +629,7 @@ func TestConfigFindBuildFile(t *testing.T) {
}
defer os.RemoveAll(topDir)
if tt.dir != "" {
createDirectories(t, topDir, []string{tt.dir})
}
createDirectories(t, topDir, tt.dirsInTrees)
createBuildFiles(t, topDir, tt.buildFiles)
curDir, err := os.Getwd()
@ -709,11 +734,23 @@ type buildActionTestCase struct {
// Expected environment variables to be set.
expectedEnvVars []envVar
// Expecting error from running test case.
expectedErrStr string
}
func testGetConfigArgs(t *testing.T, tt buildActionTestCase, action BuildAction, buildDependencies bool) {
ctx := testContext()
defer logger.Recover(func(err error) {
if tt.expectedErrStr == "" {
t.Fatalf("Got unexpected error: %v", err)
}
if tt.expectedErrStr != err.Error() {
t.Errorf("expected %s, got %s", tt.expectedErrStr, err.Error())
}
})
// Environment variables to set it to blank on every test case run.
resetEnvVars := []string{
"ONE_SHOT_MAKEFILE",
@ -780,6 +817,11 @@ func testGetConfigArgs(t *testing.T, tt buildActionTestCase, action BuildAction,
t.Errorf("expecting %s, got %s for environment variable %s", env.value, val, env.name)
}
}
// If the execution reached here and there was an expected error code, the unit test case failed.
if tt.expectedErrStr != "" {
t.Errorf("expecting error %s", tt.expectedErrStr)
}
}
func TestGetConfigArgsBuildModules(t *testing.T) {
@ -875,6 +917,7 @@ func TestGetConfigArgsBuildModulesInDirecotoryNoDeps(t *testing.T) {
envVar{
name: "ONE_SHOT_MAKEFILE",
value: "0/1/2/Android.mk"}},
expectedErrStr: "Build file not found for 0/1/2 directory",
}, {
description: "build action executed at root directory",
dirsInTrees: []string{},
@ -978,7 +1021,7 @@ func TestGetConfigArgsBuildModulesInDirectory(t *testing.T) {
expectedArgs: []string{},
expectedEnvVars: []envVar{},
}, {
description: "build file not found - no error is expected to return",
description: "build file not found",
dirsInTrees: []string{"0/1/2"},
buildFiles: []string{},
args: []string{},
@ -986,6 +1029,7 @@ func TestGetConfigArgsBuildModulesInDirectory(t *testing.T) {
tidyOnly: "",
expectedArgs: []string{"MODULES-IN-0-1-2"},
expectedEnvVars: []envVar{},
expectedErrStr: "Build file not found for 0/1/2 directory",
}, {
description: "GET-INSTALL-PATH specified,",
dirsInTrees: []string{"0/1/2"},