f0c8027ae3
1. Detect (and automatically handle) parasitic systems. 2. Each nix package has only one asd, and (almost) every parasitic package inside it builds. 3. Ensure that parasitic systems are compiled. 4. Remove unnecessary testnames lisp override mechanism (the testnae/testSystem is replaced by parasites/buildSystems). 5. Parasitic systems (if included in the system closure) become aliases to their host package. 6. Support caching fasl files in a known directory (for faster re-generation after modifying quicklisp-to-nix-system-info). 7. Eliminate unnecessary overrides. We're going to determine ALL lisp dependencies correctly. 8. Don't try to "build" lisp packages with make. lispPackages should be about bringing in a lisp library. 9. Eliminate the hand-maintained list of aliases. Parasites should become aliases. Everything else should be a real package.
117 lines
5.4 KiB
Nix
117 lines
5.4 KiB
Nix
args @ {stdenv, clwrapper, baseName, packageName ? baseName
|
|
, parasites ? []
|
|
, buildSystems ? ([packageName] ++ parasites)
|
|
, version ? "latest"
|
|
, src, description, deps, buildInputs ? [], meta ? {}, overrides?(x: {})
|
|
, propagatedBuildInputs ? []
|
|
, asdFilesToKeep ? [(builtins.concatStringsSep "" [packageName ".asd"])]}:
|
|
let
|
|
deployConfigScript = ''
|
|
outhash="$out"
|
|
outhash="''${outhash##*/}"
|
|
outhash="''${outhash%%-*}"
|
|
config_script="$out"/lib/common-lisp-settings/${args.baseName}-shell-config.sh
|
|
path_config_script="$out"/lib/common-lisp-settings/${args.baseName}-path-config.sh
|
|
store_translation="$(dirname "$out"):$(dirname "$out")"
|
|
mkdir -p "$(dirname "$config_script")"
|
|
touch "$config_script"
|
|
touch "$path_config_script"
|
|
chmod a+x "$config_script"
|
|
chmod a+x "$path_config_script"
|
|
echo "if test -z \"\''${_''${outhash}_NIX_LISP_CONFIG}\"; then export _''${outhash}_NIX_LISP_CONFIG=1; " >> "$config_script"
|
|
echo "export NIX_CFLAGS_COMPILE='$NIX_CFLAGS_COMPILE'\"\''${NIX_CFLAGS_COMPILE:+ \$NIX_CFLAGS_COMPILE}\"" >> "$config_script"
|
|
echo "export NIX_LDFLAGS='$NIX_LDFLAGS'\"\''${NIX_LDFLAGS:+ \$NIX_LDFLAGS}\"" >> "$config_script"
|
|
echo "export NIX_LISP_COMMAND='$NIX_LISP_COMMAND'" >> "$config_script"
|
|
echo "export NIX_LISP_ASDF='$NIX_LISP_ASDF'" >> "$config_script"
|
|
set | grep NIX_CC_WRAPPER_ | sed -e 's@^NIX_CC_WRAPPER@export &@' >> "$config_script"
|
|
echo "export PATH=\"\''${PATH:+\$PATH:}$PATH\"" >> "$config_script"
|
|
echo "echo \"\$ASDF_OUTPUT_TRANSLATIONS\" | grep -E '(^|:)$store_translation(:|\$)' >/dev/null || export ASDF_OUTPUT_TRANSLATIONS=\"\''${ASDF_OUTPUT_TRANSLATIONS:+\$ASDF_OUTPUT_TRANSLATIONS:}\"'$store_translation'" >> "$config_script"
|
|
echo "source '$path_config_script'" >> "$config_script"
|
|
echo "fi" >> "$config_script"
|
|
echo "if test -z \"\''${_''${outhash}_NIX_LISP_PATH_CONFIG}\"; then export _''${outhash}_NIX_LISP_PATH_CONFIG=1; " >> "$path_config_script"
|
|
echo "for i in \"''${CL_SOURCE_REGISTRY//:/\" \"}\" \"$out/lib/common-lisp/${args.baseName}/\" ; do echo \"\$CL_SOURCE_REGISTRY\" | grep -E \"(^|:)\$i(:|\\\$)\" >/dev/null || export CL_SOURCE_REGISTRY=\"\$CL_SOURCE_REGISTRY\''${CL_SOURCE_REGISTRY:+:}\$i\"; done;" >> "$path_config_script"
|
|
test -n "$LD_LIBRARY_PATH" &&
|
|
echo "export LD_LIBRARY_PATH=\"\$LD_LIBRARY_PATH\''${LD_LIBRARY_PATH:+:}\"'$LD_LIBRARY_PATH'" >> "$path_config_script"
|
|
test -n "$NIX_LISP_LD_LIBRARY_PATH" &&
|
|
echo "export NIX_LISP_LD_LIBRARY_PATH=\"\$NIX_LISP_LD_LIBRARY_PATH\''${NIX_LISP_LD_LIBRARY_PATH:+:}\"'$NIX_LISP_LD_LIBRARY_PATH'" >> "$path_config_script"
|
|
echo "fi" >> "$path_config_script"
|
|
'';
|
|
deployLaunchScript = ''
|
|
launch_script="$out"/bin/${args.baseName}-lisp-launcher.sh
|
|
mkdir -p "$(dirname "$launch_script")"
|
|
touch "$launch_script"
|
|
chmod a+x "$launch_script"
|
|
echo "#! /bin/sh" >> "$launch_script"
|
|
echo "source '$config_script'" >> "$launch_script"
|
|
echo "export LD_LIBRARY_PATH=\"\$NIX_LISP_LD_LIBRARY_PATH\''${NIX_LISP_LD_LIBRARY_PATH:+:}\$LD_LIBRARY_PATH\"" >> "$launch_script"
|
|
echo '"${clwrapper}/bin/common-lisp.sh" "$@"' >> "$launch_script"
|
|
'';
|
|
moveAsdFiles = ''
|
|
find $out/lib/common-lisp/ -name '*.asd' | while read ASD_FILE; do
|
|
KEEP_THIS_ASD=0
|
|
for ALLOWED_ASD in $asdFilesToKeep; do
|
|
ALLOWED_ASD="/$ALLOWED_ASD"
|
|
ALLOWED_ASD_LENGTH=${"$"}{#ALLOWED_ASD}
|
|
ASD_FILE_LENGTH=${"$"}{#ASD_FILE}
|
|
ASD_FILE_SUFFIX_INDEX=$(expr "$ASD_FILE_LENGTH" - "$ALLOWED_ASD_LENGTH")
|
|
ASD_FILE_SUFFIX_INDEX=$(expr "$ASD_FILE_SUFFIX_INDEX" + 1)
|
|
echo $ALLOWED_ASD $ASD_FILE $ASD_FILE_SUFFIX_INDEX $(expr substr "$ASD_FILE" "$ASD_FILE_SUFFIX_INDEX" "$ASD_FILE_LENGTH")
|
|
if [ "$(expr substr "$ASD_FILE" "$ASD_FILE_SUFFIX_INDEX" "$ASD_FILE_LENGTH")" == "$ALLOWED_ASD" ]; then
|
|
KEEP_THIS_ASD=1
|
|
break
|
|
fi
|
|
done
|
|
if [ "$KEEP_THIS_ASD" == 0 ]; then
|
|
mv "$ASD_FILE"{,.sibling}
|
|
fi
|
|
done
|
|
'';
|
|
basePackage = {
|
|
name = "lisp-${baseName}-${version}";
|
|
inherit src;
|
|
|
|
dontBuild = true;
|
|
|
|
inherit deployConfigScript deployLaunchScript;
|
|
inherit asdFilesToKeep moveAsdFiles;
|
|
installPhase = ''
|
|
eval "$preInstall"
|
|
|
|
mkdir -p "$out"/share/doc/${args.baseName};
|
|
mkdir -p "$out"/lib/common-lisp/${args.baseName};
|
|
cp -r . "$out"/lib/common-lisp/${args.baseName};
|
|
cp -rf doc/* LICENCE LICENSE COPYING README README.html README.md readme.html "$out"/share/doc/${args.baseName} || true
|
|
|
|
${deployConfigScript}
|
|
${deployLaunchScript}
|
|
${moveAsdFiles}
|
|
|
|
env -i \
|
|
NIX_LISP="$NIX_LISP" \
|
|
NIX_LISP_PRELAUNCH_HOOK='nix_lisp_run_single_form "(progn
|
|
${stdenv.lib.concatMapStrings (system: ''
|
|
(asdf:compile-system :${system})
|
|
(asdf:load-system :${system})
|
|
(asdf:operate (quote asdf::compile-bundle-op) :${system})
|
|
(ignore-errors (asdf:operate (quote asdf::deploy-asd-op) :${system}))
|
|
'') buildSystems}
|
|
)"' \
|
|
"$out/bin/${args.baseName}-lisp-launcher.sh"
|
|
|
|
eval "$postInstall"
|
|
'';
|
|
propagatedBuildInputs = (args.deps or []) ++ [clwrapper clwrapper.lisp clwrapper.asdf]
|
|
++ (args.propagatedBuildInputs or []);
|
|
buildInputs = buildInputs;
|
|
dontStrip=true;
|
|
|
|
ASDF_OUTPUT_TRANSLATIONS="${builtins.storeDir}/:${builtins.storeDir}";
|
|
|
|
meta = {
|
|
inherit description version;
|
|
} // meta;
|
|
};
|
|
package = basePackage // (overrides basePackage);
|
|
in
|
|
stdenv.mkDerivation package
|