From f06c78e82a1f49320addb014e6844d5322a58d27 Mon Sep 17 00:00:00 2001 From: tobil4sk Date: Sat, 27 Jan 2024 13:20:22 +0000 Subject: [PATCH 1/6] Set HXCPP_ARM64 by default when building on Apple Silicon Mac --- tools/platforms/MacPlatform.hx | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/tools/platforms/MacPlatform.hx b/tools/platforms/MacPlatform.hx index 4f80be65a..dbe8bf522 100644 --- a/tools/platforms/MacPlatform.hx +++ b/tools/platforms/MacPlatform.hx @@ -34,6 +34,7 @@ class MacPlatform extends PlatformTarget private var executableDirectory:String; private var executablePath:String; private var is64:Bool; + private var isArm64:Bool; private var targetType:String; public function new(command:String, _project:HXProject, targetFlags:Map) @@ -103,6 +104,8 @@ class MacPlatform extends PlatformTarget defaults.architectures = [X86]; case X64: defaults.architectures = [X64]; + case ARM64: + defaults.architectures = [ARM64]; default: defaults.architectures = []; } @@ -128,6 +131,10 @@ class MacPlatform extends PlatformTarget { is64 = true; } + if (architecture == Architecture.ARM64) + { + isArm64 = true; + } } if (project.targetFlags.exists("neko") || project.target != cast System.hostPlatform) @@ -270,6 +277,12 @@ class MacPlatform extends PlatformTarget haxeArgs.push("HXCPP_M64"); flags.push("-DHXCPP_M64"); } + else if (isArm64) + { + haxeArgs.push("-D"); + haxeArgs.push("HXCPP_ARM64"); + flags.push("-DHXCPP_ARM64"); + } if (!project.targetFlags.exists("static")) { @@ -379,11 +392,16 @@ class MacPlatform extends PlatformTarget } else { - if (!targetFlags.exists("32") && (command == "rebuild" || System.hostArchitecture == X64)) + if (!targetFlags.exists("32") && System.hostArchitecture == X64) { commands.push(["-Dmac", "-DHXCPP_CLANG", "-DHXCPP_M64"]); } + if (!targetFlags.exists("32") && System.hostArchitecture == ARM64) + { + commands.push(["-Dmac", "-DHXCPP_CLANG", "-DHXCPP_ARM64"]); + } + if (!targetFlags.exists("64") && (targetFlags.exists("32") || System.hostArchitecture == X86)) { commands.push(["-Dmac", "-DHXCPP_CLANG", "-DHXCPP_M32"]); From f0bae5692e85639d7199a906279231e4d054abc1 Mon Sep 17 00:00:00 2001 From: player-03 Date: Sat, 27 Jan 2024 22:29:04 -0500 Subject: [PATCH 2/6] Improve target selection logic in `MacPlatform.rebuild()`. The old logic could produce inappropriate results, such as attempting to compile an x86 binary on ARM64, or compiling no binary when "64" is specified on a 32-bit machine. I'd argue that it makes sense to only check the flags when they're supported, and not to bother otherwise. --- tools/platforms/MacPlatform.hx | 38 +++++++++++++++++----------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/tools/platforms/MacPlatform.hx b/tools/platforms/MacPlatform.hx index dbe8bf522..65c4e7b03 100644 --- a/tools/platforms/MacPlatform.hx +++ b/tools/platforms/MacPlatform.hx @@ -385,27 +385,27 @@ class MacPlatform extends PlatformTarget { var commands = []; - if (targetFlags.exists("hl") && System.hostArchitecture == X64) + switch (System.hostArchitecture) { - // TODO: Support single binary - commands.push(["-Dmac", "-DHXCPP_CLANG", "-DHXCPP_M64", "-Dhashlink"]); - } - else - { - if (!targetFlags.exists("32") && System.hostArchitecture == X64) - { - commands.push(["-Dmac", "-DHXCPP_CLANG", "-DHXCPP_M64"]); - } - - if (!targetFlags.exists("32") && System.hostArchitecture == ARM64) - { - commands.push(["-Dmac", "-DHXCPP_CLANG", "-DHXCPP_ARM64"]); - } - - if (!targetFlags.exists("64") && (targetFlags.exists("32") || System.hostArchitecture == X86)) - { + case X64: + if (targetFlags.exists("hl")) + { + // TODO: Support single binary + commands.push(["-Dmac", "-DHXCPP_CLANG", "-DHXCPP_M64", "-Dhashlink"]); + } + else if (!targetFlags.exists("32")) + { + commands.push(["-Dmac", "-DHXCPP_CLANG", "-DHXCPP_M64"]); + } + else + { + commands.push(["-Dmac", "-DHXCPP_CLANG", "-DHXCPP_M32"]); + } + case X86: commands.push(["-Dmac", "-DHXCPP_CLANG", "-DHXCPP_M32"]); - } + case ARM64: + commands.push(["-Dmac", "-DHXCPP_CLANG", "-DHXCPP_ARM64"]); + default: } if (targetFlags.exists("hl")) From 3d87dfeb97941c8e0544490b92f2334e858158bd Mon Sep 17 00:00:00 2001 From: player-03 Date: Sun, 28 Jan 2024 16:03:37 -0500 Subject: [PATCH 3/6] Only set one of `is64` and `isArm64`. --- tools/platforms/MacPlatform.hx | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/tools/platforms/MacPlatform.hx b/tools/platforms/MacPlatform.hx index 65c4e7b03..f76dbb380 100644 --- a/tools/platforms/MacPlatform.hx +++ b/tools/platforms/MacPlatform.hx @@ -125,16 +125,13 @@ class MacPlatform extends PlatformTarget project.architectures.remove(excludeArchitecture); } - for (architecture in project.architectures) + if (project.architectures.indexOf(X64) != -1) { - if (architecture == Architecture.X64) - { - is64 = true; - } - if (architecture == Architecture.ARM64) - { - isArm64 = true; - } + is64 = true; + } + else if (project.architectures.indexOf(ARM64) != -1) + { + isArm64 = true; } if (project.targetFlags.exists("neko") || project.target != cast System.hostPlatform) From 17ad0577d792cb7b2c54196784621d0daf9570bc Mon Sep 17 00:00:00 2001 From: player-03 Date: Sun, 28 Jan 2024 16:17:24 -0500 Subject: [PATCH 4/6] Merge `is64` and `isArm64`. --- tools/platforms/MacPlatform.hx | 48 +++++++++++++++++++++------------- 1 file changed, 30 insertions(+), 18 deletions(-) diff --git a/tools/platforms/MacPlatform.hx b/tools/platforms/MacPlatform.hx index f76dbb380..b29f1866a 100644 --- a/tools/platforms/MacPlatform.hx +++ b/tools/platforms/MacPlatform.hx @@ -33,10 +33,11 @@ class MacPlatform extends PlatformTarget private var contentDirectory:String; private var executableDirectory:String; private var executablePath:String; - private var is64:Bool; - private var isArm64:Bool; + private var targetArchitecture:Architecture; private var targetType:String; + private var dirSuffix(get, never):String; + public function new(command:String, _project:HXProject, targetFlags:Map) { super(command, _project, targetFlags); @@ -127,11 +128,15 @@ class MacPlatform extends PlatformTarget if (project.architectures.indexOf(X64) != -1) { - is64 = true; + targetArchitecture = X64; } else if (project.architectures.indexOf(ARM64) != -1) { - isArm64 = true; + targetArchitecture = ARM64; + } + else + { + targetArchitecture = X86; } if (project.targetFlags.exists("neko") || project.target != cast System.hostPlatform) @@ -141,7 +146,7 @@ class MacPlatform extends PlatformTarget else if (project.targetFlags.exists("hl")) { targetType = "hl"; - is64 = true; + targetArchitecture = X64; } else if (project.targetFlags.exists("java")) { @@ -161,7 +166,7 @@ class MacPlatform extends PlatformTarget } targetDirectory = Path.combine(project.app.path, project.config.getString("mac.output-directory", targetType == "cpp" ? "macos" : targetType)); - targetDirectory = StringTools.replace(targetDirectory, "arch64", is64 ? "64" : ""); + targetDirectory = StringTools.replace(targetDirectory, "arch64", dirSuffix); applicationDirectory = targetDirectory + "/bin/" + project.app.file + ".app"; contentDirectory = applicationDirectory + "/Contents/Resources"; executableDirectory = applicationDirectory + "/Contents/MacOS"; @@ -183,11 +188,11 @@ class MacPlatform extends PlatformTarget // TODO: Support single binary for HashLink if (targetType == "hl") { - ProjectHelper.copyLibrary(project, ndll, "Mac" + (is64 ? "64" : ""), "", ".hdll", executableDirectory, project.debug, targetSuffix); + ProjectHelper.copyLibrary(project, ndll, "Mac" + dirSuffix, "", ".hdll", executableDirectory, project.debug, targetSuffix); } else { - ProjectHelper.copyLibrary(project, ndll, "Mac" + (is64 ? "64" : ""), "", + ProjectHelper.copyLibrary(project, ndll, "Mac" + dirSuffix, "", (ndll.haxelib != null && (ndll.haxelib.name == "hxcpp" || ndll.haxelib.name == "hxlibc")) ? ".dll" : ".ndll", executableDirectory, project.debug, targetSuffix); @@ -201,8 +206,8 @@ class MacPlatform extends PlatformTarget if (noOutput) return; - NekoHelper.createExecutable(project.templatePaths, "mac" + (is64 ? "64" : ""), targetDirectory + "/obj/ApplicationMain.n", executablePath); - NekoHelper.copyLibraries(project.templatePaths, "mac" + (is64 ? "64" : ""), executableDirectory); + NekoHelper.createExecutable(project.templatePaths, "mac" + dirSuffix, targetDirectory + "/obj/ApplicationMain.n", executablePath); + NekoHelper.copyLibraries(project.templatePaths, "mac" + dirSuffix, executableDirectory); } else if (targetType == "hl") { @@ -210,7 +215,7 @@ class MacPlatform extends PlatformTarget if (noOutput) return; - HashlinkHelper.copyHashlink(project, targetDirectory, executableDirectory, executablePath, is64); + HashlinkHelper.copyHashlink(project, targetDirectory, executableDirectory, executablePath, true); // HashLink looks for hlboot.dat and libraries in the current // working directory, so the .app file won't work properly if it @@ -238,7 +243,7 @@ class MacPlatform extends PlatformTarget System.recursiveCopy(targetDirectory + "/obj/lib", Path.combine(executableDirectory, "lib")); System.copyFile(targetDirectory + "/obj/ApplicationMain" + (project.debug ? "-Debug" : "") + ".jar", Path.combine(executableDirectory, project.app.file + ".jar")); - JavaHelper.copyLibraries(project.templatePaths, "Mac" + (is64 ? "64" : ""), executableDirectory); + JavaHelper.copyLibraries(project.templatePaths, "Mac" + dirSuffix, executableDirectory); } else if (targetType == "nodejs") { @@ -246,8 +251,8 @@ class MacPlatform extends PlatformTarget if (noOutput) return; - // NekoHelper.createExecutable (project.templatePaths, "Mac" + (is64 ? "64" : ""), targetDirectory + "/obj/ApplicationMain.n", executablePath); - // NekoHelper.copyLibraries (project.templatePaths, "Mac" + (is64 ? "64" : ""), executableDirectory); + // NekoHelper.createExecutable (project.templatePaths, "Mac" + dirSuffix, targetDirectory + "/obj/ApplicationMain.n", executablePath); + // NekoHelper.copyLibraries (project.templatePaths, "Mac" + dirSuffix, executableDirectory); } else if (targetType == "cs") { @@ -268,13 +273,13 @@ class MacPlatform extends PlatformTarget var haxeArgs = [hxml, "-D", "HXCPP_CLANG"]; var flags = ["-DHXCPP_CLANG"]; - if (is64) + if (targetArchitecture == X64) { haxeArgs.push("-D"); haxeArgs.push("HXCPP_M64"); flags.push("-DHXCPP_M64"); } - else if (isArm64) + else if (targetArchitecture == ARM64) { haxeArgs.push("-D"); haxeArgs.push("HXCPP_ARM64"); @@ -342,7 +347,7 @@ class MacPlatform extends PlatformTarget context.NODE_FILE = executableDirectory + "/ApplicationMain.js"; context.HL_FILE = targetDirectory + "/obj/ApplicationMain.hl"; context.CPP_DIR = targetDirectory + "/obj/"; - context.BUILD_DIR = project.app.path + "/mac" + (is64 ? "64" : ""); + context.BUILD_DIR = project.app.path + "/mac" + dirSuffix; return context; } @@ -470,7 +475,7 @@ class MacPlatform extends PlatformTarget if (ndll.path == null || ndll.path == "") { - context.ndlls[i].path = NDLL.getLibraryPath(ndll, "Mac" + (is64 ? "64" : ""), "lib", ".a", project.debug); + context.ndlls[i].path = NDLL.getLibraryPath(ndll, "Mac" + dirSuffix, "lib", ".a", project.debug); } } } @@ -545,4 +550,11 @@ class MacPlatform extends PlatformTarget @ignore public override function trace():Void {} @ignore public override function uninstall():Void {} + + // Getters & Setters + + private inline function get_dirSuffix():String + { + return targetArchitecture == X64 ? "64" : ""; + } } From 3ee35b05c06d9a2401b35a7213e4c85a3ab1dec5 Mon Sep 17 00:00:00 2001 From: player-03 Date: Mon, 29 Jan 2024 16:37:17 -0500 Subject: [PATCH 5/6] Streamline architecture selection. I don't know if there are any ARMv6 or ARMv7 Macs, but they were in the old switch block, so maybe? --- tools/platforms/MacPlatform.hx | 33 +++++++-------------------------- 1 file changed, 7 insertions(+), 26 deletions(-) diff --git a/tools/platforms/MacPlatform.hx b/tools/platforms/MacPlatform.hx index b29f1866a..1dc2b959f 100644 --- a/tools/platforms/MacPlatform.hx +++ b/tools/platforms/MacPlatform.hx @@ -95,22 +95,6 @@ class MacPlatform extends PlatformTarget title: "" }; - switch (System.hostArchitecture) - { - case ARMV6: - defaults.architectures = [ARMV6]; - case ARMV7: - defaults.architectures = [ARMV7]; - case X86: - defaults.architectures = [X86]; - case X64: - defaults.architectures = [X64]; - case ARM64: - defaults.architectures = [ARM64]; - default: - defaults.architectures = []; - } - defaults.window.allowHighDPI = false; for (i in 1...project.windows.length) @@ -126,17 +110,14 @@ class MacPlatform extends PlatformTarget project.architectures.remove(excludeArchitecture); } - if (project.architectures.indexOf(X64) != -1) + targetArchitecture = Type.createEnum(Architecture, Type.enumConstructor(System.hostArchitecture)); + for (architecture in project.architectures) { - targetArchitecture = X64; - } - else if (project.architectures.indexOf(ARM64) != -1) - { - targetArchitecture = ARM64; - } - else - { - targetArchitecture = X86; + if (architecture.match(X86 | X64 | ARMV6 | ARMV7 | ARM64)) + { + targetArchitecture = architecture; + break; + } } if (project.targetFlags.exists("neko") || project.target != cast System.hostPlatform) From 560ad5a6ba768c5646d7d4ce2551bcd31e088ff4 Mon Sep 17 00:00:00 2001 From: player-03 Date: Mon, 29 Jan 2024 20:30:06 -0500 Subject: [PATCH 6/6] Don't force an architecture when building HL on Mac. Originally, we forced compilation on x86, presumably because at the time HashLink lacked good 64-bit support. When this support improved, the line was changed to force x64 compilation rather than being removed, which may have been a mistake. Now that there are even more valid architectures, it just doesn't make sense to force one. --- tools/platforms/MacPlatform.hx | 1 - 1 file changed, 1 deletion(-) diff --git a/tools/platforms/MacPlatform.hx b/tools/platforms/MacPlatform.hx index 1dc2b959f..bb6b93add 100644 --- a/tools/platforms/MacPlatform.hx +++ b/tools/platforms/MacPlatform.hx @@ -127,7 +127,6 @@ class MacPlatform extends PlatformTarget else if (project.targetFlags.exists("hl")) { targetType = "hl"; - targetArchitecture = X64; } else if (project.targetFlags.exists("java")) {