Clozure Common Lisp 接口数据库创建操作指导(教程翻译)

Clozure Common Lisp 接口数据库创建操作指导(教程翻译)

===
原文地址:
网络: http://trac.clozure.com/ccl/browser/trunk/source/examples/cocoa/interface-databases/
本地: file:///ccl-1.8-darwinx86/examples/cocoa/interface-databases/HOWTO.html
原文标题:
Interface Databases HOWTO
翻译者:
FreeBlues 2013-07-21

特别说明: 有了这个指导应该可以按图索骥地亲自创建那些自己需要框架的接口数据库了,不过我还没亲自试验过,改天亲自试验之后再更新这篇翻译.

目录

  • 0 关于接口数据库 About Interface Databases
    • 0.1 在线文档 Online Documentation
    • 0.2 接口数据库和外部函数接口 Interface Databases and the Foreign Function Interface
    • 0.3 接口数据库和框架 Interface Databases and Frameworks
  • 1 增加新的接口数据库Adding New Interface Databases
    • 1.1 获取和安装ffigen Obtain and install ffigen
    • 1.2 创建一个接口子目录 Create An Interfaces Subdirectory
    • 1.3 编写并运行"populate.sh"脚本 Write and Run a “populate.sh” Script
    • 1.4 使用parse-ffi生成接口数据库 Use parse-ffi to Generate Interface Databases
  • 2 结论 Conclusion

0 关于接口数据库 About Interface Databases

这份 HOWTO 指南介绍了如何为 Clozure CL(原OpenMCL)构建接口数据库。

Clozure CL 的的接口数据库是对外部数据结构和函数的描述。 Clozure CL 使用接口数据库来调用 C 和 Objective-C 的函数,使用 C 和 Objective-C 的数据结构。 Clozure CL 提供了当你编写 Cocoa 应用程序时最有可能需要的接口数据库,但它没有对每一个外部库和框架提供数据库。对于某些应用程序,你可能需要自己生成接口数据库。这个 HOWTO 文档显示如何做到这一点。

0.1 在线文档 Online Documentation

