BLFS General Libraries

icu

International Components for Unicode (ICU) 为C/C++库提供Unicode和全球化支持,是所有平台广泛移植和给予应用程序相同结果的依赖库。libxml2建议依赖,感觉有用

这个icu库大版本升级需要所有依赖库重新编译。

icu
cd /sources

icu_VERSION=75_1
tar xf icu4c-${icu_VERSION}-src.tgz
cd icu/source

./configure --prefix=/usr
make
make install

libxml2

libxml2处理XML文件,目前看多个程序建议依赖,例如 nghttp2

libxml2
cd /sources

libxml2_VERSION=2.13.3
tar xf libxml2-${libxml2_VERSION}.tar.xz
cd libxml2-${libxml2_VERSION}

patch -Np1 -i ../libxml2-${libxml2_VERSION}-upstream_fix-2.patch


./configure --prefix=/usr           \
            --sysconfdir=/etc       \
            --disable-static        \
            --with-history          \
            --with-icu              \
            PYTHON=/usr/bin/python3 \
            --docdir=/usr/share/doc/libxml2-${libxml2_VERSION} &&
make

make install

rm -vf /usr/lib/libxml2.la &&
sed '/libs=/s/xml2.*/xml2"/' -i /usr/bin/xml2-config

LZO

LZO数据压缩类似于LZ4,不过LZ4速度更快,占用CPU少,所以 ZFS 中使用了LZ4

libarchive

处理压缩格式读写接口,CMake建议依赖,还是有不少软件会使用,所以安装

libarchive
cd /sources

libarchive_VERSION=3.7.4
tar xf libarchive-${libarchive_VERSION}.tar.xz
cd libarchive-${libarchive_VERSION}

./configure --prefix=/usr --disable-static --without-expat &&
make
make install

libaio

异步I/O依赖库,例如 fio 这样的工具依赖

libaio
cd /sources

libaio_VERSION=0.3.113
tar xf libaio-${libaio_VERSION}.tar.gz
cd libaio-${libaio_VERSION}

# disable the installation of the static library
sed -i '/install.*libaio.a/s/^/#/' src/Makefile

make

make install

libuv

多平台支持库,专注于异步I/O,主要使用的程序有 Node.js (建议依赖),另外CMake也建议依赖,看起来安装较好,可以支持不少跨平台软件(跨平台软件可能不会直接使用aio)

libuv
cd /sources

libuv_VERSION=1.48.0
tar xf libuv-v${libuv_VERSION}.tar.gz
cd libuv-v${libuv_VERSION}

sh autogen.sh                              &&
./configure --prefix=/usr --disable-static &&
make

make install

libtasn1

libtasn1 是一个高度可移植C库,用于编码和解码符合ASN.1 schema的DER/BER数据。 由于 make-ca (也就是 curl 所依赖的证书)需要 p11-kit 运行时,但需要该 p11-kit 运行时在 libtasn1 之后编译以从信任发布者那里生成证书存储。

libtasn1
cd /sources

libtasn1_VERSION=4.19.0
tar xf libtasn1-${libtasn1_VERSION}.tar.gz
cd libtasn1-${libtasn1_VERSION}

./configure --prefix=/usr --disable-static &&
make

make install

PCRE2

备注

GLib (建议)依赖PCRE2

PCRE2包含Perl兼容正则表达式库。这些库用于使用与Perl相同的语法和语义来实现正则表达式模式匹配。

安装PCRE2
cd /sources

pcre2_VERSION=10.44
tar xf pcre2-${pcre2_VERSION}.tar.bz2
cd pcre2-${pcre2_VERSION}

./configure --prefix=/usr                       \
            --docdir=/usr/share/doc/pcre2-10.44 \
            --enable-unicode                    \
            --enable-jit                        \
            --enable-pcre2-16                   \
            --enable-pcre2-32                   \
            --enable-pcre2grep-libz             \
            --enable-pcre2grep-libbz2           \
            --enable-pcre2test-libreadline      \
            --disable-static                    &&
make

make install

strike:Libffi

备注

GLib 依赖Libffi,不过BLFS手册没有包含这个库编译安装,而是 GLib 源代码编译时会自动通过 git 下载源代码。 我为了降低Host主机的复杂度,目前没有安装git,而是从 libffi 官方网站下载包进行编译 由于Libffi跨平台有不同参数,我不确定支持 GLib 应该使用哪种,所以还是按照BLFS默认方法,先安装 git ,由 GLib 编译自动完成

有关 Libffi 的说明,这里参考官网Readme

高级语言的编译起会生成遵循特定约定的代码,这些约定对于单独编译的运行必不可少。其中一项约定就是"调用约定"(calling convention)。调用约定本质上是编译起对函数参数在函数入口处的位置所做的一组假设。调用约定还指定了函数返回值的位置。

某些程序在编译时可能不知道要将哪些参数传递给函数。例如,编译器可以在运行时被告知用于调用给定函数的参数的数量和类型。Libffi可用于此类程序,以提供从解释器程序到编译代码的桥梁。

Libffi库为各种调用约定提供了可移植的高级编程接口。这允许程序员在运行时调用由调用接口描述指定的任何函数。

FFI代表Foreign Function Interface(外部函数接口)。外部函数接口是允许一种语言编写的代码调用另一种语言编写的代码的接口的通俗名称。libffi库实际上仅提供全功能外部函数的最低、机器相关层。libffi之上必须存在一层来出来两种语言之间床底的值的类型转换。

GLib

备注

BLFS QEMU 依赖 Glib

Glib是底层提供处理C的数据结构的库,用于运行时功能的可移植性包装和接口,例如event loop, 线程,动态加载以及一个对象系统。

如果要支持GNOME,则还需要依赖安装 GObject Introspection。不过我不在服务器端使用gnoome,所以没有安装 gobject-introspection

  • 依赖: BLFS Python模块 packaging / docutils

  • 建议:

    • pcre2 : 实际还是要安装,如果没有安装则编译过程会自动下载源代码,所以还是提前安装为好

Glib安装
cd /sources

glib_VERSION=2.80.4
tar xf glib-${glib_VERSION}.tar.xz
cd glib-${glib_VERSION}

patch -Np1 -i ../glib-skip_warnings-1.patch

mkdir build &&
cd    build &&

# 执行之前需要确保系统中安装了git工具,因为有些代码是通过git安装的
meson setup ..                  \
      --prefix=/usr             \
      --buildtype=release       \
      -D introspection=disabled \
      -D man-pages=enabled      &&
ninja

ninja install

git的SSL问题排查

Program 'rst2man rst2man.py' not found

ninja 编译报错:

提示 rst2man 没有找到
Program 'rst2man rst2man.py' not found

参考 Install rst2man failed for varnish agent [fix] ,在 Debian 中是通过 python-docutils 安装来获得 rst2man 这个Python文档模块。

所以,对应 BLFS Python模块 安装 docutils

参考