fix(nix/buildLisp): make uiop:argv0 work also for ccl and sbcl
Detection is broken there, too, as UIOP relies on setting the variable before dumping the image in its portability wrapper dump-image which we don't use at all. Change-Id: If7bea5a8522a2e64707b1ee88d62d420bd00a952 Reviewed-on: https://cl.tvl.fyi/c/depot/+/5112 Tested-by: BuildkiteCI Reviewed-by: grfn <grfn@gws.fyi>
This commit is contained in:
parent
49c8d8371c
commit
b57854e24d
2 changed files with 46 additions and 1 deletions
|
@ -319,6 +319,11 @@ let
|
|||
(let* ((bindir (concatenate 'string (sb-posix:getenv "out") "/bin"))
|
||||
(outpath (make-pathname :name "${name}"
|
||||
:directory bindir)))
|
||||
|
||||
;; Tell UIOP that argv[0] will refer to running image, not the lisp impl
|
||||
(when (find-package :uiop)
|
||||
(eval `(setq ,(find-symbol "*IMAGE-DUMPED-P*" :uiop) :executable)))
|
||||
|
||||
(save-lisp-and-die outpath
|
||||
:executable t
|
||||
:toplevel
|
||||
|
@ -438,7 +443,7 @@ let
|
|||
;; to handle argument parsing and such properly. Since
|
||||
;; this needs to work even when we're not using UIOP,
|
||||
;; we need to do some compile-time acrobatics.
|
||||
,(when (find-package 'uiop)
|
||||
,(when (find-package :uiop)
|
||||
`(setf ,(find-symbol "*IMAGE-DUMPED-P*" :uiop) :executable))
|
||||
;; Run the actual application…
|
||||
(${main})
|
||||
|
@ -561,6 +566,10 @@ let
|
|||
(bindir (concatenate 'string out "/bin/"))
|
||||
(executable (make-pathname :directory bindir :name "${name}")))
|
||||
|
||||
;; Tell UIOP that argv[0] will refer to running image, not the lisp impl
|
||||
(when (find-package :uiop)
|
||||
(eval `(setf ,(find-symbol "*IMAGE-DUMPED-P*" :uiop) :executable)))
|
||||
|
||||
(save-application executable
|
||||
:purify t
|
||||
:error-handler :quit
|
||||
|
|
36
nix/buildLisp/tests/argv0.nix
Normal file
36
nix/buildLisp/tests/argv0.nix
Normal file
|
@ -0,0 +1,36 @@
|
|||
{ depot, pkgs, ... }:
|
||||
|
||||
depot.nix.buildLisp.program {
|
||||
name = "argv0-test";
|
||||
|
||||
srcs = [
|
||||
(pkgs.writeText "argv0-test.lisp" ''
|
||||
(defpackage :argv0-test (:use :common-lisp :uiop) (:export :main))
|
||||
(in-package :argv0-test)
|
||||
|
||||
(defun main ()
|
||||
(format t "~A~%" (uiop:argv0)))
|
||||
'')
|
||||
];
|
||||
|
||||
deps = [
|
||||
{
|
||||
sbcl = depot.nix.buildLisp.bundled "uiop";
|
||||
default = depot.nix.buildLisp.bundled "asdf";
|
||||
}
|
||||
];
|
||||
|
||||
passthru.meta.ci = {
|
||||
extraSteps.verify = {
|
||||
label = "verify argv[0] output";
|
||||
needsOutput = true;
|
||||
command = pkgs.writeShellScript "check-argv0" ''
|
||||
set -eux
|
||||
|
||||
for invocation in "$(pwd)/result/bin/argv0-test" "./result/bin/argv0-test"; do
|
||||
test "$invocation" = "$("$invocation")"
|
||||
done
|
||||
'';
|
||||
};
|
||||
};
|
||||
}
|
Loading…
Reference in a new issue