1args @ {lib, stdenv, clwrapper, baseName, packageName ? baseName
2 , parasites ? []
3 , buildSystems ? ([packageName] ++ parasites)
4 , version ? "latest"
5 , src, description, deps, buildInputs ? [], meta ? {}, overrides?(x: {})
6 , propagatedBuildInputs ? []
7 , asdFilesToKeep ? [(builtins.concatStringsSep "" [packageName ".asd"])]}:
8let
9 deployConfigScript = ''
10 outhash="$out"
11 outhash="''${outhash##*/}"
12 outhash="''${outhash%%-*}"
13 config_script="$out"/lib/common-lisp-settings/${args.baseName}-shell-config.sh
14 path_config_script="$out"/lib/common-lisp-settings/${args.baseName}-path-config.sh
15 store_translation="$(dirname "$out"):$(dirname "$out")"
16 mkdir -p "$(dirname "$config_script")"
17 touch "$config_script"
18 touch "$path_config_script"
19 chmod a+x "$config_script"
20 chmod a+x "$path_config_script"
21 echo "if test -z \"\''${_''${outhash}_NIX_LISP_CONFIG:-}\"; then export _''${outhash}_NIX_LISP_CONFIG=1; " >> "$config_script"
22 echo "export NIX_CFLAGS_COMPILE='$NIX_CFLAGS_COMPILE'\"\''${NIX_CFLAGS_COMPILE:+ \$NIX_CFLAGS_COMPILE}\"" >> "$config_script"
23 echo "export NIX_LDFLAGS='$NIX_LDFLAGS'\"\''${NIX_LDFLAGS:+ \$NIX_LDFLAGS}\"" >> "$config_script"
24 echo "export NIX_LISP_COMMAND='$NIX_LISP_COMMAND'" >> "$config_script"
25 echo "export NIX_LISP_ASDF='$NIX_LISP_ASDF'" >> "$config_script"
26 set | grep NIX_CC_WRAPPER_ | sed -e 's@^NIX_CC_WRAPPER@export &@' >> "$config_script"
27 echo "export PATH=\"\''${PATH:+\$PATH:}$PATH\"" >> "$config_script"
28 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"
29 echo "source '$path_config_script'" >> "$config_script"
30 echo "fi" >> "$config_script"
31 echo "if test -z \"\''${_''${outhash}_NIX_LISP_PATH_CONFIG:-}\"; then export _''${outhash}_NIX_LISP_PATH_CONFIG=1; " >> "$path_config_script"
32 echo "NIX_LISP_ASDF_PATHS=\"$( echo "\''${NIX_LISP_ASDF_PATHS:-}"; echo "$NIX_LISP_ASDF_PATHS"; echo "$out/lib/common-lisp/${args.baseName}" )\"" >> "$path_config_script"
33 echo "export NIX_LISP_ASDF_PATHS=\$((tr ' ' '\n' | sort | uniq | tr '\n' ' ') <<< \$NIX_LISP_ASDF_PATHS)" >> $path_config_script
34
35 test -n "$LD_LIBRARY_PATH" &&
36 echo "export LD_LIBRARY_PATH=\"\$LD_LIBRARY_PATH\''${LD_LIBRARY_PATH:+:}\"'$LD_LIBRARY_PATH'" >> "$path_config_script"
37 test -n "$NIX_LISP_LD_LIBRARY_PATH" &&
38 echo "export NIX_LISP_LD_LIBRARY_PATH=\"\''${NIX_LISP_LD_LIBRARY_PATH:-}\''${NIX_LISP_LD_LIBRARY_PATH:+:}\"'$(echo "$NIX_LISP_LD_LIBRARY_PATH" | tr -d '\n' | tr : '\n' | sort | uniq | tr '\n' ':' | sed -e 's/:$//')'" >> "$path_config_script"
39 echo "fi" >> "$path_config_script"
40 '';
41 deployLaunchScript = ''
42 launch_script="$out"/bin/${args.baseName}-lisp-launcher.sh
43 mkdir -p "$(dirname "$launch_script")"
44 touch "$launch_script"
45 chmod a+x "$launch_script"
46 echo "#! ${stdenv.shell}" >> "$launch_script"
47 echo "source '$config_script'" >> "$launch_script"
48 echo "test -n \"\$NIX_LISP_LD_LIBRARY_PATH\" && export LD_LIBRARY_PATH=\"\$NIX_LISP_LD_LIBRARY_PATH\''${LD_LIBRARY_PATH:+:}\$LD_LIBRARY_PATH\"" >> "$launch_script"
49 echo '"${clwrapper}/bin/common-lisp.sh" "$@"' >> "$launch_script"
50 '';
51 moveAsdFiles = ''
52 find $out/lib/common-lisp/ -name '*.asd' | while read ASD_FILE; do
53 KEEP_THIS_ASD=0
54 for ALLOWED_ASD in $asdFilesToKeep; do
55 ALLOWED_ASD="/$ALLOWED_ASD"
56 ALLOWED_ASD_LENGTH=${"$"}{#ALLOWED_ASD}
57 ASD_FILE_LENGTH=${"$"}{#ASD_FILE}
58 ASD_FILE_SUFFIX_INDEX=$(expr "$ASD_FILE_LENGTH" - "$ALLOWED_ASD_LENGTH")
59 ASD_FILE_SUFFIX_INDEX=$(expr "$ASD_FILE_SUFFIX_INDEX" + 1)
60 echo $ALLOWED_ASD $ASD_FILE $ASD_FILE_SUFFIX_INDEX $(expr substr "$ASD_FILE" "$ASD_FILE_SUFFIX_INDEX" "$ASD_FILE_LENGTH")
61 if [ "$(expr substr "$ASD_FILE" "$ASD_FILE_SUFFIX_INDEX" "$ASD_FILE_LENGTH")" == "$ALLOWED_ASD" ]; then
62 KEEP_THIS_ASD=1
63 break
64 fi
65 done
66 if [ "$KEEP_THIS_ASD" == 0 ]; then
67 mv "$ASD_FILE"{,.sibling}
68 fi
69 done
70 '';
71basePackage = {
72 name = "lisp-${baseName}-${version}";
73 inherit src;
74
75 dontBuild = true;
76
77 inherit deployConfigScript deployLaunchScript;
78 inherit asdFilesToKeep moveAsdFiles;
79 installPhase = ''
80 eval "$preInstall"
81
82 mkdir -p "$out"/share/doc/${args.baseName};
83 mkdir -p "$out"/lib/common-lisp/${args.baseName};
84 cp -r . "$out"/lib/common-lisp/${args.baseName};
85 cp -rf doc/* LICENCE LICENSE COPYING README README.html README.md readme.html "$out"/share/doc/${args.baseName} || true
86
87 ${deployConfigScript}
88 ${deployLaunchScript}
89 ${moveAsdFiles}
90
91 env -i \
92 NIX_LISP="$NIX_LISP" \
93 NIX_LISP_PRELAUNCH_HOOK='nix_lisp_run_single_form "(progn
94 ${lib.concatMapStrings (system: ''
95 (asdf:compile-system :${system})
96 (asdf:load-system :${system})
97 (asdf:operate (quote asdf::compile-bundle-op) :${system})
98 (ignore-errors (asdf:operate (quote asdf::deploy-asd-op) :${system}))
99'') buildSystems}
100 )"' \
101 "$out/bin/${args.baseName}-lisp-launcher.sh"
102
103 eval "$postInstall"
104 '';
105 propagatedBuildInputs = (args.deps or []) ++ [clwrapper clwrapper.lisp clwrapper.asdf]
106 ++ (args.propagatedBuildInputs or []);
107 buildInputs = buildInputs;
108 dontStrip=true;
109
110 ASDF_OUTPUT_TRANSLATIONS="${builtins.storeDir}/:${builtins.storeDir}";
111
112 noAuditTmpDir = true;
113
114 meta = {
115 inherit description version;
116 } // meta;
117};
118package = basePackage // (overrides basePackage);
119in
120stdenv.mkDerivation package