如何从Haxe宏/eval脚本中获取haxe.exe的精确路径?
获取Haxe编译器精确路径的解决方案
针对你在eval脚本和宏中需要调用Haxe子进程的场景,下面分两种情况给出可行的方案:
1. 运行时(Eval脚本):直接使用Sys.programPath
在eval脚本这种运行时场景下,你可以直接借助Haxe的Sys.programPath API——它会返回当前正在运行的可执行文件的绝对路径,也就是执行你的eval脚本的那个haxe.exe(类Unix系统下的haxe)的精确路径。
示例代码:
// 获取当前Haxe编译器的绝对路径 var haxeExecPath = Sys.programPath; // 用这个路径启动子编译进程 Sys.command('$haxeExecPath -cpp $buildDir -main CoreMain $coreDefines');
这个方法完全可靠,跨平台通用,不需要依赖系统环境变量。
2. 编译时(宏):通过自定义编译定义传递路径
遗憾的是,Haxe的宏API目前并没有直接暴露当前编译器路径的方法(宏运行在编译进程内,但官方没有提供这个访问入口)。不过我们可以通过传递自定义编译参数的方式来解决:
步骤1:启动父编译进程时传入Haxe路径
在启动执行宏的Haxe进程时,先用Sys.programPath拿到当前编译器的路径,然后通过-D参数传递给宏:
- Linux/macOS:
haxe -D haxe_path="$(which haxe)" your_build.hxml - Windows(cmd中):
或者如果你是在Haxe脚本中启动父进程,直接用haxe -D haxe_path="%~dp0haxe.exe" your_build.hxmlSys.programPath作为参数:Sys.command('haxe -D haxe_path="${Sys.programPath}" your_build.hxml');
步骤2:在宏中获取这个路径
在宏代码里,通过Context.getDefine方法读取我们传递的路径,然后用来启动子进程:
import haxe.macro.Context; import haxe.process.Process; class CompileMacro { public static function runCompile() { // 获取传递的Haxe编译器路径 switch Context.getDefine("haxe_path") { case DefineValue.String(haxePath): // 执行子编译进程 var process = Process.run(haxePath, [ "-cpp", buildDir, "-main", "CoreMain" ].concat(coreDefines.split(" "))); // 处理进程输出和结果 var result = process.wait(); if (result != 0) { trace("编译失败:" + process.stderr.readAll()); } case _: throw new Error("请通过-D haxe_path传递Haxe编译器路径"); } } }
这里用Process.run比Sys.command更灵活,能更好地处理参数和输出。
补充说明
Haxe官方没有提供宏内直接获取编译器路径的API,主要是因为宏设计上尽量和编译进程解耦,避免依赖特定的运行环境。但通过上面的方法,不管是eval脚本还是宏场景,都能可靠地拿到精确的Haxe编译器路径,完全满足你的需求。
内容的提问来源于stack exchange,提问作者Ntrf
相关产品推荐
相关产品推荐

