at 18.09-beta 170 lines 5.5 kB view raw
1{ stdenv, fetchurl, pkgconfig, unzip, zlib, libpng, bzip2, SDL, SDL_mixer 2, buildEnv, config 3}: 4 5let 6 # Choose your "paksets" of objects, images, text, music, etc. 7 paksets = config.simutrans.paksets or "pak64 pak64.japan pak128 pak128.britain pak128.german"; 8 9 result = with stdenv.lib; withPaks ( 10 if paksets == "*" then attrValues pakSpec # taking all 11 else map (name: pakSpec.${name}) (splitString " " paksets) 12 ); 13 14 ver1 = "120"; 15 ver2 = "2"; 16 ver3 = "2"; 17 version = "${ver1}.${ver2}.${ver3}"; 18 ver_dash = "${ver1}-${ver2}-${ver3}"; 19 20 binary_src = fetchurl { 21 url = "mirror://sourceforge/simutrans/simutrans/${ver_dash}/simutrans-src-${ver_dash}.zip"; 22 sha256 = "1yi6rwbrnfd65qfz63cncw2n56pbypvg6cllwh71mgvs6x2c28kz"; 23 }; 24 25 26 # As of 2015/03, many packsets still didn't have a release for version 120. 27 pakSpec = stdenv.lib.mapAttrs 28 (pakName: attrs: mkPak (attrs // {inherit pakName;})) 29 { 30 pak64 = { 31 srcPath = "120-2/simupak64-120-2"; 32 sha256 = "1s310pssar4s1nf6gi9cizbx4m75avqm2qk039ha5rk8jk4lzkmk"; 33 }; 34 "pak64.japan" = { 35 # No release for 120.2 yet! 36 srcPath = "120-0/simupak64.japan-120-0-1"; 37 sha256 = "14swy3h4ij74bgaw7scyvmivfb5fmp21nixmhlpk3mav3wr3167i"; 38 }; 39 40 pak128 = { 41 srcPath = "pak128%20for%20ST%20120.2.2%20%282.7%2C%20minor%20changes%29/pak128"; 42 sha256 = "1x6g6yfv1hvjyh3ciccly1i2k2n2b63dw694gdg4j90a543rmclg"; 43 }; 44 "pak128.britain" = { 45 srcPath = "pak128.Britain%20for%20120-1/pak128.Britain.1.17-120-1"; 46 sha256 = "1nviwqizvch9n3n826nmmi7c707dxv0727m7lhc1n2zsrrxcxlr5"; 47 }; 48 "pak128.cs" = { # note: it needs pak128 to work 49 url = "mirror://sourceforge/simutrans/Pak128.CS/pak128.cz_v.0.2.1.zip"; 50 sha256 = "008d8x1s0vxsq78rkczlnf57pv1n5hi1v5nbd1l5w3yls7lk11sc"; 51 }; 52 "pak128.german" = { 53 url = "mirror://sourceforge/simutrans/PAK128.german/" 54 + "PAK128.german_0.10.x_for_ST_120.x/PAK128.german_0.10.3_for_ST_120.x.zip"; 55 sha256 = "1379zcviyf3v0wsli33sqa509k6zlw6fkk57vahc44mrnhka5fpb"; 56 }; 57 58 /* This release contains accented filenames that prevent unzipping. 59 "pak192.comic" = { 60 srcPath = "pak192comic%20for%20${ver2_dash}/pak192comic-0.4-${ver2_dash}up"; 61 sha256 = throw ""; 62 }; 63 */ 64 }; 65 66 67 mkPak = { 68 sha256, pakName, srcPath ? null 69 , url ? "mirror://sourceforge/simutrans/${pakName}/${srcPath}.zip" 70 }: 71 stdenv.mkDerivation { 72 name = "simutrans-${pakName}"; 73 unpackPhase = "true"; 74 preferLocalBuild = true; 75 installPhase = let src = fetchurl { inherit url sha256; }; 76 in '' 77 mkdir -p "$out/share/simutrans/${pakName}" 78 cd "$out/share/simutrans/${pakName}" 79 "${unzip}/bin/unzip" "${src}" 80 chmod -R +w . # some zipfiles need that 81 82 set +o pipefail # no idea why it's needed 83 toStrip=`find . -iname '*.pak' | head -n 1 | sed 's|\./\(.*\)/[^/]*$|\1|'` 84 echo "Detected path '$toStrip' to strip" 85 mv ./"$toStrip"/* . 86 rmdir -p "$toStrip" 87 ''; 88 }; 89 90 /* The binaries need all data in one directory; the default is directory 91 of the executable, and another option is the current directory :-/ */ 92 withPaks = paks: buildEnv { 93 inherit (binaries) name; 94 paths = [binaries] ++ paks; 95 postBuild = '' 96 rm "$out/bin" && mkdir "$out/bin" 97 cat > "$out/bin/simutrans" <<EOF 98 #!${stdenv.shell} 99 cd "$out"/share/simutrans 100 exec "${binaries}/bin/simutrans" -use_workdir "\''${extraFlagsArray[@]}" "\$@" 101 EOF 102 chmod +x "$out/bin/simutrans" 103 ''; 104 105 passthru.meta = binaries.meta // { hydraPlatforms = []; }; 106 passthru.binaries = binaries; 107 }; 108 109 binaries = stdenv.mkDerivation rec { 110 name = "simutrans-${version}"; 111 112 src = binary_src; 113 114 sourceRoot = "."; 115 116 nativeBuildInputs = [ pkgconfig ]; 117 buildInputs = [ zlib libpng bzip2 SDL SDL_mixer unzip ]; 118 119 configurePhase = let 120 # Configuration as per the readme.txt and config.template 121 platform = 122 if stdenv.isLinux then "linux" else 123 if stdenv.isDarwin then "mac" else throw "add your platform"; 124 config = '' 125 BACKEND = mixer_sdl 126 COLOUR_DEPTH = 16 127 OSTYPE = ${platform} 128 VERBOSE = 1 129 ''; 130 #TODO: MULTI_THREAD = 1 is "highly recommended", 131 # but it's roughly doubling CPU usage for me 132 in '' 133 echo "${config}" > config.default 134 135 # Use ~/.simutrans instead of ~/simutrans 136 substituteInPlace simsys.cc --replace '%s/simutrans' '%s/.simutrans' 137 138 # use -O2 optimization (defaults are -O or -O3) 139 sed -i -e '/CFLAGS += -O/d' Makefile 140 export CFLAGS+=-O2 141 ''; 142 143 enableParallelBuilding = true; 144 145 installPhase = '' 146 mkdir -p $out/share/ 147 mv simutrans $out/share/ 148 149 mkdir -p $out/bin/ 150 mv build/default/sim $out/bin/simutrans 151 ''; 152 153 meta = with stdenv.lib; { 154 description = "A simulation game in which the player strives to run a successful transport system"; 155 longDescription = '' 156 Simutrans is a cross-platform simulation game in which the 157 player strives to run a successful transport system by 158 transporting goods, passengers, and mail between 159 places. Simutrans is an open source remake of Transport Tycoon. 160 ''; 161 162 homepage = http://www.simutrans.com/; 163 license = with licenses; [ artistic1 gpl1Plus ]; 164 maintainers = with maintainers; [ kkallio vcunat phile314 ]; 165 platforms = with platforms; linux; # TODO: ++ darwin; 166 }; 167 }; 168 169in result 170