diff --git a/package/openjdk/openjdk.mk b/package/openjdk/openjdk.mk index edc86c6fbe..963c2bbebe 100644 --- a/package/openjdk/openjdk.mk +++ b/package/openjdk/openjdk.mk @@ -46,6 +46,13 @@ OPENJDK_JVM_VARIANT = zero OPENJDK_DEPENDENCIES += libffi endif +# OpenJDK installs a file named 'modules' in jre/lib, which gets installed as +# /usr/lib/modules. However, with a merged /usr, this conflicts with the +# directory named 'modules' installed by the kernel. If OpenJDK gets built +# after the kernel, this manifests itself with: "cp: cannot overwrite +# directory '/usr/lib/modules with non-directory." +OPENJDK_INSTALL_BASE = /usr/lib/jvm + # OpenJDK ignores some variables unless passed via the environment. # These variables are PATH, LD, CC, CXX, and CPP. # OpenJDK defaults ld to the ld binary but passes -Xlinker and -z as @@ -75,6 +82,7 @@ OPENJDK_CONF_OPTS = \ --with-devkit=$(HOST_DIR) \ --with-extra-cflags="$(TARGET_CFLAGS)" \ --with-extra-cxxflags="$(TARGET_CXXFLAGS)" \ + --with-extra-ldflags="-Wl,-rpath,$(OPENJDK_INSTALL_BASE)/lib,-rpath,$(OPENJDK_INSTALL_BASE)/lib/$(OPENJDK_JVM_VARIANT)" \ --with-giflib=system \ --with-jobs=$(PARALLEL_JOBS) \ --with-jvm-variants=$(OPENJDK_JVM_VARIANT) \ @@ -114,8 +122,12 @@ endef # Calling make install always builds and installs the JDK instead of the JRE, # which makes manual installation necessary. define OPENJDK_INSTALL_TARGET_CMDS - cp -dpfr $(@D)/build/linux-*-release/images/jre/bin/* $(TARGET_DIR)/usr/bin/ - cp -dpfr $(@D)/build/linux-*-release/images/jre/lib/* $(TARGET_DIR)/usr/lib/ + mkdir -p $(TARGET_DIR)$(OPENJDK_INSTALL_BASE) + cp -dpfr $(@D)/build/linux-*-release/images/jre/bin/ \ + $(TARGET_DIR)$(OPENJDK_INSTALL_BASE)/ + cp -dpfr $(@D)/build/linux-*-release/images/jre/lib/ \ + $(TARGET_DIR)$(OPENJDK_INSTALL_BASE)/ + cd $(TARGET_DIR)/usr/bin && ln -snf ../..$(OPENJDK_INSTALL_BASE)/bin/* . endef $(eval $(generic-package))