nixpkgs/pkgs/development/tools/unity3d/default.nix
2020-04-10 17:54:53 +01:00

140 lines
4.2 KiB
Nix

{ stdenv, lib, fetchurl, makeWrapper, file, getopt
, gtk2, gtk3, gdk-pixbuf, glib, libGL, libGLU, nss, nspr, udev, tbb
, alsaLib, GConf, cups, libcap, fontconfig, freetype, pango
, cairo, dbus, expat, zlib, libpng12, nodejs, gnutar, gcc, gcc_32bit
, libX11, libXcursor, libXdamage, libXfixes, libXrender, libXi
, libXcomposite, libXext, libXrandr, libXtst, libSM, libICE, libxcb, chromium
, libpqxx
}:
let
libPath64 = lib.makeLibraryPath [
gcc.cc gtk2 gdk-pixbuf glib libGL libGLU nss nspr
alsaLib GConf cups libcap fontconfig freetype pango
cairo dbus expat zlib libpng12 udev tbb
libX11 libXcursor libXdamage libXfixes libXrender libXi
libXcomposite libXext libXrandr libXtst libSM libICE libxcb
libpqxx gtk3
];
libPath32 = lib.makeLibraryPath [ gcc_32bit.cc ];
binPath = lib.makeBinPath [ nodejs gnutar ];
ver = "2018.3.0";
build = "f2";
in stdenv.mkDerivation {
pname = "unity-editor";
version = "${ver}x${build}";
src = fetchurl {
url = "https://beta.unity3d.com/download/6e9a27477296/LinuxEditorInstaller/Unity.tar.xz";
sha1 = "083imikkrgha5w9sihjvv1m74naxm5yv";
};
nosuidLib = ./unity-nosuid.c;
nativeBuildInputs = [ makeWrapper file getopt ];
outputs = [ "out" ];
sourceRoot = ".";
buildPhase = ''
cd Editor
$CC -fPIC -shared -o libunity-nosuid.so $nosuidLib -ldl
strip libunity-nosuid.so
cd ..
'';
installPhase = ''
unitydir="$out/opt/Unity/Editor"
mkdir -p $unitydir
mv Editor/* $unitydir
ln -sf /run/wrappers/bin/${chromium.sandboxExecutableName} $unitydir/chrome-sandbox
mkdir -p $out/bin
makeWrapper $unitydir/Unity $out/bin/unity-editor \
--prefix LD_PRELOAD : "$unitydir/libunity-nosuid.so" \
--prefix PATH : "${binPath}"
'';
preFixup = ''
patchFile() {
ftype="$(file -b "$1")"
if [[ "$ftype" =~ LSB\ .*dynamically\ linked ]]; then
if [[ "$ftype" =~ 32-bit ]]; then
rpath="${libPath32}"
intp="$(cat $NIX_CC/nix-support/dynamic-linker-m32)"
else
rpath="${libPath64}"
intp="$(cat $NIX_CC/nix-support/dynamic-linker)"
fi
# Save origin-relative parts of rpath.
originRpath="$(patchelf --print-rpath "$1" | sed "s/:/\n/g" | grep "^\$ORIGIN" | paste -sd ":" - || echo "")"
rpath="$originRpath:$rpath"
patchelf --set-rpath "$rpath" "$1"
patchelf --set-interpreter "$intp" "$1" 2> /dev/null || true
fi
}
upm_linux=$unitydir/Data/Resources/PackageManager/Server/UnityPackageManager
orig_size=$(stat --printf=%s $upm_linux)
# Exclude PlaybackEngines to build something that can be run on FHS-compliant Linuxes
find $unitydir -name PlaybackEngines -prune -o -type f -print | while read path; do
patchFile "$path"
done
new_size=$(stat --printf=%s $upm_linux)
###### zeit-pkg fixing starts here.
# we're replacing plaintext js code that looks like
# PAYLOAD_POSITION = '1234 ' | 0
# [...]
# PRELUDE_POSITION = '1234 ' | 0
# ^-----20-chars-----^^------22-chars------^
# ^-- grep points here
#
# var_* are as described above
# shift_by seems to be safe so long as all patchelf adjustments occur
# before any locations pointed to by hardcoded offsets
var_skip=20
var_select=22
shift_by=$(expr $new_size - $orig_size)
function fix_offset {
# $1 = name of variable to adjust
location=$(grep -obUam1 "$1" $upm_linux | cut -d: -f1)
location=$(expr $location + $var_skip)
value=$(dd if=$upm_linux iflag=count_bytes,skip_bytes skip=$location \
bs=1 count=$var_select status=none)
value=$(expr $shift_by + $value)
echo -n $value | dd of=$upm_linux bs=1 seek=$location conv=notrunc
}
fix_offset PAYLOAD_POSITION
fix_offset PRELUDE_POSITION
'';
dontStrip = true;
dontPatchELF = true;
meta = with stdenv.lib; {
homepage = "https://unity3d.com/";
description = "Game development tool";
longDescription = ''
Popular development platform for creating 2D and 3D multiplatform games
and interactive experiences.
'';
license = licenses.unfree;
platforms = [ "x86_64-linux" ];
maintainers = with maintainers; [ tesq0 ];
};
}