about summary refs log tree commit diff
path: root/nixpkgs/pkgs/development/libraries/java/swt/default.nix
diff options
context:
space:
mode:
Diffstat (limited to 'nixpkgs/pkgs/development/libraries/java/swt/default.nix')
-rw-r--r--nixpkgs/pkgs/development/libraries/java/swt/default.nix147
1 files changed, 116 insertions, 31 deletions
diff --git a/nixpkgs/pkgs/development/libraries/java/swt/default.nix b/nixpkgs/pkgs/development/libraries/java/swt/default.nix
index bf35490f9a88..b85b348a9640 100644
--- a/nixpkgs/pkgs/development/libraries/java/swt/default.nix
+++ b/nixpkgs/pkgs/development/libraries/java/swt/default.nix
@@ -1,73 +1,158 @@
-{ stdenv, lib, fetchurl, unzip, jdk, pkg-config, gtk2
-, libXt, libXtst, libXi, libGLU, libGL, webkitgtk, libsoup, xorg
-, pango, gdk-pixbuf, glib
+{ lib
+, stdenv
+, canonicalize-jars-hook
+, fetchzip
+, pkg-config
+, atk
+, glib
+, gtk2
+, jdk
+, libGL
+, libGLU
+, libXt
+, libXtst
+, gnome2
 }:
 
 let
   platformMap = {
     x86_64-linux =
       { platform = "gtk-linux-x86_64";
-        sha256 = "1qq0pjll6030v4ml0hifcaaik7sx3fl7ghybfdw95vsvxafwp2ff"; };
+        sha256 = "17frac2nsx22hfa72264as31rn35hfh9gfgy0n6wvc3knl5d2716"; };
     i686-linux =
       { platform = "gtk-linux-x86";
-        sha256 = "03mhzraikcs4fsz7d3h5af9pw1bbcfd6dglsvbk2ciwimy9zj30q"; };
+        sha256 = "13ca17rga9yvdshqvh0sfzarmdcl4wv4pid0ls7v35v4844zbc8b"; };
     x86_64-darwin =
       { platform = "cocoa-macosx-x86_64";
-        sha256 = "00k1mfbncvyh8klgmk0891w8jwnd5niqb16j1j8yacrm2smmlb05"; };
+        sha256 = "0wjyxlw7i9zd2m8syd6k1q85fj8pzhxlfsrl8fpgsj37p698bd0a"; };
   };
 
