about summary refs log tree commit diff
path: root/pkgs/applications/networking/dropbox
diff options
context:
space:
mode:
authorThomas Tuegel <ttuegel@mailbox.org>2017-11-02 11:42:07 -0500
committerThomas Tuegel <ttuegel@mailbox.org>2017-11-02 11:42:07 -0500
commit9a9ea65de9a80772dc3c385b7cd2c29a4ae1122f (patch)
tree136ed7f0c095a69647bab70e34e3a6d2517962ab /pkgs/applications/networking/dropbox
parent26e4f6f4f8a0466432e4eaa750076c96e7a65ca5 (diff)
dropbox: use buildFHSUserEnv
Instead of adapting Dropbox to NixOS with patchelf, NixOS is adapted to Dropbox
with an FHS user environment. A crash due to missing libXert (#15356) is
fixed. The client's automatic updater is fixed; this obviates the need to
update Dropbox in Nixpkgs every time the client is updated upstream!

Resolves: #15356
Diffstat (limited to 'pkgs/applications/networking/dropbox')
-rw-r--r--pkgs/applications/networking/dropbox/default.nix148
1 files changed, 29 insertions, 119 deletions
diff --git a/pkgs/applications/networking/dropbox/default.nix b/pkgs/applications/networking/dropbox/default.nix
index 06ac05da36d84..d15b1d545b442 100644
--- a/pkgs/applications/networking/dropbox/default.nix
+++ b/pkgs/applications/networking/dropbox/default.nix
@@ -1,57 +1,23 @@
-{ mkDerivation, stdenv, lib, fetchurl, makeDesktopItem
-, makeWrapper, patchelf
-, dbus_libs, fontconfig, freetype, gcc, glib
-, libdrm, libffi, libICE, libSM
-, libX11, libXcomposite, libXext, libXmu, libXrender, libxcb
-, libxml2, libxslt, ncurses, zlib
-, qtbase, qtdeclarative, qtwebkit, wmctrl
-}:
+{ stdenv, lib, buildFHSUserEnv, writeScript, makeDesktopItem }:
 
-# this package contains the daemon version of dropbox
-# it's unfortunately closed source
-#
-# note: the resulting program has to be invoced as
-# 'dropbox' because the internal python engine takes
-# uses the name of the program as starting point.
+let platforms = [ "i686-linux" "x86_64-linux" ]; in
 
-# Dropbox ships with its own copies of some libraries.
-# Unfortunately, upstream makes changes to the source of
-# some libraries, rendering them incompatible with the
-# open-source versions. Wherever possible, we must try
-# to make the bundled libraries work, rather than replacing
-# them with our own.
+assert lib.elem stdenv.system platforms;
 
+# Dropbox client to bootstrap installation.
+# The client is self-updating, so the actual version may be newer.
 let
-  ## Prefetch commands to run after update, from this directory:
-  ## e.g. with Emacs: C-u M-x shell-command
-  # nix-prefetch-url ../../../../ -A dropbox.src
-  # nix-prefetch-url ../../../../ -A pkgsi686Linux.dropbox.src
-
-  # NOTE: When updating, please also update in current stable,
-  # as older versions stop working
-  version = "37.4.29";
-  sha256 = {
-    "x86_64-linux" = "0ymy8gb57bjq2mq35n52q2viww6am7wy0vskyvypliicggga8iaj";
-    "i686-linux"   = "0a7zir6x7z3ad71fj1iljc2l6x09f4wi40jfaiinf8ykx85cldw6";
-  }."${stdenv.system}" or (throw "system ${stdenv.system} not supported");
+  version = "38.4.27";
 
   arch = {
     "x86_64-linux" = "x86_64";
     "i686-linux"   = "x86";
-  }."${stdenv.system}" or (throw "system ${stdenv.system} not supported");
-
-  # relative location where the dropbox libraries are stored
-  appdir = "opt/dropbox";
+  }.${stdenv.system};
 
-  libs = [
-    dbus_libs fontconfig freetype gcc.cc glib libdrm libffi libICE libSM
-    libX11 libXcomposite libXext libXmu libXrender libxcb libxml2 libxslt
-    ncurses zlib
-
-    qtbase qtdeclarative qtwebkit
-  ];
-  ldpath = stdenv.lib.makeLibraryPath libs;
+  installer = "https://clientupdates.dropboxstatic.com/dbx-releng/client/dropbox-lnx.${arch}-${version}.tar.gz";
+in
 
+let
   desktopItem = makeDesktopItem {
     name = "dropbox";
     exec = "dropbox";
@@ -61,93 +27,37 @@ let
     categories = "Network;FileTransfer;";
     startupNotify = "false";
   };
