diff options
-rw-r--r-- | nix/buildLisp/default.nix | 11 | ||||
-rw-r--r-- | nix/buildLisp/tests/argv0.nix | 36 |
2 files changed, 46 insertions, 1 deletions
diff --git a/nix/buildLisp/default.nix b/nix/buildLisp/default.nix index 30b90d9049d7..f483e3676565 100644 --- a/nix/buildLisp/default.nix +++ b/nix/buildLisp/default.nix @@ -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 diff --git a/nix/buildLisp/tests/argv0.nix b/nix/buildLisp/tests/argv0.nix new file mode 100644 index 000000000000..bc29337d06cd --- /dev/null +++ b/nix/buildLisp/tests/argv0.nix @@ -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 + ''; + }; + }; +} |