-  metadata = assert platformMap ? ${stdenv.hostPlatform.system}; platformMap.${stdenv.hostPlatform.system};
-
+  metadata = assert platformMap ? ${stdenv.hostPlatform.system};
+    platformMap.${stdenv.hostPlatform.system};
 in stdenv.mkDerivation rec {
+  pname = "swt";
   version = "4.5";
   fullVersion = "${version}-201506032000";
-  pname = "swt";
 
   hardeningDisable = [ "format" ];
 
   # Alas, the Eclipse Project apparently doesn't produce source-only
   # releases of SWT.  So we just grab a binary release and extract
   # "src.zip" from that.
-  src = fetchurl {
-    url = "http://archive.eclipse.org/eclipse/downloads/drops4/R-${fullVersion}/${pname}-${version}-${metadata.platform}.zip";
-    sha256 = metadata.sha256;
+  src = fetchzip {
+    url = "https://archive.eclipse.org/eclipse/downloads/drops4/" +
+      "R-${fullVersion}/${pname}-${version}-${metadata.platform}.zip";
+    inherit (metadata) sha256;
+    stripRoot = false;
+    extraPostFetch = ''
+      mkdir "$unpackDir"
+      cd "$unpackDir"
+
+      renamed="$TMPDIR/src.zip"
+      mv "$out/src.zip" "$renamed"
+      unpackFile "$renamed"
+      rm -r "$out"
+
+      mv "$unpackDir" "$out"
+    '';
   };
 
-  sourceRoot = ".";
+  nativeBuildInputs = [
+    canonicalize-jars-hook
+    pkg-config
+  ];
+  buildInputs = [
+    atk
+    gtk2
+    jdk
+    libGL
+    libGLU
+    libXtst
+    gnome2.gnome_vfs
+    gnome2.libgnome
+    gnome2.libgnomeui
+  ] ++ lib.optionals (lib.hasPrefix "8u" jdk.version) [
+    libXt
+  ];
+
+  patches = [ ./awt-libs.patch ./gtk-libs.patch ];
 
-  nativeBuildInputs = [ unzip pkg-config ];
-  buildInputs = [ jdk gtk2 libXt libXtst libXi libGLU libGL webkitgtk libsoup ];
+  prePatch = ''
+    # clear whitespace from makefiles (since we match on EOL later)
+    sed -i 's/ \+$//' ./*.mak
+  '';
 
-  NIX_LFLAGS = toString (map (x: "-L${lib.getLib x}/lib") [ xorg.libX11 pango gdk-pixbuf glib ]) +
-    " -lX11 -lpango-1.0 -lgdk_pixbuf-2.0 -lglib-2.0";
+  postPatch = let makefile-sed = builtins.toFile "swt-makefile.sed" (''
+    # fix pkg-config invocations in CFLAGS/LIBS pairs.
+    #
+    # change:
+    #     FOOCFLAGS = `pkg-config --cflags `foo bar`
+    #     FOOLIBS = `pkg-config --libs-only-L foo` -lbaz
+    # into:
+    #     FOOCFLAGS = `pkg-config --cflags foo bar`
+    #     FOOLIBS = `pkg-config --libs foo bar`
+    #
+    # the latter works more consistently.
+    /^[A-Z0-9_]\+CFLAGS = `pkg-config --cflags [^`]\+`$/ {
+      N
+      s'' +
+        "/" + ''
+          ^\([A-Z0-9_]\+\)CFLAGS = `pkg-config --cflags \(.\+\)`\
+          \1LIBS = `pkg-config --libs-only-L .\+$'' +
+        "/" + ''
+          \1CFLAGS = `pkg-config --cflags \2`\
+          \1LIBS = `pkg-config --libs \2`'' +
+        "/\n" + ''
+    }
+    # fix WebKit libs not being there
+    s/\$(WEBKIT_LIB) \$(WEBKIT_OBJECTS)$/\0 `pkg-config --libs glib-2.0`/g
+  ''); in ''
+    declare -a makefiles=(./*.mak)
+    sed -i -f ${makefile-sed} "''${makefiles[@]}"
+    # assign Makefile variables eagerly & change backticks to `$(shell …)`
+    sed -i -e 's/ = `\([^`]\+\)`/ := $(shell \1)/' \
+      -e 's/`\([^`]\+\)`/$(shell \1)/' \
+      "''${makefiles[@]}"
+  '';
 
   buildPhase = ''
-    unzip src.zip -d src
+    runHook preBuild
 
-    cd src
-    sed -i "s#^LFLAGS =#LFLAGS = $NIX_LFLAGS #g"  *.mak
     export JAVA_HOME=${jdk}
 
-    sh ./build.sh
+    ./build.sh
 
     mkdir out
-    javac -d out/ $(find org/ -name "*.java")
+    find org/ -name '*.java' -type f -exec javac -d out/ {} +
+
+    runHook postBuild
   '';
 
   installPhase = ''
-    mkdir -p $out/lib
-    cp *.so $out/lib
+    runHook preInstall
+
+    if [ -n "$prefix" ]; then
+      mkdir -p "$prefix"
+    fi
+
+    mkdir -p "$out/lib"
+    cp -t "$out/lib" ./*.so
+
+    mkdir -p "$out/jars"
+    cp -t out/ version.txt
+    (cd out && jar -c *) > "$out/jars/swt.jar"
 
-    mkdir -p $out/jars
-    cp version.txt out/
-    cd out && jar -c * > $out/jars/swt.jar
+    runHook postInstall
   '';
 
   meta = with lib; {
-    homepage = "http://www.eclipse.org/swt/";
-    description = "An widget toolkit for Java to access the user-interface facilities of the operating systems on which it is implemented";
+    homepage = "https://www.eclipse.org/swt/";
+    description = ''
+      A widget toolkit for Java to access the user-interface facilities of
+      the operating systems on which it is implemented.
+    '';
     license = licenses.epl10;
-    maintainers = with maintainers; [ pSub ];
-    platforms = with platforms; linux;
+    maintainers = with maintainers; [ bb010g ];
+    platforms = platforms.linux;
   };
 }