evcc: 0.131.4 -> 0.131.5
[NixPkgs.git] / pkgs / development / beam-modules / build-mix.nix
blobd61b5e91556bd1a63221a787e61631b99cdac0b7
1 { stdenv, writeText, elixir, erlang, hex, lib }:
3 { name
4 , version
5 , src
6 , buildInputs ? [ ]
7 , nativeBuildInputs ? [ ]
8 , erlangCompilerOptions ? [ ]
9   # Deterministic Erlang builds remove full system paths from debug information
10   # among other things to keep builds more reproducible. See their docs for more:
11   # https://www.erlang.org/doc/man/compile
12 , erlangDeterministicBuilds ? true
13 , beamDeps ? [ ]
14 , propagatedBuildInputs ? [ ]
15 , postPatch ? ""
16 , compilePorts ? false
17 , meta ? { }
18 , enableDebugInfo ? false
19 , mixEnv ? "prod"
20 # A config directory that is considered for all the dependencies of an app, typically in $src/config/
21 # This was initially added, as some of Mobilizon's dependencies need to access the config at build time.
22 , appConfigPath ? null
23 , ...
24 }@attrs:
26 let
27   shell = drv: stdenv.mkDerivation {
28     name = "interactive-shell-${drv.name}";
29     buildInputs = [ drv ];
30   };
32   pkg = self: stdenv.mkDerivation (attrs // {
33     name = "${name}-${version}";
34     inherit version src;
36     MIX_ENV = mixEnv;
37     MIX_DEBUG = if enableDebugInfo then 1 else 0;
38     HEX_OFFLINE = 1;
40     ERL_COMPILER_OPTIONS =
41       let
42         options = erlangCompilerOptions ++ lib.optionals erlangDeterministicBuilds [ "deterministic" ];
43       in
44       "[${lib.concatStringsSep "," options}]";
46     LC_ALL = "C.UTF-8";
48     # add to ERL_LIBS so other modules can find at runtime.
49     # http://erlang.org/doc/man/code.html#code-path
50     # Mix also searches the code path when compiling with the --no-deps-check flag
51     setupHook = attrs.setupHook or
52       writeText "setupHook.sh" ''
53       addToSearchPath ERL_LIBS "$1/lib/erlang/lib"
54     '';
56     buildInputs = buildInputs ++ [ ];
57     nativeBuildInputs = nativeBuildInputs ++ [ elixir hex ];
58     propagatedBuildInputs = propagatedBuildInputs ++ beamDeps;
60     configurePhase = attrs.configurePhase or ''
61       runHook preConfigure
63       ${./mix-configure-hook.sh}
64       ${lib.optionalString (!isNull appConfigPath)
65       # Due to https://hexdocs.pm/elixir/main/Config.html the config directory
66       # of a library seems to be not considered, as config is always
67       # application specific. So we can safely delete it.
68       ''
69         rm -rf config
70         cp -r ${appConfigPath} config
71       ''}
73       runHook postConfigure
74     '';
76     buildPhase = attrs.buildPhase or ''
77       runHook preBuild
78       export HEX_HOME="$TEMPDIR/hex"
79       export MIX_HOME="$TEMPDIR/mix"
80       mix compile --no-deps-check
81       runHook postBuild
82     '';
84     installPhase = attrs.installPhase or ''
85       runHook preInstall
87       # This uses the install path convention established by nixpkgs maintainers
88       # for all beam packages. Changing this will break compatibility with other
89       # builder functions like buildRebar3 and buildErlangMk.
90       mkdir -p "$out/lib/erlang/lib/${name}-${version}"
92       # Some packages like db_connection will use _build/shared instead of
93       # honoring the $MIX_ENV variable.
94       for reldir in _build/{$MIX_ENV,shared}/lib/${name}/{src,ebin,priv,include} ; do
95         if test -d $reldir ; then
96           # Some builds produce symlinks (eg: phoenix priv dircetory). They must
97           # be followed with -H flag.
98           cp  -Hrt "$out/lib/erlang/lib/${name}-${version}" "$reldir"
99         fi
100       done
102       # Copy the source so it can be used by dependent packages. For example,
103       # phoenix applications need the source of phoenix and phoenix_html to
104       # build javascript and css assets.
105       mkdir -p $out/src
106       cp -r $src/* "$out/src"
108       runHook postInstall
109     '';
111     # stripping does not have any effect on beam files
112     # it is however needed for dependencies with NIFs like bcrypt for example
113     dontStrip = false;
115     passthru = {
116       packageName = name;
117       env = shell self;
118       inherit beamDeps;
119     };
120   });
122 lib.fix pkg