瀏覽代碼

allowed ndlls with haxelib.

Nicolas Cannasse 19 年之前
父節點
當前提交
0f0c474e00
共有 3 個文件被更改,包括 29 次插入8 次删除
  1. 10 2
      genneko.ml
  2. 12 6
      main.ml
  3. 7 0
      std/tools/haxelib/Main.hx

+ 10 - 2
genneko.ml

@@ -618,7 +618,14 @@ let gen_name ctx acc t =
 	| TTypeDecl _ ->
 		acc
 
-let generate file types hres =
+let generate_libs_init = function
+	| [] -> ""
+	| libs ->
+		List.fold_left (fun acc l ->
+			acc ^ "$loader.path = $array(\"" ^ Nast.escape l ^ "\" + @s,$loader.path);"
+		) "@s = $loader.loadprim(\"std@sys_string\",0)() + \"/\";" libs
+
+let generate file types hres libs =
 	let ctx = {
 		methods = Plugin.defined "debug";
 		curclass = "$boot";
@@ -631,7 +638,8 @@ let generate file types hres =
 	let header = ENeko (
 		"@classes = $new(null);" ^
 		"@enum_to_string = function() { return neko.Boot.__enum_str(this); };" ^
-		"@serialize = function() { return neko.Boot.__serialize(this); };"
+		"@serialize = function() { return neko.Boot.__serialize(this); };" ^ 
+		generate_libs_init libs
 	) , { psource = "<header>"; pline = 1; } in
 	let packs = List.concat (List.map (gen_package ctx h) types) in
 	let names = List.fold_left (gen_name ctx) [] types in

+ 12 - 6
main.ml

@@ -131,7 +131,7 @@ try
 	let hres = Hashtbl.create 0 in
 	let cmds = ref [] in
 	let excludes = ref [] in
-	let libs = ref [] in
+	let libs = ref [] in	
 	let gen_hx = ref false in
 	Plugin.defines := base_defines;
 	Typer.check_override := false;
@@ -278,15 +278,21 @@ try
 	Arg.parse_argv ~current args args_spec args_callback usage;
 	(match !libs with
 	| [] -> ()
-	| l -> 
+	| l ->
+		libs := [];
 		let cmd = "haxelib path " ^ String.concat " " l in
 		let p = Unix.open_process_in cmd in
 		let lines = Std.input_list p in
 		let ret = Unix.close_process_in p in
-		let lines = List.map (fun l ->
+		let lines = List.fold_left (fun acc l ->			
 			let p = String.length l - 1 in
-			if l.[p] = '\r' then String.sub l 0 p else l
-		) lines in
+			let l = (if l.[p] = '\r' then String.sub l 0 p else l) in
+			if p > 3 && String.sub l 0 3 = "-L " then begin
+				libs := String.sub l 3 (String.length l - 3) :: !libs;
+				acc
+			end else
+				l :: acc
+		) [] lines in
 		if ret <> Unix.WEXITED 0 then failwith (String.concat "\n" lines);
 		Plugin.class_path := lines @ !Plugin.class_path;
 	);
@@ -322,7 +328,7 @@ try
 			Genswf.generate file (!swf_version) (!swf_header) (!swf_in) types hres
 		| Neko file ->
 			if !Plugin.verbose then print_endline ("Generating neko : " ^ file);
-			Genneko.generate file types hres
+			Genneko.generate file types hres !libs
 		| Js file ->
 			if !Plugin.verbose then print_endline ("Generating js : " ^ file);
 			Genjs.generate file types hres

+ 7 - 0
std/tools/haxelib/Main.hx

@@ -554,6 +554,13 @@ class Main {
 		var rep = getRepository();
 		for( d in list ) {
 			var dir = rep + Datas.safe(d.project)+"/"+Datas.safe(d.version)+"/";
+			var ndir = dir + "ndll";
+			if( neko.FileSystem.exists(ndir) ) {
+				var sysdir = ndir+"/"+neko.Sys.systemName();
+				if( !neko.FileSystem.exists(sysdir) )
+					throw "Project "+d.project+" version "+d.version+" does not have a neko dll for your system";
+				neko.Lib.println("-L "+ndir+"/");
+			}
 			if( dir.split(" ").length > 1 )
 				dir = '"' + dir + '"';
 			neko.Lib.println(dir);