From c6750d2f46d07228b4986fd4e93e286473374dd6 Mon Sep 17 00:00:00 2001 From: Eric Litak Date: Mon, 11 Apr 2016 21:19:14 -0700 Subject: [PATCH] factorio: refactor in preparation for headless version --- pkgs/games/factorio/default.nix | 126 +++++++++++++++++++------------- pkgs/top-level/all-packages.nix | 2 +- 2 files changed, 78 insertions(+), 50 deletions(-) diff --git a/pkgs/games/factorio/default.nix b/pkgs/games/factorio/default.nix index 3118c3fffb1..f9ea485dca7 100644 --- a/pkgs/games/factorio/default.nix +++ b/pkgs/games/factorio/default.nix @@ -4,80 +4,108 @@ # Begin download parameters , username ? "" , password ? "" +, releaseType }: +assert releaseType == "alpha" || releaseType == "headless"; + +with stdenv.lib; let version = "0.12.28"; + isHeadless = releaseType == "headless"; - fetch = callPackage ./fetch.nix { username = username; password = password; }; - arch = if stdenv.system == "x86_64-linux" then "x64" - else if stdenv.system == "i686-linux" then "x32" - else abort "Unsupported platform"; + arch = if stdenv.system == "x86_64-linux" then { + inUrl = "linux64"; + inTar = "x64"; + } else if stdenv.system == "i686-linux" then { + inUrl = "linux32"; + inTar = "i386"; + } else abort "Unsupported platform"; - variants = { + authenticatedFetch = callPackage ./fetch.nix { inherit username password; }; + + fetch = rec { + url = "https://www.factorio.com/get-download/${version}/${releaseType}/${arch.inUrl}"; + name = "factorio_${releaseType}_${arch.inTar}-${version}.tar.gz"; # TODO take this from 302 redirection somehow? fetchurl doesn't help. x64 = { - url = "https://www.factorio.com/get-download/${version}/alpha/linux64"; - sha256 = "01si5n9hb2h0c5q8k3hr3nphsakp9kki84qyp70dgddwqsn8wfjl"; + alpha = authenticatedFetch { inherit url; sha256 = "0vngfrjjib99k6czhg32rikfi36i3p3adx4mxc1z8bi5n70dbwqb"; }; }; - - x32 = { - url = "https://www.factorio.com/get-download/${version}/alpha/linux32"; - sha256 = "13h013ixyhv4rpvh0jv5jry3mrwv65v57nqn16bjh3hr8ip70lkq"; + i386 = { + alpha = authenticatedFetch { inherit url; sha256 = "10135rd9103x79i89p6fh5ssmw612012yyx3yyhb3nzl554zqzbm"; }; }; }; + + configBaseCfg = '' + use-system-read-write-data-directories=false + [path] + read-data=$out/share/factorio/data/ + ''; + + updateConfigSh = '' + #! $SHELL + if [[ -e ~/.factorio/config.cfg ]]; then + # Config file exists, but may have wrong path. + # Try to edit it. I'm sure this is perfectly safe and will never go wrong. + sed -i 's|^read-data=.*|read-data=$out/share/factorio/data/|' ~/.factorio/config.cfg + else + # Config file does not exist. Phew. + install -D $out/share/factorio/config-base.cfg ~/.factorio/config.cfg + fi + ''; + in stdenv.mkDerivation rec { - name = "factorio-${version}"; + name = "factorio-${releaseType}-${version}"; - src = fetch variants.${arch}; + src = fetch.${arch.inTar}.${releaseType}; - libPath = stdenv.lib.makeLibraryPath [ - alsaLib - libX11 - libXcursor - libXinerama - libXrandr - libXi - mesa_noglu - ]; + libPath = stdenv.lib.makeLibraryPath ( + optionals (! isHeadless) [ + alsaLib + libX11 + libXcursor + libXinerama + libXrandr + libXi + mesa_noglu + ] + ); buildInputs = [ makeWrapper ]; + dontBuild = true; + + # TODO detangle headless/normal mode wrapping, libs, etc. test all urls 32/64/headless/gfx installPhase = '' mkdir -p $out/{bin,share/factorio} - cp -a bin/${arch}/factorio $out/bin/factorio.${arch} - cp -a doc-html data $out/share/factorio/ - - # Fortunately, Factorio already supports system-wide installs. - # Unfortunately it's a bit inconvenient to set the paths. - cat > $out/share/factorio/config-base.cfg < $out/share/factorio/update-config.sh <