以 HTML 方式读取源代码
每个像样的程序员都必须在某个时候学习源代码。有时是为了学习新的编码风格。有时是为了了解某些东西是如何工作的。无论出于何种原因,程序员都离不开它。学习小型项目的源代码并不困难。您可以轻松地在没有正式方法的情况下完成。但是,当您想要研究大型项目的源代码时,跟踪各种函数、变量及其定义就成了一个巨大的问题。如果人们可以在线找到源代码,那真是太幸运了——这样做意味着他们可以使用工具来处理源代码并帮助他们学习。这些工具为研究源代码的人们带来了前所未有的优势和灵活性。其中一种工具是 LXR(Linux 交叉引用)工具。
最初在挪威开发作为通用超文本交叉引用工具的测试平台应用程序,其旗舰成就就是对 Linux 内核源代码进行交叉引用。代码可在 lxr.linux.no/source 上浏览。其他项目位于 lxr.mozilla.org/seamonkey,Mozilla 源代码可在该处浏览,FreeBSD 源代码可在 fxr.watson.org 处找到。LXR 使用户只需单击一下即可跳转到函数定义、搜索用法等等。它还支持电子邮件和超文本链接的索引。
该项目基于现有的 Web 技术,因此可以通过任何 Web 浏览器访问。在服务器端,它是使用 Apache 开发的,但应该可以与任何支持 CGI 脚本功能的 Web 浏览器一起使用。实际完成所有工作的脚本是使用 Perl 开发的,并且严重依赖 Perl 强大的正则表达式库。
该软件可能最好的功能是以 HTML 格式呈现给用户。由于 HTML 格式,可以轻松地将代码的各个部分链接到其他部分。它是用 Perl 编写的,因此理论上,它可以运行在任何安装了 Perl 解释器的操作系统上。这个工具真正伟大之处在于它支持多种语言。这意味着无论您的程序是用哪种语言编写的;您仍然可以使用此工具来交叉引用和浏览您的代码。
LXR 实际上非常简单和清晰。用户使用一个名为 genxref 的实用程序来生成完整源代码的索引。完成此操作后,用户通过 Web 浏览器访问一个名为 source 的 Perl 脚本,该脚本读取索引文件并动态生成交叉引用源代码的 HTML。然后,用户可以根据需要浏览源代码。
一旦您了解 LXR 的工作原理以及各种配置选项,安装和配置 LXR 就非常简单。首先,从 sourceforge.net/projects/lxr 下载源代码 tarball。在撰写本文时,lxr-0.3 是稳定版本。下载 tarball 后,使用以下命令解压它
bash# tar -xvf lxr-0.3.tar.gz
解压源代码后,cd到新创建的目录,并使用您选择的文本编辑器打开 Makefile 进行编辑。您需要在此处设置两个变量:INSTALLPREFIX 和 PERLBIN。PERLBIN 指的是 perl5 解释器的可执行二进制文件。在我的情况下,它位于 /usr/bin/perl 中。INSTALLPREFIX 是 LXR 将安装到的目录。它应该位于可以通过 Web 浏览器访问的位置。在我的系统上,那是 Apache 1.3.33,我选择将其安装在 /var/www/htdcos/ 下。因此,我的 Makefile 看起来像这样
# Makefile for installation and configuration of LXR # The location of your perl5 binary PERLBIN=/usr/bin/perl # LXR will be installed here INSTALLPREFIX=/var/www/htdocs/lxr # End of configuration parameters CGISCRIPTS=find ident search diff source PERLMODULES=SimpleParse.pm Common.pm Config.pm .... .... ....
保持 Makefile 的其余部分不变。在控制台中,键入
bash# make install
现在,cd到 LXR 安装到的目录(在我的情况下是 /var/www/htdocs/lxr)。应该有三个子目录:bin、http 和 source。虽然您要交叉引用的源代码可以放在任何位置,但我更喜欢将其放在 $INSTALLPREFIX/source 子目录下。我将 glibc-2.3.5 和 OpenMOSIX-2.4.26 源代码放在这里。现在,我们必须生成索引文件,LXR 将使用这些索引文件来生成交叉引用的源代码。所以,cd到包含源代码的目录,并执行 $INSTALLPREFIX/bin 中的 genxref 脚本
bash# /var/www/htdocs/lxr/bin/genxref .
末尾的 . 告诉脚本源代码包含在当前目录中。接下来,坐下来享受过程,直到解析完成。完成后,您应该在当前目录(包含源代码的目录)中获得两个新文件——fileidx 和 xref。这两个文件是 lxr 生成您浏览时所需的交叉引用源代码所需的文件。确保其他人对这些文件具有读取权限。为此,仍在源目录中时,键入以下命令
bash# ls -l fileidx xref
输出应如下所示
-r--r--r-- 1 nobody root 671744 2006-08-24 05:06 fileidx* -r--r--r-- 1 nobody root 8425472 2006-08-24 05:06 xref*
应设置第三个 r。如果未设置,您可以通过执行以下操作来设置它
bash# chmod o+x fileidx xref
现在,是时候配置 LXR 以供使用了。将目录更改为 $INSTALLPREFIX/http/(在我的情况下,它是 /var/www/htdocs/lxr/http/),并打开 lxr.conf 文件进行编辑。lxr.conf 文件是您需要的最重要的文件。它有几个不同的配置选项。
当您打开文件时,您首先会看到一个名为 v 的变量的定义。与编程语言一样,您可以定义自己的变量并在配置文件中稍后使用它们。无论它们出现在哪里,都将被它们的值替换。变量值由配置文件通过 $/variable-name 引用。变量定义遵循两种可能的格式之一
variable: /variable-identifier, variable-name, /(/list-of-values/), /default-value/
或
variable: /variable-identifier, variable-name, /[/file-containing-list-of-values/], /default-value/
以下是术语的含义
variable-identifier:变量在整个配置文件中将被称为的名称。
variable-name:将向用户显示的变量的实际名称。
list-of-values:要显示的逗号分隔的值列表。
file-containing:包含可能值列表的文件。
list-of-values:该列表的每个条目都在单独的一行上。用户可以选择其中任何一个。应提供文件的绝对路径。
default-value:变量默认将采用的值。如果未指定,则自动设置第一个值。
baseurl 是所有 LXR 所需脚本相对于其放置位置的 URL。它应该可以通过浏览器访问。在我的配置中,它是 http://my-ip/lxr/http/ <https:///lxr/http/>。确保在末尾放置 /,否则将忽略最后一个目录。
当为源代码生成 HTML 时,LXR 可以向页面添加标头和页脚。示例标头和页脚在 $INSTALLPREFIX/http/ 目录中提供。它们被称为 template-head 和 template-tail。此外,您还可以通过修改 template-dir 文件来更改 LXR 显示文件和目录的方式。这些文件的位置可以通过 lxr.conf 文件中的 htmlhead、htmltail 和 htmldir 选项指定。
此选项告诉 LXR 在哪里查找实际的源代码。在我的情况下,它是 /var/www/htdocs/lxr/source/glibc-2.3.5。如果要交叉引用多个项目,您只需创建一个变量来指定每个包含源代码的目录的位置。然后,您可以将变量的值指定为 sourceroot。例如,我为 glibc-2.3.5 和 OpenMOSIX-2.4.26 设置了源,将两者的源都放在 /var/www/htdocs/lxr/source 中,分别放在名称与上述名称相同的单独目录中。在 lxr.conf 中,我有一行像
variable: s, Source, (glibc-2.3.5, OpenMOSIX-2.4.26)
这是 genxref 生成的 fileidx 和 xref 文件的位置。如果您有多个项目,请为每个项目指定单独的位置,如下所示
dbdir: /var/www/htdocs/lxr/source/$s/
这些是配置 LXR 时唯一需要设置的选项。此外,您可以使用 glimpsebin 指定 glimpse 二进制文件的位置。
glimpse 允许用户在源代码中搜索特定文件,并在源文件中搜索任何文本。您可以从 webglimpse.net/trial/glimpse-latest.tar.gz 获取 glimpse 的最新版本。解压并安装它。安装 glimpse 后,转到安装源代码的目录,例如 /var/www/htdocs/lxr/source/glibc-2.3.5,并执行以下操作
bash# glimpseindex -H . .
输出应如下所示
This is glimpseindex version 4.18.2, 2006. Indexing "/var/www/htdocs/lxr/source/glibc-2.3.5" ... Size of files being indexed = 81711416 B, Total #of files = 10075 Index-directory: "/var/www/htdocs/lxr/source/glibc-2.3.5" Glimpse-files created here: -rw-r--r-- 1 root root 676398 2006-09-08 05:51 .glimpse_filenames -rw-r--r-- 1 root root 40300 2006-09-08 05:51 .glimpse_filenames_index -rw-r--r-- 1 root root 0 2006-09-08 05:50 .glimpse_filetimes -rw------- 1 root root 1783314 2006-09-08 05:51 .glimpse_index -rw-r--r-- 1 root root 686 2006-09-08 05:51 .glimpse_messages -rw------- 1 root root 836 2006-09-08 05:51 .glimpse_partitions -rw-r--r-- 1 root root 23888 2006-09-08 05:51 .glimpse_statistics
这会在当前目录中创建所需的 glimpse 索引文件。创建它们后,请确保为其他人设置了读取权限
bash# chmod o+r .glimpse-*
现在,将 lxr.conf 中的 glimpsebin 选项设置为您安装 glimpse 的位置。我将其安装在 /usr/local/bin/glimpse。
就这样;保存并关闭 lxr.conf 文件。现在剩下的唯一事情是配置 Web 服务器以与 LXR 一起工作。
我使用的 Web 服务器是 Apache 1.3.33。首要任务是设置 LXR 目录的权限。您可以通过编辑 httpd.conf 文件来完成此操作,该文件通常位于 /etc/apache/httpd.conf 下。添加以下行
<Directory /var/www/htdocs/lxr> AllowOverride All Options All </Directory>
只需将位置替换为您安装 LXR 的位置。然后,转到 $INSTALLPREFIX/http/ 并创建并打开一个名为 .htaccess 的文件进行编辑。键入以下行
<File ~ (search|find|source|diff|ident)?> SetHandler cgi-script </Files>
这告诉 Web 服务器将上述文件视为 CGI 脚本。如果您不这样做,服务器将仅显示这些文件的内容。关闭并保存 .htaccess。我们现在准备好浏览交叉引用的源代码。
完成上述所有步骤后,您只需打开 Web 浏览器并转到 URL,http:///my-ip//lxr/http/source,其中 /my-ip/ 是您的 Web 服务器的 IP。当您打开网页时,您将获得类似于图 1 中显示的内容。
如您所见,用户可以选择任何源代码文件进行浏览。在顶部,我正在使用 LXR 提供的模板。它包括用于导航源代码、搜索特定标识符、在源代码中搜索任何文本以及搜索任何文件的链接。
一些值得注意的实用程序
源代码导航:选择此选项可浏览您选择的源代码。
标识符搜索:搜索特定标识符的定义和用法。需要 ident 脚本。
自由文本搜索:在源文件中搜索任何文本。需要 search 脚本。
文件搜索:搜索与传递的字符串匹配的文件。需要 find 脚本。
所有这些实用程序还可以使用正则表达式来匹配字符串。
Kamran Soomro 是巴基斯坦国立科技大学的软件工程专业的学生。自从他在第一学期首次使用 Linux 以来,他就对 Linux 产生了浓厚的兴趣。从那时起,他一直热衷于在巴基斯坦推广 Linux。