FBC написан на самом FB, поэтому вам нужен рабочий
FBC для построения нового
FBC.
Как это сделать в системе, где нет рабочего
FBC?
Существует два варианта: Предварительная компиляция (с помощью кросс
компиляции) исходников fbc на системе, где вы имеете рабочий fbc а затем
принимать полученные результаты на целевой системе, или полная
кросс-компиляция с использованием набора инструментов GCC кросс-компилятора.
Начальная загрузка по предварительной компиляции
источников компилятора
- На целевой системе, компиляция FB rtlib/gfxlib2 с помощью нативного
компилятора C, как обычно:
- На Linux или Win32 (или другой системе, где у вас есть рабочий fbc),
использовать существующий FBC к кросс-компиляции src/compiler/*.bas
в *.asm (-gen gas, x86 только) или *.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, в противном случае могут быть проблемы
несовместимости. Версия компилятора всегда должна
соответствовать версии rtlib/gfxlib2 в ее директории lib/.
- Когда линкуется fbc для Unix-подобных систем, вам необходимо связать его с libncurses
или libtinfo, а также с libpthread, потому что fbc использует среду выполнения
FB, которая зависит от этих библиотек и gcc не связывает их по умолчанию. Когда
линкуется fbc для Win32/Win64 это не требуется.
- Альтернативой линковки с gcc является вызов ld вручную, как fbc сам, как
правило, делает это. Вы можете посмотреть на выход fbc -v, чтобы увидеть, что он
делает. Однако, это является более сложным.
Начальная загрузка всего по кросс-компиляции
Если вы находитесь на 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)
Кросс-компиляция 64 разрядной версии на 32-битной системе с gcc -m64
Если у вас есть GCC мультибиблиотечный набор инструментов с -m64 поддержкой
на 32bit системе, вы можете использовать его для кросс-компиляции 64-битной
версии FB. Например, на 32-битной Ubuntu (GNU/Linux), вы можете установить
gcc-multilib
пакет для установки поддержки
gcc -m64. В Win32 GCC компилированные
инструменты из проекта MinGW-W64 также имеют поддержку кросс-компиляции для
64bit через
gcc -m64.
# 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'
Это делает работу не только для
gcc -m64 на 32bit, но также
gcc -m32
на 64bit. Для кросс-компиляции 32 bit FB на 64-битной системе, просто
поменяйте 32 и 64 в приведенном выше примере. Для примера необходимо указать
MULTILIB=32
вместо
MULTILIB=64.