OpenJDK 8 compact profiles fail to build with make 4.0

Erik Joelsson erik.joelsson at oracle.com
Mon Jun 2 14:09:04 UTC 2014


Hello Emmanuel,

I remember that piece of make logic being especially tricky to get 
working and it seems the weirdness in make has been fixed in make 4.0, 
or at least changed. Our dealing with escaping dollars is rather messy 
in JDK 8. I have recently worked on this in a JDK 9 project, where I 
have chosen a different approach that seems to work with both 3.8x and 
4.0. The idea is based on defining this macro in make/common/MakeBase.gmk:

################################################################################
# This macro translates $ into \$ to protect the $ from expansion in the 
shell.
# To make this macro resilient against already escaped strings, first remove
# any present escapes before escaping so that no double escapes are added.
EscapeDollar = $(subst $$,\$$,$(subst \$$,$$,$(strip $1)))

And then instead of escaping dollars explicitly in make variable 
declarations, just call that macro before giving anything containing 
dollars to the shell.

--- a/make/CreateJars.gmk
+++ b/make/CreateJars.gmk
@@ -302,17 +302,15 @@
  # methods from classes that only go into the profile builds.
  BEANLESS_CLASSES = $(IMAGES_OUTPUTDIR)/beanless

-# When there are $ characters in filenames we have some very subtle 
interactions between
-# make expansion and shell expansion. In this particular case $< will 
contain a single $ while
-# $@ will contain \$. So we have to pass $< in single-quotes to avoid 
shell expansion
  $(BEANLESS_CLASSES)/%: $(JDK_OUTPUTDIR)/classes/%
      $(MKDIR) -p $(@D)
-    $(TOOL_REMOVEMETHODS) '$<' $@ addPropertyChangeListener 
removePropertyChangeListener
+    $(TOOL_REMOVEMETHODS) $(call EscapeDollar, $<) $(call EscapeDollar, 
$@) \
+        addPropertyChangeListener removePropertyChangeListener

  CLASSES_TO_DEBEAN = \
      java/util/logging/LogManager.class \
-    java/util/jar/Pack200\$$Packer.class \
-    java/util/jar/Pack200\$$Unpacker.class \
+    java/util/jar/Pack200$$Packer.class \
+    java/util/jar/Pack200$$Unpacker.class \
      com/sun/java/util/jar/pack/PackerImpl.class \
      com/sun/java/util/jar/pack/UnpackerImpl.class

@@ -345,7 +343,7 @@
        $(CD) $(patsubst %$(VERSION_CLASS_PATH), %, $(CLASS_FILE)) && \
        $(JAR) $(RT_JAR_UPDATE_OPTIONS) $@.tmp $(VERSION_CLASS_PATH); \
        $(CD) $(BEANLESS_CLASSES) && \
-      $(JAR) $(RT_JAR_UPDATE_OPTIONS) $@.tmp $(CLASSES_TO_DEBEAN); \
+      $(JAR) $(RT_JAR_UPDATE_OPTIONS) $@.tmp $(call EscapeDollar, 
$(CLASSES_TO_DEBEAN)); \
      fi
      $(MV) $@.tmp $@

The patch above works for me at least.

/Erik

On 2014-05-31 15:35, Emmanuel Bourg wrote:
> Hi,
>
> I'd like to report an issue with the build for the OpenJDK 8 compact
> profiles. On Debian the build fails when PropertyChangeListener is
> removed from the pack200 classes:
>
> ## Starting profiles
> /usr/bin/find: `/home/ebourg/jdk8u-dev/build/images/lib': No such file
> or directory
> make[2]: *** No rule to make target
> '/home/ebourg/jdk8u-dev/build/images/beanless/java/util/jar/Pack200\$Packer.class',
> needed by '/home/ebourg/jdk8u-dev/build/images/libprofile_1/rt.jar'.  Stop.
> make[2]: *** Waiting for unfinished jobs....
> Removed method
> addPropertyChangeListener(java.beans.PropertyChangeListener) from
> java/util/logging/LogManager
> Removed method
> removePropertyChangeListener(java.beans.PropertyChangeListener) from
> java/util/logging/LogManager
> BuildJdk.gmk:113: recipe for target 'profile_1' failed
> make[1]: *** [profile_1] Error 2
> /home/ebourg/jdk8u-dev//make/Main.gmk:147: recipe for target
> 'profiles-only' failed
> make: *** [profiles-only] Error 2
>
>
> The same issue was reported last year on Arch Linux:
>
> http://mail.openjdk.java.net/pipermail/build-dev/2013-July/009557.html
>
> It looks like this error is caused by GNU Make 4.0 which is now the
> default in Debian. I was able to build the compact profiles after
> downgrading make to the version 3.81.
>
> OpenJDK 9 isn't affected by this issue because the
> add/removePropertyChangeListener() methods are already removed.
>
> Make 4.0 caused another regression (JDK-8028407) which has been fixed
> for OpenJDK 9. Could you also consider backporting it to OpenJDK 8 please?
>
> Thank you,
>
> Emmanuel Bourg




More information about the build-dev mailing list