6.8.3 安装X相关库和工具
在安装X服务器前,我们需要安装X服务器依赖的库、这些库依赖的库以及X服务器使用的工具和相关数据。注意,某些库是有安装顺序要求的,比如,libX11需要在libxkbfile前安装,安装libXfont前需要先安装freetype,libdrm、expat需要在Mesa前安装等。读者按照下面的顺序安装即可。
(1)pixman
pixman是一个底层的像素操作的库,提供图形合成及光栅化等功能,是X中软件渲染的基础。
(2)xtrans
xtrans封装了网络传输的基本功能,从开发角度讲,是X服务器和应用程序之间进行通信的基础。X服务器、libX11等X的相关组件都要用到这个库。
(3)libXau
libXau是X服务器和应用程序之间认证授权使用的库。
(4)libX11、libxcb和libpthread-stubs
libX11是为应用程序提供的X协议的实现,应用程序使用libX11中提供的API和X服务器进行通信。
因为libX11的效率问题,开发人员又开发了libxcb来替换libX11。而反过来,libX11也基于xcb进行了改进,所以在安装libX11前,需要安装libxcb。
libxcb依赖libpthread-stubs,因此在安装libxcb前需要先安装libpthread-stubs。
(5)libxkbfile、xkbcomp和xkeyboard-config
这三个包都与键盘扩展相关。X服务器根据键盘扩展,确定不同键盘模型的键盘的布局、键值到字符的转换等。键盘相关的数据就包含在xkeyboard-config中。
而开发者将操作这些数据的功能封装在库libxkbfile中。
xkbcomp包中提供了同名的工具xkbcomp,该工具根据键盘映射的描述,将键盘映射编译为X服务器可以识别的指定格式。
(6)libXfont、libfontenc和freetype
这几个库都是与字体处理相关的。开发者将X使用的与字体相关的功能封装在库libXfont中。
而libXfont使用freetype进行字体渲染,使用libfontenc处理字体编码。所以安装libXfont前需要安装libfontenc和freetype。
(7)pciaccess
早期版本的GPU的2D驱动,包括X服务器中的一些功能,不通过内核,而是直接访问PCI接口的GPU,这就是这个库的由来。现在虽然GPU驱动都通过内核访问GPU硬件了,但是X服务器中并没有清理得特别干净,还残存着对pciaccess库的依赖。
库libdrm中也使用了部分pciaccess中的功能。比如通过读取PCI寄存器探测BIOS中给GPU分配的显存大小,libdrm借助的就是库pciaccess中的函数。
(8)libdrm
用户空间的组件,如GPU的2D驱动和3D驱动、GLX扩展(包括X服务器端和Mesa端的实现部分)等,都需要通过内核的DRM模块访问GPU。为了方便用户空间的组件访问内核DRM模块,开发者开发了库libdrm。
(9)Mesa、expat、libXext、libXdamage和libXfixes
如果配置X服务器支持DRI2,那么必须要安装Mesa,它是3D应用程序进行直接渲染的基础。
Mesa中的DRI扩展使用Damage扩展告知X服务器绘制完成,因此需要安装libXdamage。
Mesa中的DRI2扩展使用XFixes扩展中的如XFixesCreateRegion创建发生了改变的区域,也就是绘制发生的区域,因此也需要安装库libXfixes。
而在安装扩展前,需要安装库libXext。它是所有扩展的公共库。
另外,Mesa使用expat解析XML,所以安装Mesa前,还需要安装expat。
在安装上述相关库之前,在宿主系统上还需安装几个辅助的软件包。一个是xkeyboard-config依赖的intltool。另外是Mesa依赖的xutils-dev、flex和bison,使用如下命令在宿主系统上安装这几个软件包:
除了Mesa外,这些库的安装完全相同。以pixman为例,配置及安装命令如下:
Mesa的配置要稍复杂一点,配置命令如下:
因为笔者的测试机器使用的是Intel的GPU,因此为了简单,这里仅编译了Intel GPU的3D驱动,而且使用经典模式的3D驱动,不使用Gallium3D模式的驱动。
另外,我们不使用libtool查找依赖库,因此每次安装完库后,切记使用如下命令删除la文件,以避免libtool带来麻烦: