您如何构建具有 LibFFI 支持的 Rebol 的 "Ren-C" 分支?

How do you build Rebol's "Ren-C" branch with LibFFI support?

我想使用 Ren-C Rebol 分支中的 FFI 功能访问动态库。我知道这可以通过启用 LibFFI 支持来构建。我需要采取哪些步骤才能启用此功能?

我主要使用 OS X 进行开发,但也希望能够构建它以用于 Linux。

(注意:这可能是应该添加到 Wiki 中的信息,因为它与其说是语言问题,不如说是随时间变化的信息。但是,有责任感,所以...)

如果您使用 GNU make 方法进行构建(其中 make -f makefile.boot 为您生成一个 makefile),那么您应该在其中找到一些行,例如:

TO_OS_BASE?= TO_OSX
TO_OS_NAME?= TO_OSX_X64
OS_ID?= 0.2.40
BIN_SUFFIX=
RAPI_FLAGS= -D__LP64__ -DENDIAN_LITTLE -DHAS_LL_CONSTS -O1 ...
HOST_FLAGS= -DREB_EXE  -D__LP64__ -DENDIAN_LITTLE ...

修改开头的RAPI_FLAGS和HOST_FLAGS行,增加-DHAVE_LIBFFI_AVAILABLE。这 (-D) 定义了一个预处理器指令来告诉代码生成对 FFI 的调用是可以的,因为您以后可以使用它进行链接。

现在告诉它在哪里可以找到包含文件。包含一行应该如下所示:

INCL ?= .
I= -I$(INCL) -I$S/include/ -I$S/codecs/ ...

您需要在其末尾添加类似于 -I/usr/local/opt/libffi/lib/libffi-3.0.13/include 或类似内容的内容。实际目录将取决于您的系统上有 libffi 的位置。在我正在查看的 OSX 系统上,其中有两个文件,ffi.hffitarget.h.

(注意:恐怕我不知道这些文件是如何进入这台计算机的。它们没有随 OS 一起提供,所以它们来自...某处。我通常不在 OSX 上开发——我也不使用这个 FFI。你必须咨询你当地的 FFI-on-OSX 网站,或者可能需要支持联系 Atronix Engineering) 将 FFI 功能添加到 Rebol。)

然后有必要告诉它您的系统上哪里有 libffi。您会发现一条 CLIB 行可能只是 CLIB= -lm。例如,您可以将其更改为:

CLIB= -L/usr/local/opt/libffi/lib -lm -lffi

-lffi 告诉它寻找 ffi (-l) 库,-lxxx 意味着它假设库的名称是 libxxx[something]-L/usr/local/opt/libffi/lib 告诉它在哪里寻找它。你必须弄清楚你在哪里(如果有的话)你有 libffi,如果没有的话。如果你有它,该目录将包含如下内容:

libffi-3.0.13
libffi.6.dylib
libffi.a
libffi.dylib
pkgconfig

I mainly use OS X for development, though would also like to be able to build it for use with Linux.

在 Linux 上,它与 sudo apt-get install libffi-dev 类似,但通常更容易获得库。 RFLAGS 和 CFLAGS 的步骤相同,它应该会自动处理位置...因此您只需将 -lffi 添加到 CLIB。

我的旧笔记:

猫steps-for-lib-ffi-osx

通过自制软件安装 libfffi

brew 安装 libffi

在生成的makefile中的-I中添加/use/include/libffi

添加/usr/local/Cellar/libffi/3.0.13/lib/libffi.a到OBJS中 生成的 makefile

版本 3.0.13 可能会有所不同