From c368530e92ec3f828bcef16d0be79181bf0feb4c Mon Sep 17 00:00:00 2001 From: Andrew Hughes Date: Mon, 16 Aug 2021 18:23:30 +0100 Subject: [PATCH] Initial import of Jigawatts for RHEL 9. Rewrite to use autotools build system, avoiding need for Maven dependencies missing in RHEL 9. This also ensures use of the standard build flags and installs the jar in the expected location. Resolves: rhbz#1972029 --- .gitignore | 1 + jigawatts.spec | 92 ++++++++++++++++++++++++++++++++++++++++++++++ load_library.patch | 58 +++++++++++++++++++++++++++++ sources | 1 + 4 files changed, 152 insertions(+) create mode 100644 jigawatts.spec create mode 100644 load_library.patch create mode 100644 sources diff --git a/.gitignore b/.gitignore index e69de29..e367361 100644 --- a/.gitignore +++ b/.gitignore @@ -0,0 +1 @@ +/e814e2f0a9390b19a4073b074d43de8a0d121b8d.zip diff --git a/jigawatts.spec b/jigawatts.spec new file mode 100644 index 0000000..1f33972 --- /dev/null +++ b/jigawatts.spec @@ -0,0 +1,92 @@ +%global uname jigawatts +%global uversion e814e2f0a9390b19a4073b074d43de8a0d121b8d +%global dversion %(echo %{uversion} | sed s/-/_/) +%global aarch64 aarch64 arm64 armv8 +%global shortcommit %(c=%{uversion}; echo ${c:0:7}) +%global commitdate 20210802 + +Name: %{uname} +Version: 0.2 +Release: 0.3.%{commitdate}%{shortcommit}%{?dist} +Summary: Java CRIU helper +License: GPLv2 with exceptions +URL: https://github.com/chflood/%{uname} +Source0: https://github.com/gnu-andrew/jigawatts/archive/%{uversion}.zip + +Patch0: load_library.patch + +BuildRequires: java-devel +BuildRequires: criu-devel +BuildRequires: gcc +BuildRequires: gcc-c++ +BuildRequires: autoconf +BuildRequires: automake + +Requires: java-headless + +# criu is only available on these architectures +# https://bugzilla.redhat.com/show_bug.cgi?id=902875 +ExclusiveArch: x86_64 %{arm} ppc64le aarch64 s390x + +%description +CRIU is a Linux utility that allows the checkpointing and restoring +of processes.You can read more about CRIU at criu.org. CRIU for +Java is a package which makes it more convenient to use CRIU from +Java. + +%package javadoc +Summary: Javadoc for %{name} +%description javadoc +Javadoc for %{name} + +%prep +%setup -q -n %{uname}-%{uversion} +%patch0 -p1 + +./autogen.sh + +%build + +%configure + +make + +%install + +rm -rf $RPM_BUILD_ROOT +%make_install + +%files +%dir %{_pkgdocdir} +%doc %{_pkgdocdir}/README.md +%dir %{_defaultlicensedir}/%{name} +%license %{_defaultlicensedir}/%{name}/LICENSE.md +%dir %{_javadir}/%{name} +%{_javadir}/%{name}/jigawatt.jar +%{_libdir}/libJigawatts.so + +%files javadoc +%{_javadocdir}/%{name} + +%changelog +* Mon Aug 02 2021 Andrew Hughes - 0.2-0.3.20210802a3007aa +- Rewrite to use autotools build system, avoiding need for Maven dependencies missing in RHEL 9. +- This also ensures use of the standard build flags and installs the jar in the expected location. +- Resolves: rhbz#1972029 + +* Thu Jul 22 2021 Fedora Release Engineering - 0.2-0.2.20210701c15dd4c +- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild + +* Thu Jul 01 2021 Jiri Vanek - 0.2-0.1.20210701c15dd4c +- criu-devel moved to BR +- now requires criu-libs +- enabled debuginfo generation +- excluded i686 build as criu is 64b only +- .so file moved out of jar. Required teo patches: +- added and applied patch0 output_loc.patch +- added and applied patch1 load_library.patch +- on aarch64 workarounded missing lib64 on /usr/LD_LIBRARY_PATH + +* Wed Apr 14 2021 Jiri Vanek - 0.2-0.1.20210701c15dd4c +- initial build +- added requires of criu-devel diff --git a/load_library.patch b/load_library.patch new file mode 100644 index 0000000..cb8bf9a --- /dev/null +++ b/load_library.patch @@ -0,0 +1,58 @@ +diff --git a/src/main/java/org/openjdk/jigawatts/Jigawatts.java b/src/main/java/org/openjdk/jigawatts/Jigawatts.java +index f2766da..8257eeb 100644 +--- a/src/main/java/org/openjdk/jigawatts/Jigawatts.java ++++ b/src/main/java/org/openjdk/jigawatts/Jigawatts.java +@@ -150,38 +150,26 @@ public class Jigawatts { + return Collections.unmodifiableList(crContext.restoreHooks); + } + +- private static void copyLibrary(String library, String destDir) throws IOException { +- +- String libraryName = System.mapLibraryName(library); +- String libraryFile = destDir + "/" + libraryName; +- +- try (InputStream is = Jigawatts.class.getClassLoader().getResourceAsStream(libraryName); +- FileOutputStream os = new FileOutputStream(libraryFile)) { +- +- byte[] buf = new byte[1024]; +- +- int bytesRead; +- +- while ((bytesRead = is.read(buf)) > 0) { +- os.write(buf, 0, bytesRead); ++ private static void loadLib(String library) { ++ String criuLib = System.mapLibraryName(library); ++ boolean success = false; ++ for (String path: System.getProperty("java.library.path").split(":")) { ++ try { ++ String libPath = path + File.separator + criuLib; ++ System.load(libPath); ++ success = true; ++ break; ++ } catch (UnsatisfiedLinkError e) { ++ continue; + } ++ }; ++ if (!success) { ++ throw new RuntimeException(library + " library not found!"); + } + } + + static { +- +- String libDir = System.getProperty("java.io.tmpdir"); +- String tmpLib = libDir+ "/" + System.mapLibraryName("Jigawatts"); +- +- if (!Files.exists(Paths.get(tmpLib))) { +- try { +- copyLibrary("Jigawatts", libDir); +- } catch (IOException ex) { +- throw new RuntimeException("can't initialize Jigawatts",ex); +- } +- } +- System.load(tmpLib); +- System.loadLibrary("criu"); ++ loadLib("Jigawatts"); + + checkpointHooks = new ArrayList(); + restoreHooks = new ArrayList(); diff --git a/sources b/sources new file mode 100644 index 0000000..2885e2d --- /dev/null +++ b/sources @@ -0,0 +1 @@ +SHA512 (e814e2f0a9390b19a4073b074d43de8a0d121b8d.zip) = 5ca78cb7a923a97075be8c61bf017bce56d68c6fb9e132e6474ddc877fbb51e9ef46d03cc2d3b3353c4b9385af7a0684e65377f61b32e9812423b991ee5391cf