This is an automated email from the ASF dual-hosted git repository.

neilcsmith pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/netbeans-nbpackage.git


The following commit(s) were added to refs/heads/master by this push:
     new 7fc49b0  Provide arch option for macOS launcher, or attempt to parse 
from runtime filename when present.
     new 8e0f109  Merge pull request #32 from neilcsmith-net/macos-arch
7fc49b0 is described below

commit 7fc49b0531df8604e08b7e0eda04da6cf7fa914d
Author: Neil C Smith <neilcsm...@apache.org>
AuthorDate: Fri Jun 30 17:35:25 2023 +0100

    Provide arch option for macOS launcher, or attempt to parse from runtime 
filename when present.
---
 .../netbeans/nbpackage/macos/AppBundleTask.java    | 73 +++++++++++++++++-----
 .../org/apache/netbeans/nbpackage/macos/MacOS.java |  8 +++
 .../netbeans/nbpackage/macos/PkgPackager.java      |  1 +
 .../netbeans/nbpackage/macos/Messages.properties   |  2 +
 .../nbpackage/macos/Package.swift.template         |  4 +-
 5 files changed, 71 insertions(+), 17 deletions(-)

diff --git 
a/src/main/java/org/apache/netbeans/nbpackage/macos/AppBundleTask.java 
b/src/main/java/org/apache/netbeans/nbpackage/macos/AppBundleTask.java
index 560a5b6..ef79f6c 100644
--- a/src/main/java/org/apache/netbeans/nbpackage/macos/AppBundleTask.java
+++ b/src/main/java/org/apache/netbeans/nbpackage/macos/AppBundleTask.java
@@ -26,6 +26,7 @@ import java.nio.file.StandardOpenOption;
 import java.text.MessageFormat;
 import java.util.Arrays;
 import java.util.List;
+import java.util.Locale;
 import java.util.Map;
 import java.util.stream.Collectors;
 import org.apache.netbeans.nbpackage.AbstractPackagerTask;
