1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
|
{ stdenv, callPackage, fetchurl, makeWrapper
, alsaLib, libX11, libXcursor, libXinerama, libXrandr, libXi, mesa_noglu
, factorio-utils, factorio-fetch
, releaseType
, mods ? []
}:
assert releaseType == "alpha" || releaseType == "headless";
with stdenv.lib;
let
version = "0.14.5";
isHeadless = releaseType == "headless";
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";
authenticatedFetch = factorio-fetch;
fetch = rec {
url = "https://www.factorio.com/get-download/${version}/${releaseType}/${arch.inUrl}";
name = "factorio_${releaseType}_${arch.inTar}-${version}.tar.gz";
x64 = {
headless = fetchurl { inherit name url; sha256 = "153sx7rvh9s5nsq0jyw0mnzqwlvhy4qrs4zqz0639akb2j4kcjvk"; };
alpha = authenticatedFetch { inherit url; sha256 = null; };
};
i386 = {
headless = abort "Factorio 32-bit headless binaries are not available for download.";
alpha = authenticatedFetch { inherit url; sha256 = null; };
};
};
configBaseCfg = ''
use-system-read-write-data-directories=false
[path]
read-data=$out/share/factorio/data/
[other]
check_updates=false
'';
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
'';
modDir = factorio-utils.mkModDirDrv mods;
base = {
name = "factorio-${releaseType}-${version}";
src = fetch.${arch.inTar}.${releaseType};
preferLocalBuild = true;
dontBuild = true;
installPhase = ''
mkdir -p $out/{bin,share/factorio}
cp -a data $out/share/factorio
cp -a bin/${arch.inTar}/factorio $out/bin/factorio
patchelf \
--set-interpreter $(cat $NIX_CC/nix-support/dynamic-linker) \
$out/bin/factorio
'';
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 = with stdenv.lib.maintainers; [ Baughn elitak ];
platforms = [ "i686-linux" "x86_64-linux" ];
};
};
headless = base;
alpha = base // {
buildInputs = [ makeWrapper ];
libPath = stdenv.lib.makeLibraryPath [
alsaLib
libX11
libXcursor
libXinerama
libXrandr
libXi
mesa_noglu
];
installPhase = base.installPhase + ''
wrapProgram $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 ${optionalString (mods != []) "--mod-directory=${modDir}"}"
# TODO Currently, every time a mod is changed/added/removed using the
# modlist, a new derivation will take up the entire footprint of the
# client. The only way to avoid this is to remove the mods arg from the
# package function. The modsDir derivation will have to be built
# separately and have the user specify it in the .factorio config or
# right along side it using a symlink into the store I think i will
# just remove mods for the client derivation entirely. this is much
# cleaner and more useful for headless mode.
# TODO: trying to toggle off a mod will result in read-only-fs-error.
# not much we can do about that except warn the user somewhere. In
# fact, no exit will be clean, since this error will happen on close
# regardless. just prints an ugly stacktrace but seems to be otherwise
# harmless, unless maybe the user forgets and tries to use the mod
# manager.
install -m0644 <(cat << EOF
${configBaseCfg}
EOF
) $out/share/factorio/config-base.cfg
install -m0755 <(cat << EOF
${updateConfigSh}
EOF
) $out/share/factorio/update-config.sh
cp -a doc-html $out/share/factorio
'';
};
in stdenv.mkDerivation (if isHeadless then headless else alpha)
|