I see in clisp
recipe lib:libdb$secondaryArchSuffix
is changed to lib:libdb_18.1$secondaryArchSuffix
. Is there also some change to berkeley-db
recipe?
2 lines in the db recipe:
for REQUIRES:
and:
for BUILD_REQUIRES:
This makes sense. But how is it possible that the recipe succeed on my local machine?
I only noticed it when trying to install the local build packages, the one that required libdb couldnāt be installed because the dependency couldnāt be found, so while the build succeeded, in the end the package couldnāt be installed.
Buildmaster must have a rule for that check that we donāt have? That I donāt know.
Understand.
So, to test the build, I first need to:
- install all the necessary dependencies and take a note of them,
- prepare the recipe from what I did manually,
- test the recipe with
haikuporter
, - uninstall all the dependencies and thy to install built with
haikuporter
packages.
CLIPS recipe was updated and CLISP together with some modules is now available in HaikuDepot.
Because Haiku is quite new target OS for Common Lisp generally, I am working on getting usual Common Lisp infrastructure to detect / work with Haiku.
But the existing CLISP port is probably (almost) all I need to resume working on SBCL.
Found a bug in ASDF shipped with CLISP, which removes :HAIKU symbol from *features* when loading this module. This bug was already reported to ASDF when attempting to port SBCL 4 years ago, and it was fixed back then. So, CLISP updated ASDF module to latest upstream and a new CLISP recipe contains this fix. New packages are already built.
Common Lisp uses global variable *features* where it holds a list of implementation specific symbols. Having :HAIKU symbol there makes it possible to write Haiku specific code:
(when (member :HAIKU *features*)
<some Haiku specific code here>)
Or annotation-like version of the above:
#+haiku
<some code for Haiku>
#-haiku
<some code outside of Haiku>
This code in Common Lisp is similar to the following in C++:
#ifdef __HAIKU__
<some Haiku specific code here>
#endif
Before the fix, :HAIKU and :UNIX were members of *features*, but as soon as ASDF module was loaded, :HAIKU was removed and :OS-UNIX was added. After the fix, :HAIKU and :UNIX are members of *features*, and after loading ASDF, :OS-HAIKU and :OS-UNIX are added.
Because ASDF is the module which ālinksā Common Lisp modules together, the right treatment of *features* is crucial here.
QuickLisp is de-facto repository of Common Lisp modules, which ships its own version of ASDF. Unfortunately, QuickLisp uses an outdated version of it that contains the bug. I contacted QuickLisp for this issue. For now, CLISP on Haiku has a work-around. If ASDF is loaded prior to QuickLisp, the right version is used and :HAIKU / :OS-HAIKU symbols are available.
Nice work! Thanks for taking care of this
ASDF team asks if there is an available Docker image with Haiku that can be used for CI builds. This image also could be used for CLISP and SBCL for the same goal. I found this one. Is it actively maintained? Can it be used for CI builds of some projects? Or is it possible to prepare a dedicated image? ASDF team is ready to help setting it up.
Thank you @Begasus, I do it for my fun, not only for Haiku / Common Lisp community. I really appreciate all the hard work and exciting results achieved by these projects and I am happy to contribute to some extent to them.
There is: HashiCorp Cloud Platform still on beta4 though, I donāt know who is responsible to upload(?) those vagrant images, I saw @kallisti5 mentioning it for R1B1 at: Haiku R1/beta1 in Vagrant | Haiku Project
Not sure if itās helpful though
Now, on the topic of SBCL. I have a build error:
cc -g -Wall -Wundef -Wsign-compare -Wpointer-arith -O3
-Wunused-parameter -fno-omit-frame-pointer
-momit-leaf-frame-pointer -gdwarf-2 -I. -c
-o run-program.o run-program.c
run-program.c:35:10: fatal error: sys/syscall.h: No such file or directory
35 | #include <sys/syscall.h>
| ^~~~~~~~~~~~~
I remember this error was years ago when I played with SBCL, but I do not remember the solution: some definition like -D_BSD_SOURCE
or some more *_devel
packages installed?
Checked current patch at haikuports?
Thank you @Begasus. Yes, I saw it. But it seems more a hack than a solution. Is there a technical reason why #include <sys/syscall.h>
is not necessary on Haiku? Is necessary information from it available elsewhere?
Anyway, I followed this pattern and modified src/runtime/run-program.c
this way:
#ifndef __HAIKU__
#include <sys/syscall.h>
#endif
And this makes the trick. Now, latest SBCL (2.4.10 from 2024.10) is buildable with CLISP except Contrib section with selected contributed modules.
SBCL also contains an older version of ASDF module, so I can start contributing to it by asking to upgrade this module.
From a quick search there is no syscall.h
for/in Haiku.
SBCL submitted this Haiku specific patch. So now SBCL can be built (except modules and notable ASDF).
I am preparing the recipe for it. For some unknown reason, the recipe stops building sporadically at different stages of process, but sometimes it finishes. It may be related to BUILD_PREREQUIRES
section, which is rather spartan for now.
Another goal I follow is to provide upstream ASDF during SBCL build (it seems SBCL had this possibility some time in the past) with hope of successful building of more contrib modules.
OK, figured out how to clone upstream ASDF (the most important contrib module) during bilding of SBCL.
Now, I am testing which other contrib modules are buildable. There are already 2 positive (one being ASDF with upstream code) and 1 negative result out of 21 modules.
Good news: SBCL modules are quite easily buildable. The build says 13 / 20 of contrib modules are present (it seems, ASDF is not considered the 21st module), but in reality only 2 modules fail building: sb-posix
and sb-bsd-sockets
. Some other depend on them. The architecture of SBCL does not make modules depend on 3rd party software, so all them can be supplied in the same package.
So, I plan the next steps:
- Prepare preliminary recipe for x86_64,
- Fill gaps in x86_64 Haiku specific code and possibly extend it to Haiku x86,
- Extensive testing of main executable and contrib modules possibly fixing failing modules,
- Working on threading support.
hello there,
watching all this effort into getting common lisp runtimes to run on haiku has been a heartwarming effort to observe. seeing the clisp make it into haikuports was quite the pleasant surprise as i had tried building it myself on and off but got stuck with it.
in regards to the sbcl port, your observations on current abcl failing to bootstrap sbcl was something i also ran into as well unfortunately. from what i can tell it is some internal changes to sbcl that happened sometime around 2.2.x-2.3.x where this occurred so abcl can no longer be used to bootstrap sbcl (this affects more than just haiku as i tried on other osāes like linux and got similar results). the clisp port that is available can bootstrap sbcl as well as sbcl build in haikuports as well (very cool). haiku is really shaping up to be a pretty good lisp machine these days. in regards to further efforts on the sbcl port, i am afraid that iāve been rather occupied with other life things that require my attention so have not been able to give as much care to keeping the sbcl port updated and getting features like threading into a better state so seeing someone else pick up the torch to do so is encouraging for me (thank you).
if it helps i am including a (work in progress) patch if it helps with your porting/updating efforts. it also builds on top of the haikuports patchset but has changes that have been a work in progress but should build even with the latest sbcl checkout git hash 4487e858f. some things that this patch should allow as well besides preliminary threading support are core compression and getting more tests and contrib modules to pass/build. this patchset should allow sbcl to build although i think one of the contrib modules is not passing, unfortunately. you can try getting the sbcl build to use more features with a build invocation like so:
# sbcl version
sh make.sh sbcl --with-sb-core-compression --with-sb-simd-pack --with-sb-thread
# clisp version
sh make.sh clisp --with-sb-core-compression --with-sb-simd-pack --with-sb-thread
good luck with further efforts on the sbcl port! i can try to answer questions around the patch if you decide to use it when i have some time (or can try to push up this branch if that would be easier to work with)
sbcl wip patch below
diff --git a/contrib/asdf/uiop.lisp b/contrib/asdf/uiop.lisp
index 5e52e7745..eef5ef150 100644
--- a/contrib/asdf/uiop.lisp
+++ b/contrib/asdf/uiop.lisp
@@ -1859,7 +1859,7 @@ except on ABCL where it might change between FASL compilation and runtime."
(:os-windows . os-windows-p)
(:genera . os-genera-p) (:os-oldmac . os-oldmac-p)
(:haiku . os-haiku-p))
- :when (and (or (not o) (eq feature :os-macosx)) (funcall detect))
+ :when (and (or (not o) (eq feature :os-macosx) (eq feature :os-haiku)) (funcall detect))
:do (setf o feature) (pushnew feature *features*)
:else :do (setf *features* (remove feature *features*))
:finally
diff --git a/contrib/sb-bsd-sockets/sockets.lisp b/contrib/sb-bsd-sockets/sockets.lisp
index b8f265892..ecf43174d 100644
--- a/contrib/sb-bsd-sockets/sockets.lisp
+++ b/contrib/sb-bsd-sockets/sockets.lisp
@@ -345,7 +345,9 @@ request an input stream and get an output stream in response\)."
(define-socket-condition sockint::EOPNOTSUPP operation-not-supported-error)
(define-socket-condition sockint::EPERM operation-not-permitted-error)
(define-socket-condition sockint::EPROTONOSUPPORT protocol-not-supported-error)
-(define-socket-condition sockint::ESOCKTNOSUPPORT socket-type-not-supported-error)
+;; haiku hack
+#+haiku (define-socket-condition -4025 socket-type-not-supported-error)
+#-haiku (define-socket-condition sockint::ESOCKTNOSUPPORT socket-type-not-supported-error)
(define-socket-condition sockint::ENETUNREACH network-unreachable-error)
(define-socket-condition sockint::ENOTCONN not-connected-error)
(define-socket-condition sockint::EAFNOSUPPORT address-family-not-supported)
diff --git a/contrib/sb-bsd-sockets/tests.lisp b/contrib/sb-bsd-sockets/tests.lisp
index 7ec6342a2..ccbf00930 100644
--- a/contrib/sb-bsd-sockets/tests.lisp
+++ b/contrib/sb-bsd-sockets/tests.lisp
@@ -78,6 +78,7 @@
;; here, not socket-type-not-supported-error or
;; protocol-not-supported-error.
((or #+darwin socket-error
+ #+haiku address-family-not-supported
operation-not-supported-error
socket-type-not-supported-error
protocol-not-supported-error)
@@ -96,6 +97,7 @@
;; protocol-not-supported-error.
((or
#+darwin socket-error
+ #+haiku address-family-not-supported
operation-not-supported-error
protocol-not-supported-error
socket-type-not-supported-error)
@@ -507,7 +509,7 @@
;; translates into an END-OF-FILE on the other end, no matter which
;; end performs the shutdown and independent of the element-type of
;; the stream.
-#+ipv4-support
+#+(and ipv4-support (not haiku))
(macrolet
((define-shutdown-test (name who-shuts-down who-reads element-type direction)
`(deftest ,name
diff --git a/contrib/sb-posix/constants.lisp b/contrib/sb-posix/constants.lisp
index 78a3f68e0..9883757ff 100644
--- a/contrib/sb-posix/constants.lisp
+++ b/contrib/sb-posix/constants.lisp
@@ -68,7 +68,7 @@
"background read attempted from control terminal." t)
(:integer SIGTTOU "SIGTTOU"
"background write attempted to control terminal." t)
- (:integer SIGIO "SIGIO"
+ #-haiku (:integer SIGIO "SIGIO"
"I/O is possible on a descriptor (see fcntl(2))." t)
(:integer SIGXCPU "SIGXCPU"
"cpu time limit exceeded (see setrlimit(2))." t)
@@ -274,6 +274,7 @@
#-(and linux largefile) "struct dirent"
#-(or win32 android) (:ino-t ino "ino_t" "d_ino")
#+android ((unsigned 64) ino "unsigned long long" "d_ino")
+ #-haiku
(:c-string name "char *" "d_name"
;; FIXME: sunos should really have :distrust-length
;; t, but this is currently broken. -- Jim Wise 2010-08-31
diff --git a/contrib/sb-posix/posix-tests.lisp b/contrib/sb-posix/posix-tests.lisp
index 72551f69c..48d07eae8 100644
--- a/contrib/sb-posix/posix-tests.lisp
+++ b/contrib/sb-posix/posix-tests.lisp
@@ -162,6 +162,8 @@
;; non-writable parent dir may return EACCES instead of ENOTDIR
#+unix (member err `(,sb-posix:enotdir ,sb-posix:eacces)))))
+;; disable for haiku
+#-haiku
(deftest rmdir.error.3
(handler-case
(sb-posix:rmdir #-win32 "/" #+win32 (sb-ext:posix-getenv "windir"))
@@ -171,7 +173,7 @@
`(member #+(or darwin openbsd freebsd) ,sb-posix:eisdir
#+win32 ,sb-posix::eacces #+win32 ,sb-posix::enotempty
#+sunos ,sb-posix::einval
- #-(or darwin openbsd freebsd win32 sunos) ,sb-posix::ebusy))))
+ #-(or darwin openbsd freebsd win32 sunos haiku) ,sb-posix::ebusy))))
t)
(deftest rmdir.error.4
@@ -223,7 +225,7 @@
(logand mode (logior sb-posix::s-iread sb-posix::s-iwrite sb-posix::s-iexec)))
#.(logior sb-posix::s-iread sb-posix::s-iwrite sb-posix::s-iexec))
-#-(or (and darwin x86) win32)
+#-(or (and darwin x86) win32 haiku)
(deftest stat.2
(eql
(sb-posix::stat-mode (sb-posix:stat "/"))
@@ -419,7 +421,7 @@
sb-posix::o-nonblock))
t)
-#-(or gc-stress win32 netbsd) ; fix: cant handle c-vargs
+#-(or gc-stress win32 netbsd haiku) ; fix: cant handle c-vargs
(deftest fcntl.flock.1
(locally (declare (sb-ext:muffle-conditions sb-ext:compiler-note))
(let ((flock (make-instance 'sb-posix:flock
@@ -511,7 +513,9 @@
(sb-posix:closedir dir))))
nil)
-#-(and darwin x86)
+;;#-(and darwin x86)
+;; disable on haiku
+#-haiku
(deftest readdir.1
(let ((dir (sb-posix:opendir "/")))
(unwind-protect
@@ -524,7 +528,7 @@
(sb-posix:closedir dir)))
t)
-#-darwin
+#-(or darwin haiku)
(test-util:with-test (:name :readdir/dirent-name)
(let* ((dir (sb-posix:opendir *current-directory*))
(posix-readdir (loop for entry = (sb-posix:readdir dir)
@@ -566,7 +570,7 @@
(not (sb-posix:getpwuid 0))
nil)
-#-(or android win32)
+#-(or android win32 haiku)
(deftest pwent.2
;; make sure that we found something
(not (sb-posix:getpwnam "root"))
@@ -712,7 +716,7 @@
(plusp (sb-posix:time))
t)
-#-(or (and darwin x86) win32)
+#-(or (and darwin x86) win32 haiku)
(macrolet ((test (name posix-fun)
`(deftest ,name
(let ((file (merge-pathnames #p"utimes.1" *test-directory*))
@@ -760,7 +764,7 @@
#.(concatenate 'string "/" (make-string 255 :initial-element #\a)))
;; The error tests are in the order of exposition from SUSv3.
- #-freebsd
+ #-(or freebsd haiku)
(deftest readlink.error.1
(if (zerop (sb-posix:getuid))
sb-posix:eacces
@@ -782,6 +786,8 @@
(sb-posix:unlink link-pathname)
(sb-posix:rmdir subdir-pathname)))))
#.sb-posix:eacces)
+ ;; TERRIBLE
+ #-haiku
(deftest readlink.error.2
(let* ((non-link-pathname (make-pathname :name "readlink.error.2"
:defaults *test-directory*))
@@ -812,6 +818,8 @@
#.sb-posix:eloop)
;; Note: PATH_MAX and NAME_MAX need not be defined, and may vary, so
;; failure of this test is not too meaningful.
+ ;; TERRIBLE
+ #-haiku
(deftest readlink.error.4
(let ((pathname
(make-pathname :name (make-string 257 ;NAME_MAX plus some, maybe
diff --git a/src/code/unix.lisp b/src/code/unix.lisp
index 880975fa9..99065f438 100644
--- a/src/code/unix.lisp
+++ b/src/code/unix.lisp
@@ -924,10 +924,20 @@ avoiding atexit(3) hooks, etc. Otherwise exit(2) is called."
(it-interval (struct timeval)) ; timer interval
(it-value (struct timeval)))) ; current value
+#-haiku
(defconstant itimer-real 0)
+#-haiku
(defconstant itimer-virtual 1)
+#-haiku
(defconstant itimer-prof 2)
+#+haiku
+(defconstant itimer-real 1)
+#+haiku
+(defconstant itimer-virtual 2)
+#+haiku
+(defconstant itimer-prof 3)
+
#-win32
(defun unix-getitimer (which)
"UNIX-GETITIMER returns the INTERVAL and VALUE slots of one of
diff --git a/src/runtime/Config.x86-64-haiku b/src/runtime/Config.x86-64-haiku
index 429e4ab90..f862b5756 100644
--- a/src/runtime/Config.x86-64-haiku
+++ b/src/runtime/Config.x86-64-haiku
@@ -14,12 +14,16 @@ ARCH_SRC = x86-64-arch.c
OS_SRC = haiku-os.c x86-64-haiku-os.c
LINKFLAGS += -Wl,--export-dynamic
-OS_LIBS += -lbe -lnetwork
+OS_LIBS += -lbe -lnetwork -lbsd
ifdef LISP_FEATURE_SB_THREAD
OS_LIBS += -lpthread
endif
+ifdef LISP_FEATURE_SB_CORE_COMPRESSION
+ OS_LIBS += -lzstd
+endif
+
CFLAGS += -Wunused-parameter -fno-omit-frame-pointer -momit-leaf-frame-pointer -gdwarf-2
# The installed compiler won't work with no-pie.
# The support ticket https://dev.haiku-os.org/ticket/12430 is closed,
diff --git a/src/runtime/haiku-os.c b/src/runtime/haiku-os.c
index 7bdfc7bb0..8a55206a0 100644
--- a/src/runtime/haiku-os.c
+++ b/src/runtime/haiku-os.c
@@ -3,6 +3,7 @@
#include "interrupt.h"
#include "arch.h" // for arch_get_bad_addr
#include "interrupt.h" // for sig_stop_for_gc_handler
+#include "gc.h" // for gencgc_handle_wp_violation
#include <image.h>
#include <stdio.h>
@@ -14,7 +15,11 @@ os_alloc_gc_space(int __attribute__((unused)) space_id,
attributes &= ~IS_GUARD_PAGE;
// There's no MAP_NORESERVE flag? How do we inform the OS not to commit
// the whole range to swap?
- int flags = MAP_PRIVATE | MAP_ANONYMOUS;
+ //int flags = MAP_PRIVATE | MAP_ANONYMOUS;
+ int flags = MAP_PRIVATE | MAP_NORESERVE | MAP_ANONYMOUS;
+ if (addr)
+ flags |= MAP_FIXED;
+
os_vm_address_t actual;
#ifdef MAP_32BIT
@@ -23,6 +28,8 @@ os_alloc_gc_space(int __attribute__((unused)) space_id,
#endif
actual = mmap(addr, len, protection, flags, -1, 0);
if (actual == MAP_FAILED) {
+ fprintf(stderr, "mmap: FAILED__ wanted %lu bytes at %p, actually mapped at %p\n",
+ (unsigned long) len, addr, actual);
perror("mmap");
return 0; /* caller should check this */
}
@@ -56,13 +63,16 @@ sigsegv_handler(int signal, siginfo_t *info, os_context_t *context)
if (gencgc_handle_wp_violation(context, addr)) return;
if (!handle_guard_page_triggered(context, addr))
- interrupt_handle_now(signal, info, context);
+ lisp_memory_fault_error(context, addr);
+ //interrupt_handle_now(signal, info, context);
}
void
os_install_interrupt_handlers(void)
{
- ll_install_handler(SIGSEGV, sigsegv_handler);
+ if (INSTALL_SIG_MEMORY_FAULT_HANDLER) {
+ ll_install_handler(SIGSEGV, sigsegv_handler);
+ }
}
int pthread_getattr_np(pthread_t thread, pthread_attr_t *attr)
@@ -70,14 +80,14 @@ int pthread_getattr_np(pthread_t thread, pthread_attr_t *attr)
lose("pthread_getattr_np unimplemented");
}
-int pthread_attr_setstack(pthread_attr_t *attr,
- void *stackaddr, size_t stacksize)
-{
- lose("pthread_attr_setstack unimplemented");
-}
-
-int pthread_attr_getstack(const pthread_attr_t *attr,
- void **stackaddr, size_t *stacksize)
-{
- lose("pthread_attr_getstack unimplemented");
-}
+//int pthread_attr_setstack(pthread_attr_t *attr,
+// void *stackaddr, size_t stacksize)
+//{
+// lose("pthread_attr_setstack unimplemented");
+//}
+//
+//int pthread_attr_getstack(const pthread_attr_t *attr,
+// void **stackaddr, size_t *stacksize)
+//{
+// lose("pthread_attr_getstack unimplemented");
+//}
diff --git a/src/runtime/thread.c b/src/runtime/thread.c
index d9b9c2d89..4491aff79 100644
--- a/src/runtime/thread.c
+++ b/src/runtime/thread.c
@@ -251,6 +251,11 @@ int sb_GetTID()
int sb_GetTID() {
return pthread_mach_thread_np(pthread_self());
}
+#elif defined __HAIKU__ && defined LISP_FEATURE_SB_THREAD
+#include <OS.h>
+int sb_GetTID() {
+ return get_pthread_thread_id(pthread_self());
+}
#else
#define sb_GetTID() 0
#endif
diff --git a/src/runtime/x86-64-haiku-os.c b/src/runtime/x86-64-haiku-os.c
index 15a7b0824..16e722d26 100644
--- a/src/runtime/x86-64-haiku-os.c
+++ b/src/runtime/x86-64-haiku-os.c
@@ -1,12 +1,27 @@
#include "os.h"
#include "thread.h"
#include <signal.h>
+#include <string.h>
+#include <errno.h>
+
+//int arch_os_thread_init(struct thread __attribute__((unused)) *thread) {
+int arch_os_thread_init(struct thread *thread) {
+
+ /* Signal handlers are run on the control stack, so if it is exhausted
+ * we had better use an alternate stack for whatever signal tells us
+ * we've exhausted it */
+ stack_t sigstack;
+ sigstack.ss_sp = calc_altstack_base(thread);
+ sigstack.ss_flags = 0;
+ sigstack.ss_size = calc_altstack_size(thread);
+ if (sigaltstack(&sigstack,0)<0)
+ lose("Cannot sigaltstack: %s",strerror(errno));
-int arch_os_thread_init(struct thread __attribute__((unused)) *thread) {
return 1;
}
-int arch_os_thread_cleanup(struct thread __attribute__((unused)) *thread) {
+//int arch_os_thread_cleanup(struct thread __attribute__((unused)) *thread) {
+int arch_os_thread_cleanup(struct thread *thread) {
return 1;
}
@@ -49,7 +64,8 @@ os_restore_fp_control(os_context_t *context)
}
void
-os_flush_icache(os_vm_address_t __attribute__((unused)) address,
- os_vm_size_t __attribute__((unused)) length)
+//os_flush_icache(os_vm_address_t __attribute__((unused)) address,
+// os_vm_size_t __attribute__((unused)) length)
+os_flush_icache(os_vm_address_t address, os_vm_size_t length)
{
}
diff --git a/tests/arith-slow.pure.lisp b/tests/arith-slow.pure.lisp
index 57bf456eb..abe492307 100644
--- a/tests/arith-slow.pure.lisp
+++ b/tests/arith-slow.pure.lisp
@@ -2,11 +2,11 @@
;;; than all other tests in arith.pure combined.
(defmacro test-guts ()
- #+sb-thread '(let ((t1 (sb-thread:make-thread #'doit :arguments '(-8 0)))
+ #-sb-thread '(let ((t1 (sb-thread:make-thread #'doit :arguments '(-8 0)))
(t2 (sb-thread:make-thread #'doit :arguments '(1 8))))
(sb-thread:join-thread t1)
(sb-thread:join-thread t2))
- #-sb-thread '(doit -8 8))
+ #+sb-thread '(doit -8 8))
(with-test (:name (logand :complicated-identity)
:skipped-on :mips) ; too slow
diff --git a/tests/debug.impure.lisp b/tests/debug.impure.lisp
index 493dbe542..5000ba40d 100644
--- a/tests/debug.impure.lisp
+++ b/tests/debug.impure.lisp
@@ -139,7 +139,7 @@
(defparameter *breakpoint-tracing-expectations*
'(:fails-on (or :arm :arm64)
- :broken-on (or :freebsd :ppc :ppc64)))
+ :broken-on (or :freebsd :ppc :ppc64 :haiku)))
;;; bug 379
(with-test (:name (trace :encapsulate nil)
diff --git a/tests/run-program.test.sh b/tests/run-program.test.sh
index df49a2843..70347407a 100755
--- a/tests/run-program.test.sh
+++ b/tests/run-program.test.sh
@@ -49,7 +49,7 @@ run_sbcl --eval "(defvar *exit-ok* $EXIT_LISP_WIN)" <<'EOF'
;; (instead of CMU CL alist-of-keywords convention).
#+unix ; env works differently for msys2 apparently
(let ((string (with-output-to-string (stream)
- (sb-ext:run-program "/usr/bin/env" ()
+ (sb-ext:run-program "/bin/env" ()
:output stream
:environment '("FEEFIE=foefum")))))
(assert (equal string "FEEFIE=foefum
@@ -98,7 +98,7 @@ run_sbcl --eval "(defvar *exit-ok* $EXIT_LISP_WIN)" <<'EOF'
(let* ((sb-impl::*default-external-format* :latin-1)
(sb-alien::*default-c-string-external-format* :latin-1)
(string (with-output-to-string (stream)
- (sb-ext:run-program "/usr/bin/env" ()
+ (sb-ext:run-program "/bin/env" ()
:output stream)))
(expected (apply #'concatenate
'string