Compiling FB on Windows
 

准备

获取FB源代码

要编译新版本的FB,您首先需要获取FB源代码.以下假设您有一个名为fbc的目录,其中包含最新的FB源代码。

安装MinGW-w64工具链

在本指南中,我们将使用32位或64位MinGW-w64工具链分别构建32位或64位版本的FB。请访问http://sourceforge.net/projects/mingw-w64/files/,并输入针对Win64的工具链针对Win32的工具链目录,具体取决于是否要编译32位或64位版本的FB。输入Personal Builds/mingw-builds/子目录,选择最新的gcc版本,然后输入threads-win32/sjlj/子目录并从那里下载工具链软件包。

将工具链解压缩成新的C:\MinGW-w64目录,最终得到C:\MinGW-w64\bin\gcc.exe.

如果您知道您在做什么,还可以使用不同的MinGW-w64工具链,甚至可以使用MinGW.org或TDM-GCC等不同项目。有关DevGccToolchainChoice页面上MinGW工具链选项的更多信息。

安装MSYS

MSYS(原来是Cygwin的分支)将一个类Unix的shell环境带到Windows中,包括GNU make,bash shell和Unix命令行工具,如cprm.对于FB,我们需要它来运行FB makefile和FB测试套件。

可以使用最新版本的从MinGW.org项目中获取设置下载并提取所需的MSYS软件包。

运行安装程序并选择C:\MinGW作为安装目录。这样,它将与C:\MinGW-w64分开,避免潜在的冲突。MinGW安装管理器(C:\MinGW\bin\mingw-get.exe)应该自动打开。使用它从“基本设置”部分安装mingw-developer-toolkit程序包,方法是单击包名称旁边的框,然后选择“标记为安装”,然后从应用程序菜单中选择安装 - >应用更改。

这应该安装常用的MSYS组件。我们不想在这里安装mingw32-basemingw32-gcc-*软件包,因为我们使用的是外部的MinGW-w64工具链而不是MinGW.org。如果您不希望使用MinGW.org安装程序,还可以从MinGW项目的下载站点手动下载MinGW / MSYS软件包。

最终,MSYS应该安装在C:\MinGW\msys\1.0\.现在有三个重要的目录:C:\MinGW-w64\bin\C:\MinGW\bin\C:\MinGW\msys\1.0\bin\.所有这些都必须添加到PATH环境变量中(按给定的顺序),以便在从命令提示符或FB makefile中调用它们时包含的程序。

为了避免修改系统范围的PATH,您可以使用下面的open-msys.bat脚本,每次需要时,使用所需的PATH设置打开一个MSYS bash:

set PATH=C:\MinGW\msys\1.0\bin;%PATH%
set PATH=C:\MinGW\bin;%PATH%
set PATH=C:\MinGW-w64\bin;%PATH%
C:\MinGW\msys\1.0\msys.bat

获得libffi

FB rtlib源代码取决于gcc工具链中可用的libffi标头(ffi.hffitarget.h)包含目录(C:\MinGW-w64\i686-w64-mingw32\include,用于32位MinGW-w64和C:\MinGW-w64\x86_64-w64-mingw32\include,用于64位MinGW-w64)。此外,在编译使用Threadcall的FB程序时,稍后将需要libffi.a库。

预设版本的libffi可从fbc下载区获取。

如果您不想使用预构建版本,但是更愿意手动编译libffi,那么它是相当简单的。libffi使用autotools(autoconf,automake,libtool)构建系统,因此必须为MinGW / MSYS安装相应的包。打开MSYS bash(使用正确的PATH设置)。

  • 32位:
$ ./configure
$ make
  • 64位:这需要在MSYS'uname周围工作,即使在64位上仍然返回32位:
$ ./configure --build=x86_64-w64-mingw32 --host=x86_64-w64-mingw32
$ make

这应该在include/子目录中生成libffi标头,并在.libs/子目录中生成编译库。然后,您可以将它们复制到MinGW-w64工具链的相应目录中,以便gcc可以找到它们。

独立构建(自包含FB)

获取现有的FB设置进行自举

我们需要一个工作的FB-win32安装来引导新的FB编译器。如果您还没有安装FB-win32,请从FB的下载网站下载最新的FreeBASIC-X.XX.X-win32版本。它应该在C:\FreeBASIC-X.XX.X-win32之外提取。

构建新的FB设置

