>> George Koehler <kern...@gmail.com> writes: >> >>> I have a problem: if devel/capstone/main is installed, then sbcl fails >>> to build on powerpc. This happens with sbcl-2.1.11 or sbcl-2.2.1. >>> >>> sbcl doesn't depend on capstone, and doesn't need capstone to build >>> contrib/sb-capstone, but does try to test sb-capstone during the >>> build. If libcapstone.so is missing, then sbcl skips the test. If >>> libcapstone.so is found, then the test crashes, so the build fails. >>> An installed capstone broke sbcl-2.1.11 in the ongoing powerpc bulk; >>> I told the bulk to retry sbcl; it succeeded after removing capstone.
I think I've finally solved it. The problem is that contrib/sb-capstone hardcodes some values from capstone.h so lisp can call the C functions. This "transcription" however is not accurate and worked until now by pure chance on 64 bit arches due to how arguments are passed and struct padding, pure luck! I've also discovered that sbcl compiles on i386 if built with ecl. To be honest the sbcl build infrastructure scares me, so I haven't digged into understanding why clisp won't do it when it works on amd64 and powerpc. The downside is that ecl is quite slow, here it takes roughly an hour and half to compile the port with it. So, the following patch updates sbcl, adds a bdep on capstone^1, fixes the issue reported and re-enables it for i386 with the ecl workaround. The patch should definitely be upstreamed and I'll look into how to do it tomorrow. OK/Comments/Tests? :) 1: the build is not affected by the presence of capstone and the module is built anyway; if it's present it just runs some extra tests that otherwise are skipped. Cheers, Omar Polo Index: Makefile =================================================================== RCS file: /cvs/ports/lang/sbcl/Makefile,v retrieving revision 1.47 diff -u -p -r1.47 Makefile --- Makefile 31 Dec 2021 09:53:11 -0000 1.47 +++ Makefile 22 Feb 2022 23:07:25 -0000 @@ -1,31 +1,12 @@ # $OpenBSD: Makefile,v 1.47 2021/12/31 09:53:11 solene Exp $ -BROKEN-i386 = build fails in "Compiling file [...]/src/compiler/generic/genesis.lisp" -# ;; Compiling file /pobj/sbcl-2.0.1/sbcl-2.0.1/src/compiler/generic/genesis.lisp ... -# ;; Wrote file /pobj/sbcl-2.0.1/sbcl-2.0.1/obj/from-host/src/compiler/generic/genesis.fas-tmp -# 0 errors, 0 warnings -# ;; Loading file obj/from-host/src/compiler/generic/genesis.fas ... -# ;; Loaded file obj/from-host/src/compiler/generic/genesis.fas -# *** - OPEN: File -# #P"/pobj/sbcl-2.0.1/sbcl-2.0.1/obj/from-xc/tls-init.lisp-expr" does not -# exist -# The following restarts are available: -# SKIP :R1 skip (GENESIS OBJECT-FILE-NAMES # ...) -# RETRY :R2 retry (GENESIS OBJECT-FILE-NAMES # ...) -# STOP :R3 stop loading file /pobj/sbcl-2.0.1/sbcl-2.0.1/make-genesis-2.lisp -# ABORT-BUILD :R4 Abort building SBCL. -# ABORT :R5 Abort main loop -# //testing for consistency of first and second GENESIS passes -# diff: output/genesis-2: No such file or directory -# error: header files do not match between first and second GENESIS - # not yet ported to other arches ONLY_FOR_ARCHS = amd64 i386 powerpc USE_WXNEEDED = Yes COMMENT= compiler and runtime system for ANSI Common Lisp -V = 2.1.11 +V = 2.2.1 DISTNAME= sbcl-${V}-source PKGNAME= sbcl-${V} WRKDIST= ${WRKDIR}/sbcl-${V} @@ -58,10 +39,17 @@ WANTLIB+= pthread MAKE_PARAMS += --with-sb-core-compression \ --with-sb-xref-for-internals +# contrib/sb-capstone/test.lisp opens it at build-time if present +BUILD_DEPENDS = devel/capstone/main + .if ${FLAVOR:Mnative_bootstrap} BUILD_DEPENDS+= lang/sbcl BOOTSTRAP_CMD= ${LOCALBASE}/bin/sbcl \ --disable-debugger --no-sysinit --no-userinit +.elif ${MACHINE_ARCH:Mi386} +# ecl is way slower but clips fails to build sbcl on i386 +BUILD_DEPENDS += lang/ecl +BOOTSTRAP_CMD = ${LOCALBASE}/bin/ecl -q --norc .else BUILD_DEPENDS += lang/clisp BOOTSTRAP_CMD = ${LOCALBASE}/bin/clisp -q -norc Index: distinfo =================================================================== RCS file: /cvs/ports/lang/sbcl/distinfo,v retrieving revision 1.21 diff -u -p -r1.21 distinfo --- distinfo 31 Dec 2021 09:53:11 -0000 1.21 +++ distinfo 22 Feb 2022 23:07:25 -0000 @@ -1,2 +1,2 @@ -SHA256 (sbcl-2.1.11-source.tar.bz2) = v8FIHef9vfru8qsPDo6E79NDQz3qjSHPvqiwFGy9/v0= -SIZE (sbcl-2.1.11-source.tar.bz2) = 6687529 +SHA256 (sbcl-2.2.1-source.tar.bz2) = Xdbm4/CLfG7fJioOhEqfi15WLMoIFVA0wfLAFPyQh9o= +SIZE (sbcl-2.2.1-source.tar.bz2) = 6701705 Index: patches/patch-contrib_sb-capstone_capstone_lisp =================================================================== RCS file: patches/patch-contrib_sb-capstone_capstone_lisp diff -N patches/patch-contrib_sb-capstone_capstone_lisp --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ patches/patch-contrib_sb-capstone_capstone_lisp 22 Feb 2022 23:07:25 -0000 @@ -0,0 +1,26 @@ +$OpenBSD$ + +sync a couple of size mismatches with capstone.h; fixes the build on +32bit arches (i386, powerpc.) + +Index: contrib/sb-capstone/capstone.lisp +--- contrib/sb-capstone/capstone.lisp.orig ++++ contrib/sb-capstone/capstone.lisp +@@ -285,7 +285,7 @@ + (define-alien-type cs-insn + (struct nil + (insn-id int) +- (insn-addr unsigned) ++ (insn-addr (integer 64)) + (insn-size short) + (insn-bytes (array char 16)) + (insn-mnemonic (array char 32)) +@@ -310,7 +310,7 @@ + + ;; The handle returned by cs-open will be represented as being of type unsigned + +-(define-alien-routine cs-open int (arch int) (mode (integer 64)) (handle unsigned :out)) ++(define-alien-routine cs-open int (arch int) (mode unsigned) (handle unsigned :out)) + + (define-alien-routine cs-version unsigned (major int :out) (minor int :out)) +