From dbac077ce8ec5a1cc2ddbc8faf335966255a9504 Mon Sep 17 00:00:00 2001 From: aszlig Date: Mon, 8 Feb 2016 21:05:02 +0100 Subject: steam: Add Starbound Comes in two flavors: stable (beta) and unstable (beta), though at the moment, both are the same version. I've renamed prefixed the command names with starbound-... and also converted underscores to dashes to make the commands a bit more consistent. Also, I made room for Mac OS X and Windows so in *theory* it should also work on these platforms. However I only tested it on NixOS with a 64bit Linux. Signed-off-by: aszlig --- steam/default.nix | 3 ++ steam/starbound.nix | 132 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 135 insertions(+) create mode 100644 steam/starbound.nix diff --git a/steam/default.nix b/steam/default.nix index 84e8669c..03e6b180 100644 --- a/steam/default.nix +++ b/steam/default.nix @@ -9,6 +9,9 @@ let fetchSteam = callPackage ./fetchsteam { inherit (config.steam) username password; }; + + starbound = callPackage ./starbound.nix { flavor = "stable"; }; + starbound-unstable = callPackage ./starbound.nix { flavor = "unstable"; }; }; in with lib; { options.steam = { diff --git a/steam/starbound.nix b/steam/starbound.nix new file mode 100644 index 00000000..ba63fcfa --- /dev/null +++ b/steam/starbound.nix @@ -0,0 +1,132 @@ +{ stdenv, fetchSteam, makeWrapper, SDL, mesa, flavor ? "stable" }: + +let + renameAttrs = f: let + rename = name: value: { + name = f name; + inherit value; + }; + in stdenv.lib.mapAttrs' rename; + + darwinize = renameAttrs (bin: "Starbound.app/Contents/MacOS/${bin}"); + winize = renameAttrs (bin: "${bin}.exe"); + + mkOsBinaryDeps = with stdenv.lib; + if stdenv.system == "x86_64-darwin" then darwinize + else if elem stdenv.system [ "i686-cygwin" "x86_64-cygwin" ] then winize + else id; + + binaryDeps = mkOsBinaryDeps { + starbound.deps = [ SDL mesa ]; + starbound_server.name = "starbound-server"; + asset_packer.name = "starbound-asset-packer"; + asset_unpacker.name = "starbound-asset-unpacker"; + dump_versioned_json.name = "starbound-dump-versioned-json"; + make_versioned_json.name = "starbound-make-versioned-json"; + planet_mapgen.name = "starbound-planet-mapgen"; + }; + + binpath = if stdenv.system == "x86_64-linux" then "linux64" + else if stdenv.system == "i686-linux" then "linux32" + else if stdenv.system == "x86_64-darwin" then "osx" + else if stdenv.system == "i686-cygwin" then "win32" + else if stdenv.system == "x86_64-cygwin" then "win64" + else throw "Unsupported system ${stdenv.system} for Starbound"; + + upstream = let + attrs = if flavor == "stable" then { + name = "starbound"; + appId = 211820; + depotId = 211821; + manifestId = 1842730272313189605; + sha256 = "0qppfn56c778wsg38hi6sxgi3rl9nv72h9rmmxybi1vzpf3p49py"; + } else if flavor == "unstable" then { + name = "starbound-unstable"; + appId = 367540; + depotId = 367541; + manifestId = 6970641909803280413; + sha256 = "0qppfn56c778wsg38hi6sxgi3rl9nv72h9rmmxybi1vzpf3p49py"; + } else throw "Unsupported flavor, use either `stable' or `unstable'."; + in fetchSteam (attrs // { + fileList = [ + "^(?:assets|tiled)/" + ( "^${binpath}(?:/Starbound\\.app/Contents/MacOS)?" + + "/(?:[a-zA-Z0-9_-]+(?:\\.exe)?|sbboot\\.config)$") + ]; + }); + +in stdenv.mkDerivation { + name = "${upstream.name}-20160208"; + + unpackPhase = ":"; + + configurePhase = '' + libexec="$out/libexec/starbound" + data="$out/share/starbound" + ''; + + inherit binpath upstream; + + buildInputs = [ makeWrapper ]; + + buildPhase = with stdenv.lib; '' + mkdir -p patched + sed -e 's,\.\./assets,'"$data/assets"',g' \ + -e 's,\.\./giraffe_storage,.,g' \ + "$upstream/$binpath/sbboot.config" > "patched/sbboot.config" + '' + concatStrings (mapAttrsToList (bin: attrs: '' + mkdir -p "patched/$(dirname "${bin}")" + cp -t "patched/$(dirname "${bin}")" "$upstream/$binpath/${bin}" + chmod +x "patched/$(basename "${bin}")" + patchelf \ + --set-interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)" \ + --set-rpath "${stdenv.lib.makeLibraryPath (attrs.deps or [])}" \ + "patched/$(basename "${bin}")" + if ldd "patched/$(basename "${bin}")" | grep -F 'not found'; then + exit 1; + fi + '') binaryDeps); + + doCheck = true; + + checkPhase = '' + checkFailed= + for i in "$upstream/$binpath"/*; do + [ -f "$i" ] || continue + [ "$(basename "$i")" != launcher ] || continue + [ ! -e "patched/$(basename "$i")" ] || continue + + echo "Found missing binary $i from the upstream tree." + checkFailed=1 + done + [ -z "$checkFailed" ] + ''; + + installPhase = '' + mkdir -p "$out/bin" + ${stdenv.lib.concatStrings (stdenv.lib.mapAttrsToList (bin: attrs: '' + prog="$(basename "${bin}")" + install -vD "patched/$prog" "$libexec/$prog" + cat > "$out/bin/${attrs.name or "$prog"}" <