如何从 macro/eval 获取到 "haxe.exe" 的路径?

How to get path to "haxe.exe" from macro/eval?

我想从 haxe eval 脚本(或宏)生成一个子进程。这个子进程也是haxe的一个实例,由parent编译代码downloaded/generated。显然,我可以简单地使用

Sys.command('haxe -cpp $buildDir -main CoreMain $coreDefines');

但如果可能,我想使用 haxe.exehaxe on *nix)的确切路径。到目前为止,我还没有找到 API 从 eval 或宏中获取这条路径。我是不是遗漏了什么或者没有这样的东西 API?

我不知道有任何 API 选项可用于获取 haxe 二进制文件的路径,但应该有一个 HAXEPATH environment variable 可以用 Sys.getEnv()?

否则您可能能够启动一个进程,找到路径,并将其写入文件:

function getHaxeBinPath () : String {
    var path = switch ( Sys.systemName () ) {
        case "Windows":
            // Windows Script.
        case "Linux":
            Sys.command ( "echo $( which haxe ) >> exePath.txt" );
            Sys.io.File.getContent ( "exePath.txt" );
        case "BSD":
            // BSD Script.
        case "Mac":
            // Macintosh Script.
        default:
            throw "Unknown Operating System!";
    }

    if ( sys.FileSystem.exists ( "exePath.txt" ) {
        sys.FileSystem.deleteFile ( "exePath.txt" );
    }

    return path;
}

但是您需要为每个操作系统编写一个脚本并说明事物的版本。如果您决定使用它,我认为 Windows 有一个 WHERE 命令您也许可以使用,但我对它的了解并不多。

这似乎不适用于 *nix(因为需要记录 in/out 以更新环境变量),但您 可能 可以在进程中设置环境变量然后用Sys.getEnv()获取吗?不过,为每个 OS 制作自定义物品时也会出现同样的问题。

另一种解决方案是使用宏来访问直接位于 Haxe 标准库中的类型的位置信息:

import haxe.macro.Context;

function resolveHaxePath() : String {
    return switch Context.getType( "StdTypes.Void" ) {
        case TAbstract(_.get() => a,_):
            final pos = Context.getPosInfos( a.pos );
            pos.file.substr( 0, pos.file.lastIndexOf("std") - 1 );
        case _:
            Context.fatalError( "Fail to resolve the compiler's path", (macro _).pos );
    }
}