From 263605431662a7753e5350e653457a08e9861659 Mon Sep 17 00:00:00 2001 From: Craig Everett Date: Wed, 1 Jul 2020 02:54:47 +0900 Subject: [PATCH] WIP: Adding --libs= --- zomp/lib/otpr/zx/0.10.7/src/zx.erl | 82 +++++++++++++++++++++++++++--- 1 file changed, 76 insertions(+), 6 deletions(-) diff --git a/zomp/lib/otpr/zx/0.10.7/src/zx.erl b/zomp/lib/otpr/zx/0.10.7/src/zx.erl index 13f33af..360a400 100644 --- a/zomp/lib/otpr/zx/0.10.7/src/zx.erl +++ b/zomp/lib/otpr/zx/0.10.7/src/zx.erl @@ -907,21 +907,25 @@ run2(FuzzyID, RunArgs) -> Error -> Error end. - run3(PackageID, RunArgs) -> case fetch(PackageID) of ok -> run4(PackageID, RunArgs); Error -> Error end. - run4(PackageID, RunArgs) -> Dir = zx_lib:ppath(lib, PackageID), {ok, Meta} = zx_lib:read_project_meta(Dir), - Type = maps:get(type, Meta), - Deps = maps:get(deps, Meta), - ok = prepare([PackageID | Deps]), - execute(Type, PackageID, Meta, Dir, RunArgs). + case pre_prep(Meta, RunArgs) of + {Type, Deps, NewArgs} -> run5(Type, PackageID, Meta, Dir, Deps, NewArgs); + Error -> Error + end. + +run5(Type, PackageID, Meta, Dir, Deps, NewArgs) -> + case prepare([PackageID | Deps]) of + ok -> execute(Type, PackageID, Meta, Dir, NewArgs); + Error -> Error + end. -spec resolve_version(PackageID) -> Result @@ -1001,6 +1005,72 @@ run_project(ProjectDir, ExecDir, RunArgs) -> Error end. + +-spec pre_prep(Meta, RunArgs) -> {Type, Deps, NewArgs} | {error, term()} + when Meta :: zx_zsp:meta(), + RunArgs :: [string()], + Type :: package_type(), + Deps :: [package_id()], + NewArgs :: [string()]. + +pre_prep(Meta, ["--libs=" ++ LibString | Args]) -> + pre_prep2(Meta, lib_split(LibString), RunArgs); +pre_prep(Meta, RunArgs) -> + pre_prep(Meta, [], RunArgs). + +lib_split(String) -> + lib_split(String, [], []). + +lib_split([$: | Rest], Dep, Deps) -> + {Next, NewDeps} = dep_split(Rest, lists:reverse(Dep), [], Deps), + lib_split(Next, [], NewDeps); +lib_split([C | Rest], Dep, Deps) -> + lib_split(Rest, [C | Dep], Deps); +lib_split([], [], Deps) -> + Deps. + +dep_split([$, | Rest], Dep, Dir, Deps) -> + {Rest, [{Dep, lists:reverse(Dir)} | Deps]}; +dep_split([C | Rest], Dep, Dir, Deps) -> + dep_split(Rest, Dep, [C | Dir], Deps); +dep_split([], Dep, Dir, Deps) -> + {[], [{Dep, lists:reverse(Dir)} | Deps]}. + +pre_prep2(Meta, LocalDeps, RunArgs) -> + Type = maps:get(type, Meta), + Deps = maps:get(deps, Meta), + NewDeps = pre_prep3(Deps, LocalDeps), + {Type, NewDeps, RunArgs}. + + +pre_prep3(Deps, [{Dep, Dir} | Rest]) -> + case zx_lib:package_id(Dep) of + {ok, PackageID} -> pre_prep4(Deps, PackageID, Dir, Rest); + Error -> Error + end; +pre_prep3(Deps, []) -> + {ok, Deps}. + +pre_prep4(Deps, {Realm, Name, _}, Dir, Rest) -> + case file:set_cwd(Dir) of + ok -> + Scrub = + fun(D = {R, N, _}, Acc) -> + case R == Realm and N == Name of + true -> Acc; + false -> [D | Acc] + end + end, + NewDeps = Scrub(Deps, []), + true = os:putenv(Name ++ "_include", filename:join(Dir, "include")), + ok = zx_lib:build(), + pre_prep3(NewDeps, Rest); + Error = {error, enoent} -> + ok = tell(error, "Dir ~p does not exist!", [Dir]), + Error + end. + + -spec prepare([zx:package_id()]) -> ok. %% @private %% Execution prep common to all packages.