RFR [9] Modular Source Code
Magnus Ihse Bursie
magnus.ihse.bursie at oracle.com
Fri Aug 15 08:52:36 UTC 2014
On 2014-08-12 16:10, Chris Hegarty wrote:
> This is a review request for the Initial changes for JEP 201: Modular Source Code [1].
>
> There are a number of individuals responsible for these changes. Some, possibly not all, are explicitly listed in the To section of this mail, and they will help address any comments arising from this review request.
>
> For the purposes of review, the actual source file moves have been omitted from the webrev below, with the exception of any source file that has a change to it’s actual content. The new location of the source files can be determined from JEP 201 [1] and JEP 200 "The Modular JDK" [2], or by browsing the staging forest [3].
>
> Webrevs:
> http://cr.openjdk.java.net/~chegar/8054834/00/
These are indeed the single most significant changes to the build system
since the "new" build system was introduced.
Here follows a partial review of the changes in the jdk repo. Even
though it's long, I'm not done. ;-)
*** General issues ***
* The new directory jdk/make/bundle should instead reside in
jdk/make/data/bundles.
* In GensrcSwing.gmk is a "$(if $(SHUFFLED)..." part that seems to be
remnants of older, temporary work.
* The new file GensrcProviders.gmk are included by the Gensrc files for
jdk.attach and jdk.jdi, which only uses half of it each. Each half is
just a few lines long. I believe a better solution is to remove the
GensrcProviders.gmk file, move the process-provider macro to
GensrcCommon.gmk and move the two actual rules to the respective module
gensrc file.
* In the gensrc directory, there are now almost twice as many files. For
many of them, the following pattern holds:
GensrcOldStyle.gmk -- defines the actual logic for some gensrc target
Gensrc-<module>.gmk -- does nothing but includes GensrcOldStyle.gmk
In these cases, I think the contents of GensrcOldStyle should be inlined
directly in the Gensrc-<module>.gmk instead. This holds for all modules
except the two mammuth modules java.base and java.desktop. (Depending on
the treatment of GensrcProviders as described above.)
* In CreateJars.gmk, the following new comment is found embedded:
# This currently won't work with modular build layout, but
there currently are no
# types needing to be re added.
In my opinion, leaving code which looks like it's working but with a
note saying "out of order", is bad practice. I'd recommend that the code
is removed or commented out, if it is not needed.
* In CreateJars.gmk, in BUILD_TOOLS_JAR: The following looks like a
duplication; I believe the "classes" version should be removed.
$(JDK_OUTPUTDIR)/modules/jdk.jdi/META-INF/services/com.sun.jdi.connect.Connector
\
$(JDK_OUTPUTDIR)/classes/META-INF/services/com.sun.jdi.connect.Connector \
* In CreateSecurityJars.gmk, there is a variable SECURITY_CLASSES_SUBDIR
that is always set to 'modules'. I believe this is remains of an older
temporary design, and that "modules" should be hard-coded into the paths.
* The old Setup.gmk had a very generic-sounding name, even though it
only did setup java compilers. So, the rename to SetupJava.gmk was good;
however, I'd suggest we follow it through all the way and rename it
further to SetupJavaCompilers.gmk, since that is an even more accurate
description of it's job.
* The file CopyIntoClasses.gmk is not used anymore and should be removed.
* In CoreLibraries.gmk, there used to be a line "BUILD_LIBRARIES +=
$(BUILD_LIBFDLIBM)" which is now removed. After discussion with Erik, I
learned that this was since the libfdlibm was not delivered in itself,
but was used solely as a helper lib for libjava, which has
BUILD_LIBFDLIBM as a requirement. While this change is thus correct, I
believe a comment describing this fact would be in place on libfdlibm,
since it makes it behave differently than all other libraries.
*** Issues with source files moving and its repercussions ***
* When the source code has moved, especially the native libraries, most
of the specific INCLUDE and EXCLUDE statements are, or should be,
unnecessary. Nevertheless, there are still several occasions of such
statements. In some cases, it seems like dead code that can (and should)
be removed. But in some cases, I believe it is an indication that the
source code has still not yet been moved to a suitable location. I
believe the end goal with this shuffling regarding native library source
code is that there should be a one-to-one correspondance between
compiled native library and source code directory. This is now indeed
the case for 99% of the libraries, but there are still some exceptions.
This is a slightly vague point at the moment. I indent to check the
INCLUDE and EXCLUDE statements more fully and will post a second review
with results of what I find. Nevertheless, I think it is important to
make sure we do get things correct this time.
*** Issues regarding modules.xml ***
The new modules.xml and associated Java tools and make files seems
rather confusing to me. I understand some of the mysteries here are due
the the fact that the file has moved around during development.
Nevertheless, such historical relics should be removed when the code is
ready to be pushed to mainline. More concretely:
* ModulesXml.gmk referes to make/data/checkdeps/modules.xml. This file
does not exist. I believe this should be the $(TOPDIR)/modules.xml.
* GenererateModules.Xml says: "This tool is used to generate
com/sun/tools/jdeps/resources/modules.xml". This is an incorrect claim.
In fact, the output file of the tool is specified by the user. The way
it is used by the build tool currently, the output file is placed in
$(JDK_OUTPUTDIR)/modules/jdk.dev/com/sun/tools/jdeps/resources/modules.xml,
but that is decided by the make file and not the Java utility.
* In fact, what happens is this:
** $(TOPDIR)/modules.xml is copied to
$(JDK_OUTPUTDIR)/btclasses/build/tools/module/modules.xml
** Then the GenerateModulesXml tool is executed.
** The tool will open and read this file using
GenerateModulesXml.class.getResourceAsStream("modules.xml").
** The tool will generate output to a new file, specified to be
$(JDK_OUTPUTDIR)/modules/jdk.dev/com/sun/tools/jdeps/resources/modules.xml.
** Afterwards, the separate tool $(JDK_OUTPUTDIR)/bin/jdeps is executed,
which will pick up the
$(JDK_OUTPUTDIR)/modules/jdk.dev/com/sun/tools/jdeps/resources/modules.xml,
presumably using getResourceAsStream. (I have not verified this.)
I have several objections to this.
* First, we are actually dealing with two different files, but both are
named modules.xml. I believe one of them is an annotated version of the
other, but I have not chec,ed. Nevertheless, this is just an
unneccessary source of confusion. One of them should change name, e.g.
annotated-modules.xml or jdeps-modules.xml or whatever.
* Second, it is not documented anywhere that GenerateModulexXml requires
an modules.xml as input.
* Third, and this links into the bullet above, this dependency is not
explicit but hidden away with unnessary shuffling and hard-to-understand
shuffling of files as result. A better solution, I believe, is two
modify GenerateModulesXml to require a path to the input modules.xml as
an argument, in addition to the output file. That way, the dependency
will be obvious, and we can just point to $(TOPDIR)/modules.xml instead
of copying it around.
* And fourth, all old comments etc refering to old placements of the
files should be corrected.
* Finally, I'm also not entirely happy with the placement of modules.xml
in the root directory. Erik has told me that the intention is that this
file will ultimately be created dynamically at build time, and when that
happens, it will just be a build by-product which can be placed
elsewhere. If this is indeed the case, I can live with some temporary
extra cluttering of the top-level directory.
*** More major undertakings ***
* The file GensrcProperties.gmk is not split according to modules. I
understand why this is harder to do and why it was not done for this
milestone; nevertheless I believe it should be done in a followup patch.
* GensrcCLDR.gmk is not ideal. It generates source for multiple modules,
and the output is separated afterwards. Fixing this will probably means
some modification to the java helper tools.
* This code that previously was in jdk/make/CopyIntoClasses has now
unfortunately moved this very specific logic up into the top repo. In
fact, the top/make/CompileJavaModules.gmk now contain module-specific
data such as "java.base_COPY := .icu .dat .spp
content-types.properties". This should really be split into
module-specific files and pushed down once again to the jdk/make
directory, maybe into the copy directory.
* I think the jdk/make/data directory could (and should) be separated on
module level, e.g. jdk/make/data/java.base/... etc. Or, maybe, that the
contents should even be moved out into like src/java.base/share/data,
since the contents of that directory in a way is "source code" (only
just not Java or native source code), and not really part of the build
system.
*** Issues that was not introduced now, but should be fixed at some
point ***
* In CopyCommon, the variables LIBDIR and INCLUDEDIR has very
generic-sounding name even though they are very specific. These names
are not new, but since the definition is now in a different file than
the uses of it, the badly chosen names makes it even harder to
understand the code.
* The platform-specific correspondance, OPENJDK_TARGET_OS_INCLUDE =
$(INCLUDEDIR)/$(OPENJDK_TARGET_OS) is also bad from several
perspectives: It is a variant of INCLUDEDIR but it does not end in DIR,
it should not start with OPENJDK since it's not a global variable, and
finally it uses incorrect assignment (= instead of :=).
* In Awt2dLibraries.gmk, for libsplashscreen, the logic for the three
included external graphics libraries (gif, jpeg and png) is highly
asymmetric, which make it hard to understand. It seems likely that at
least the libjpeg handling is broken.
* The BUILD_LIBT2K is used only by the Oracle closed build, and the
definition should move to the closed sources.
/Magnus
More information about the jdk9-dev
mailing list