以 HTML 方式读取源代码

作者:Kamran Soomro

每个像样的程序员都必须在某个时候学习源代码。有时是为了学习新的编码风格。有时是为了了解某些东西是如何工作的。无论出于何种原因,程序员都离不开它。学习小型项目的源代码并不困难。您可以轻松地在没有正式方法的情况下完成。但是,当您想要研究大型项目的源代码时,跟踪各种函数、变量及其定义就成了一个巨大的问题。如果人们可以在线找到源代码,那真是太幸运了——这样做意味着他们可以使用工具来处理源代码并帮助他们学习。这些工具为研究源代码的人们带来了前所未有的优势和灵活性。其中一种工具是 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

LXR 将安装在指定的目录中。

配置

现在,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

baseurl 是所有 LXR 所需脚本相对于其放置位置的 URL。它应该可以通过浏览器访问。在我的配置中,它是 http://my-ip/lxr/http/ <https:///lxr/http/>。确保在末尾放置 /,否则将忽略最后一个目录。

HTML 标头和页脚

当为源代码生成 HTML 时,LXR 可以向页面添加标头和页脚。示例标头和页脚在 $INSTALLPREFIX/http/ 目录中提供。它们被称为 template-head 和 template-tail。此外,您还可以通过修改 template-dir 文件来更改 LXR 显示文件和目录的方式。这些文件的位置可以通过 lxr.conf 文件中的 htmlhead、htmltail 和 htmldir 选项指定。

sourceroot

此选项告诉 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)

然后

sourceroot: /var/www/htdocs/lxr/source/$s

因此,将根据 source 变量的值自动选择合适的源代码。

srcrootname

srcrootname 指定要显示其源代码的项目的名称——例如

srcrootname: $s
incprefix

这指定了要包含在项目中的头文件的位置。

dbdir

这是 genxref 生成的 fileidx 和 xref 文件的位置。如果您有多个项目,请为每个项目指定单独的位置,如下所示

dbdir: /var/www/htdocs/lxr/source/$s/

这些是配置 LXR 时唯一需要设置的选项。此外,您可以使用 glimpsebin 指定 glimpse 二进制文件的位置。

glimpsebin

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 一起工作。

配置 Apache

我使用的 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。我们现在准备好浏览交叉引用的源代码。

如何使用 LXR

完成上述所有步骤后,您只需打开 Web 浏览器并转到 URL,http:///my-ip//lxr/http/source,其中 /my-ip/ 是您的 Web 服务器的 IP。当您打开网页时,您将获得类似于图 1 中显示的内容。

Read Source Code the HTML Way

图 1. 通过浏览器进行源代码导航

如您所见,用户可以选择任何源代码文件进行浏览。在顶部,我正在使用 LXR 提供的模板。它包括用于导航源代码、搜索特定标识符、在源代码中搜索任何文本以及搜索任何文件的链接。

一些值得注意的实用程序

  • 源代码导航:选择此选项可浏览您选择的源代码。

  • 标识符搜索:搜索特定标识符的定义和用法。需要 ident 脚本。

  • 自由文本搜索:在源文件中搜索任何文本。需要 search 脚本。

  • 文件搜索:搜索与传递的字符串匹配的文件。需要 find 脚本。

所有这些实用程序还可以使用正则表达式来匹配字符串。

结论

LXR 是一个出色的工具。它使想要研究源代码的人们的生活变得更加轻松,而且它功能强大且易于使用。它使用动态生成的网页来浏览源代码这一事实为用户提供了很大的配置灵活性。此外,由于可以通过任何 Web 浏览器访问它,因此它对用户的平台、客户端或位置没有任何限制。这种互操作性是 LXR 如此强大的原因之一。

Kamran Soomro 是巴基斯坦国立科技大学的软件工程专业的学生。自从他在第一学期首次使用 Linux 以来,他就对 Linux 产生了浓厚的兴趣。从那时起,他一直热衷于在巴基斯坦推广 Linux。

加载 Disqus 评论