+in
 
-in mkDerivation {
-  name = "dropbox-${version}";
-  src = fetchurl {
-    name = "dropbox-${version}.tar.gz";
-    url = "https://clientupdates.dropboxstatic.com/dbx-releng/client/dropbox-lnx.${arch}-${version}.tar.gz";
-    inherit sha256;
-  };
-
-  sourceRoot = ".dropbox-dist";
+buildFHSUserEnv {
+  name = "dropbox";
 
-  nativeBuildInputs = [ makeWrapper patchelf ];
-  buildInputs = libs;
-  dontStrip = true; # already done
-
-  installPhase = ''
-    runHook preInstall
-
-    mkdir -p "$out/${appdir}"
-    cp -r --no-preserve=mode "dropbox-lnx.${arch}-${version}"/* "$out/${appdir}/"
-
-    # Vendored libraries interact poorly with our graphics drivers
-    rm "$out/${appdir}/libdrm.so.2"
-    rm "$out/${appdir}/libffi.so.6"
-    rm "$out/${appdir}/libGL.so.1"
-    rm "$out/${appdir}/libX11-xcb.so.1"
-
-    # Cannot use vendored Qt libraries due to problem with xkbcommon
-    rm "$out/${appdir}/"libQt5*.so.5
-    rm "$out/${appdir}/qt.conf"
-    rm -fr "$out/${appdir}/plugins"
+  targetPkgs = pkgs: with pkgs; with xlibs; [
+    libICE libSM libX11 libXcomposite libXdamage libXext libXfixes libXrender
+    libXxf86vm libxcb
+    curl dbus fontconfig freetype gcc glib gnutar libxml2 libxslt zlib
+  ];
 
+  extraInstallCommands = ''
     mkdir -p "$out/share/applications"
     cp "${desktopItem}/share/applications/"* $out/share/applications
-
-    mkdir -p "$out/share/icons"
-    ln -s "$out/${appdir}/images/hicolor" "$out/share/icons/hicolor"
-
-    mkdir -p "$out/bin"
-    RPATH="${ldpath}:$out/${appdir}"
-    chmod 755 $out/${appdir}/dropbox
-    makeWrapper "$out/${appdir}/dropbox" "$out/bin/dropbox" \
-      --prefix LD_LIBRARY_PATH : "$RPATH"
-
-
-    rm $out/${appdir}/wmctrl
-    ln -s ${wmctrl}/bin/wmctrl $out/${appdir}/wmctrl
-
-    runHook postInstall
   '';
 
-  preFixup = ''
-    INTERP=$(cat $NIX_CC/nix-support/dynamic-linker)
-    RPATH="${ldpath}:$out/${appdir}"
-    getType='s/ *Type: *\([A-Z]*\) (.*/\1/'
-    find "$out/${appdir}" -type f -print | while read obj; do
-        dynamic=$(readelf -S "$obj" 2>/dev/null | grep "DYNAMIC" || true)
-        if [[ -n "$dynamic" ]]; then
-
-            if readelf -l "$obj" 2>/dev/null | grep "INTERP" >/dev/null; then
-                echo "patching interpreter path in $type $obj"
-                patchelf --set-interpreter "$INTERP" "$obj"
-            fi
-
-            type=$(readelf -h "$obj" 2>/dev/null | grep 'Type:' | sed -e "$getType")
-            if [ "$type" == "EXEC" ] || [ "$type" == "DYN" ]; then
-
-                echo "patching RPATH in $type $obj"
-                oldRPATH=$(patchelf --print-rpath "$obj")
-                patchelf --set-rpath "''${oldRPATH:+$oldRPATH:}$RPATH" "$obj"
-
-            else
-
-                echo "unknown ELF type \"$type\"; not patching $obj"
-
-            fi
-        fi
-    done
-
-    paxmark m $out/${appdir}/dropbox
+  runScript = writeScript "install-and-start-dropbox" ''
+    if ! [ -d "$HOME/.dropbox-dist" ]; then
+        # Dropbox is not installed.
+        # Download and unpack the client. If a newer version is available,
+        # the client will update itself when run.
+        curl '${installer}' | tar -C "$HOME" -x -z
+    fi
+    exec "$HOME/.dropbox-dist/dropboxd"
   '';
 
   meta = with lib; {
     description = "Online stored folders (daemon version)";
-    homepage    = http://www.dropbox.com;
-    maintainers = with maintainers; [ ttuegel ];
+    homepage    = http://www.dropbox.com/;
     license     = licenses.unfree;
+    maintainers = with maintainers; [ ttuegel ];
     platforms   = [ "i686-linux" "x86_64-linux" ];
   };
 }