>> 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))
+ 

Reply via email to