1- load (
2- "@rules_erlang//:util.bzl" ,
3- "path_join" ,
4- )
1+ load ("@bazel_skylib//lib:shell.bzl" , "shell" )
52load (
63 "@rules_erlang//private:util.bzl" ,
74 "additional_file_dest_relative_path" ,
@@ -20,24 +17,20 @@ def _impl(ctx):
2017 out = ctx .actions .declare_file (ctx .attr .out .name )
2118 mix_invocation_dir = ctx .actions .declare_directory ("{}_mix" .format (ctx .label .name ))
2219
23- package_dir = path_join (
24- ctx .label .workspace_root ,
25- ctx .label .package ,
26- )
27-
2820 copy_srcs_commands = []
29- for src in ctx .files .srcs :
30- dest = additional_file_dest_relative_path (ctx .label , src )
31- copy_srcs_commands .extend ([
32- 'mkdir -p "$(dirname ${{MIX_INVOCATION_DIR}}/{dest})"' .format (
33- dest = dest ,
34- ),
35- 'cp {flags}"{src}" "${{MIX_INVOCATION_DIR}}/{dest}"' .format (
36- flags = "-r " if src .is_directory else "" ,
37- src = src .path ,
38- dest = dest ,
39- ),
40- ])
21+ for src in ctx .attr .srcs :
22+ for src_file in src [DefaultInfo ].files .to_list ():
23+ dest = additional_file_dest_relative_path (src .label , src_file )
24+ copy_srcs_commands .extend ([
25+ 'mkdir -p "$(dirname ${{MIX_INVOCATION_DIR}}/{dest})"' .format (
26+ dest = dest ,
27+ ),
28+ 'cp {flags}"{src}" "${{MIX_INVOCATION_DIR}}/{dest}"' .format (
29+ flags = "-r " if src_file .is_directory else "" ,
30+ src = src_file .path ,
31+ dest = dest ,
32+ ),
33+ ])
4134
4235 script = """set -euo pipefail
4336
@@ -60,11 +53,23 @@ MIX_INVOCATION_DIR="{mix_invocation_dir}"
6053
6154{copy_srcs_commands}
6255
56+ ORIGINAL_DIR=$PWD
6357cd "${{MIX_INVOCATION_DIR}}"
6458export HOME="${{PWD}}"
6559export MIX_ENV=prod
6660export ERL_COMPILER_OPTIONS=deterministic
67- "${{ABS_ELIXIR_HOME}}"/bin/mix archive.build -o "${{ABS_OUT_PATH}}"
61+ for archive in {archives}; do
62+ "${{ABS_ELIXIR_HOME}}"/bin/mix archive.install --force $ORIGINAL_DIR/$archive
63+ done
64+ if [[ -n "{ez_deps}" ]]; then
65+ mkdir -p _build/${{MIX_ENV}}/lib
66+ for ez_dep in {ez_deps}; do
67+ unzip -q $ORIGINAL_DIR/$ez_dep -d _build/${{MIX_ENV}}/lib
68+ done
69+ fi
70+ "${{ABS_ELIXIR_HOME}}"/bin/mix archive.build \\
71+ --no-deps-check \\
72+ -o "${{ABS_OUT_PATH}}"
6873
6974# remove symlinks from the _build directory since it
7075# is an unused output, and bazel does not allow them
@@ -75,7 +80,8 @@ find . -type l -delete
7580 elixir_home = elixir_home ,
7681 mix_invocation_dir = mix_invocation_dir .path ,
7782 copy_srcs_commands = "\n " .join (copy_srcs_commands ),
78- package_dir = package_dir ,
83+ archives = " " .join ([shell .quote (a .path ) for a in ctx .files .archives ]),
84+ ez_deps = " " .join ([shell .quote (a .path ) for a in ctx .files .ez_deps ]),
7985 out = out .path ,
8086 )
8187
@@ -84,6 +90,8 @@ find . -type l -delete
8490 transitive = [
8591 erlang_runfiles .files ,
8692 elixir_runfiles .files ,
93+ depset (ctx .files .archives ),
94+ depset (ctx .files .ez_deps ),
8795 ],
8896 )
8997
@@ -110,6 +118,12 @@ mix_archive_build = rule(
110118 mandatory = True ,
111119 allow_files = True ,
112120 ),
121+ "archives" : attr .label_list (
122+ allow_files = [".ez" ],
123+ ),
124+ "ez_deps" : attr .label_list (
125+ allow_files = [".ez" ],
126+ ),
113127 "out" : attr .output (),
114128 },
115129 toolchains = [
0 commit comments