From abf185c93b2a4a415dc60c40ed37e6cc9ee12318 Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Wed, 24 May 2023 10:34:04 +0200 Subject: [PATCH] Deal with OS-specific jars --- .../src/org/argeo/init/a2/A2Contribution.java | 61 +++++++++++++++++++ .../argeo/init/a2/ProvisioningManager.java | 11 ++++ .../src/org/argeo/init/osgi/OsgiBoot.java | 6 ++ 3 files changed, 78 insertions(+) diff --git a/org.argeo.init/src/org/argeo/init/a2/A2Contribution.java b/org.argeo.init/src/org/argeo/init/a2/A2Contribution.java index a4b720056..9de09cecf 100644 --- a/org.argeo.init/src/org/argeo/init/a2/A2Contribution.java +++ b/org.argeo.init/src/org/argeo/init/a2/A2Contribution.java @@ -14,6 +14,7 @@ public class A2Contribution implements Comparable { final static String CLASSPATH = "classpath"; final static String DEFAULT = "default"; + final static String LIB = "lib"; private final ProvisioningSource source; private final String id; @@ -87,4 +88,64 @@ public class A2Contribution implements Comparable { } } + static String localOsArchRelativePath() { + return Os.local().toString() + "/" + Arch.local().toString(); + } + + static enum Os { + LINUX, WIN32, MACOSX, UNKOWN; + + @Override + public String toString() { + return name().toLowerCase(); + } + + public static Os local() { + String osStr = System.getProperty("os.name").toLowerCase(); + if (osStr.startsWith("linux")) + return LINUX; + if (osStr.startsWith("win")) + return WIN32; + if (osStr.startsWith("mac")) + return MACOSX; + return UNKOWN; + } + + } + + static enum Arch { + X86_64, AARCH64, X86, POWERPC, UNKOWN; + + @Override + public String toString() { + return name().toLowerCase(); + } + + public static Arch local() { + String archStr = System.getProperty("os.arch").toLowerCase(); + return switch (archStr) { + case "x86_64": + case "amd64": + case "x86-64": { + yield X86_64; + } + case "aarch64": + case "arm64": { + yield AARCH64; + } + case "x86": + case "i386": + case "i686": { + yield X86; + } + case "powerpc": + case "ppc": { + yield POWERPC; + } + default: + yield UNKOWN; + }; + } + } + } diff --git a/org.argeo.init/src/org/argeo/init/a2/ProvisioningManager.java b/org.argeo.init/src/org/argeo/init/a2/ProvisioningManager.java index cbb296f4c..6a0836bdf 100644 --- a/org.argeo.init/src/org/argeo/init/a2/ProvisioningManager.java +++ b/org.argeo.init/src/org/argeo/init/a2/ProvisioningManager.java @@ -85,6 +85,17 @@ public class ProvisioningManager { source.load(); addSource(source); OsgiBootUtils.info("Registered " + uri + " as source"); + + // OS specific / native + String localRelPath = A2Contribution.localOsArchRelativePath(); + Path localLibBase = base.resolve(A2Contribution.LIB).resolve(localRelPath); + if (Files.exists(localLibBase)) { + FsA2Source libSource = new FsA2Source(localLibBase, xOr, + SCHEME_A2_REFERENCE.equals(u.getScheme())); + libSource.load(); + addSource(libSource); + OsgiBootUtils.info("Registered OS-specific " + uri + " as source (" + localRelPath + ")"); + } } else { OsgiBootUtils.debug("Source " + base + " does not exist, ignoring."); } diff --git a/org.argeo.init/src/org/argeo/init/osgi/OsgiBoot.java b/org.argeo.init/src/org/argeo/init/osgi/OsgiBoot.java index 884461b12..2e96db3b3 100644 --- a/org.argeo.init/src/org/argeo/init/osgi/OsgiBoot.java +++ b/org.argeo.init/src/org/argeo/init/osgi/OsgiBoot.java @@ -98,19 +98,25 @@ public class OsgiBoot implements OsgiBootConstants { queryPart = source.substring(qmIndex); source = source.substring(0, qmIndex); } + // TODO centralise in A" package? if (source.trim().equals(A2Source.DEFAULT_A2_URI)) { if (Files.exists(homePath)) provisioningManager.registerSource( A2Source.SCHEME_A2 + "://" + homePath.toString() + "/.local/share/a2" + queryPart); provisioningManager.registerSource(A2Source.SCHEME_A2 + ":///usr/local/share/a2" + queryPart); + provisioningManager.registerSource(A2Source.SCHEME_A2 + ":///usr/local/lib/a2" + queryPart); provisioningManager.registerSource(A2Source.SCHEME_A2 + ":///usr/share/a2" + queryPart); + provisioningManager.registerSource(A2Source.SCHEME_A2 + ":///usr/lib/a2" + queryPart); } else if (source.trim().equals(A2Source.DEFAULT_A2_REFERENCE_URI)) { if (Files.exists(homePath)) provisioningManager.registerSource(A2Source.SCHEME_A2_REFERENCE + "://" + homePath.toString() + "/.local/share/a2" + queryPart); provisioningManager .registerSource(A2Source.SCHEME_A2_REFERENCE + ":///usr/local/share/a2" + queryPart); + provisioningManager + .registerSource(A2Source.SCHEME_A2_REFERENCE + ":///usr/local/lib/a2" + queryPart); provisioningManager.registerSource(A2Source.SCHEME_A2_REFERENCE + ":///usr/share/a2" + queryPart); + provisioningManager.registerSource(A2Source.SCHEME_A2_REFERENCE + ":///usr/lib/a2" + queryPart); } else { provisioningManager.registerSource(source + queryPart); } -- 2.30.2