这里解释的概念在 OpenMCL 的在线文档中也被深入讨论。来这个页面(http://www.openmcl.org/Doc/index.html#The-Interface-Translator 译者注:该页面已无法访问)查看关于如何生成接口数据库的解释。

0.2 接口数据库和外部函数接口 Interface Databases and the Foreign Function Interface

Clozure CL 提供了一个集成的外部函数接口,可以调用外部 C 和 Objective-C 函数和方法,定义和实例化 Objective-C 类,读写 C 数据结构字段。 Lisp 程序使用这些功能,可以自由地与外部库和框架互操作。对于 Mac OS X 程序员特别有利,Lisp 程序可以连接 Mac OS X 的框架,并使用框架提供的功能,包括标准的 OS X 功能,如 AppKit, CoreAudio, OpenGL, CoreAnimation,等等。

0.3 接口数据库和框架 Interface Databases and Frameworks

为了使用外部定义的函数和数据结构,Clozure CL 需要入口点和数据字段的描述,包括他们的名字和类型。Clozure CL 从接口数据库读取这些信息。一个单独的被称为 ffigen 的工具解析描述外部库和框架的头文件,比如苹果的 SDK 所提供的,由 Clozure CL 的 parse-ffi 子系统处理可读的描述。然后 parse-ffi 子系统读取这些描述并将其处理结果写入文件。这些由 parse-ffi 写入的文件, 就是我们所说的接口数据库。

1 增加新的接口数据库Adding New Interface Databases

为了生成一组新的接口数据库,您必须遵循这些步骤,在下面的章节解释:

  • 1 获取并安装 ffigen 工具

  • 2 为您的平台创建一个适当的命名和适当的结构的接口目录的子目录

  • 3 写一个脚本(“populate.sh”),然后运行它来填充新的接口子目录

  • 4 使用 parse-ffi 子系统,把上一步创建的 “.ffi” 文件转换为接口数据库

1.1 获取和安装ffigen Obtain and install ffigen

ffigen 是一个来自 Clozure 的命令行工具,被 Clozure CL parse-ffi 子系统原来解析 C 和 Objective-C 头文件。 一个 “populate.sh” 脚本驱动这个 ffigen 工具去解析库或框架头,然后​​Clozure CL 的parse-ffi 子系统把 ffigen 的输出转换为接口数据库。为了生成接口数据库,你必须先取得您所使用平台的最新版本的 ffigen 。

ffigen 可从 Clozure 位于 clozure.com/pub/testing/(ftp://clozure.com/pub/testing/) 的 FTP 服务器获取。一个单独的版本 ffigen 可用于每个受支持的平台。确保获取您所使用的平台的可用的最新版本。例如,

ffigen-apple-gcc-5465-x86-64-2007-11-06-00-00-59
译者注:此为该 ftp 文件夹下的一个文件名

      
可支持苹果公司的64位(”X86-64“) Intel 平台上的 C 编译器(GCC“)。

一旦你有相应版本的 ffigen, 解压并把它安装在可以方便使用的位置。例如,您可能把它安装在:

/usr/local/ffigen 

或安装在:

~/ffigen

ffigen 的分发版解压缩到一个目录下的文件结构如下:

bin/
h-to-ffi.sh
ffigen/
bin/
ffigen
include/

要安装 ffigen, 先解包分发版,然后将解压后的目录移动到其安装位置。例如,把它安装在:

/usr/local/ffigen

tar zxf ffigen-apple-gcc-5465-x86-64-2007-11-06-00-00-59.tar.gz

mv ffigen-apple-gcc-5465-x86-64-2007-11-06-00-00-59\ /usr/local/ffigen

      
现在,您可以添加一行添加到您的 shell 的 init 脚本来把 h-to-ffi.sh 脚本加到你的 PATH,该脚本会自动找到 ffigen 工具。

例如,如果你的 shell 是 bash,您可以在 .bashrc 或 .bash_profile 文件中加入这一行:

PATH="/usr/local/ffigen/bin:${PATH}"

1.2 创建一个接口子目录 Create An Interfaces Subdirectory

Clozure CL 通过咨询一个搜索列表找到接口数据库。它在启动时初始化搜索列表, 搜索列表的确切内容取决于 Clozure CL 运行的平台。例如,Clozure CL 运行于其上的64位的 Intel 平台的一个 Mac OS X 版本搜索“ccl/darwin-x86-headers64/”,但32位 PowerPC 平台上运行的 Mac OS X 版本会搜索"ccl/darwin-headers/“。我们把这个搜索目录称做接口目录。对于本次讨论的其余部分,我们将假设我们在 Mac OS X 的64位 Intel 平台上运行 Clozure CL 。

每个支持外部库或框架的接口目录都有相应的子目录。例如,我们可以找到一个 “ccl/darwin-x86-headers64/” 的 “cocoa” 子目录; 它包含了 Cocoa 框架的接口数据库。同样, “gl” 子目录中包含 OpenGL 的接口数据库。

为了添加一个新的框架的支持,我们必须首先添加一个框架接口目录的子目录。例如,假设我们要添加对 TWAIN 框架的支持。这个框架是提供在 Mac OS X 10.5 中的一个标准的框架,但不是那些开箱即用(out-of-the-box)的被 CL Clozure 支持的框架之一。

要由 Clozure CL 添加 TWAIN 接口来使用,请按照下列步骤操作:

在接口目录中创建一个子目录名为 “TWAIN”

在 “TWAIN” 目录中创建一个子目录名为 “C” 。

如果你查看任何现有接口子目录的内部,您会看到每一个都包含一个类似的名为 “C” 的子目录。ffigen 工具在解析框架或库的头文件时使用 “.ffi” 文件填充这些 “C” 子目录。

进入 “C” 子目录中,创建一个名为 “populate.sh” 的文件

同样,你可以看到,现有接口的子目录在他们的 “C” 子目录中包含文件 “populate.sh”。此文件是用来驱动 ffigen 工具为我们创建特定接口数据库的脚本。下一节将说明在 “populate.sh” 文件中写些什么内容。

1.3 编写并运行"populate.sh"脚本 Write and Run a “populate.sh” Script

如果你查看该目录的内部

ccl/darwin-x86-headers64/cocoa/C/

例如,你会发现脚本名为 populate.sh。脚本为 C 编译器设置标志,然后调用 H-ffi.sh, 对每个被 Cocoa 框架使用的定义 Objective-C 的数据结构和入口点的头文件。在生成或再生成接口数据库过程中的第一个步骤是运行这些 populate.sh 脚本中的某一个。

可以通过从现有的另一组接口复制一个脚本的方法创建一个 populate.sh 脚本,然后更换 populate.sh 脚本要处理的到库或框架的引用。使用现有 populate.sh 脚本是一个很好的开始, 该脚本所处理的库或框架和您要添加的库或框架比较类似或相关。

例如,对于我们的 TWAIN 接口,我们可以从现有 qtkit 子目录复制​​ populate.sh 脚本。qtkit 脚本的内容为:

#!/bin/sh
# For now, things earlier than the 10.5 sdk are pointless
rm -rf System Developer usr
SDK=/Developer/SDKs/MacOSX10.5.sdk
CFLAGS="-m64 -fobjc-abi-version=2 -isysroot ${SDK} -mmacosx-version-min=10.5";  export CFLAGS
h-to-ffi.sh ${SDK}/System/Library/Frameworks/QTKit.framework/Headers/QTKit.h

现在我们只需要把对 QTKit 头文件的引用修改替换为对 TWAIN 头文件的引用:

#!/bin/sh
# For now, things earlier than the 10.5 sdk are pointless
rm -rf System Developer usr
SDK=/Developer/SDKs/MacOSX10.5.sdk
CFLAGS="-m64 -fobjc-abi-version=2 -isysroot ${SDK} -mmacosx-version-min=10.5";  export CFLAGS
h-to-ffi.sh ${SDK}/System/Library/Frameworks/TWAIN.framework/Headers/TWAIN.h

接下来你必须运行脚本来生成将在下一步被使用的 “.ffi” 文件. 假设你已经按照第一步的描述安装了 ffigen, 并且确保它在你的 PATH 中, 剩下的就是 cd 到这个包含你最新的 populate.sh 文件的目录中, 执行 populate.sh:

$ ./populate.sh
+++ /Developer/SDKs/MacOSX10.5.sdk/System/Library/Frameworks/TWAIN.framework/Headers/TWAIN.h

现在, 如果你查看你的 twain 目录的 C 子目录内部, 你将发现它已经被形如 “.ffi” 的文件填满了:

oshirion:C mikel$ ls
./           ../          Developer/   populate.sh*

oshirion:C mikel$ ls Developer/SDKs/MacOSX10.5.sdk/System/Library/Frameworks/TWAIN.framework/Headers/
./         ../        TWAIN.ffi

译者注:上述内容是原作者的目录内的,我还没有实际操作        

1.4 使用parse-ffi生成接口数据库 Use parse-ffi to Generate Interface Databases

这些前一步创建的 “.ffi” 文件, 包含一系列来自 Clozure CL parse-ffi 子系统的可读的 S-表达式. 每个 S-表达式 都描述了外部库中的一个数据结构或者入口点.

一旦你通过运行一个 populate.sh 脚本创建完成一组 “.ffi” 文件, 接下来你必须用 Clozure CL 把这些 “.ffi” 文件转换进接口数据库里面去.

首先, 执行 Clozure CL

其次, 对这条语句求值来加载 parse-ffi 子系统

(require "PARSE-FFI")

接着, 假设你想对前面章节创建的 TWAIN 文件进行解析, 求值下面的语句形式:

(ccl::parse-standard-ffi-files :twain)

parse-ffi 子系统会查找一个名为 “twain” 的子目录, 在当前平台的接口数据库里.

当你首次运行这个表达式时, 你会看到如下的警告信息:

; Warning: Interface file #P"ccl:darwin-x86-headers64;twain;types.cdb.newest" does not exist.

这些告警信息都是正常的.

最后, 再一次对如下形式求值:

(ccl::parse-standard-ffi-files :twain)

为了正确地描述一些外部定义,parse-ffi 子系统需要首次解析所提供的信息。因此,要产生一个完整正确的接口数据库集合,你应该始终对标准解析FFI文件形式(parse-standard-ffi-files)进行两次求值。

2 结论 Conclusion

假设一切顺利的话,你现在应该找到一套新的接口数据库文件, 在你当前平台的接口数据库目录的 twain 子目录下。恭喜!您已经在您的 Clozure CL 安装中添加了一套新的接口数据库。

关于 ffigen 和接口转换过程的更多信息,请参阅关于接口转换器(http://www.openmcl.org/Doc/index.html#The-Interface-Translator 译者注:此链接已经失效)的联机文档。

你可能感兴趣的:(database,interface,lisp,ffi,clozure)