X11 构建指南
X11,从参考实现到 Xorg 6.9,使用自己的“imake”构建系统。客户端、服务器和库都在一个构建树中。(只构建树的一部分非常困难;必须构建整个树。)一些东西,比如 Mesa 和 Freetype,被修改为可选地成为树的一部分。
Xorg 7.0 用一套基于 GNU autoconf 构建系统的模块替换了它。这创建了一个复杂的包和依赖关系系统。为同时实现 Xorg 6.9rc1 和 Xorg 7.0rc1 的两个系统而产生的问题,延迟了第一个候选版本的发布。
为了用 imake 构建 Xorg,您首先需要下载并解压源代码包。Xorg 6.9rc1 的包叫做xorg-x11-6.8.99.901.tar.bz2可以从 这里 获取。现在 Xorg 6.9 和 7.0 的最终版本已经发布,您可以使用镜像列表 这里 找到它们。
构建系统的粗略概述
- 创建一个“host.def”文件(可选)。
- 执行“make World”来配置和构建树。
- 执行“make install”和“make install.man”来安装所有内容。
您可以使用“host.def”文件来定制您的构建。如果您没有创建它,那么您将使用默认设置,这些设置应该已经针对您的操作系统进行了调整。
文件xc/BUILD更详细地描述了构建。
是的,您必须构建整个树才能构建一个部分。例外情况是,有时您可以进行服务器端或无服务器端构建。请参阅我们关于 #构建静态服务器 的部分,以及xc/config/cf/xorgsite.def.
在以下示例中,root 已授予我们对/usr/local/src的写访问权限。我们下载了 Xorg 6.9 的第一个候选版本(/usr/local/src/xorg-x11-6.8.99.901.tar.bz2).
)。我们已经安装了 Xorg 6.8.2。我们在构建期间运行它,因此我们有多个 xterm 来输入 shell 命令。
使用一个“xterm”,将源代码解压到/usr/local/src,创建/usr/local/src/xc:
$ cd /usr/local/src $ bzcat xorg-x11-6.8.99.901.tar.bz2 | pax -rv
如xc/BUILD所述,我们可以使用 lndir 创建一个指向源代码的符号链接的影子树。(这可以防止对象出现在源代码树中。)因为“lndir”是 X 的一部分,我们已经安装了 Xorg 6.8.2,所以我们可以运行“lndir”
$ mkdir xcbuild $ cd xcbuild $ lndir ../xc
请注意,当前目录是/usr/local/src/xcbuild。现在我们将跳过创建config/cf/host.def,并使用默认配置。现在该调用 Makefile 了。我们必须运行make World,因为没有其他正确的方法来配置和启动构建。如果我们运行 Bourne shell
$ make World > World.log 2>&1
如果我们运行 C shell,那么上面的命令是make World >& World.log. |
运行“make”的“xterm”现在很忙。为了查看日志,我们在第二个 xterm 中运行“tail”
$ cd /usr/local/src/xcbuild $ tail -f World.log
最终,日志会宣布 Xorg 的构建已完成。
如果我们需要重新启动构建(例如,在发生错误之后),那么我们不想清理树。一个make World配置树、清理树并启动构建。我们可以用make Everything或make重新启动构建;请参阅xc/BUILD了解更多信息。 |
我们安装(到默认的/usr/X11R6,从而覆盖了 Xorg 6.8.2 的大部分内容)
$ sudo make install $ sudo make install.man
请注意
- 如果我们的系统上“sudo”不起作用,那么我们将使用“su”。
- 可以在执行安装之前退出 X11。另一种选择是在 X11 运行时覆盖它的大部分内容。这可以工作,但稍微不安全一些。
如果需要,退出 X 并运行xorgcfg来创建配置文件。
可以修改树以仅构建静态 X 服务器。如果您需要从树的较新版本中获得更好的硬件支持,这将很有用。此外,这将跳过构建库、客户端和单独的服务器模块。(X11 协议非常稳定,因此较新的服务器可以与较旧的库和客户端一起使用。)
OpenBSD 提供了一个示例host.def。他们的示例host.def是下一个场景的基础。如果您有静态构建 X 服务器的理由,您可以执行与下一个场景类似的操作。
场景:我们已经安装了 Xorg 6.8.2。我们需要 Xorg 6.9rc0(第 0 个候选版本)中更好的“ati”驱动程序,但我们需要跳过 6.9rc0 树的大部分内容以避免错误。
解决方案:我们将静态构建 6.9rc0 服务器。
如果您有一个用“lndir”创建的影子树,请在影子树中创建类似“host.def”和“X11Conf.h”的文件,而不是源代码树中。 |
在树中的config/cf/host.def创建此文件。如果您有一个影子树,请将其放在影子树中。该文件是
#define InstallEmptyHostDef #define BuildServersOnly YES /* * you may also restrict the drivers that are built by editing and * uncommenting the line below */ #define XF86CardDrivers wsfb ati #define UsbMouseSupport NO #define DoLoadableServer NO #define XnestServer NO #define XVirtualFramebufferServer NO #define XprtServer NO #define BuildGlxExt NO #define BuildGLXLibrary NO #define BuildGLULibrary NO #define BuildRenderLibrary NO #define BuildLBX NO #define BuildType1 NO #define BuildFreeType NO #define BuildXTrueType NO #define BuildSpeedo NO #define BuildFonts NO #define BuildXFree86ConfigTools NO
“XF86CardDrivers”行已更改为仅指定“wsfb”和“ati”。我们的驱动程序是“ati”。我们有一个第二个驱动程序,它避免了高级硬件功能,以防“ati”出现故障。OpenBSD 上的“wsfb”驱动程序使用内核帧缓冲区,而不是重新配置硬件。在 Linux 上,帧缓冲区驱动程序是“fbdev”。在 i386 硬件上,“vga”和“vesa”可能是不错的选择。使用以下行之一
#define XF86CardDrivers wsfb ati #define XF86CardDrivers fbdev ati #define XF86CardDrivers vga ati #define XF86CardDrivers vesa ati
现在开始构建
$ make World > World.log 2>&1
构建最终会因缺少某个“XlibConf.h”而停止;我们的 host.def 跳过了这一步。(这是一个错误;Xorg 6.8.2 不需要“XlibConf.h”文件。)该文件可能是在构建 libX11 时生成的,而我们跳过了这一步。对于服务器而言,我们实际上并不需要它。在xc/lib/X11/XlibConf.h:
$ touch lib/X11/XlibConf.h
创建一个空文件。
$ make Everything >> World.log 2>&1
现在继续构建最终构建完成。服务器出现在xc/programs/Xserver/Xorg。因为此文件是静态链接的,所以它是唯一需要安装的文件。我们将它安装到/usr/X11R6/bin/Xorg69/usr/X11R6:
$ cp -p programs/Xserver/Xorg /usr/X11R6/bin/Xorg69
以补充我们位于
$ cd /usr/X11R6/bin $ chown root:wheel Xorg69 $ chmod a+xs Xorg69
的 Xorg 6.8.2 安装。现在我们需要测试服务器。首先,如果我们现在正在运行 X,请退出 X 到控制台。然后将我们的新服务器设置为 root,以便它可以使用视频硬件使用 Xorg69 -configure 生成新的配置文件,然后使用 xinit -- /usr/X11R6/bin/Xorg69 测试它。如果它能工作,请通过更改
$ cd /usr/X11R6/bin $ rm X $ ln -s Xorg69 X
/usr/X11R6/bin/X