ninenines / erlang.mk

A build tool for Erlang that just works.
https://erlang.mk
ISC License
578 stars 241 forks source link

relx.config.script isn't evaluated since relx v4 #956

Closed artman41 closed 1 year ago

artman41 commented 2 years ago

Our projects depend on the relx.config.script being evaluated alongside the relx.config

Looks like the new relx plugin only checks for & evaluates the relx.config.

using the following changes, I was able to replicate the old functionality that relx provided

diff --git a/erlang.mk b/erlang.mk
index acbd80d..ab32ec9 100644
--- a/erlang.mk
+++ b/erlang.mk
@@ -7473,6 +7473,7 @@ ifeq ($(filter relx,$(BUILD_DEPS) $(DEPS) $(REL_DEPS)),relx)
 # Configuration.

 RELX_CONFIG ?= $(CURDIR)/relx.config
+RELX_CONFIG_SCRIPT ?= $(CURDIR)/relx.config.script

 RELX_OUTPUT_DIR ?= _rel
 RELX_REL_EXT ?=
@@ -7485,7 +7486,7 @@ endif
 # Core targets.

 ifeq ($(IS_DEP),)
-ifneq ($(wildcard $(RELX_CONFIG)),)
+ifneq ($(wildcard $(RELX_CONFIG))$(wildcard $(RELX_CONFIG_SCRIPT)),)
 rel:: relx-rel

 relup:: relx-relup
@@ -7497,41 +7498,86 @@ distclean:: distclean-relx-rel
 # Plugin-specific targets.

 define relx_release.erl
-   {ok, Config} = file:consult("$(call core_native_path,$(RELX_CONFIG))"),
-   {release, {Name, Vsn0}, _} = lists:keyfind(release, 1, Config),
+   Config0 = 
+       case file:consult("$(call core_native_path,$(RELX_CONFIG))") of
+           {ok, Terms} ->
+               Terms;
+           {error, _} ->
+               []
+       end,
+   Config1 =
+       case filelib:is_file("$(call core_native_path,$(RELX_CONFIG_SCRIPT))") of
+           true ->
+               Bindings = erl_eval:add_binding('CONFIG', Config0, erl_eval:new_bindings()),
+               {ok, Config_} = file:script("$(call core_native_path,$(RELX_CONFIG_SCRIPT))", Bindings),
+               Config_;
+           false ->
+               Config0
+       end,
+   {release, {Name, Vsn0}, _} = lists:keyfind(release, 1, Config1),
    Vsn = case Vsn0 of
        {cmd, Cmd} -> os:cmd(Cmd);
        semver -> "";
        {semver, _} -> "";
        VsnStr -> Vsn0
    end,
-   {ok, _} = relx:build_release(#{name => Name, vsn => Vsn}, Config),
+   {ok, _} = relx:build_release(#{name => Name, vsn => Vsn}, Config1),
    halt(0).
 endef

 define relx_tar.erl
-   {ok, Config} = file:consult("$(call core_native_path,$(RELX_CONFIG))"),
-   {release, {Name, Vsn0}, _} = lists:keyfind(release, 1, Config),
+   Config0 = 
+       case file:consult("$(call core_native_path,$(RELX_CONFIG))") of
+           {ok, Terms} ->
+               Terms;
+           {error, _} ->
+               []
+       end,
+   Config1 =
+       case filelib:is_file("$(call core_native_path,$(RELX_CONFIG_SCRIPT))") of
+           true ->
+               Bindings = erl_eval:add_binding('CONFIG', Config0, erl_eval:new_bindings()),
+               {ok, Config_} = file:script("$(call core_native_path,$(RELX_CONFIG_SCRIPT))", Bindings),
+               Config_;
+           false ->
+               Config0
+       end,
+   {release, {Name, Vsn0}, _} = lists:keyfind(release, 1, Config1),
    Vsn = case Vsn0 of
        {cmd, Cmd} -> os:cmd(Cmd);
        semver -> "";
        {semver, _} -> "";
        VsnStr -> Vsn0
    end,
-   {ok, _} = relx:build_tar(#{name => Name, vsn => Vsn}, Config),
+   {ok, _} = relx:build_tar(#{name => Name, vsn => Vsn}, Config1),
    halt(0).
 endef

 define relx_relup.erl
-   {ok, Config} = file:consult("$(call core_native_path,$(RELX_CONFIG))"),
-   {release, {Name, Vsn0}, _} = lists:keyfind(release, 1, Config),
+   Config0 = 
+       case file:consult("$(call core_native_path,$(RELX_CONFIG))") of
+           {ok, Terms} ->
+               Terms;
+           {error, _} ->
+               []
+       end,
+   Config1 =
+       case filelib:is_file("$(call core_native_path,$(RELX_CONFIG_SCRIPT))") of
+           true ->
+               Bindings = erl_eval:add_binding('CONFIG', Config0, erl_eval:new_bindings()),
+               {ok, Config_} = file:script("$(call core_native_path,$(RELX_CONFIG_SCRIPT))", Bindings),
+               Config_;
+           false ->
+               Config0
+       end,
+   {release, {Name, Vsn0}, _} = lists:keyfind(release, 1, Config1),
    Vsn = case Vsn0 of
        {cmd, Cmd} -> os:cmd(Cmd);
        semver -> "";
        {semver, _} -> "";
        VsnStr -> Vsn0
    end,
-   {ok, _} = relx:build_relup(Name, Vsn, undefined, Config ++ [{output_dir, "$(RELX_OUTPUT_DIR)"}]),
+   {ok, _} = relx:build_relup(Name, Vsn, undefined, Config1 ++ [{output_dir, "$(RELX_OUTPUT_DIR)"}]),
    halt(0).
 endef
essen commented 2 years ago

Oh I didn't realize this was dropped from upstream relx, sorry. Thanks for the patch I will try to cook something permanent when I can (possibly middle of August we'll see).

artman41 commented 2 years ago

@essen I've put together an MR for you - if I've done any of it wrong please say 😃

philipcristiano commented 1 year ago

I've run into this as well, can #960 be merged?

essen commented 1 year ago

Done. Thanks!