Hello, Magnus
Thanks for the thorough review. I tend to agree with Alan, that we
should rather push this in unless we find critical issues but make sure
to continue cleaning this up in jdk9/dev. I have created bugs for
(almost) everything you have listed below. See inline for links and
comments.
On 2014-08-15 10:52, Magnus Ihse Bursie wrote:
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.
Created " General cleanup of minor issues from source restructure"
https://bugs.openjdk.java.net/browse/JDK-8055188
* 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.)
Created "Cleanup gensrc after source code restructure"
https://bugs.openjdk.java.net/browse/JDK-8055189
* 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.
While I agree on this in principle, I would rather not spend time on the
profiles generation code since it's planned to go away soon anyway.
* 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.
Added to general cleanup
*** 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.
Created "Cleanup include and exclude of native libraries after source
code restructure" https://bugs.openjdk.java.net/browse/JDK-8055190
*** 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.
While I agree it's messy at the moment, this is an area that is
temporary and will change drastically. Added as optional to general cleanup.
*** 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.
Created "Split GensrcProperties.gmk into separate modules"
https://bugs.openjdk.java.net/browse/JDK-8055191
* 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.
While I think it would be good to split this in principle, I'm not sure
it's worth pursuing. The english locale is in the base module and the
others are in a different module. I would leave this as it is for now.
* 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.
Created "Move java and copy specific information in
CompileJavaModules.gmk to module specific makefiles"
https://bugs.openjdk.java.net/browse/JDK-8055192
* 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.
Created "Move jdk/make/data to module specific src dirs after source
restructure" https://bugs.openjdk.java.net/browse/JDK-8055193
*** 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 :=).
Added to general cleanup.
* 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.
Created "Cleanup source and makefile logic for libsplashscreen and
libjavajpeg after source restructure"
https://bugs.openjdk.java.net/browse/JDK-8055194
* The BUILD_LIBT2K is used only by the Oracle closed build, and the
definition should move to the closed sources.
Added to general cleanup
/Erik