This patch adds new module to allow building an image with
JDK 9 or newer from the files found on a Linux host. It does so
by locating javac executable found in the PATH and then navigating
the corresponding directory to collect all required files.

Signed-off-by: Waldemar Kozaczuk <[email protected]>
---
 modules/openjdk9_1x-from-host/.gitignore |  1 +
 modules/openjdk9_1x-from-host/Makefile   | 28 ++++++++++++++++++
 modules/openjdk9_1x-from-host/module.py  | 37 ++++++++++++++++++++++++
 3 files changed, 66 insertions(+)
 create mode 100644 modules/openjdk9_1x-from-host/.gitignore
 create mode 100644 modules/openjdk9_1x-from-host/Makefile
 create mode 100644 modules/openjdk9_1x-from-host/module.py

diff --git a/modules/openjdk9_1x-from-host/.gitignore 
b/modules/openjdk9_1x-from-host/.gitignore
new file mode 100644
index 00000000..f9235a6b
--- /dev/null
+++ b/modules/openjdk9_1x-from-host/.gitignore
@@ -0,0 +1 @@
+usr.manifest
diff --git a/modules/openjdk9_1x-from-host/Makefile 
b/modules/openjdk9_1x-from-host/Makefile
new file mode 100644
index 00000000..6441543f
--- /dev/null
+++ b/modules/openjdk9_1x-from-host/Makefile
@@ -0,0 +1,28 @@
+.PHONY: module clean
+
+include ../common.gmk
+ifneq ($(arch),$(host_arch))
+$(error Cannot provide JDK when cross-compiling)
+endif
+
+SRC = $(shell readlink -f ../..)
+
+javac_exe_path = $(shell realpath $$(which javac))
+javac_bin_path = $(shell dirname $(javac_exe_path))
+java_jdk_path = $(shell dirname $(javac_bin_path))
+libsunec_path = $(shell find $(java_jdk_path) -name libsunec.so)
+
+javac_with_version = $(shell javac -version)
+
+module:
+       @case "$(javac_with_version)" in \
+               "javac 9"*) ;; \
+               "javac 1"[0-9]*) ;; \
+               *) echo "Requires Java 9 or later"; exit 1 ;; \
+       esac
+       $(call very-quiet, $(SRC)/scripts/manifest_from_host.sh 
$(libsunec_path) > usr.manifest)
+       $(call very-quiet, $(SRC)/scripts/manifest_from_host.sh -li 
libfreeblpriv3.so >> usr.manifest)
+       $(call very-quiet, echo "/usr/lib/jvm/java/lib/security/default.policy: 
$(java_jdk_path)/lib/security/default.policy" >> usr.manifest)
+
+clean:
+       rm -f usr.manifest
diff --git a/modules/openjdk9_1x-from-host/module.py 
b/modules/openjdk9_1x-from-host/module.py
new file mode 100644
index 00000000..4685f586
--- /dev/null
+++ b/modules/openjdk9_1x-from-host/module.py
@@ -0,0 +1,37 @@
+from osv.modules.filemap import FileMap
+from osv.modules import api
+import os, os.path
+import subprocess
+
+#Verify that the jdk exists by trying to locate javac (java compiler)
+if subprocess.call(['which', 'javac']) != 0:
+    print('Could not find any jdk on the host. Please install openjdk9 or 
later!')
+    exit(-1)
+
+javac_path = subprocess.check_output(['which', 
'javac']).decode('utf-8').split('\n')[0]
+javac_real_path = os.path.realpath(javac_path)
+java_real_path = os.path.dirname(javac_real_path) + '/java'
+jdk_path = os.path.dirname(os.path.dirname(javac_real_path))
+
+javac_with_version = subprocess.check_output(['javac', '-version'], 
stderr=subprocess.STDOUT).decode('utf-8')
+java_version = javac_with_version.split()[1].split('.')[0]
+
+api.require('ca-certificates')
+api.require('libz')
+provides = ['java','java%s' % java_version]
+
+usr_files = FileMap()
+
+jdk_dir = os.path.basename(jdk_path)
+
+usr_files.add(jdk_path).to('/usr/lib/jvm/java') \
+    .include('lib/**') \
+    .exclude('lib/security/cacerts') \
+    .exclude('man/**') \
+    .exclude('bin/**') \
+    .include('bin/java') \
+    .include('bin/jshell')
+
+usr_files.link('/usr/lib/jvm/' + jdk_dir).to('java')
+usr_files.link('/usr/lib/jvm/java/lib/security/cacerts').to('/etc/pki/java/cacerts')
+usr_files.link('/usr/bin/java').to('/usr/lib/jvm/java/bin/java')
-- 
2.30.2

-- 
You received this message because you are subscribed to the Google Groups "OSv 
Development" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/osv-dev/20210614042047.13437-1-jwkozaczuk%40gmail.com.

Reply via email to