summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArseniy Seroka <jagajaga@users.noreply.github.com>2016-01-24 23:13:49 +0300
committerArseniy Seroka <jagajaga@users.noreply.github.com>2016-01-24 23:13:49 +0300
commit988fcf8890d3805e5902e378f9ef17c56917829d (patch)
treea441641f91b909f7e0fe8ba45e5cc576788daa66
parentMerge pull request #12588 from dezgeg/pr-binutils-platforms (diff)
parentfactorio: init at 0.12.20 (diff)
downloadnixpkgs-988fcf8890d3805e5902e378f9ef17c56917829d.tar.gz
Merge pull request #12561 from Baughn/factorio
factorio: init at 0.12.20
-rw-r--r--pkgs/games/factorio/default.nix100
-rw-r--r--pkgs/games/factorio/fetch.nix33
-rw-r--r--pkgs/games/factorio/fetch.sh44
-rw-r--r--pkgs/top-level/all-packages.nix2
4 files changed, 179 insertions, 0 deletions
diff --git a/pkgs/games/factorio/default.nix b/pkgs/games/factorio/default.nix
new file mode 100644
index 000000000000..b08f977cda6b
--- /dev/null
+++ b/pkgs/games/factorio/default.nix
@@ -0,0 +1,100 @@
+{ stdenv, callPackage, fetchurl, makeWrapper
+# Begin libraries
+, alsaLib, libX11, libXcursor, libXinerama, libXrandr, libXi
+# Begin download parameters
+, username ? ""
+, password ? ""
+}:
+
+let
+ version = "0.12.20";
+
+ 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";
+
+ variants = {
+ x64 = {
+ url = "https://www.factorio.com/get-download/${version}/alpha/linux64";
+ sha256 = "1xpzrx3q678519qgjl92fxn3qv55hd188x9jp6dcfk2ljhi1gmqk";
+ };
+
+ x32 = {
+ url = "https://www.factorio.com/get-download/${version}/alpha/linux32";
+ sha256 = "1dl1dsp4nni5nda437ckyw1ss6w168g19v51h7cdvb3cgsdb7sab";
+ };
+ };
+in
+
+stdenv.mkDerivation rec {
+ name = "factorio-${version}";
+
+ src = fetch variants.${arch};
+
+ libPath = stdenv.lib.makeLibraryPath [
+ alsaLib
+ libX11
+ libXcursor
+ libXinerama
+ libXrandr
+ libXi
+ ];
+
+ buildInputs = [ makeWrapper ];
+
+ 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 <<EOF
+use-system-read-write-data-directories=false
+[path]
+read-data=$out/share/factorio/data/
+EOF
+
+ cat > $out/share/factorio/update-config.sh <<EOF
+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
+EOF
+ chmod a+x $out/share/factorio/update-config.sh
+
+ patchelf \
+ --set-interpreter $(cat $NIX_CC/nix-support/dynamic-linker) \
+ $out/bin/factorio.${arch}
+
+ makeWrapper $out/bin/factorio.${arch} $out/bin/factorio \
+ --prefix LD_LIBRARY_PATH : /run/opengl-driver/lib:$libPath \
+ --run "$out/share/factorio/update-config.sh" \
+ --add-flags "-c \$HOME/.factorio/config.cfg"
+ '';
+
+ meta = {
+ description = "A game in which you build and maintain factories.";
+ longDescription = ''
+ Factorio is a game in which you build and maintain factories.
+
+ You will be mining resources, researching technologies, building
+ infrastructure, automating production and fighting enemies. Use your
+ imagination to design your factory, combine simple elements into
+ ingenious structures, apply management skills to keep it working and
+ finally protect it from the creatures who don't really like you.
+
+ Factorio has been in development since spring of 2012 and it is
+ currently in late alpha.
+ '';
+ homepage = https://www.factorio.com/;
+ license = stdenv.lib.licenses.unfree;
+ maintainers = [ stdenv.lib.maintainers.Baughn ];
+ platforms = [ "i686-linux" "x86_64-linux" ];
+ };
+}
diff --git a/pkgs/games/factorio/fetch.nix b/pkgs/games/factorio/fetch.nix
new file mode 100644
index 000000000000..03dc786492a2
--- /dev/null
+++ b/pkgs/games/factorio/fetch.nix
@@ -0,0 +1,33 @@
+{ stdenv, curl
+# Begin download parameters
+, username ? ""
+, password ? ""
+}:
+
+{
+ # URL to fetch.
+ url ? ""
+
+ # Login URL.
+, loginUrl ? "https://www.factorio.com/login"
+
+ # SHA256 of the fetched URL.
+, sha256 ? ""
+}:
+
+stdenv.mkDerivation {
+ name = "factorio.tar.gz";
+
+ buildInputs = [ curl ];
+
+ inherit url loginUrl username password;
+
+ builder = ./fetch.sh;
+
+ outputHashAlgo = "sha256";
+ outputHash = sha256;
+ outputHashMode = "flat";
+
+ # There's no point in downloading remotely, we'd just slow things down.
+ preferLocalBuild = true;
+}
diff --git a/pkgs/games/factorio/fetch.sh b/pkgs/games/factorio/fetch.sh
new file mode 100644
index 000000000000..ad9766736867
--- /dev/null
+++ b/pkgs/games/factorio/fetch.sh
@@ -0,0 +1,44 @@
+source $stdenv/setup
+
+# Curl flags to increase reliability a bit.
+#
+# Can't use fetchurl, for several reasons. One is that we definitely
+# don't want --insecure for the login, though we need it for the
+# download as their download cert isn't in the standard linux bundle.
+curl="curl \
+ --max-redirs 20 \
+ --retry 3 \
+ --cacert /etc/ssl/certs/ca-bundle.crt \
+ $curlOpts \
+ $NIX_CURL_FLAGS"
+
+# We don't want the password to be on any program's argv, as it may be
+# visible in /proc. Writing it to file with echo should be safe, since
+# it's a shell builtin.
+echo "password=$password" > password
+# Might as well hide the username as well.
+echo "username-or-email=$username" > username
+
+# Log in. We don't especially care about the result, but let's check if login failed.
+$curl -c cookies -d @username -d @password $loginUrl -D headers > /dev/null
+
+if grep -q 'Location: /' headers; then
+ # Now download. We need --insecure for this, but the sha256 should cover us.
+ $curl -b cookies --insecure --location $url > $out
+else
+ echo 'Login failed'
+ echo 'Please set username and password with config.nix,'
+ echo 'or /etc/nix/nixpkgs-config.nix if on NixOS.'
+ echo
+ echo 'Example:'
+ echo '{'
+ echo ' packageOverrides = pkgs: rec {'
+ echo ' factorio = pkgs.factorio.override {'
+ echo ' username = "<username or email address>";'
+ echo ' password = "<password>";'
+ echo ' };'
+ echo ' };'
+ echo '}'
+
+ exit 1
+fi
diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix
index 9e6ccb141ea3..917f6d439876 100644
--- a/pkgs/top-level/all-packages.nix
+++ b/pkgs/top-level/all-packages.nix
@@ -14144,6 +14144,8 @@ let
exult = callPackage ../games/exult { };
+ factorio = callPackage ../games/factorio {};
+
fairymax = callPackage ../games/fairymax {};
fish-fillets-ng = callPackage ../games/fish-fillets-ng {};