Win32 构建过程

Win32 与当前 SVN 情况有些复杂,所以我要专门使用一个段落来介绍。综上所述,Win32 的问题是 SVN 将自己的配置文件标记为只读,这会导致安装示例的问题,并且 2.0 的 cp 程序有 unix 路径 <-> Windows 路径问题,值得注意的是,他们没有把 xxxyyy 作为Windows 路径,他们将 d:xxxyyy 当作 Windows 路径。

有两种解决方案:快速的,是一个简洁的示例。慢的一个,最好偶尔进行一次慢速操作以获得最新的示例,其余的使用快速解决方案即可。缓慢的解决方案解决了旧版本 mingw 工具的一些问题。

除了 SVN 目录只读问题外,Vista 也存在问题,并且在一些 mingw 在 PATH 语句大小上也存在问题。

缓慢的解决方案:SVN导出

在开始之前,先定义目录(我的默认设置):

  • d:pp 是我目前安装 FPC 的目录和 d:ppbini386-win32 FPC 可执行文件目录在 %PATH% 中

  • d:fpcSVN 是我检出SVN 仓库的目录,我没有构建它

  • d:fpc 是我导出SVN 仓库的目录

  • d:fpcrel 是用于构建FPC 2.4.0 的目录

另一个重要问题是:确保 CYGWIN 的目录在不在环境变量 PATH中!!!原因是,在 mingw 找到后会使用 cygwin 的 sh.exe,简单的说,FPC 提供的工具和 cygwin 提供的工具是重复的,如果存在环境变量中,那么,将使用 cygwin 提供的工具,而不是 FPC的。因此,要保证,cygwin 可执行程序目录不在环境变量 PATH 中!!!

然后,为了构建和安装快照,我们需要更新 SVN:

请注意,make clean 目标仅清除当前 $FPCTARGET。要严格清理所有,删除所有.o,.a 和 .ppu 文件,然后 SVN 再次更新,以恢复 FPC 树中的少量.o文件夹(主要用于与C链接测试相关的组件)。

1
2
  cd /d d:\
  svn up fpcSVN

然后,我们导出它:

1
2
3
4
5
  # 清理以提高性能
  cd fpc
  make clean
  cd ..
  svn export --force fpcSVN fpc

现在,开始构建:

1
2
  cd fpc
  make clean all OPT='-gl' FPC=d:\fpcrel\bin\i386-win32\ppc386.exe

如果安装成功(所有内容在一行)

make install OPT='-gl' INSTALL_PREFIX=d:\pp11 UPXPROG=echo FPC=d:\fpcrel\bin\i386-win32\ppc386

有些事你需要注意:

  • 确保CYGWIN 目录不在环境变量 PATH中!!!Mingw/msys 也有问题,但很少见(见 2.6.4)

  • 选项(OPT=’-gl’)将传递给 make install,这是因为单元依赖性故障和实用程序,在安装过程中(更新)构建了少量代码。这适用于所有与安装无关的构建选项。

  • UPXPROG=echo 避免对生成可执行文件进行 UPX 压缩,以便可以调试程序。如果想减少程序体积,将删除该项,并将 SMART=1 添加到命令行中。注意,UPX虽然可以减少了程序体积,但浪费了比磁盘更昂贵的内存 1

  • 在SVN导出时,增加 force 参数,用于强制覆盖原来的存储库。如果构建出错,时间长了,请尝试在导入之前删除导出目录(d:fpc)。

快速解决方案:COPYTREE

快速解决方案利用仅用于复制示例的命令来完成递归复制。更新(已安装的)示例在日常更新中并不重要,人们通常希望避免缓慢的 SVN 导出。make 文件中用于递归复制的是 COPYTREE,然后我们使用与前面相同的技巧通过指定 echo 命令来禁用它:

make install COPYTREE=echo

VISTA特定主题:install.exe

Vista 在某些方面相当苛刻,在将来会有更多的问题,特别是在发布工程方面。(考虑到根目录中的临时文件,不允许在 appdir 中写入,等等)。然而,有一个小问题,也是一个正常的构建。

这个问题实际上是通过自动弹出 UAC 来避免安装干扰(否则你将不得不以管理员的身份运行,这对用户而言不是很友好),但它是半实现的。任何名称中包含安装,设置或更新的 EXE 都会弹出UAC,但是。UAC 提示控制台应用程序会失败 2

FPC 构建系统使用 GNU 安装(作为 ginstall.exe)文件需要有适当权限,并且由于 UAC失败。问题的定义也意味着解决方案:

  1. 将 (g)install.exe 文件复制到一个没有关键字的新名称,我使用 myinst.exe

  2. 将 GINSTALL=myinst.exe 传递给命令行:

make install GINSTALL=myinst.exe

附:通过添加清单,此 Vista/Windows 7 问题已在2.4.0中解决。

把它们放在一起

这是我在 Windows 上使用的批处理文件:(FPC源代码在 d:repofpc)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
  @echo on
  set BASEDRV=c:
  set SRCDIR=%BASEDRV%\repo\fpc set PPCNAME=ppc386
  set FPCSTART=c:\fpc\2.4.0\bin\i386-win32\%PPCNAME%
  set LOGDIR=%BASEDRV%\repo
  set INSTALLDIR=%BASEDRV%\pp11
  REM 一些随机设置
  set OPTS=-gl -dSAX_HTML_DEBUG -dUSE_MINGW_GDB
  set COMMONOPTS=UPXPROG=echo COPYTREE=echo OPT="%OPTS%" GINSTALL=myinst.exe
  rem === 不变部分 ===
  cd /d %SRCDIR%
  REM 构建
  make clean all %COMMONOPTS% FPC=%FPCSTART% 1> %LOGDIR%\buildlog.txt 2>&1
  REM 单独的安装步骤,用于交叉版本(在unix sudo下)(在一行)
  make install %COMMONOPTS% INSTALL_PREFIX=%INSTALLDIR% FPC=%SRCDIR%/compiler/%PPCNAME% 1> %LOGDIR%\installlog.txt 2>&1

实际上,我有几个这样的配置,一个是64位的,一个用于交叉编译到 wince 等,win64是一个副本,仅在路径中的 x86_64-win64 和 ppcx64,而不是 ppc386 中。请注意,所以变量都位于批处理文件中,这样可以通过调整路径轻松移植到其它系统中。有几台计算机和不同的路径是编写的原因。

不幸的是,纯批处理文件有限,不能在上面投入太多时间。

1

http://wiki.freepascal.org/Size_Matters

2

http://technet2.microsoft.com/WindowsVista/en/library/00d04415-2b2f-422c-b70e-b18918c2811033.mspxhttp://technet2.microsoft.com/WindowsVista/en/library/00d04415-2b2f-422c-b70e-b18ff918c2811033.mspx 搜索关键字