Merge branch 'master' of gitlab.com:zxq9/zx

This commit is contained in:
Craig Everett 2020-07-01 13:50:27 +09:00
commit 37eae54b0f

View File

@ -907,21 +907,25 @@ run2(FuzzyID, RunArgs) ->
Error -> Error Error -> Error
end. end.
run3(PackageID, RunArgs) -> run3(PackageID, RunArgs) ->
case fetch(PackageID) of case fetch(PackageID) of
ok -> run4(PackageID, RunArgs); ok -> run4(PackageID, RunArgs);
Error -> Error Error -> Error
end. end.
run4(PackageID, RunArgs) -> run4(PackageID, RunArgs) ->
Dir = zx_lib:ppath(lib, PackageID), Dir = zx_lib:ppath(lib, PackageID),
{ok, Meta} = zx_lib:read_project_meta(Dir), {ok, Meta} = zx_lib:read_project_meta(Dir),
Type = maps:get(type, Meta), case pre_prep(Meta, RunArgs) of
Deps = maps:get(deps, Meta), {Type, Deps, NewArgs} -> run5(Type, PackageID, Meta, Dir, Deps, NewArgs);
ok = prepare([PackageID | Deps]), Error -> Error
execute(Type, PackageID, Meta, Dir, RunArgs). 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 -spec resolve_version(PackageID) -> Result
@ -1001,6 +1005,72 @@ run_project(ProjectDir, ExecDir, RunArgs) ->
Error Error
end. 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 | RunArgs]) ->
pre_prep2(Meta, lib_split(LibString), RunArgs);
pre_prep(Meta, RunArgs) ->
pre_prep2(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) andalso (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. -spec prepare([zx:package_id()]) -> ok.
%% @private %% @private
%% Execution prep common to all packages. %% Execution prep common to all packages.