pytrainer: unpin python 3.10
[NixPkgs.git] / pkgs / by-name / fa / factorio / utils.nix
blobb68cc921996e83e5935d8fdc115c41dcfefca12b
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 }:
4 let
5   inherit (lib)
6     flatten
7     head
8     optionals
9     optionalString
10     removeSuffix
11     replaceStrings
12     splitString
13     unique
14     ;
17   mkModDirDrv = mods: modsDatFile: # a list of mod derivations
18     let
19       recursiveDeps = modDrv: [modDrv] ++ map recursiveDeps modDrv.deps;
20       modDrvs = unique (flatten (map recursiveDeps mods));
21     in
22     stdenv.mkDerivation {
23       name = "factorio-mod-directory";
25       preferLocalBuild = true;
26       buildCommand = ''
27         mkdir -p $out
28         for modDrv in ${toString modDrvs}; do
29           # NB: there will only ever be a single zip file in each mod derivation's output dir
30           ln -s $modDrv/*.zip $out
31         done
32       '' + (optionalString (modsDatFile != null) ''
33        cp ${modsDatFile} $out/mod-settings.dat
34       '');
35     };
37     modDrv = { allRecommendedMods, allOptionalMods }:
38       { src
39       , name ? null
40       , deps ? []
41       , optionalDeps ? []
42       , recommendedDeps ? []
43       }: stdenv.mkDerivation {
45         inherit src;
47         # Use the name of the zip, but endstrip ".zip" and possibly the querystring that gets left in by fetchurl
48         name = replaceStrings ["_"] ["-"] (if name != null then name else removeSuffix ".zip" (head (splitString "?" src.name)));
50         deps = deps ++ optionals allOptionalMods optionalDeps
51                     ++ optionals allRecommendedMods recommendedDeps;
53         preferLocalBuild = true;
54         buildCommand = ''
55           mkdir -p $out
56           srcBase=$(basename $src)
57           srcBase=''${srcBase#*-}  # strip nix hash
58           srcBase=''${srcBase%\?*} # strip querystring leftover from fetchurl
59           cp $src $out/$srcBase
60         '';
61       };