feat(nix/buildLisp): allow implementation-specifc bundled functions
By implementing a bundled function for an implementation, we can use a custom one for a specific implementation. This is useful for implementations like ECL where a require will be compiled as an instruction rather than importing all new symbols into a dump, so using the underlying static or shared object directly would be beneficial. overrideLisp for bundled libraries now only allows overriding the name and implementation arguments. Change-Id: I9036b29157e8daa4d86ff87d603b044373711dbf Reviewed-on: https://cl.tvl.fyi/c/depot/+/3301 Tested-by: BuildkiteCI Reviewed-by: tazjin <mail@tazj.in>
This commit is contained in:
parent
d344637fe2
commit
acb5994e87
1 changed files with 32 additions and 6 deletions
|
@ -124,6 +124,16 @@ let
|
||||||
# Builds a script (or dumped image) which when executed loads (or has
|
# Builds a script (or dumped image) which when executed loads (or has
|
||||||
# loaded) all given dependencies. When built this should create an executable
|
# loaded) all given dependencies. When built this should create an executable
|
||||||
# at "$out/bin/${implementation}".
|
# at "$out/bin/${implementation}".
|
||||||
|
#
|
||||||
|
# Optional members:
|
||||||
|
#
|
||||||
|
# - bundled :: string -> library
|
||||||
|
# Allows giving an implementation specific builder for a bundled library.
|
||||||
|
# This function is used as a replacement for the internal defaultBundled
|
||||||
|
# function and only needs to support one implementation. The returned derivation
|
||||||
|
# must behave like one built by 'library' (in particular have the same files
|
||||||
|
# available in "$out" and the same 'passthru' attributes), but may be built
|
||||||
|
# completely differently.
|
||||||
impls = lib.mapAttrs (name: v: { inherit name; } // v) {
|
impls = lib.mapAttrs (name: v: { inherit name; } // v) {
|
||||||
sbcl = {
|
sbcl = {
|
||||||
runScript = "${sbcl}/bin/sbcl --script";
|
runScript = "${sbcl}/bin/sbcl --script";
|
||||||
|
@ -326,12 +336,28 @@ let
|
||||||
wrapProgram $out/bin/${name} --prefix LD_LIBRARY_PATH : "${libPath}"
|
wrapProgram $out/bin/${name} --prefix LD_LIBRARY_PATH : "${libPath}"
|
||||||
'');
|
'');
|
||||||
|
|
||||||
# 'bundled' creates a "library" that calls 'require' on a built-in
|
# 'bundled' creates a "library" which makes a built-in package available,
|
||||||
# package, such as any of SBCL's sb-* packages.
|
# such as any of SBCL's sb-* packages or ASDF. By default this is done
|
||||||
bundled = name: (makeOverridable library) {
|
# by calling 'require', but implementations are free to provide their
|
||||||
inherit name;
|
# own specific bundled function.
|
||||||
srcs = lib.singleton (builtins.toFile "${name}.lisp" "(require '${name})");
|
bundled = name:
|
||||||
};
|
let
|
||||||
|
# TODO(sterni): allow overriding args to underlying 'library' (e. g. srcs)
|
||||||
|
defaultBundled = implementation: name: library {
|
||||||
|
inherit name implementation;
|
||||||
|
srcs = lib.singleton (builtins.toFile "${name}.lisp" "(require '${name})");
|
||||||
|
};
|
||||||
|
|
||||||
|
bundled' =
|
||||||
|
{ implementation ? defaultImplementation
|
||||||
|
, name
|
||||||
|
}:
|
||||||
|
impls."${implementation}".bundled or (defaultBundled implementation) name;
|
||||||
|
|
||||||
|
in (makeOverridable bundled') {
|
||||||
|
inherit name;
|
||||||
|
};
|
||||||
|
|
||||||
in {
|
in {
|
||||||
library = makeOverridable library;
|
library = makeOverridable library;
|
||||||
program = makeOverridable program;
|
program = makeOverridable program;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue