nixpkgs/pkgs/development/interpreters/octave/build-env.nix
2024-08-03 17:18:20 +02:00

92 lines
3.1 KiB
Nix

{ lib, stdenv, octave, buildEnv
, makeWrapper, texinfo
, wrapOctave
, computeRequiredOctavePackages
, extraLibs ? []
, extraOutputsToInstall ? []
, postBuild ? ""
, ignoreCollisions ? false
}:
# Create an octave executable that knows about additional packages
let
packages = computeRequiredOctavePackages extraLibs;
in buildEnv {
name = "${octave.name}-env";
paths = extraLibs ++ [ octave ];
inherit ignoreCollisions;
extraOutputsToInstall = [ "out" ] ++ extraOutputsToInstall;
nativeBuildInputs = [ makeWrapper ];
buildInputs = [ texinfo wrapOctave ];
# During "build" we must first unlink the /share symlink to octave's /share
# Then, we can re-symlink the all of octave/share, except for /share/octave
# in env/share/octave, re-symlink everything from octave/share/octave and then
# perform the pkg install.
postBuild = ''
if [ -L "$out/bin" ]; then
unlink $out/bin
mkdir -p "$out/bin"
cd "${octave}/bin"
for prg in *; do
if [ -x $prg ]; then
makeWrapper "${octave}/bin/$prg" "$out/bin/$prg" --set OCTAVE_SITE_INITFILE "$out/share/octave/site/m/startup/octaverc"
fi
done
cd $out
fi
# Remove symlinks to the input tarballs, they aren't needed, use -f so it
# will not fail if no .tar.gz symlinks are there - for example if
# sommething which is not a tarball used as a package
rm -f $out/*.tar.gz
createOctavePackagesPath $out ${octave}
# Create the file even if the loop afterwards has no packages to run over
touch $out/.octave_packages
for path in ${lib.concatStringsSep " " packages}; do
if [ -e $path/*.tar.gz ]; then
$out/bin/octave-cli --eval "pkg local_list $out/.octave_packages; \
pkg prefix $out/${octave.octPkgsPath} $out/${octave.octPkgsPath}; \
pfx = pkg (\"prefix\"); \
pkg install -nodeps -local $path/*.tar.gz"
fi
done
# Re-write the octave-wide startup file (share/octave/site/m/startup/octaverc)
# To point to the new local_list in $out
addPkgLocalList $out ${octave}
wrapOctavePrograms "${lib.concatStringsSep " " packages}"
# We also need to modify the Exec= line of the desktop file, so it will point
# to the wrapper we generated above.
rm $out/share/applications # should be a symlink to ${octave}/share/applications
mkdir $out/share/applications
substitute \
${octave}/share/applications/org.octave.Octave.desktop \
$out/share/applications/org.octave.Octave.desktop \
--replace-fail ${octave}/bin/octave $out/bin/octave
'' + postBuild;
inherit (octave) meta;
passthru = octave.passthru // {
interpreter = "$out/bin/octave";
inherit octave;
env = stdenv.mkDerivation {
name = "interactive-${octave.name}-environment";
buildCommand = ''
echo >&2 ""
echo >&2 "*** octave 'env' attributes are intended for interactive nix-shell sessions, not for building! ***"
echo >&2 ""
exit 1
'';
};
};
}