Selaa lähdekoodia

[neko] Add support for loading arm ndlls (#10996)

* [neko] Add support for loading arm ndlls

* [tests] Add test for correct ndll path
tobil4sk 2 vuotta sitten
vanhempi
commit
1372eaad59

+ 16 - 2
src/generators/genneko.ml

@@ -675,7 +675,14 @@ let generate_libs_init = function
 					else
 						"/usr/local/lib/haxe/lib/";
 			if( try $loader.loadprim("std@sys_file_type",1)(".haxelib") == "dir" catch e false ) @b = $loader.loadprim("std@file_full_path",1)(".haxelib") + "/";
-			if( $loader.loadprim("std@sys_is64",0)() ) @s = @s + 64;
+			if( $version() >= 240 )
+				@s = @s + switch $loader.loadprim("std@sys_cpu_arch",0)() {
+					"arm64" => "Arm64"
+					"arm" => "Arm"
+					"x86_64" => "64"
+					default => ""
+				};
+			else if( $loader.loadprim("std@sys_is64",0)() ) @s = @s + 64;
 			@b = @b + "/"
 		*)
 		let p = null_pos in
@@ -705,7 +712,14 @@ let generate_libs_init = function
 				),p);
 			],p);
 			(EIf ((ETry (op "==" (call p (loadp "sys_file_type" 1) [str p ".haxelib"]) (str p "dir"),"e",(EConst False,p)),p),op "=" (ident p "@b") (op "+" (call p (loadp "file_full_path" 1) [str p ".haxelib"]) (str p "/")), None),p);
-			(EIf (call p (loadp "sys_is64" 0) [],op "=" es (op "+" es (int p 64)),None),p);
+			(EIf (op ">=" (builtin p "version") (int p 240),
+				(op "=" es (op "+" es (ESwitch (call p (loadp "sys_cpu_arch" 0) [],[
+					(str p "arm64", str p "Arm64");
+					(str p "arm", str p "Arm");
+					(str p "x86_64", str p "64");
+				], Some (str p "")),p))),
+				Some (EIf (call p (loadp "sys_is64" 0) [],op "=" es (op "+" es (int p 64)),None),p)
+			),p);
 			op "=" es (op "+" es (str p "/"));
 		] in
 		let lpath = field p (builtin p "loader") "path" in

+ 70 - 0
tests/misc/neko/projects/Issue10937/Main.hx

@@ -0,0 +1,70 @@
+import sys.io.Process;
+
+using StringTools;
+
+enum abstract Arch(String) {
+	final Arm64;
+	final Arm;
+	final X86;
+	final X86_64;
+
+	public function getNdllSuffix():String {
+		return switch abstract {
+			case Arm64: "Arm64";
+			case Arm: "Arm";
+			case X86_64: "64";
+			case X86: "";
+		};
+	}
+}
+
+function getArchWindows() {
+	return switch Sys.getEnv("PROCESSOR_ARCHITECTURE") {
+		case "x86": X86;
+		case "AMD64": X86_64;
+		case "ARM64": Arm64;
+		case other: throw 'Unknown CPU architecture: $other';
+	};
+}
+
+function getArchUnix() {
+	final uname = new Process("uname", ["-m"]);
+
+	final arch = try {
+		uname.stdout.readLine();
+	} catch (e:haxe.io.Eof) {
+		"";
+	};
+
+	uname.kill();
+	uname.close();
+
+	return switch arch {
+		case "x86_64" | "amd64": X86_64;
+		case "i386" | "x86": X86;
+		case "arm64" | "aarch64": Arm64;
+		case "arm": Arm;
+		case other: throw 'Unknown CPU architecture: "$other"';
+	};
+}
+
+function getArch() {
+	return switch Sys.systemName() {
+		case "Windows":	getArchWindows();
+		default: getArchUnix();
+	};
+}
+
+function main() {
+	final arch = getArch();
+
+	final expectedNdllSubDir = Sys.systemName() + arch.getNdllSuffix() + "/";
+
+	final ndllPath = neko.vm.Loader.local().getPath()[0];
+
+	if (ndllPath.endsWith(expectedNdllSubDir)) {
+		Sys.println("Success");
+	} else {
+		Sys.println('Failure: Expected $ndllPath to end with $expectedNdllSubDir');
+	}
+}

+ 1 - 0
tests/misc/neko/projects/Issue10937/aaa-setup.hxml

@@ -0,0 +1 @@
+--cmd haxelib dev dummy_ndll dummy_ndll

+ 4 - 0
tests/misc/neko/projects/Issue10937/compile.hxml

@@ -0,0 +1,4 @@
+--main Main
+--neko bin/main.n
+-lib dummy_ndll
+--cmd neko bin/main.n

+ 1 - 0
tests/misc/neko/projects/Issue10937/compile.hxml.stdout

@@ -0,0 +1 @@
+Success

+ 0 - 0
tests/misc/neko/projects/Issue10937/dummy_ndll/ndll/.exists


+ 2 - 0
tests/misc/neko/run.hxml

@@ -0,0 +1,2 @@
+-cp ../src
+--run Main

+ 3 - 0
tests/runci/targets/Neko.hx

@@ -8,6 +8,9 @@ class Neko {
 		runCommand("haxe", ["compile-neko.hxml", "-D", "dump", "-D", "dump_ignore_var_ids"].concat(args));
 		runCommand("neko", ["bin/unit.n"]);
 
+		changeDirectory(getMiscSubDir('neko'));
+		runCommand("haxe", ["run.hxml"].concat(args));
+
 		changeDirectory(sysDir);
 		runCommand("haxe", ["compile-neko.hxml"].concat(args));
 		runSysTest("neko", ["bin/neko/sys.n"]);