diff options
Diffstat (limited to 'nixpkgs/pkgs/development/tools/unity3d/default.nix')
-rw-r--r-- | nixpkgs/pkgs/development/tools/unity3d/default.nix | 143 |
1 files changed, 143 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/development/tools/unity3d/default.nix b/nixpkgs/pkgs/development/tools/unity3d/default.nix new file mode 100644 index 000000000000..dfb5f6abf481 --- /dev/null +++ b/nixpkgs/pkgs/development/tools/unity3d/default.nix @@ -0,0 +1,143 @@ +{ 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, libselinux, pciutils, libpulseaudio +}: + +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 + + libselinux pciutils libpulseaudio + ]; + 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_LIBRARY_PATH : "${libPath64}" \ + --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 ]; + }; +} |