如何从宏/评估获取到“ haxe.exe”的路径?

时间:2019-01-18 22:08:22

标签: haxe

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

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

但我想尽可能使用到haxe.exe(在* nix上的haxe)的确切路径。到目前为止,我还没有找到从eval或macro获取此路径的API。我是否缺少某些东西或没有此类API?

2 个答案:

答案 0 :(得分:2)

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

否则,您也许可以启动进程,找到路径并将其写入文件:

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(因为需要登录/注销以更新环境变量),但是您可能可以在其中设置环境变量然后使用Sys.getEnv()来获得它?不过,为每个操作系统制作自定义商品也存在同样的问题。

答案 1 :(得分:0)

另一种解决方案是使用宏来访问直接位于 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 );
    }
}