Cleaner nested unpacking, as well as general robustness improvements. Turns out the LFLAGS stuff was from upstream not trusting pkg-config on their boxes, but it works great for us. (Or rather, it works great after fixing some of their pkg-config invocations.) Assisted by the diffoscope ( https://diffoscope.org/ ) and readelf grepping based on its output.main
parent
20ccd74a36
commit
076a4b662c
@ -0,0 +1,8 @@ |
||||
--- a/make_linux.mak
|
||||
+++ b/make_linux.mak
|
||||
@@ -63,4 +63,4 @@
|
||||
|
||||
AWT_LFLAGS = -shared ${SWT_LFLAGS}
|
||||
-AWT_LIBS = -L$(AWT_LIB_PATH) -ljawt
|
||||
+AWT_LIBS = `pkg-config --libs x11` -L$(AWT_LIB_PATH) -ljawt
|
||||
|
@ -1,85 +1,158 @@ |
||||
{ lib, stdenv, fetchurl, canonicalize-jars-hook |
||||
, gtk2, jdk, libGL, libGLU, libXi, libXt, libXtst, libsoup, webkitgtk |
||||
, gdk-pixbuf, glib, pango, xorg |
||||
, unzip, pkg-config |
||||
{ 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" |
||||
|
||||
sourceRoot = "."; |
||||
renamed="$TMPDIR/src.zip" |
||||
mv "$out/src.zip" "$renamed" |
||||
unpackFile "$renamed" |
||||
rm -r "$out" |
||||
|
||||
nativeBuildInputs = [ canonicalize-jars-hook unzip pkg-config ]; |
||||
mv "$unpackDir" "$out" |
||||
''; |
||||
}; |
||||
|
||||
nativeBuildInputs = [ |
||||
canonicalize-jars-hook |
||||
pkg-config |
||||
]; |
||||
buildInputs = [ |
||||
atk |
||||
gtk2 |
||||
jdk |
||||
libGL |
||||
libGLU |
||||
libXi |
||||
libXt |
||||
libXtst |
||||
libsoup |
||||
webkitgtk |
||||
gnome2.gnome_vfs |
||||
gnome2.libgnome |
||||
gnome2.libgnomeui |
||||
] ++ lib.optionals (lib.hasPrefix "8u" jdk.version) [ |
||||
libXt |
||||
]; |
||||
|
||||
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" ]); |
||||
patches = [ ./awt-libs.patch ./gtk-libs.patch ]; |
||||
|
||||
prePatch = '' |
||||
# clear whitespace from makefiles (since we match on EOL later) |
||||
sed -i 's/ \+$//' ./*.mak |
||||
''; |
||||
|
||||
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; |
||||
}; |
||||
} |
||||
|
@ -0,0 +1,14 @@ |
||||
--- a/make_linux.mak
|
||||
+++ b/make_linux.mak
|
||||
@@ -53,9 +53,4 @@
|
||||
|
||||
-# Do not use pkg-config to get libs because it includes unnecessary dependencies (i.e. pangoxft-1.0)
|
||||
-GTKCFLAGS = `pkg-config --cflags gtk+-$(GTK_VERSION) gtk+-unix-print-$(GTK_VERSION)`
|
||||
+GTKCFLAGS = `pkg-config --cflags gtk+-$(GTK_VERSION) gthread-2.0 gtk+-unix-print-$(GTK_VERSION) x11 xtst`
|
||||
+GTKLIBS = `pkg-config --libs gtk+-$(GTK_VERSION) gthread-2.0 gtk+-unix-print-$(GTK_VERSION) x11 xtst`
|
||||
-ifeq ($(GTK_VERSION), 3.0)
|
||||
-GTKLIBS = `pkg-config --libs-only-L gtk+-$(GTK_VERSION) gthread-2.0` $(XLIB64) -L/usr/X11R6/lib -lgtk-3 -lgdk-3 -lcairo -lgthread-2.0 -lXtst
|
||||
-else
|
||||
-GTKLIBS = `pkg-config --libs-only-L gtk+-$(GTK_VERSION) gthread-2.0` $(XLIB64) -L/usr/X11R6/lib -lgtk-x11-$(GTK_VERSION) -lgthread-2.0 -lXtst
|
||||
-endif
|
||||
|
Loading…
Reference in new issue