如果要创建一个传统独立FB-win32安装程序,就像FreeBASIC-X.XX.X-win32发行版中一样,您需要通过设置ENABLE_STANDALONE变量来告诉FB的makefile。此外,为了编译64位,需要手动设置TARGET_ARCH变量,因为MSYS的uname -m命令不支持64位,因此FB makefile会将系统错误地检测为32位。假设FB源位于C:\fbc,请创建一个包含以下内容的C:\fbc\config.mk文件:

  • 32位:
ENABLE_STANDALONE = 1
  • 64位:
ENABLE_STANDALONE = 1

# Manually set TARGET_ARCH to override uname check for 64bit
TARGET_ARCH = x86_64

然后,使用上述.bat脚本打开MSYS bash(使用正确的PATH设置),使用FB源代码进入目录,运行“make”,将FBC=...变量设置为到现有的fbc.exe用于引导,并让它编译:

$ cd /c/fbc
$ make FBC=C:/FreeBASIC-X.XX.X-win32/fbc.exe

这应该分别在lib\win32\lib\win64\中生成了fbc.exe编译器和库。要完成这个新的FB设置,您需要将binutils(as.exe,ar.exe,ld.exe,dlltool.exe)添加到bin\win32\并将其部分MinGW库复制到lib\win32\中。

  • 复制到C:\fbc\bin\win32(32bit)或C:\fbc\bin\win64(64bit):
    • C:\MinGW-w64\bin\{ar,as,ld,dlltool}.exe
    • 来自http://www.godevtool.com/ GoRC.exe
  • 复制到C:\fbc\lib\win32(32bit)或C:\fbc\lib\win64(64bit):
    • C:\MinGW-w64\[target]\lib\{crt2,dllcrt2,gcrt2}.o
    • C:\MinGW-w64\[target]\lib\lib{gmon,mingw32,mingwex,moldname}.a
    • C:\MinGW-w64\[target]\lib\lib{advapi32,gdi32,kernel32,msvcrt,user32,winmm,winspool}.a (rename to lib*.dll.a if wanted)
    • C:\MinGW-w64\lib\gcc\[target]\[version]\{crtbegin,crtend}.o
    • C:\MinGW-w64\lib\gcc\[target]\[version]\libgcc.a
    • libffi.a(从预构建的libffi包或您自己的构建)
[target])对于64位MinGW-w64的32位MinGW-w64或x86_64-w64-mingw32i686-w64-mingw32[version]是gcc版本号)

如果需要,您可以复制更多的库,例如C:\MinGW-w64\lib\gcc\[target]\[version]\libsupc++.aC ++支持库或来自C:\MinGW-w64\[target]\lib\目录的其他Win32 API DLL导入库。

现在,新的FB设置应该可以使用了。您可以从源代码树中使用它,或将其复制到别的地方。以下是相关的文件和目录:

  • fbc.exe
  • bin/win32/(32bit)或bin/win64/(64bit)
  • inc/
  • lib/win32/(32位)或lib/win64/(64位)

正常构建(如Linux)

获取现有的FB设置进行自举

我们需要一个工作的fbc安装来引导新的FB编译器。如果您尚未安装fbc,请从FB的下载网站下载最新的fbc-X.XX.X-mingw-w64-i686(32位)或fbc-X.XX.X-mingw-w64-x86_64(64位) ,并将其提取到MinGW-w64目录(C:\MinGW-w64),如MinGW包。这将为您的MinGW-w64安装添加一个工作的fbc。

构建新的FB设置

为了创建正常(非独立)构建,只需编译FB,而不指定ENABLE_STANDALONE.但是,为了编译64位,需要手动设置TARGET_ARCH变量,因为MSYS的uname -m命令不支持64位,因此FB makefile会将系统错误地检测为32位。

  • 32bit:否config.mk需要。
  • 64bit:创建一个包含以下内容的config.mk
# Manually set TARGET_ARCH to override uname check for 64bit
TARGET_ARCH = x86_64

然后,使用上述.bat脚本打开MSYS bash(使用正确的PATH设置),使用FB源代码进入目录,运行“make”并编译它:

$ cd /c/fbc
$ make

这应该分别在lib\freebasic\win32\lib\freebasic\win64\中生成了bin/fbc.exe编译器和库。

或者,您可以通过运行“make install”将此设置复制到C:\MinGW-w64树中:

$ make install prefix=C:/MinGW-w64

将前缀变量存储在config.mk中是非常有用的,因此您将来可以运行make install,而无需担心:

# config.mk:
prefix = C:/MinGW-w64

以这种方式将fbc安装到MinGW树中意味着它的作用就像是MinGW的一部分。但是,也可以从源代码树中使用fbc,而不必在其他地方安装它。它将调用gcc -print-file-name=...以找到MinGW binutils和库。