Clozure CL中文版003:从源代码构建Clozure CL
Category:帮助手册从源代码构建Clozure CL
建筑定义
以下条款用于后续章节; 参考这些定义可能会有所帮助。
甲FasL的文件是由所产生的文件compile-file。这些文件以紧凑的机器可读形式存储与函数定义相关的机器代码和其他lisp对象的外部表示。“ FASt Loading”的缩写。Clozure CL使用不同的路径名类型(扩展名)来命名不同平台上的fasl文件; 有关详细信息,请参阅特定于平台的文件名约
该口齿不清内核是具备相当的特定于平台的汇编语言代码的C程序。lisp内核为lisp代码提供运行时支持,例如垃圾收集,内存分配,异常处理等。当lisp内核启动时,它会将堆映像映射到内存中,并将控制权转移到映像包含的已编译的lisp代码。
一个堆图像是可以迅速地映射到进程的地址空间中的文件。从概念上讲,它与OS的本机格式(ELF或Mach-O / dyld格式)中的可执行文件或共享库没有太大区别; 由于历史原因,Clozure CL自己的堆映像是以他们自己的(相当简单的)格式。完整堆映像包含构成Clozure CL的所有代码和数据。默认映像文件名是带有.image后缀的lisp内核的名称。请参阅平台特定的文件名约定。
引导映像(请参阅创建引导映像)是在构建Clozure CL本身的过程中使用的最小堆映像。引导映像包含足够的代码来从fasl文件加载Clozure CL的其余部分。该功能会rebuild-ccl 自动创建一个引导映射图像作为其工作的一部分。
每个受支持的平台(可能还有一些尚未支持的平台)具有唯一命名的子目录 ccl/lisp-kernel/; 每个这样的内核构建目录都包含一个Makefile,并且可能包含一些辅助文件(链接器脚本等),这些文件用于在特定平台上构建lisp内核。特定于平台的文件名约定中描述了内核构建目录的特定于平台的名称。
特定于平台的文件名约定 | |||
平台 | 核心 | fasl扩展 | 内核构建目录 |
Linux(ppc) | ppccl | .pfsl | linuxppc |
Linux(ppc64) | ppccl64 | .p64fsl | linuxppc64 |
Linux(x8664) | lx86cl64 | .lx64fsl | linuxx8664 |
Linux(x8632) | lx86cl | .lx32fsl | linuxx8632 |
Linux(arm32) | armcl | .lafsl | linuxarm |
OS X(x8664) | dx86cl64 | .dx64fsl | darwinx8664 |
OS X(x8632) | dx86cl | .dx32fsl | darwinx8632 |
FreeBSD(x8664) | fx86cl64 | .fx64fsl | freebsdx8664 |
FreeBSD(x8632) | fx86cl | .fx32fsl | freebsdx8632 |
Solaris(x8664) | sx86cl64 | .sx64fsl | solarisx64 |
Solaris(x8632) | sx86cl | .sx32fsl | solarisx86 |
Windows(x8664) | wx86cl64.exe | .wx64fsl | Win64平台 |
Windows(x8632) | wx86cl.exe | .wx32fsl | 的win32 |
建筑的原因
在给定的时间,您可能希望使用两个版本的Clozure CL(因此可能希望从源代码构建)。
第一个是当前的发布分支。有时会将严重错误的修复程序检入发布分支,您可能希望从Subversion更新并重建以获取这些修复程序。
您可能还有兴趣构建Clozure CL的开发版本,通常称为主干。主干可能包含有趣的新功能和有趣的新bug。 有关如何签出主干副本的信息,请参见http://trac.clozure.com/ccl/wiki。
内核构建先决条件
为了构建lisp内核,您必须已经安装了C编译器及其相关工具(例如as和ld)。另外,lisp内核构建过程使用m4; 默认情况下,通常不会安装此程序,因此请确保您已安装该程序。lisp内核makefile通常假设您使用的是GNU make。
在最近的Mac OS X系统中,键入xcode-select –install应该下载并安装构建Clozure CL所需的一切。
建设一切
有了所有先决条件,构建Clozure CL非常简单。
$ ccl -n
? (ccl:rebuild-ccl :full t)
这将执行以下步骤:
- 删除ccl目录树中的所有fasl文件和其他目标文件
- (compile-ccl t)在运行的lisp中,是否从lisp源生成fasl文件。
- 是否(xload-level-0 :force)在运行口齿不清。这将编译ccl:level-0;目录中的lisp文件,然后从已编译的fasl文件中创建一个特殊的引导映像。
- 运行make在当前平台的内核构建目录中运行的外部进程 以创建新内核。只有安装了C编译器和相关工具,此步骤才有效; 请参阅内核构建先决条件。
- 运行另一个外部进程,这会导致新编译的lisp内核加载新的引导映像。然后,引导映像加载其余的fasl文件,然后保存平台的完整堆映像的新副本。
当一切顺利时,这一切都在没有用户干预和一些简单的进度消息的情况下发生。如果在执行任一外部进程期间出现任何问题,则进程输出将显示为lisp错误消息的一部分。
rebuild-ccl基本上只是运行重建系统所涉及的所有单个步骤的捷径。您也可以单独执行这些步骤,如下所述。
构建内核
重建lisp内核是直截了当的。请参阅表特定于平台的文件名约定,以确定所需的lisp内核构建目录的名称。然后,切换到该目录并说出来make。假设您想为64位FreeBSD / x86构建lisp内核。我们发现lisp内核构建目录的名称是freebsdx8664,所以我们执行以下操作:
$ cd ccl/lisp-kernel/freebsdx8664
$ make clean
$ make
构建失败的最常见原因是因为未安装m4。如果你看到m4: command not found,那么你应该安装m4。
在Mac OS X上,确保已安装命令行开发人员工具xcode-select –install。如果您收到错误消息,指出sys/signal.h无法找到该文件,则表明您需要执行此操作。即使已经安装了Xcode,也需要这样做。
建立堆图像
通常,rebuild-ccl用于重建所有Clozure CL。在特殊情况下,您可能希望更多地控制堆映像的构建方式。这些情况通常仅在开发Clozure CL本身时才会出现。
创建新的Clozure CL堆映像包括以下步骤:
- 使用现有的lisp,重新编译更新的lisp源代码
- 使用现有的lisp,创建一个新的自举图像
- 启动lisp内核并告诉它加载刚刚创建的引导映像
编译Lisp源代码
呼叫:
? (ccl:compile-ccl)
在lisp提示符下编译与相应的lisp源相关的任何过时的fasl文件; (ccl:compile-ccl t)强制重新编译。ccl:compile-ccl重新加载一些文件的新编译版本;ccl:xcompile-ccl是类似的,但跳过这个重新加载步骤。
除非涉及引导考虑因素,否则在重新编译这些文件后是否重新加载通常无关紧要。
调用compile-ccl或 xcompile-ccl在一个尚未存在fasl文件的环境中,只要require在编译期间文件为d,就会产生相应的警告; 这些警告可以安全地忽略。根据Clozure CL版本的成熟度,调用 compile-ccl或者 xcompile-ccl还可能产生关于未定义函数的几个警告等。应该在某些时候清除它们。
创建一个Bootstrapping图像
Clozure CL发行版中未提供引导图像。它可以使用下面描述的过程从分发中提供的源代码(使用这些分发中提供的lisp图像和内核)构建。
引导映像是通过在正在运行的Clozure CL堆映像中调用特殊实用程序来构建的,以加载目录中包含的ccl/level-0文件。自举图像加载了几十个fasl文件。完成后,它会保存堆映像save-application。此过程称为交叉转储。
给定源分发,lisp内核和堆映像,可以通过首先从shell调用Clozure CL来生成引导映像:
$ ccl
? (ccl:xload-level-0)
此函数ccl/level-0根据需要编译目录中的lisp源,然后将生成的fasl文件加载到运行的lisp内的数据结构中包含的模拟lisp堆中。然后,它将此数据作为自举图像写入磁盘,并在终端上显示新写入图像的路径名。
xload-level-0应该在您的现有启动映像相对于源文件过期时调用 ccl:level-0;。
从自举图像构建完整图像
要从引导映像构建完整映像,只需调用内核并告诉它加载引导映像(如报告所示xload-level-0。例如,假设您使用的是64位Mac OS X:
$ cd ccl # wherever your ccl directory is
$ ./dx86cl64 –image-name x86-boot64.image –no-init
其他平台使用类似的步骤:为lisp内核使用适当的特定于平台的名称,并使用报告的引导映像的名称xload-level-0。
此过程将加载几十个fasl文件,在每个文件加载时打印一条消息。如果所有这些文件都成功加载,则lisp将打印提示。您应该能够在完整堆映像提供的环境中完成该环境中的所有操作。如果一切顺利,您可以使用save-application以下方法保存该图像:
? (ccl:save-application “new.image”)
new.image这个名字可以是你想要的。您可能希望使用平台的默认图像名称; 查看特定于平台的文件名约定。
如果在加载序列的早期阶段出现问题,通常很难调试错误; 直到加载了相当数量的代码(CLOS,CL条件系统,流,读取器,读取 – 评估 – 打印循环),lisp通常不可能报告错误。在这些早期阶段(“冷加载”)中发生的错误有时会导致调用lisp内核调试程序; 这是原始的,但有时可以帮助人们获得导向。
http://mip.i3geek.com