nixpkgs/pkgs/by-name/sw/swt/package.nix
2024-09-15 09:31:45 +00:00

155 lines
3.9 KiB
Nix

{
atk,
fetchzip,
gtk2,
jdk,
lib,
libGL,
libGLU,
libXt,
libXtst,
pkg-config,
stdenv,
stripJavaArchivesHook,
}:
stdenv.mkDerivation (finalAttrs: {
pname = "swt";
version = "4.5";
fullVersion = "${finalAttrs.version}-201506032000";
hardeningDisable = [ "format" ];
passthru.srcMetadataByPlatform = {
x86_64-linux.platform = "gtk-linux-x86_64";
x86_64-linux.hash = "sha256-JhzRCrVzsM2NBf65l6CDZdgchlbECHGUg0J0bQVT2Z0=";
i686-linux.platform = "gtk-linux-x86";
i686-linux.hash = "sha256-C7H1CUFkl7GPpqDFSzYnlLWa1XcawI2hbtsn9fIJio0=";
x86_64-darwin.platform = "cocoa-macosx-x86_64";
x86_64-darwin.hash = "sha256-CrSFkrlnSP2uQzRrRzv8F0lXEA7TNK9RFe2neDjtXnI=";
};
passthru.srcMetadata =
finalAttrs.passthru.srcMetadataByPlatform.${stdenv.hostPlatform.system} or null;
# 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 =
let
inherit (finalAttrs.passthru) srcMetadata;
in
assert srcMetadata != null;
fetchzip {
url = "https://archive.eclipse.org/eclipse/downloads/drops4/R-${finalAttrs.fullVersion}/swt-${finalAttrs.version}-${srcMetadata.platform}.zip";
inherit (srcMetadata) hash;
stripRoot = false;
postFetch = ''
mkdir "$unpackDir"
cd "$unpackDir"
renamed="$TMPDIR/src.zip"
mv -- "$out/src.zip" "$renamed"
unpackFile "$renamed"
rm -r -- "$out"
mv -- "$unpackDir" "$out"
'';
};
nativeBuildInputs = [
stripJavaArchivesHook
pkg-config
];
buildInputs = [
atk
gtk2
jdk
libGL
libGLU
libXtst
] ++ lib.optionals (lib.hasPrefix "8u" jdk.version) [ libXt ];
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`''}/
}
# 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 = ''
runHook preBuild
export JAVA_HOME=${jdk}
./build.sh
mkdir out
find org/ -name '*.java' -type f -exec javac -d out/ {} +
runHook postBuild
'';
installPhase = ''
runHook preInstall
if [[ -n "$prefix" ]]; then
install -d -- "$prefix"
fi
install -Dm 644 -t "$out/lib" -- *.so
install -d -- "$out/jars"
install -m 644 -t out -- version.txt
(cd out && jar -c *) > "$out/jars/swt.jar"
runHook postInstall
'';
meta = {
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 = lib.licenses.epl10;
maintainers = [ ];
platforms = lib.platforms.linux;
};
})