1# This file provides a top-level function that will be used by both nixpkgs and nixos
2# to generate mod directories for use at runtime by factorio.
3{ lib, stdenv }:
4with lib;
5{
6 mkModDirDrv = mods: modsDatFile: # a list of mod derivations
7 let
8 recursiveDeps = modDrv: [modDrv] ++ map recursiveDeps modDrv.deps;
9 modDrvs = unique (flatten (map recursiveDeps mods));
10 in
11 stdenv.mkDerivation {
12 name = "factorio-mod-directory";
13
14 preferLocalBuild = true;
15 buildCommand = ''
16 mkdir -p $out
17 for modDrv in ${toString modDrvs}; do
18 # NB: there will only ever be a single zip file in each mod derivation's output dir
19 ln -s $modDrv/*.zip $out
20 done
21 '' + (lib.optionalString (modsDatFile != null) ''
22 cp ${modsDatFile} $out/mod-settings.dat
23 '');
24 };
25
26 modDrv = { allRecommendedMods, allOptionalMods }:
27 { src
28 , name ? null
29 , deps ? []
30 , optionalDeps ? []
31 , recommendedDeps ? []
32 }: stdenv.mkDerivation {
33
34 inherit src;
35
36 # Use the name of the zip, but endstrip ".zip" and possibly the querystring that gets left in by fetchurl
37 name = replaceStrings ["_"] ["-"] (if name != null then name else removeSuffix ".zip" (head (splitString "?" src.name)));
38
39 deps = deps ++ optionals allOptionalMods optionalDeps
40 ++ optionals allRecommendedMods recommendedDeps;
41
42 preferLocalBuild = true;
43 buildCommand = ''
44 mkdir -p $out
45 srcBase=$(basename $src)
46 srcBase=''${srcBase#*-} # strip nix hash
47 srcBase=''${srcBase%\?*} # strip querystring leftover from fetchurl
48 cp $src $out/$srcBase
49 '';
50 };
51}