mozart: refactoring

- Append emacs to the oz wrapper's command search path rather than the
  rpath.  Previously, emacs would end up in the closure but the oz
  shell script would not be helped by it. Now a user without emacs in
  their PATH can still get the complete Oz experience (which depends
  crucially on emacs).  To build a variant without emacs, do
  mozart.override { emacs = null; }
- Patch full path to oz executable into the oz desktop item to make the
  output less reliant on the runtime PATH
- Compress .elc files to save a little bit of space
- Make it easier to extend platform support
- Inline builder.sh
- Be more specific about patching.  oz and ozc are capable of inferring
  OZHOME themselves; thus we generate wrappers only for the binary
  executable components.

Note that gmp and boost would be removed by patchelf --shrink-path; I've
no idea whether they are used somehow, so we leave them in and forego
rpath shrinking for now.
This commit is contained in:
Joachim Fasting 2017-02-15 02:13:22 +01:00
parent a46258ed0a
commit 2d643613f3
No known key found for this signature in database
GPG Key ID: 7544761007FE4E08
2 changed files with 43 additions and 37 deletions

View File

@ -1,25 +1,30 @@
{ stdenv, fetchurl, boost, emacs, gmp, makeWrapper
{ stdenv, fetchurl, makeWrapper
, boost, gmp
, tcl-8_5, tk-8_5
, emacs
}:
let
version = "2.0.0";
in stdenv.mkDerivation {
binaries = {
"x86_64-linux" = fetchurl {
url = "mirror://sourceforge/project/mozart-oz/v${version}-alpha.0/mozart2-${version}-alpha.0+build.4105.5c06ced-x86_64-linux.tar.gz";
sha256 = "0rsfrjimjxqbwprpzzlmydl3z3aiwg5qkb052jixdxjyad7gyh5z";
};
};
in
stdenv.mkDerivation {
name = "mozart-binary-${version}";
preferLocalBuild = true;
src = fetchurl {
url = "mirror://sourceforge/project/mozart-oz/v${version}-alpha.0/mozart2-${version}-alpha.0+build.4105.5c06ced-x86_64-linux.tar.gz";
sha256 = "0rsfrjimjxqbwprpzzlmydl3z3aiwg5qkb052jixdxjyad7gyh5z";
};
src = binaries."${stdenv.system}" or (throw "unsupported system: ${stdenv.system}");
libPath = stdenv.lib.makeLibraryPath
[ stdenv.cc.cc
boost
emacs
gmp
tcl-8_5
tk-8_5
@ -27,10 +32,36 @@ in stdenv.mkDerivation {
TK_LIBRARY = "${tk-8_5}/lib/tk8.5";
builder = ./builder.sh;
buildInputs = [ makeWrapper ];
buildCommand = ''
mkdir $out
tar xvf $src -C $out --strip-components=1
for exe in $out/bin/{ozemulator,ozwish} ; do
patchelf --set-interpreter $(< $NIX_CC/nix-support/dynamic-linker) \
--set-rpath $libPath \
$exe
done
wrapProgram $out/bin/ozwish \
--set OZHOME $out \
--set TK_LIBRARY $TK_LIBRARY
wrapProgram $out/bin/ozemulator --set OZHOME $out
${stdenv.lib.optionalString (emacs != null) ''
wrapProgram $out/bin/oz --suffix PATH ":" ${stdenv.lib.makeBinPath [ emacs ]}
''}
sed -i $out/share/applications/oz.desktop \
-e "s,Exec=oz %u,Exec=$out/bin/oz %u,"
gzip -9n $out/share/mozart/elisp"/"*.elc
patchShebangs $out
'';
meta = with stdenv.lib; {
homepage = "http://www.mozart-oz.org/";
description = "Multiplatform implementation of the Oz programming language";
@ -42,6 +73,7 @@ in stdenv.mkDerivation {
expressive power and advanced functionality.
'';
license = licenses.mit;
platforms = [ "x86_64-linux" ];
platforms = attrNames binaries;
hydraPlatforms = [];
};
}

View File

@ -1,26 +0,0 @@
source $stdenv/setup
echo "unpacking $src..."
tar xvfz $src
mkdir -p $out/bin
mkdir -p $out/share
mv mozart*linux/bin/* $out/bin
mv mozart*linux/share/* $out/share
patchShebangs $out
for f in $out/bin/*; do
b=$(basename $f)
if [ $b == "ozemulator" ] || [ $b == "ozwish" ]; then
patchelf --interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)" \
--set-rpath $libPath \
$f
continue;
fi
wrapProgram $f --set OZHOME $out \
--set TK_LIBRARY $TK_LIBRARY
done