Merge "Remove support for ONE_SHOT_MAKEFILE" am: d778b93168 am: 57d5786d59 am: cf7003d934

am: b56717da3b

Change-Id: Iea3f7fddd401d241f9b57f8694e196c9dff5263a
This commit is contained in:
Dan Willemsen 2019-08-01 15:07:00 -07:00 committed by android-build-merger
commit 40cd519ef5
4 changed files with 197 additions and 424 deletions

View file

@ -350,42 +350,36 @@ func buildActionConfig(ctx build.Context, args ...string) build.Config {
}
buildActionFlags := []struct {
name string
description string
action build.BuildAction
buildDependencies bool
set bool
name string
description string
action build.BuildAction
set bool
}{{
name: "all-modules",
description: "Build action: build from the top of the source tree.",
action: build.BUILD_MODULES,
buildDependencies: true,
name: "all-modules",
description: "Build action: build from the top of the source tree.",
action: build.BUILD_MODULES,
}, {
// buildDependencies is set to true as mm is being deprecated. This is redirecting to mma build
// command behaviour. Once it has soaked for a while, the build command is deleted from here once
// it has been removed from the envsetup.sh.
name: "modules-in-a-dir-no-deps",
description: "Build action: builds all of the modules in the current directory without their dependencies.",
action: build.BUILD_MODULES_IN_A_DIRECTORY,
buildDependencies: true,
// This is redirecting to mma build command behaviour. Once it has soaked for a
// while, the build command is deleted from here once it has been removed from the
// envsetup.sh.
name: "modules-in-a-dir-no-deps",
description: "Build action: builds all of the modules in the current directory without their dependencies.",
action: build.BUILD_MODULES_IN_A_DIRECTORY,
}, {
// buildDependencies is set to true as mmm is being deprecated. This is redirecting to mmma build
// command behaviour. Once it has soaked for a while, the build command is deleted from here once
// it has been removed from the envsetup.sh.
name: "modules-in-dirs-no-deps",
description: "Build action: builds all of the modules in the supplied directories without their dependencies.",
action: build.BUILD_MODULES_IN_DIRECTORIES,
buildDependencies: true,
// This is redirecting to mmma build command behaviour. Once it has soaked for a
// while, the build command is deleted from here once it has been removed from the
// envsetup.sh.
name: "modules-in-dirs-no-deps",
description: "Build action: builds all of the modules in the supplied directories without their dependencies.",
action: build.BUILD_MODULES_IN_DIRECTORIES,
}, {
name: "modules-in-a-dir",
description: "Build action: builds all of the modules in the current directory and their dependencies.",
action: build.BUILD_MODULES_IN_A_DIRECTORY,
buildDependencies: true,
name: "modules-in-a-dir",
description: "Build action: builds all of the modules in the current directory and their dependencies.",
action: build.BUILD_MODULES_IN_A_DIRECTORY,
}, {
name: "modules-in-dirs",
description: "Build action: builds all of the modules in the supplied directories and their dependencies.",
action: build.BUILD_MODULES_IN_DIRECTORIES,
buildDependencies: true,
name: "modules-in-dirs",
description: "Build action: builds all of the modules in the supplied directories and their dependencies.",
action: build.BUILD_MODULES_IN_DIRECTORIES,
}}
for i, flag := range buildActionFlags {
flags.BoolVar(&buildActionFlags[i].set, flag.name, false, flag.description)
@ -405,12 +399,10 @@ func buildActionConfig(ctx build.Context, args ...string) build.Config {
// is specified.
buildActionCount := 0
var buildAction build.BuildAction
buildDependency := false
for _, flag := range buildActionFlags {
if flag.set {
buildActionCount++
buildAction = flag.action
buildDependency = flag.buildDependencies
}
}
if buildActionCount != 1 {
@ -422,7 +414,7 @@ func buildActionConfig(ctx build.Context, args ...string) build.Config {
// Remove the build action flags from the args as they are not recognized by the config.
args = args[numBuildActionFlags:]
return build.NewBuildActionConfig(buildAction, *dir, buildDependency, ctx, args...)
return build.NewBuildActionConfig(buildAction, *dir, ctx, args...)
}
func make(ctx build.Context, config build.Config, _ []string, logsDir string) {
@ -444,17 +436,13 @@ func make(ctx build.Context, config build.Config, _ []string, logsDir string) {
if _, ok := config.Environment().Get("ONE_SHOT_MAKEFILE"); ok {
writer := ctx.Writer
fmt.Fprintln(writer, "! The variable `ONE_SHOT_MAKEFILE` is deprecated, and will be removed shortly.")
fmt.Fprintln(writer, "! The variable `ONE_SHOT_MAKEFILE` is obsolete.")
fmt.Fprintln(writer, "!")
fmt.Fprintln(writer, "! If you're using `mm`, you'll need to run `source build/envsetup.sh` to update.")
fmt.Fprintln(writer, "!")
fmt.Fprintln(writer, "! Otherwise, either specify a module name with m, or use mma / MODULES-IN-...")
fmt.Fprintln(writer, "")
select {
case <-time.After(30 * time.Second):
case <-ctx.Done():
return
}
ctx.Fatal("done")
}
toBuild := build.BuildAll

View file

@ -253,13 +253,13 @@ func NewConfig(ctx Context, args ...string) Config {
// NewBuildActionConfig returns a build configuration based on the build action. The arguments are
// processed based on the build action and extracts any arguments that belongs to the build action.
func NewBuildActionConfig(action BuildAction, dir string, buildDependencies bool, ctx Context, args ...string) Config {
return NewConfig(ctx, getConfigArgs(action, dir, buildDependencies, ctx, args)...)
func NewBuildActionConfig(action BuildAction, dir string, ctx Context, args ...string) Config {
return NewConfig(ctx, getConfigArgs(action, dir, ctx, args)...)
}
// getConfigArgs processes the command arguments based on the build action and creates a set of new
// arguments to be accepted by Config.
func getConfigArgs(action BuildAction, dir string, buildDependencies bool, ctx Context, args []string) []string {
func getConfigArgs(action BuildAction, dir string, ctx Context, args []string) []string {
// The next block of code verifies that the current directory is the root directory of the source
// tree. It then finds the relative path of dir based on the root directory of the source tree
// and verify that dir is inside of the source tree.
@ -295,7 +295,6 @@ func getConfigArgs(action BuildAction, dir string, buildDependencies bool, ctx C
configArgs = removeFromList("GET-INSTALL-PATH", configArgs)
}
var buildFiles []string
var targets []string
switch action {
@ -312,20 +311,11 @@ func getConfigArgs(action BuildAction, dir string, buildDependencies bool, ctx C
if buildFile == "" {
ctx.Fatalf("Build file not found for %s directory", relDir)
}
buildFiles = []string{buildFile}
targets = []string{convertToTarget(filepath.Dir(buildFile), targetNamePrefix)}
case BUILD_MODULES_IN_DIRECTORIES:
newConfigArgs, dirs := splitArgs(configArgs)
configArgs = newConfigArgs
targets, buildFiles = getTargetsFromDirs(ctx, relDir, dirs, targetNamePrefix)
}
// This is to support building modules without building their dependencies. Soon, this will be
// deprecated.
if !buildDependencies && len(buildFiles) > 0 {
if err := os.Setenv("ONE_SHOT_MAKEFILE", strings.Join(buildFiles, " ")); err != nil {
ctx.Fatalf("Unable to set ONE_SHOT_MAKEFILE environment variable: %v", err)
}
targets = getTargetsFromDirs(ctx, relDir, dirs, targetNamePrefix)
}
// Tidy only override all other specified targets.
@ -435,7 +425,7 @@ func splitArgs(args []string) (newArgs []string, dirs []string) {
// directory from the dirs list does not exist, a fatal error is raised. relDir is related to the
// source root tree where the build action command was invoked. Each directory is validated if the
// build file can be found and follows the format "dir1:target1,target2,...". Target is optional.
func getTargetsFromDirs(ctx Context, relDir string, dirs []string, targetNamePrefix string) (targets []string, buildFiles []string) {
func getTargetsFromDirs(ctx Context, relDir string, dirs []string, targetNamePrefix string) (targets []string) {
for _, dir := range dirs {
// The directory may have specified specific modules to build. ":" is the separator to separate
// the directory and the list of modules.
@ -466,20 +456,18 @@ func getTargetsFromDirs(ctx Context, relDir string, dirs []string, targetNamePre
if !hasBuildFile(ctx, dir) {
ctx.Fatalf("Couldn't locate a build file from %s directory", dir)
}
buildFiles = append(buildFiles, filepath.Join(dir, "Android.mk"))
} else {
buildFile := findBuildFile(ctx, dir)
if buildFile == "" {
ctx.Fatalf("Build file not found for %s directory", dir)
}
newTargets = []string{convertToTarget(filepath.Dir(buildFile), targetNamePrefix)}
buildFiles = append(buildFiles, buildFile)
}
targets = append(targets, newTargets...)
}
return targets, buildFiles
return targets
}
func (c *configImpl) parseArgs(ctx Context, args []string) {

View file

@ -363,19 +363,15 @@ func TestConfigGetTargets(t *testing.T) {
// Expected targets from the function.
expectedTargets []string
// Expected build from the build system.
expectedBuildFiles []string
// Expecting error from running test case.
errStr string
}{{
description: "one target dir specified",
dirsInTrees: []string{"0/1/2/3"},
buildFiles: []string{"0/1/2/3/Android.bp"},
dirs: []string{"1/2/3"},
curDir: "0",
expectedTargets: []string{"MODULES-IN-0-1-2-3"},
expectedBuildFiles: []string{"0/1/2/3/Android.mk"},
description: "one target dir specified",
dirsInTrees: []string{"0/1/2/3"},
buildFiles: []string{"0/1/2/3/Android.bp"},
dirs: []string{"1/2/3"},
curDir: "0",
expectedTargets: []string{"MODULES-IN-0-1-2-3"},
}, {
description: "one target dir specified, build file does not exist",
dirsInTrees: []string{"0/1/2/3"},
@ -391,21 +387,19 @@ func TestConfigGetTargets(t *testing.T) {
curDir: "0",
errStr: "1/2/3:t1:t2 not in proper directory:target1,target2,... format (\":\" was specified more than once)",
}, {
description: "one target dir specified, no targets specified but has colon",
dirsInTrees: []string{"0/1/2/3"},
buildFiles: []string{"0/1/2/3/Android.bp"},
dirs: []string{"1/2/3:"},
curDir: "0",
expectedTargets: []string{"MODULES-IN-0-1-2-3"},
expectedBuildFiles: []string{"0/1/2/3/Android.mk"},
description: "one target dir specified, no targets specified but has colon",
dirsInTrees: []string{"0/1/2/3"},
buildFiles: []string{"0/1/2/3/Android.bp"},
dirs: []string{"1/2/3:"},
curDir: "0",
expectedTargets: []string{"MODULES-IN-0-1-2-3"},
}, {
description: "one target dir specified, two targets specified",
dirsInTrees: []string{"0/1/2/3"},
buildFiles: []string{"0/1/2/3/Android.bp"},
dirs: []string{"1/2/3:t1,t2"},
curDir: "0",
expectedTargets: []string{"t1", "t2"},
expectedBuildFiles: []string{"0/1/2/3/Android.mk"},
description: "one target dir specified, two targets specified",
dirsInTrees: []string{"0/1/2/3"},
buildFiles: []string{"0/1/2/3/Android.bp"},
dirs: []string{"1/2/3:t1,t2"},
curDir: "0",
expectedTargets: []string{"t1", "t2"},
}, {
description: "one target dir specified, no targets and has a comma",
dirsInTrees: []string{"0/1/2/3"},
@ -428,13 +422,12 @@ func TestConfigGetTargets(t *testing.T) {
curDir: "0",
errStr: "0/1/2/3 not in proper directory:target1,target2,... format",
}, {
description: "one target dir specified, many targets specified",
dirsInTrees: []string{"0/1/2/3"},
buildFiles: []string{"0/1/2/3/Android.bp"},
dirs: []string{"1/2/3:t1,t2,t3,t4,t5,t6,t7,t8,t9,t10"},
curDir: "0",
expectedTargets: []string{"t1", "t2", "t3", "t4", "t5", "t6", "t7", "t8", "t9", "t10"},
expectedBuildFiles: []string{"0/1/2/3/Android.mk"},
description: "one target dir specified, many targets specified",
dirsInTrees: []string{"0/1/2/3"},
buildFiles: []string{"0/1/2/3/Android.bp"},
dirs: []string{"1/2/3:t1,t2,t3,t4,t5,t6,t7,t8,t9,t10"},
curDir: "0",
expectedTargets: []string{"t1", "t2", "t3", "t4", "t5", "t6", "t7", "t8", "t9", "t10"},
}, {
description: "one target dir specified, one target specified, build file does not exist",
dirsInTrees: []string{"0/1/2/3"},
@ -450,29 +443,26 @@ func TestConfigGetTargets(t *testing.T) {
curDir: "0",
errStr: "Couldn't locate a build file from 0/1/2/3 directory",
}, {
description: "one target dir specified, build file not in target dir",
dirsInTrees: []string{"0/1/2/3"},
buildFiles: []string{"0/1/2/Android.mk"},
dirs: []string{"1/2/3"},
curDir: "0",
expectedTargets: []string{"MODULES-IN-0-1-2"},
expectedBuildFiles: []string{"0/1/2/Android.mk"},
description: "one target dir specified, build file not in target dir",
dirsInTrees: []string{"0/1/2/3"},
buildFiles: []string{"0/1/2/Android.mk"},
dirs: []string{"1/2/3"},
curDir: "0",
expectedTargets: []string{"MODULES-IN-0-1-2"},
}, {
description: "multiple targets dir specified, targets specified",
dirsInTrees: []string{"0/1/2/3", "0/3/4"},
buildFiles: []string{"0/1/2/3/Android.bp", "0/3/4/Android.mk"},
dirs: []string{"1/2/3:t1,t2", "3/4:t3,t4,t5"},
curDir: "0",
expectedTargets: []string{"t1", "t2", "t3", "t4", "t5"},
expectedBuildFiles: []string{"0/1/2/3/Android.mk", "0/3/4/Android.mk"},
description: "multiple targets dir specified, targets specified",
dirsInTrees: []string{"0/1/2/3", "0/3/4"},
buildFiles: []string{"0/1/2/3/Android.bp", "0/3/4/Android.mk"},
dirs: []string{"1/2/3:t1,t2", "3/4:t3,t4,t5"},
curDir: "0",
expectedTargets: []string{"t1", "t2", "t3", "t4", "t5"},
}, {
description: "multiple targets dir specified, one directory has targets specified",
dirsInTrees: []string{"0/1/2/3", "0/3/4"},
buildFiles: []string{"0/1/2/3/Android.bp", "0/3/4/Android.mk"},
dirs: []string{"1/2/3:t1,t2", "3/4"},
curDir: "0",
expectedTargets: []string{"t1", "t2", "MODULES-IN-0-3-4"},
expectedBuildFiles: []string{"0/1/2/3/Android.mk", "0/3/4/Android.mk"},
description: "multiple targets dir specified, one directory has targets specified",
dirsInTrees: []string{"0/1/2/3", "0/3/4"},
buildFiles: []string{"0/1/2/3/Android.bp", "0/3/4/Android.mk"},
dirs: []string{"1/2/3:t1,t2", "3/4"},
curDir: "0",
expectedTargets: []string{"t1", "t2", "MODULES-IN-0-3-4"},
}, {
description: "two dirs specified, only one dir exist",
dirsInTrees: []string{"0/1/2/3"},
@ -481,13 +471,12 @@ func TestConfigGetTargets(t *testing.T) {
curDir: "0",
errStr: "couldn't find directory 0/3/4",
}, {
description: "multiple targets dirs specified at root source tree",
dirsInTrees: []string{"0/1/2/3", "0/3/4"},
buildFiles: []string{"0/1/2/3/Android.bp", "0/3/4/Android.mk"},
dirs: []string{"0/1/2/3:t1,t2", "0/3/4"},
curDir: ".",
expectedTargets: []string{"t1", "t2", "MODULES-IN-0-3-4"},
expectedBuildFiles: []string{"0/1/2/3/Android.mk", "0/3/4/Android.mk"},
description: "multiple targets dirs specified at root source tree",
dirsInTrees: []string{"0/1/2/3", "0/3/4"},
buildFiles: []string{"0/1/2/3/Android.bp", "0/3/4/Android.mk"},
dirs: []string{"0/1/2/3:t1,t2", "0/3/4"},
curDir: ".",
expectedTargets: []string{"t1", "t2", "MODULES-IN-0-3-4"},
}, {
description: "no directories specified",
dirsInTrees: []string{"0/1/2/3", "0/3/4"},
@ -518,13 +507,10 @@ func TestConfigGetTargets(t *testing.T) {
r := setTop(t, topDir)
defer r()
targets, buildFiles := getTargetsFromDirs(ctx, tt.curDir, tt.dirs, "MODULES-IN-")
targets := getTargetsFromDirs(ctx, tt.curDir, tt.dirs, "MODULES-IN-")
if !reflect.DeepEqual(targets, tt.expectedTargets) {
t.Errorf("expected %v, got %v for targets", tt.expectedTargets, targets)
}
if !reflect.DeepEqual(buildFiles, tt.expectedBuildFiles) {
t.Errorf("expected %v, got %v for build files", tt.expectedBuildFiles, buildFiles)
}
// If the execution reached here and there was an expected error code, the unit test case failed.
if tt.errStr != "" {
@ -732,14 +718,11 @@ type buildActionTestCase struct {
// Expected arguments to be in Config instance.
expectedArgs []string
// 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) {
func testGetConfigArgs(t *testing.T, tt buildActionTestCase, action BuildAction) {
ctx := testContext()
defer logger.Recover(func(err error) {
@ -753,7 +736,6 @@ func testGetConfigArgs(t *testing.T, tt buildActionTestCase, action BuildAction,
// Environment variables to set it to blank on every test case run.
resetEnvVars := []string{
"ONE_SHOT_MAKEFILE",
"WITH_TIDY_ONLY",
}
@ -807,17 +789,11 @@ func testGetConfigArgs(t *testing.T, tt buildActionTestCase, action BuildAction,
t.Fatalf("failed to create %s file: %v", srcDirFileCheck, err)
}
args := getConfigArgs(action, tt.curDir, buildDependencies, ctx, tt.args)
args := getConfigArgs(action, tt.curDir, ctx, tt.args)
if !reflect.DeepEqual(tt.expectedArgs, args) {
t.Fatalf("expected %v, got %v for config arguments", tt.expectedArgs, args)
}
for _, env := range tt.expectedEnvVars {
if val := os.Getenv(env.name); val != env.value {
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)
@ -826,299 +802,143 @@ func testGetConfigArgs(t *testing.T, tt buildActionTestCase, action BuildAction,
func TestGetConfigArgsBuildModules(t *testing.T) {
tests := []buildActionTestCase{{
description: "normal execution from the root source tree directory",
dirsInTrees: []string{"0/1/2", "0/2", "0/3"},
buildFiles: []string{"0/1/2/Android.mk", "0/2/Android.bp", "0/3/Android.mk"},
args: []string{"-j", "fake_module", "fake_module2"},
curDir: ".",
tidyOnly: "",
expectedArgs: []string{"-j", "fake_module", "fake_module2"},
expectedEnvVars: []envVar{},
description: "normal execution from the root source tree directory",
dirsInTrees: []string{"0/1/2", "0/2", "0/3"},
buildFiles: []string{"0/1/2/Android.mk", "0/2/Android.bp", "0/3/Android.mk"},
args: []string{"-j", "fake_module", "fake_module2"},
curDir: ".",
tidyOnly: "",
expectedArgs: []string{"-j", "fake_module", "fake_module2"},
}, {
description: "normal execution in deep directory",
dirsInTrees: []string{"0/1/2", "0/2", "0/3", "1/2/3/4/5/6/7/8/9/1/2/3/4/5/6"},
buildFiles: []string{"0/1/2/Android.mk", "0/2/Android.bp", "1/2/3/4/5/6/7/8/9/1/2/3/4/5/6/Android.mk"},
args: []string{"-j", "fake_module", "fake_module2", "-k"},
curDir: "1/2/3/4/5/6/7/8/9",
tidyOnly: "",
expectedArgs: []string{"-j", "fake_module", "fake_module2", "-k"},
expectedEnvVars: []envVar{},
description: "normal execution in deep directory",
dirsInTrees: []string{"0/1/2", "0/2", "0/3", "1/2/3/4/5/6/7/8/9/1/2/3/4/5/6"},
buildFiles: []string{"0/1/2/Android.mk", "0/2/Android.bp", "1/2/3/4/5/6/7/8/9/1/2/3/4/5/6/Android.mk"},
args: []string{"-j", "fake_module", "fake_module2", "-k"},
curDir: "1/2/3/4/5/6/7/8/9",
tidyOnly: "",
expectedArgs: []string{"-j", "fake_module", "fake_module2", "-k"},
}, {
description: "normal execution in deep directory, no targets",
dirsInTrees: []string{"0/1/2", "0/2", "0/3", "1/2/3/4/5/6/7/8/9/1/2/3/4/5/6"},
buildFiles: []string{"0/1/2/Android.mk", "0/2/Android.bp", "1/2/3/4/5/6/7/8/9/1/2/3/4/5/6/Android.mk"},
args: []string{"-j", "-k"},
curDir: "1/2/3/4/5/6/7/8/9",
tidyOnly: "",
expectedArgs: []string{"-j", "-k"},
expectedEnvVars: []envVar{},
description: "normal execution in deep directory, no targets",
dirsInTrees: []string{"0/1/2", "0/2", "0/3", "1/2/3/4/5/6/7/8/9/1/2/3/4/5/6"},
buildFiles: []string{"0/1/2/Android.mk", "0/2/Android.bp", "1/2/3/4/5/6/7/8/9/1/2/3/4/5/6/Android.mk"},
args: []string{"-j", "-k"},
curDir: "1/2/3/4/5/6/7/8/9",
tidyOnly: "",
expectedArgs: []string{"-j", "-k"},
}, {
description: "normal execution in root source tree, no args",
dirsInTrees: []string{"0/1/2", "0/2", "0/3"},
buildFiles: []string{"0/1/2/Android.mk", "0/2/Android.bp"},
args: []string{},
curDir: "0/2",
tidyOnly: "",
expectedArgs: []string{},
expectedEnvVars: []envVar{},
description: "normal execution in root source tree, no args",
dirsInTrees: []string{"0/1/2", "0/2", "0/3"},
buildFiles: []string{"0/1/2/Android.mk", "0/2/Android.bp"},
args: []string{},
curDir: "0/2",
tidyOnly: "",
expectedArgs: []string{},
}, {
description: "normal execution in symlink root source tree, no args",
dirsInTrees: []string{"0/1/2", "0/2", "0/3"},
buildFiles: []string{"0/1/2/Android.mk", "0/2/Android.bp"},
rootSymlink: true,
args: []string{},
curDir: "0/2",
tidyOnly: "",
expectedArgs: []string{},
expectedEnvVars: []envVar{},
description: "normal execution in symlink root source tree, no args",
dirsInTrees: []string{"0/1/2", "0/2", "0/3"},
buildFiles: []string{"0/1/2/Android.mk", "0/2/Android.bp"},
rootSymlink: true,
args: []string{},
curDir: "0/2",
tidyOnly: "",
expectedArgs: []string{},
}}
for _, tt := range tests {
t.Run("build action BUILD_MODULES with dependencies, "+tt.description, func(t *testing.T) {
testGetConfigArgs(t, tt, BUILD_MODULES, true)
})
}
}
// TODO: Remove this test case once mm shell build command has been deprecated.
func TestGetConfigArgsBuildModulesInDirecotoryNoDeps(t *testing.T) {
tests := []buildActionTestCase{{
description: "normal execution in a directory",
dirsInTrees: []string{"0/1/2"},
buildFiles: []string{"0/1/2/Android.mk"},
args: []string{"-j", "-k", "showcommands", "fake-module"},
curDir: "0/1/2",
tidyOnly: "",
expectedArgs: []string{"-j", "-k", "showcommands", "fake-module", "MODULES-IN-0-1-2"},
expectedEnvVars: []envVar{
envVar{
name: "ONE_SHOT_MAKEFILE",
value: "0/1/2/Android.mk"}},
}, {
description: "makefile in parent directory",
dirsInTrees: []string{"0/1/2"},
buildFiles: []string{"0/1/Android.mk"},
args: []string{},
curDir: "0/1/2",
tidyOnly: "",
expectedArgs: []string{"MODULES-IN-0-1"},
expectedEnvVars: []envVar{
envVar{
name: "ONE_SHOT_MAKEFILE",
value: "0/1/Android.mk"}},
}, {
description: "build file not found",
dirsInTrees: []string{"0/1/2"},
buildFiles: []string{},
args: []string{},
curDir: "0/1/2",
tidyOnly: "",
expectedArgs: []string{"MODULES-IN-0-1-2"},
expectedEnvVars: []envVar{
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{},
buildFiles: []string{},
args: []string{},
curDir: ".",
tidyOnly: "",
expectedArgs: []string{},
expectedEnvVars: []envVar{
envVar{
name: "ONE_SHOT_MAKEFILE",
value: ""}},
}, {
description: "GET-INSTALL-PATH specified,",
dirsInTrees: []string{"0/1/2"},
buildFiles: []string{"0/1/Android.mk"},
args: []string{"GET-INSTALL-PATH"},
curDir: "0/1/2",
tidyOnly: "",
expectedArgs: []string{"GET-INSTALL-PATH-IN-0-1"},
expectedEnvVars: []envVar{
envVar{
name: "ONE_SHOT_MAKEFILE",
value: "0/1/Android.mk"}},
}, {
description: "tidy only environment variable specified,",
dirsInTrees: []string{"0/1/2"},
buildFiles: []string{"0/1/Android.mk"},
args: []string{"GET-INSTALL-PATH"},
curDir: "0/1/2",
tidyOnly: "true",
expectedArgs: []string{"tidy_only"},
expectedEnvVars: []envVar{
envVar{
name: "ONE_SHOT_MAKEFILE",
value: "0/1/Android.mk"}},
}}
for _, tt := range tests {
t.Run("build action BUILD_MODULES_IN_DIR without their dependencies, "+tt.description, func(t *testing.T) {
testGetConfigArgs(t, tt, BUILD_MODULES_IN_A_DIRECTORY, false)
testGetConfigArgs(t, tt, BUILD_MODULES)
})
}
}
func TestGetConfigArgsBuildModulesInDirectory(t *testing.T) {
tests := []buildActionTestCase{{
description: "normal execution in a directory",
dirsInTrees: []string{"0/1/2"},
buildFiles: []string{"0/1/2/Android.mk"},
args: []string{"fake-module"},
curDir: "0/1/2",
tidyOnly: "",
expectedArgs: []string{"fake-module", "MODULES-IN-0-1-2"},
expectedEnvVars: []envVar{},
description: "normal execution in a directory",
dirsInTrees: []string{"0/1/2"},
buildFiles: []string{"0/1/2/Android.mk"},
args: []string{"fake-module"},
curDir: "0/1/2",
tidyOnly: "",
expectedArgs: []string{"fake-module", "MODULES-IN-0-1-2"},
}, {
description: "build file in parent directory",
dirsInTrees: []string{"0/1/2"},
buildFiles: []string{"0/1/Android.mk"},
args: []string{},
curDir: "0/1/2",
tidyOnly: "",
expectedArgs: []string{"MODULES-IN-0-1"},
expectedEnvVars: []envVar{},
description: "build file in parent directory",
dirsInTrees: []string{"0/1/2"},
buildFiles: []string{"0/1/Android.mk"},
args: []string{},
curDir: "0/1/2",
tidyOnly: "",
expectedArgs: []string{"MODULES-IN-0-1"},
},
{
description: "build file in parent directory, multiple module names passed in",
dirsInTrees: []string{"0/1/2"},
buildFiles: []string{"0/1/Android.mk"},
args: []string{"fake-module1", "fake-module2", "fake-module3"},
curDir: "0/1/2",
tidyOnly: "",
expectedArgs: []string{"fake-module1", "fake-module2", "fake-module3", "MODULES-IN-0-1"},
expectedEnvVars: []envVar{},
description: "build file in parent directory, multiple module names passed in",
dirsInTrees: []string{"0/1/2"},
buildFiles: []string{"0/1/Android.mk"},
args: []string{"fake-module1", "fake-module2", "fake-module3"},
curDir: "0/1/2",
tidyOnly: "",
expectedArgs: []string{"fake-module1", "fake-module2", "fake-module3", "MODULES-IN-0-1"},
}, {
description: "build file in 2nd level parent directory",
dirsInTrees: []string{"0/1/2"},
buildFiles: []string{"0/Android.bp"},
args: []string{},
curDir: "0/1/2",
tidyOnly: "",
expectedArgs: []string{"MODULES-IN-0"},
expectedEnvVars: []envVar{},
description: "build file in 2nd level parent directory",
dirsInTrees: []string{"0/1/2"},
buildFiles: []string{"0/Android.bp"},
args: []string{},
curDir: "0/1/2",
tidyOnly: "",
expectedArgs: []string{"MODULES-IN-0"},
}, {
description: "build action executed at root directory",
dirsInTrees: []string{},
buildFiles: []string{},
rootSymlink: false,
args: []string{},
curDir: ".",
tidyOnly: "",
expectedArgs: []string{},
expectedEnvVars: []envVar{},
description: "build action executed at root directory",
dirsInTrees: []string{},
buildFiles: []string{},
rootSymlink: false,
args: []string{},
curDir: ".",
tidyOnly: "",
expectedArgs: []string{},
}, {
description: "build action executed at root directory in symlink",
dirsInTrees: []string{},
buildFiles: []string{},
rootSymlink: true,
args: []string{},
curDir: ".",
tidyOnly: "",
expectedArgs: []string{},
expectedEnvVars: []envVar{},
description: "build action executed at root directory in symlink",
dirsInTrees: []string{},
buildFiles: []string{},
rootSymlink: true,
args: []string{},
curDir: ".",
tidyOnly: "",
expectedArgs: []string{},
}, {
description: "build file not found",
dirsInTrees: []string{"0/1/2"},
buildFiles: []string{},
args: []string{},
curDir: "0/1/2",
tidyOnly: "",
expectedArgs: []string{"MODULES-IN-0-1-2"},
expectedEnvVars: []envVar{},
expectedErrStr: "Build file not found for 0/1/2 directory",
description: "build file not found",
dirsInTrees: []string{"0/1/2"},
buildFiles: []string{},
args: []string{},
curDir: "0/1/2",
tidyOnly: "",
expectedArgs: []string{"MODULES-IN-0-1-2"},
expectedErrStr: "Build file not found for 0/1/2 directory",
}, {
description: "GET-INSTALL-PATH specified,",
dirsInTrees: []string{"0/1/2"},
buildFiles: []string{"0/1/Android.mk"},
args: []string{"GET-INSTALL-PATH", "-j", "-k", "GET-INSTALL-PATH"},
curDir: "0/1/2",
tidyOnly: "",
expectedArgs: []string{"-j", "-k", "GET-INSTALL-PATH-IN-0-1"},
expectedEnvVars: []envVar{},
description: "GET-INSTALL-PATH specified,",
dirsInTrees: []string{"0/1/2"},
buildFiles: []string{"0/1/Android.mk"},
args: []string{"GET-INSTALL-PATH", "-j", "-k", "GET-INSTALL-PATH"},
curDir: "0/1/2",
tidyOnly: "",
expectedArgs: []string{"-j", "-k", "GET-INSTALL-PATH-IN-0-1"},
}, {
description: "tidy only environment variable specified,",
dirsInTrees: []string{"0/1/2"},
buildFiles: []string{"0/1/Android.mk"},
args: []string{"GET-INSTALL-PATH"},
curDir: "0/1/2",
tidyOnly: "true",
expectedArgs: []string{"tidy_only"},
expectedEnvVars: []envVar{},
description: "tidy only environment variable specified,",
dirsInTrees: []string{"0/1/2"},
buildFiles: []string{"0/1/Android.mk"},
args: []string{"GET-INSTALL-PATH"},
curDir: "0/1/2",
tidyOnly: "true",
expectedArgs: []string{"tidy_only"},
}, {
description: "normal execution in root directory with args",
dirsInTrees: []string{},
buildFiles: []string{},
args: []string{"-j", "-k", "fake_module"},
curDir: "",
tidyOnly: "",
expectedArgs: []string{"-j", "-k", "fake_module"},
expectedEnvVars: []envVar{},
description: "normal execution in root directory with args",
dirsInTrees: []string{},
buildFiles: []string{},
args: []string{"-j", "-k", "fake_module"},
curDir: "",
tidyOnly: "",
expectedArgs: []string{"-j", "-k", "fake_module"},
}}
for _, tt := range tests {
t.Run("build action BUILD_MODULES_IN_DIR, "+tt.description, func(t *testing.T) {
testGetConfigArgs(t, tt, BUILD_MODULES_IN_A_DIRECTORY, true)
})
}
}
// TODO: Remove this test case once mmm shell build command has been deprecated.
func TestGetConfigArgsBuildModulesInDirectoriesNoDeps(t *testing.T) {
tests := []buildActionTestCase{{
description: "normal execution in a directory",
dirsInTrees: []string{"0/1/2/3.1", "0/1/2/3.2", "0/1/2/3.3"},
buildFiles: []string{"0/1/2/3.1/Android.bp", "0/1/2/3.2/Android.bp", "0/1/2/3.3/Android.bp"},
args: []string{"3.1/:t1,t2", "3.2/:t3,t4", "3.3/:t5,t6"},
curDir: "0/1/2",
tidyOnly: "",
expectedArgs: []string{"t1", "t2", "t3", "t4", "t5", "t6"},
expectedEnvVars: []envVar{
envVar{
name: "ONE_SHOT_MAKEFILE",
value: "0/1/2/3.1/Android.mk 0/1/2/3.2/Android.mk 0/1/2/3.3/Android.mk"}},
}, {
description: "GET-INSTALL-PATH specified",
dirsInTrees: []string{"0/1/2/3.1", "0/1/2/3.2", "0/1/2/3.3"},
buildFiles: []string{"0/1/2/3.1/Android.bp", "0/1/2/3.2/Android.bp", "0/1/2/3.3/Android.bp"},
args: []string{"GET-INSTALL-PATH", "3.1/", "3.2/", "3.3/:t6"},
curDir: "0/1/2",
tidyOnly: "",
expectedArgs: []string{"GET-INSTALL-PATH-IN-0-1-2-3.1", "GET-INSTALL-PATH-IN-0-1-2-3.2", "t6"},
expectedEnvVars: []envVar{
envVar{
name: "ONE_SHOT_MAKEFILE",
value: "0/1/2/3.1/Android.mk 0/1/2/3.2/Android.mk 0/1/2/3.3/Android.mk"}},
}, {
description: "tidy only environment variable specified",
dirsInTrees: []string{"0/1/2/3.1", "0/1/2/3.2", "0/1/2/3.3"},
buildFiles: []string{"0/1/2/3.1/Android.bp", "0/1/2/3.2/Android.bp", "0/1/2/3.3/Android.bp"},
args: []string{"GET-INSTALL-PATH", "3.1/", "3.2/", "3.3/:t6"},
curDir: "0/1/2",
tidyOnly: "1",
expectedArgs: []string{"tidy_only"},
expectedEnvVars: []envVar{
envVar{
name: "ONE_SHOT_MAKEFILE",
value: "0/1/2/3.1/Android.mk 0/1/2/3.2/Android.mk 0/1/2/3.3/Android.mk"}},
}, {
description: "normal execution from top dir directory",
dirsInTrees: []string{"0/1/2/3.1", "0/1/2/3.2", "0/1/2/3.3"},
buildFiles: []string{"0/1/2/3.1/Android.bp", "0/1/2/3.2/Android.bp", "0/1/2/3.3/Android.bp"},
args: []string{"0/1/2/3.1", "0/1/2/3.2/:t3,t4", "0/1/2/3.3/:t5,t6"},
curDir: ".",
tidyOnly: "",
expectedArgs: []string{"MODULES-IN-0-1-2-3.1", "t3", "t4", "t5", "t6"},
expectedEnvVars: []envVar{
envVar{
name: "ONE_SHOT_MAKEFILE",
value: "0/1/2/3.1/Android.mk 0/1/2/3.2/Android.mk 0/1/2/3.3/Android.mk"}},
}}
for _, tt := range tests {
t.Run("build action BUILD_MODULES_IN_DIRS_NO_DEPS, "+tt.description, func(t *testing.T) {
testGetConfigArgs(t, tt, BUILD_MODULES_IN_DIRECTORIES, false)
testGetConfigArgs(t, tt, BUILD_MODULES_IN_A_DIRECTORY)
})
}
}
@ -1132,10 +952,6 @@ func TestGetConfigArgsBuildModulesInDirectories(t *testing.T) {
curDir: "0/1/2",
tidyOnly: "",
expectedArgs: []string{"MODULES-IN-0-1-2-3.1", "MODULES-IN-0-1-2-3.2", "MODULES-IN-0-1-2-3.3"},
expectedEnvVars: []envVar{
envVar{
name: "ONE_SHOT_MAKEFILE",
value: ""}},
}, {
description: "GET-INSTALL-PATH specified",
dirsInTrees: []string{"0/1/2/3.1", "0/1/2/3.2", "0/1/3"},
@ -1144,10 +960,6 @@ func TestGetConfigArgsBuildModulesInDirectories(t *testing.T) {
curDir: "0/1",
tidyOnly: "",
expectedArgs: []string{"GET-INSTALL-PATH-IN-0-1-2-3.1", "GET-INSTALL-PATH-IN-0-1-2-3.2", "GET-INSTALL-PATH-IN-0-1"},
expectedEnvVars: []envVar{
envVar{
name: "ONE_SHOT_MAKEFILE",
value: ""}},
}, {
description: "tidy only environment variable specified",
dirsInTrees: []string{"0/1/2/3.1", "0/1/2/3.2", "0/1/2/3.3"},
@ -1156,10 +968,6 @@ func TestGetConfigArgsBuildModulesInDirectories(t *testing.T) {
curDir: "0/1/2",
tidyOnly: "1",
expectedArgs: []string{"tidy_only"},
expectedEnvVars: []envVar{
envVar{
name: "ONE_SHOT_MAKEFILE",
value: ""}},
}, {
description: "normal execution from top dir directory",
dirsInTrees: []string{"0/1/2/3.1", "0/1/2/3.2", "0/1/3", "0/2"},
@ -1169,10 +977,6 @@ func TestGetConfigArgsBuildModulesInDirectories(t *testing.T) {
curDir: ".",
tidyOnly: "",
expectedArgs: []string{"MODULES-IN-0-1-2-3.1", "MODULES-IN-0-1-2-3.2", "MODULES-IN-0-1-3", "MODULES-IN-0-2"},
expectedEnvVars: []envVar{
envVar{
name: "ONE_SHOT_MAKEFILE",
value: ""}},
}, {
description: "normal execution from top dir directory in symlink",
dirsInTrees: []string{"0/1/2/3.1", "0/1/2/3.2", "0/1/3", "0/2"},
@ -1182,14 +986,10 @@ func TestGetConfigArgsBuildModulesInDirectories(t *testing.T) {
curDir: ".",
tidyOnly: "",
expectedArgs: []string{"MODULES-IN-0-1-2-3.1", "MODULES-IN-0-1-2-3.2", "MODULES-IN-0-1-3", "MODULES-IN-0-2"},
expectedEnvVars: []envVar{
envVar{
name: "ONE_SHOT_MAKEFILE",
value: ""}},
}}
for _, tt := range tests {
t.Run("build action BUILD_MODULES_IN_DIRS, "+tt.description, func(t *testing.T) {
testGetConfigArgs(t, tt, BUILD_MODULES_IN_DIRECTORIES, true)
testGetConfigArgs(t, tt, BUILD_MODULES_IN_DIRECTORIES)
})
}
}

View file

@ -42,9 +42,6 @@ func genKatiSuffix(ctx Context, config Config) {
if args := config.KatiArgs(); len(args) > 0 {
katiSuffix += "-" + spaceSlashReplacer.Replace(strings.Join(args, "_"))
}
if oneShot, ok := config.Environment().Get("ONE_SHOT_MAKEFILE"); ok {
katiSuffix += "-" + spaceSlashReplacer.Replace(oneShot)
}
// If the suffix is too long, replace it with a md5 hash and write a
// file that contains the original suffix.