Merge "Add ctx.ModuleDir and top level module dirs of input sources to JDK9 --patch-module lookup." am: 366c7d3a74
am: bb24d6d16c
Original change: https://android-review.googlesource.com/c/platform/build/soong/+/1480608 Change-Id: I0389331e49f6ac552838224a0ffd2a66c186d694
This commit is contained in:
49
java/java.go
49
java/java.go
@@ -1246,7 +1246,8 @@ func (j *Module) collectBuilderFlags(ctx android.ModuleContext, deps deps) javaB
|
|||||||
return flags
|
return flags
|
||||||
}
|
}
|
||||||
|
|
||||||
func (j *Module) collectJavacFlags(ctx android.ModuleContext, flags javaBuilderFlags) javaBuilderFlags {
|
func (j *Module) collectJavacFlags(
|
||||||
|
ctx android.ModuleContext, flags javaBuilderFlags, srcFiles android.Paths) javaBuilderFlags {
|
||||||
// javac flags.
|
// javac flags.
|
||||||
javacFlags := j.properties.Javacflags
|
javacFlags := j.properties.Javacflags
|
||||||
|
|
||||||
@@ -1262,14 +1263,48 @@ func (j *Module) collectJavacFlags(ctx android.ModuleContext, flags javaBuilderF
|
|||||||
|
|
||||||
if j.properties.Patch_module != nil {
|
if j.properties.Patch_module != nil {
|
||||||
// Manually specify build directory in case it is not under the repo root.
|
// Manually specify build directory in case it is not under the repo root.
|
||||||
// (javac doesn't seem to expand into symbolc links when searching for patch-module targets, so
|
// (javac doesn't seem to expand into symbolic links when searching for patch-module targets, so
|
||||||
// just adding a symlink under the root doesn't help.)
|
// just adding a symlink under the root doesn't help.)
|
||||||
patchPaths := ".:" + ctx.Config().BuildDir()
|
patchPaths := []string{".", ctx.Config().BuildDir()}
|
||||||
|
|
||||||
|
// b/150878007
|
||||||
|
//
|
||||||
|
// Workaround to support *Bazel-executed* JDK9 javac in Bazel's
|
||||||
|
// execution root for --patch-module. If this javac command line is
|
||||||
|
// invoked within Bazel's execution root working directory, the top
|
||||||
|
// level directories (e.g. libcore/, tools/, frameworks/) are all
|
||||||
|
// symlinks. JDK9 javac does not traverse into symlinks, which causes
|
||||||
|
// --patch-module to fail source file lookups when invoked in the
|
||||||
|
// execution root.
|
||||||
|
//
|
||||||
|
// Short of patching javac or enumerating *all* directories as possible
|
||||||
|
// input dirs, manually add the top level dir of the source files to be
|
||||||
|
// compiled.
|
||||||
|
topLevelDirs := map[string]bool{}
|
||||||
|
for _, srcFilePath := range srcFiles {
|
||||||
|
srcFileParts := strings.Split(srcFilePath.String(), "/")
|
||||||
|
// Ignore source files that are already in the top level directory
|
||||||
|
// as well as generated files in the out directory. The out
|
||||||
|
// directory may be an absolute path, which means srcFileParts[0] is the
|
||||||
|
// empty string, so check that as well. Note that "out" in Bazel's execution
|
||||||
|
// root is *not* a symlink, which doesn't cause problems for --patch-modules
|
||||||
|
// anyway, so it's fine to not apply this workaround for generated
|
||||||
|
// source files.
|
||||||
|
if len(srcFileParts) > 1 &&
|
||||||
|
srcFileParts[0] != "" &&
|
||||||
|
srcFileParts[0] != "out" {
|
||||||
|
topLevelDirs[srcFileParts[0]] = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
patchPaths = append(patchPaths, android.SortedStringKeys(topLevelDirs)...)
|
||||||
|
|
||||||
classPath := flags.classpath.FormJavaClassPath("")
|
classPath := flags.classpath.FormJavaClassPath("")
|
||||||
if classPath != "" {
|
if classPath != "" {
|
||||||
patchPaths += ":" + classPath
|
patchPaths = append(patchPaths, classPath)
|
||||||
}
|
}
|
||||||
javacFlags = append(javacFlags, "--patch-module="+String(j.properties.Patch_module)+"="+patchPaths)
|
javacFlags = append(
|
||||||
|
javacFlags,
|
||||||
|
"--patch-module="+String(j.properties.Patch_module)+"="+strings.Join(patchPaths, ":"))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1303,7 +1338,9 @@ func (j *Module) compile(ctx android.ModuleContext, aaptSrcJar android.Path) {
|
|||||||
|
|
||||||
srcFiles = j.genSources(ctx, srcFiles, flags)
|
srcFiles = j.genSources(ctx, srcFiles, flags)
|
||||||
|
|
||||||
flags = j.collectJavacFlags(ctx, flags)
|
// Collect javac flags only after computing the full set of srcFiles to
|
||||||
|
// ensure that the --patch-module lookup paths are complete.
|
||||||
|
flags = j.collectJavacFlags(ctx, flags, srcFiles)
|
||||||
|
|
||||||
srcJars := srcFiles.FilterByExt(".srcjar")
|
srcJars := srcFiles.FilterByExt(".srcjar")
|
||||||
srcJars = append(srcJars, deps.srcJars...)
|
srcJars = append(srcJars, deps.srcJars...)
|
||||||
|
@@ -2046,7 +2046,14 @@ func TestPatchModule(t *testing.T) {
|
|||||||
|
|
||||||
java_library {
|
java_library {
|
||||||
name: "baz",
|
name: "baz",
|
||||||
srcs: ["c.java"],
|
srcs: [
|
||||||
|
"c.java",
|
||||||
|
// Tests for b/150878007
|
||||||
|
"dir/d.java",
|
||||||
|
"dir2/e.java",
|
||||||
|
"dir2/f.java",
|
||||||
|
"nested/dir/g.java"
|
||||||
|
],
|
||||||
patch_module: "java.base",
|
patch_module: "java.base",
|
||||||
}
|
}
|
||||||
`
|
`
|
||||||
@@ -2055,7 +2062,8 @@ func TestPatchModule(t *testing.T) {
|
|||||||
checkPatchModuleFlag(t, ctx, "foo", "")
|
checkPatchModuleFlag(t, ctx, "foo", "")
|
||||||
expected := "java.base=.:" + buildDir
|
expected := "java.base=.:" + buildDir
|
||||||
checkPatchModuleFlag(t, ctx, "bar", expected)
|
checkPatchModuleFlag(t, ctx, "bar", expected)
|
||||||
expected = "java.base=" + strings.Join([]string{".", buildDir, moduleToPath("ext"), moduleToPath("framework")}, ":")
|
expected = "java.base=" + strings.Join([]string{
|
||||||
|
".", buildDir, "dir", "dir2", "nested", moduleToPath("ext"), moduleToPath("framework")}, ":")
|
||||||
checkPatchModuleFlag(t, ctx, "baz", expected)
|
checkPatchModuleFlag(t, ctx, "baz", expected)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user