@@ -44,6 +45,9 @@ class AppBundleTask extends AbstractPackagerTask {
     private static final String JAR_BIN_FILENAME = "jarBinaries";
     private static final String ENTITLEMENTS_FILENAME = "sandbox.plist";
     private static final String LAUNCHER_SRC_DIRNAME = "macos-launcher-src";
+    private static final String ARCH_X86_64 = "x86_64";
+    private static final String ARCH_ARM64 = "arm64";
+    private static final String ARCH_UNIVERSAL = "universal";
 
     private String bundleName;
 
@@ -55,9 +59,9 @@ class AppBundleTask extends AbstractPackagerTask {
     protected void checkPackageRequirements() throws Exception {
         String[] cmds;
         if (context().getValue(MacOS.CODESIGN_ID).isEmpty()) {
-            cmds = new String[] {"swift"};
+            cmds = new String[]{"swift"};
         } else {
-            cmds = new String[] {"swift", "codesign"};
+            cmds = new String[]{"swift", "codesign"};
         }
         validateTools(cmds);
     }
@@ -94,7 +98,8 @@ class AppBundleTask extends AbstractPackagerTask {
                 .findFirst()
                 .map(path -> path.getFileName().toString())
                 .orElseThrow();
-        Path launcher = compileLauncher(image.resolve(LAUNCHER_SRC_DIRNAME));
+        String arch = findArch();
+        Path launcher = compileLauncher(image.resolve(LAUNCHER_SRC_DIRNAME), 
arch);
         Files.copy(launcher, bundle.resolve("Contents")
                 .resolve("MacOS").resolve(execName),
                 StandardCopyOption.COPY_ATTRIBUTES);
@@ -172,7 +177,7 @@ class AppBundleTask extends AbstractPackagerTask {
     }
 
     private Path findLauncher(Path binDir) throws IOException {
-        try ( var files = Files.list(binDir)) {
+        try (var files = Files.list(binDir)) {
             return files.filter(f -> 
!f.getFileName().toString().endsWith(".exe"))
                     .findFirst().orElseThrow(IOException::new);
         }
@@ -226,8 +231,8 @@ class AppBundleTask extends AbstractPackagerTask {
 
     private void setupSigningConfiguration(Path image, Path bundle) throws 
IOException {
         Files.writeString(image.resolve(ENTITLEMENTS_FILENAME),
-                MacOS.ENTITLEMENTS_TEMPLATE.load(context())
-                , StandardOpenOption.CREATE_NEW);
+                MacOS.ENTITLEMENTS_TEMPLATE.load(context()),
+                 StandardOpenOption.CREATE_NEW);
         var nativeBinaries = FileUtils.find(bundle,
                 context().getValue(MacOS.SIGNING_FILES).orElseThrow());
         Files.writeString(image.resolve(NATIVE_BIN_FILENAME),
@@ -246,17 +251,55 @@ class AppBundleTask extends AbstractPackagerTask {
                 StandardOpenOption.CREATE_NEW);
     }
 
-    private Path compileLauncher(Path launcherProject) throws IOException, 
InterruptedException {
-        var pb = new ProcessBuilder("swift", "build",
-                "--configuration", "release",
-                "--arch", "x86_64");
+    private Path compileLauncher(Path launcherProject, String arch) throws 
IOException, InterruptedException {
+        final ProcessBuilder pb;
+        switch (arch) {
+            case ARCH_X86_64:
+                pb = new ProcessBuilder("swift", "build",
+                        "--configuration", "release",
+                        "--arch", "x86_64");
+                break;
+            case ARCH_ARM64:
+                pb = new ProcessBuilder("swift", "build",
+                        "--configuration", "release",
+                        "--arch", "arm64");
+                break;
+            default:
+                pb = new ProcessBuilder("swift", "build",
+                        "--configuration", "release",
+                        "--arch", "arm64",
+                        "--arch", "x86_64");
+        }
         pb.directory(launcherProject.toFile());
         context().exec(pb);
-        Path launcher = launcherProject.resolve(".build/release/AppLauncher");
-        if (!Files.exists(launcher)) {
-            throw new IOException(launcher.toString());
+        var output = FileUtils.find(launcherProject.resolve(".build"), 
"**/{R,r}elease/AppLauncher");
+        if (output.isEmpty()) {
+            throw new IOException(launcherProject.toString());
+        }
+        return output.get(0);
+    }
+
+    private String findArch() {
+        var arch = 
context().getValue(MacOS.ARCH).orElse("").toLowerCase(Locale.ROOT);
+        if (arch.isBlank()) {
+            var runtimeName = context().getValue(NBPackage.PACKAGE_RUNTIME)
+                    .map(path -> 
path.getFileName().toString().toLowerCase(Locale.ROOT))
+                    .orElse("");
+            if (runtimeName.isBlank()) {
+                return ARCH_UNIVERSAL;
+            }
+            if (runtimeName.contains(ARCH_X86_64) || 
runtimeName.contains("x64")) {
+                return ARCH_X86_64;
+            }
+            if (runtimeName.contains(ARCH_ARM64) || 
runtimeName.contains("aarch64")) {
+                return ARCH_ARM64;
+            }
+        } else if (ARCH_ARM64.equals(arch) || ARCH_X86_64.equals(arch)
+                || ARCH_UNIVERSAL.equals(arch)) {
+            return arch;
         }
-        return launcher;
+        
context().warningHandler().accept(MacOS.MESSAGES.getString("message.unknownarch"));
+        return ARCH_UNIVERSAL;
     }
 
     private void signBinariesInJARs(Path image, Path entitlements, String id)
@@ -282,7 +325,7 @@ class AppBundleTask extends AbstractPackagerTask {
     }
 
     private void signNativeBinaries(Path image, Path entitlements, String id)
-            throws IOException  {
+            throws IOException {
         Path nativeFiles = image.resolve(NATIVE_BIN_FILENAME);
         if (!Files.exists(nativeFiles)) {
             return;
diff --git a/src/main/java/org/apache/netbeans/nbpackage/macos/MacOS.java 
b/src/main/java/org/apache/netbeans/nbpackage/macos/MacOS.java
index 5adecee..285fdf2 100644
--- a/src/main/java/org/apache/netbeans/nbpackage/macos/MacOS.java
+++ b/src/main/java/org/apache/netbeans/nbpackage/macos/MacOS.java
@@ -61,6 +61,14 @@ class MacOS {
     static final Template INFO_TEMPLATE
             = Template.of(INFO_TEMPLATE_PATH, "Info.plist.template",
                     () -> 
MacOS.class.getResourceAsStream("Info.plist.template"));
+    /**
+     * Target system architecture to use for building launcher, etc. Currently
+     * supported values are aarch64, x86_64 and universal. Default attempts to
+     * parse from runtime file, if present, or universal.
+     */
+    static final Option<String> ARCH
+            = Option.ofString("package.macos.arch",
+                    MESSAGES.getString("option.arch.help"));
 
     /**
      * Optional launcher (main.swift) template path.
diff --git a/src/main/java/org/apache/netbeans/nbpackage/macos/PkgPackager.java 
b/src/main/java/org/apache/netbeans/nbpackage/macos/PkgPackager.java
index 2fe4ae7..bd9c8bb 100644
--- a/src/main/java/org/apache/netbeans/nbpackage/macos/PkgPackager.java
+++ b/src/main/java/org/apache/netbeans/nbpackage/macos/PkgPackager.java
@@ -34,6 +34,7 @@ public class PkgPackager implements Packager {
             MacOS.BUNDLE_ID,
             MacOS.ICON_PATH,
             MacOS.INFO_TEMPLATE_PATH,
+            MacOS.ARCH,
             MacOS.LAUNCHER_TEMPLATE_PATH,
             MacOS.ENTITLEMENTS_TEMPLATE_PATH,
             MacOS.SIGNING_FILES,
diff --git 
a/src/main/resources/org/apache/netbeans/nbpackage/macos/Messages.properties 
b/src/main/resources/org/apache/netbeans/nbpackage/macos/Messages.properties
index f28f798..12c3a15 100644
--- a/src/main/resources/org/apache/netbeans/nbpackage/macos/Messages.properties
+++ b/src/main/resources/org/apache/netbeans/nbpackage/macos/Messages.properties
@@ -18,6 +18,7 @@
 # Option file help comments
 option.bundle_id.help=Value for CFBundleIdentifier.
 option.icon.help=Path to icon file (*.icns). Defaults to Apache NetBeans logo.
+option.arch.help=Optional target system architecture (arm64, x86_64 or 
universal). Defaults to parsing runtime or universal.
 option.info_template.help=Optional path to Info.plist template.
 option.launcher_template.help=Optional path to launcher (main.swift) template.
 option.entitlements_template.help=Optional path to codesign entitlements 
template.
@@ -31,3 +32,4 @@ message.validatingtools=Validating required tools - {0}
 message.missingtool=Cannot find required tool - {0}
 message.nocodesignid=No codesign ID has been configured. App bundle will be 
unsigned.
 message.nopkgbuildid=No pkgbuild ID has been configured. Installer will be 
unsigned.
+message.unknownarch=Architecture is not recognised, defaulting to universal.
diff --git 
a/src/main/resources/org/apache/netbeans/nbpackage/macos/Package.swift.template 
b/src/main/resources/org/apache/netbeans/nbpackage/macos/Package.swift.template
index 0e9b7f1..8e92253 100644
--- 
a/src/main/resources/org/apache/netbeans/nbpackage/macos/Package.swift.template
+++ 
b/src/main/resources/org/apache/netbeans/nbpackage/macos/Package.swift.template
@@ -1,4 +1,4 @@
-// swift-tools-version:5.1
+// swift-tools-version:5.3
 // The swift-tools-version declares the minimum version of Swift required to 
build this package.
 /*
 * Licensed to the Apache Software Foundation (ASF) under one
@@ -24,7 +24,7 @@ import PackageDescription
 let package = Package(
     name: "AppLauncher",
     platforms: [
-        .macOS(.v10_13)
+        .macOS(.v11)
     ],
     dependencies: [],
     targets: [


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@netbeans.apache.org
For additional commands, e-mail: commits-h...@netbeans.apache.org

For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists

Reply via email to