Merge "Add ctx.ModuleDir and top level module dirs of input sources to JDK9 --patch-module lookup." am: 366c7d3a74
am: bb24d6d16c
am: ad37e4010f
Original change: https://android-review.googlesource.com/c/platform/build/soong/+/1480608 Change-Id: I3350b08170f897da1f3a2e2f36ee4550ec3c18e5
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
|
||||
}
|
||||
|
||||
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.
|
||||
javacFlags := j.properties.Javacflags
|
||||
|
||||
@@ -1262,14 +1263,48 @@ func (j *Module) collectJavacFlags(ctx android.ModuleContext, flags javaBuilderF
|
||||
|
||||
if j.properties.Patch_module != nil {
|
||||
// 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.)
|
||||
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("")
|
||||
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)
|
||||
|
||||
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 = append(srcJars, deps.srcJars...)
|
||||
|
@@ -2046,7 +2046,14 @@ func TestPatchModule(t *testing.T) {
|
||||
|
||||
java_library {
|
||||
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",
|
||||
}
|
||||
`
|
||||
@@ -2055,7 +2062,8 @@ func TestPatchModule(t *testing.T) {
|
||||
checkPatchModuleFlag(t, ctx, "foo", "")
|
||||
expected := "java.base=.:" + buildDir
|
||||
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)
|
||||
})
|
||||
}
|
||||
|
Reference in New Issue
Block a user