Bootstrapping fbc on a new system
 

fbc是用FB写的,所以你需要一个工作的fbc来构建一个新的fbc。如何在没有工作的fbc存在的系统上执行此操作?有两个选项:在您具有工作fbc的系统上预编译(通过交叉编译)fbc源,然后将结果导入目标系统,或使用gcc交叉编译器工具链完全交叉编译。

通过预编译编译器源启动引导

  • 在目标系统上,照常使用本机C编译器编译FB的rtlib / gfxlib2:
make rtlib gfxlib2

  • 在Linux或Win32(或其他具有工作fbc的系统)上,使用现有的fbc将src/compiler/*.bas交叉编译为*.asm(-gen gas,x86 only)或*.c(-gen gcc,适用于每个目标)文件兼容到目标系统:
fbc -e -m fbc src/compiler/*.bas -r -target  -arch 
  
Some random examples:
x86 Win32 -> x86 OpenBSD: -target openbsd [-arch 486]
x86 Win32 -> x86_64 FreeBSD: -target freebsd -arch x86_64
x86 Linux -> ARM Linux: -target arm-linux-gnueabihf, or just -arch armv6

  • 将生成的.asm.c文件导入目标系统,并使用目标系统的本机工具构建最终的fbc可执行文件:


    • 如果您生成.asm文件,请将它们带到目标系统,并使用目标系统的本地汇编器将其组装到*.o对象文件中,然后将所有内容链接到新的fbc可执行文件中:
for i in src/compiler/*.asm; do
as $i -o `echo $i | sed -e 's/asm$/o/g'`
done

gcc -o fbc lib/freebasic//fbrt0.o src/compiler/*.o -Llib/freebasic/ -lfb -lncurses -lm -pthread

    • 如果您生成.c文件,请将其导入目标系统,并将其编译为新的fbc可执行文件:
gcc -o fbc lib/freebasic//fbrt0.o src/compiler/*.c -Llib/freebasic/ -lfb -lncurses -lm -pthread

附加说明和提示
  • 新的fbc和新的rtlib / gfxlib2必须由相同版本的FB源代码构建,否则可能会出现不兼容问题。编译器版本应始终与其lib/目录中的rtlib / gfxlib2版本相匹配。
  • 当链接到类Unix系统的fbc时,您需要将其链接到libncurses或libtinfo以及libpthread,因为fbc使用依赖于这些库的FB运行时,gcc默认情况下不链接它们。当连接不需要的Win32 / Win64的fbc。
  • 与gcc链接的替代方法是手动调用ld,如fbc本身通常会这样做。你可以看看fbc -v输出来看看它的作用。然而这更复杂。

通过交叉编译一切{Bootstrapping {

如果您使用的是Linux或Win32或已经有一个工作的fbc的另一个系统,并且您有一个用于目标系统的gcc交叉编译器工具链,并且需要链接目标系统的fbc(libc,libpthread,等等和libncurses / libtinfo),那么您可以直接交叉编译FB设置,如下所示:

  • 使用附加库构建本机FB设置,以交叉编译到目标系统:
# Get a directory with the fbc sources, e.g. "fbc"
cd fbc
make
make rtlib gfxlib2 TARGET=

# Optionally, you can install everything into /usr/local:
make install
make install-rtlib install-gfxlib2 TARGET=

  • 使用上面构建的本机FB设置来交叉编译目标系统的新FB设置:
cd ..
mkdir crosscompiled-fbc && cd crosscompiled-fbc
make -f ../fbc/makefile FBC='../fbc/bin/fbc -i ../fbc/inc' TARGET=
# (Specifying FBC=... is only needed if you did not install it globally)

使用gcc -m64 在32位系统上交叉编译64位版本

如果您在32位系统上具有支持-m64的gcc multilib工具链,则可以使用它来交叉编译64位版本的FB。例如,在32位Ubuntu(GNU / Linux)上,您可以安装gcc-multilib软件包来安装gcc -m64支持。MinGW-w64项目的Win32 gcc工具链也支持通过gcc -m64交叉编译为64位。

# Get FB sources into fbc/ (must be 0.91+ because earlier versions didn't support multilib/64bit at all),
# and build a native (32bit) FB first
cd fbc
make

# Then add the 64bit rtlib/gfxlib2 to that. Specifying MULTILIB=64 tells the FB makefile to use gcc -m64.
make rtlib gfxlib2 MULTILIB=64

# Now we have a new 32bit FB with 64bit libraries for cross-compiling.
# This can now be used to build a full 64bit FB:
cd ..
mkdir fbc64
cd fbc64
make -f ../fbc/makefile MULTILIB=64 FBC='../fbc/bin/fbc -i ../fbc/inc'

这不仅适用于32位的gcc -m64,而且还可以在64位上使用gcc -m32.为了在64位系统上交叉编译32位FB,只需在上面的示例中交换32和64。例如,您必须指定MULTILIB=32而不是MULTILIB=64.