summary refs log tree commit diff
path: root/pkgs/development/tools/unity3d
diff options
context:
space:
mode:
authorNikolay Amiantov <ab@fmap.me>2016-05-26 17:45:45 +0300
committerNikolay Amiantov <ab@fmap.me>2016-05-29 17:38:35 +0300
commit846893aabb414de12f301250b21859ddd3318d25 (patch)
tree24a192548ff7077458c092c68aeac95f82ecf507 /pkgs/development/tools/unity3d
parent788ee3bcc1a1b648645a52a54b1b4b08685e054f (diff)
downloadnixpkgs-846893aabb414de12f301250b21859ddd3318d25.tar
nixpkgs-846893aabb414de12f301250b21859ddd3318d25.tar.gz
nixpkgs-846893aabb414de12f301250b21859ddd3318d25.tar.bz2
nixpkgs-846893aabb414de12f301250b21859ddd3318d25.tar.lz
nixpkgs-846893aabb414de12f301250b21859ddd3318d25.tar.xz
nixpkgs-846893aabb414de12f301250b21859ddd3318d25.tar.zst
nixpkgs-846893aabb414de12f301250b21859ddd3318d25.zip
unity3d: 5.1.0f3 -> 5.3.5f1
Diffstat (limited to 'pkgs/development/tools/unity3d')
-rw-r--r--pkgs/development/tools/unity3d/default.nix207
-rw-r--r--pkgs/development/tools/unity3d/unity-nosuid.c32
2 files changed, 139 insertions, 100 deletions
diff --git a/pkgs/development/tools/unity3d/default.nix b/pkgs/development/tools/unity3d/default.nix
index 5c805ac667d..8f89770ffc8 100644
--- a/pkgs/development/tools/unity3d/default.nix
+++ b/pkgs/development/tools/unity3d/default.nix
@@ -1,135 +1,142 @@
-{ GConf
-, alsaLib
-, fetchurl
-, stdenv
-, makeWrapper
-, cairo
-, libcap
-, cups
-, dbus
-, expat
-, postgresql
-, fontconfig
-, freetype
-, gdk_pixbuf
-, getopt
-, fakeroot
-, glib
-, gtk
-, mesa_glu
-, nspr
-, nss
-, pango
-, xorg
-, monodevelop
-, xdg_utils
+{ stdenv, lib, fetchurl, makeWrapper, fakeroot, file, getopt
+, gtk2, gdk_pixbuf, glib, mesa_glu, postgresql, nss, nspr
+, 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
+, mono, libgnomeui, gnome_vfs, gnome-sharp, gtk-sharp
 }:
 
 let
-  deps = [
-    GConf
-    alsaLib
-    cairo
-    cups
-    libcap
-    dbus
-    expat
-    fontconfig
-    freetype
-    glib
-    gtk
-    gdk_pixbuf
-    mesa_glu
-    nspr
-    postgresql
-    nss
-    pango
-    xorg.libXcomposite
-    xorg.libX11
-    xorg.libXcursor
-    xorg.libXdamage
-    xorg.libXfixes
-    xorg.libXi
-    xorg.libXrandr
-    xorg.libXrender
-    xorg.libXtst
+  libPath64 = lib.makeLibraryPath [
+    gcc.cc gtk2 gdk_pixbuf glib mesa_glu postgresql nss nspr
+    alsaLib GConf cups libcap fontconfig freetype pango
+    cairo dbus expat zlib libpng12
+    libX11 libXcursor libXdamage libXfixes libXrender libXi
+    libXcomposite libXext libXrandr libXtst libSM libICE libxcb
   ];
-  libPath = stdenv.lib.makeLibraryPath deps;
-  ver = "5.1.0";
-  build = "f3";
-  date = "2015091501";
+  libPath32 = lib.makeLibraryPath [ gcc_32bit.cc ];
+  binPath = lib.makeBinPath [ nodejs gnutar ];
+  developBinPath = lib.makeBinPath [ mono ];
+  developLibPath = lib.makeLibraryPath [
+    glib libgnomeui gnome_vfs gnome-sharp gtk-sharp gtk-sharp.gtk
+  ];
+  developDotnetPath = lib.concatStringsSep ":" [
+    gnome-sharp gtk-sharp
+  ];
+
+  ver = "5.3.5";
+  build = "f1";
+  date = "20160525";
   pkgVer = "${ver}${build}";
   fullVer = "${pkgVer}+${date}";
+
 in stdenv.mkDerivation rec {
   name = "unity-editor-${version}";
   version = pkgVer;
-  buildInputs = [ makeWrapper monodevelop xdg_utils getopt fakeroot ];
 
   src = fetchurl {
-    url = "http://download.unity3d.com/download_unity/unity-editor-installer-${fullVer}.sh";
-    sha256 = "77b351d80fc4b63284f118093df486e16c13d7b136debae6534245878029a5ca";
+    url = "http://download.unity3d.com/download_unity/linux/unity-editor-installer-${fullVer}.sh";
+    sha256 = "0lmc65175fdvbyn3565pjlg6cc4l5i58fj7bxzi5cqykkbzv5wdm";
   };
 
-  outputs = ["out" "sandbox"];
+  nosuidLib = ./unity-nosuid.c;
+
+  nativeBuildInputs = [ makeWrapper fakeroot file getopt ];
+
+  outputs = [ "out" "monodevelop" "sandbox" ];
 
   unpackPhase = ''
-    # 'yes | fakeroot'
     echo -e 'q\ny' | fakeroot sh $src
     sourceRoot="unity-editor-${pkgVer}"
   '';
 
+  buildPhase = ''
+    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
+
+        rpath="$(patchelf --print-rpath "$1"):$rpath"
+        if [[ "$ftype" =~ LSB\ shared ]]; then
+          patchelf \
+            --set-rpath "$rpath" \
+            "$1"
+        elif [[ "$ftype" =~ LSB\ executable ]]; then
+          patchelf \
+            --set-rpath "$rpath" \
+            --interpreter "$intp" \
+            "$1"
+        fi
+      fi
+    }
+
+    cd Editor
+
+    $CC -fPIC -shared -o libunity-nosuid.so $nosuidLib -ldl
+    strip libunity-nosuid.so
+
+    # Exclude PlaybackEngines to build something that can be run on FHS-compliant Linuxes
+    find . -name PlaybackEngines -prune -o -executable -type f -print | while read path; do
+      patchFile "$path"
+    done
+
+    cd ..
+  '';
+
   installPhase = ''
-    unitydir=$out/opt/Unity
+    install -Dm755 Editor/chrome-sandbox $sandbox/bin/unity-chrome-sandbox
 
-    mkdir -p $out/{bin,opt}
-    mkdir -p $sandbox/bin
+    unitydir="$out/opt/Unity/Editor"
     mkdir -p $unitydir
-    mkdir -p $out/share/applications
-    mkdir -p $out/share/icons/hicolor/{256x256,48x48}/apps
-
-    mv Editor $unitydir
-    mv MonoDevelop $unitydir
-
-    echo "exec $unitydir/Editor/Unity \"\$@\"" > $out/bin/unity-editor
-    chmod +x $out/bin/unity-editor
-
-    sed "/^Exec=/c\Exec=$out/bin/unity-editor" < unity-editor.desktop \
-                                               > $out/share/applications/unity-editor.desktop
-
-    #sed -i "/^Exec=/c\Exec=$out/bin/monodevelop-unity" unity-monodevelop.desktop
-
-    cp unity-editor-icon.png $out/share/icons/hicolor/256x256/apps
-    # cp $unitydir/unity-monodevelop.png $out/share/icons/hicolor/48x48/apps
-
-    rpath="$unitydir/Editor/Data/Tools:$unitydir/Editor:${stdenv.cc.cc}/lib"
-
-    patchelf \
-      --interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)" \
-      $unitydir/Editor/chrome-sandbox
-
-    cp $unitydir/Editor/chrome-sandbox $sandbox/bin
-    rm  $unitydir/Editor/chrome-sandbox
-
-    patchelf \
-      --interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)" \
-      --set-rpath "$rpath" \
-      $unitydir/Editor/Unity
-
-    wrapProgram $out/bin/unity-editor \
-      --prefix LD_LIBRARY_PATH : "${libPath}"
+    mv Editor/* $unitydir
+    ln -sf /var/setuid-wrappers/unity-chrome-sandbox $unitydir/chrome-sandbox
 
+    mkdir -p $out/share/applications
+    sed "/^Exec=/c\Exec=$out/bin/unity-editor" \
+      < unity-editor.desktop \
+      > $out/share/applications/unity-editor.desktop
+
+    install -D unity-editor-icon.png $out/share/icons/hicolor/256x256/apps/unity-editor-icon.png
+
+    mkdir -p $out/bin
+    makeWrapper $unitydir/Unity $out/bin/unity-editor \
+      --prefix LD_PRELOAD : "$unitydir/libunity-nosuid.so" \
+      --prefix PATH : "${binPath}"
+
+    developdir="$monodevelop/opt/Unity/MonoDevelop"
+    mkdir -p $developdir
+    mv MonoDevelop/* $developdir
+
+    mkdir -p $monodevelop/share/applications
+    sed "/^Exec=/c\Exec=$monodevelop/bin/unity-monodevelop" \
+      < unity-monodevelop.desktop \
+      > $monodevelop/share/applications/unity-monodevelop.desktop
+
+    mkdir -p $monodevelop/bin
+    makeWrapper $developdir/bin/monodevelop $monodevelop/bin/unity-monodevelop \
+      --prefix PATH : "${developBinPath}" \
+      --prefix LD_LIBRARY_PATH : "${developLibPath}" \
+      --prefix MONO_GAC_PREFIX : "${developDotnetPath}"
   '';
 
   dontStrip = true;
 
-  meta = {
+  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 = stdenv.lib.licenses.unfree;
-    maintainers = with stdenv.lib.maintainers; [ jb55 ];
+    license = licenses.unfree;
+    platforms = [ "x86_64-linux" ];
+    maintainers = with maintainers; [ jb55 ];
   };
 }
diff --git a/pkgs/development/tools/unity3d/unity-nosuid.c b/pkgs/development/tools/unity3d/unity-nosuid.c
new file mode 100644
index 00000000000..26a923ab039
--- /dev/null
+++ b/pkgs/development/tools/unity3d/unity-nosuid.c
@@ -0,0 +1,32 @@
+#define _GNU_SOURCE
+
+#include <stdio.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <dlfcn.h>
+
+static const char sandbox_path[] = "/chrome-sandbox";
+
+int __xstat(int ver, const char* path, struct stat* stat_buf) {
+  static int (*original_xstat)(int, const char*, struct stat*) = NULL;
+  if (original_xstat == NULL) {
+    int (*fun)(int, const char*, struct stat*) = dlsym(RTLD_NEXT, "__xstat");
+    if (fun == NULL) {
+      return -1;
+    };
+    original_xstat = fun;
+  };
+
+  int res = (*original_xstat)(ver, path, stat_buf);
+  if (res == 0) {
+    char* pos = strstr(path, sandbox_path);
+    if (pos != NULL && *(pos + sizeof(sandbox_path) - 1) == '\0') {
+      printf("Lying about chrome-sandbox access rights...\n");
+      stat_buf->st_uid = 0;
+      stat_buf->st_gid = 0;
+      stat_buf->st_mode = 0104755;
+    };
+  }
+  return res;
+}