(于2021-05-22针对最新编译问题进行了更新,在Fedora 33下测试通过)
一、安装编译环境依赖
$ sudo dnf builddep libreoffice
$ sudo dnf install ccache # 安装 ccache,从而能够在重新编译时复用之前编译的缓存以加速编译。您也可以不用ccache
$ ccache -M 10G # 将 ccache 缓存大小限制设置为 10G
$ ccache --set-config=cache_dir=</path/to/ccache_dir> # 若空间不足,可将 ccache 的缓存目录设置为其他的位置(比如挂载的其他分区目录)
$ sudo dnf install patch avahi-devel # builddep 没有安装好这两个编译依赖的包
$ sudo dnf install fakeroot rpm-build # 若您需要 rpm 或 deb 格式的安装包,则需要安装这两个依赖项
二、克隆源代码及子模块(git clone)
首先克隆主代码。此处克隆 libreoffice-7-1 分支。克隆时,因为我只需要最新的源代码(不需要历次的所有commit),因此使用了depth=1选项。
$ git clone --depth=1 --branch libreoffice-7-1 git://go.suokunlong.cn/lo/core ./libreoffice-7-1
正克隆到 './libreoffice-7-1'…
remote: 枚举对象: 120360, 完成.
remote: 对象计数中: 100% (120360/120360), 完成.
remote: 压缩对象中: 100% (86011/86011), 完成.
remote: 总共 120360 (差异 46040),复用 87907 (差异 32504)
接收对象中: 100% (120360/120360), 272.72 MiB | 9.36 MiB/s, 完成.
处理 delta 中: 100% (46040/46040), 完成.
正在更新文件: 100% (120889/120889), 完成.
然后,配置子模块。若不进行如下配置,则若启用中文用户界面选项,会默认去git.libreoffice.org克隆子模块代码,速度较慢并且无法观察克隆进展:
$ cd libreoffice-7-1/
$ git submodule init
子模组 'dictionaries'(https://git.libreoffice.org/dictionaries)已对路径 'dictionaries' 注册
子模组 'helpcontent2'(https://git.libreoffice.org/help)已对路径 'helpcontent2' 注册
子模组 'translations'(https://git.libreoffice.org/translations)已对路径 'translations' 注册
我们编译时只需要 translations 子模块,没有启用帮助及词典,因此到 .git/config 中将 dictionaries 和 helpcontent2 两个子模块删除。然后,将translations模块的url修改为国内镜像地址(比如 git://go.suokunlong.cn/lo/translations),以加快克隆速度。
然后,抓取子模块。此处使用 –depth=1 选项以只获取最新的翻译字符串,并且使用 –progress 选项以显示克隆进展。
$ git submodule update --progress --depth=1
正克隆到 '/home/suokunlong/build/lo/libreoffice-7-1/translations'...
remote: 枚举对象: 45290, 完成.
remote: 对象计数中: 100% (45290/45290), 完成.
remote: 压缩对象中: 100% (11030/11030), 完成.
remote: 总共 45290 (差异 22278),复用 37455 (差异 14997)
接收对象中: 100% (45290/45290), 107.72 MiB | 7.20 MiB/s, 完成.
处理 delta 中: 100% (22278/22278), 完成.
remote: 总共 0 (差异 0),复用 0 (差异 0)
remote: 枚举对象: 14403, 完成.
remote: 对象计数中: 100% (14403/14403), 完成.
remote: 压缩对象中: 100% (3316/3316), 完成.
remote: 总共 11565 (差异 5892),复用 9773 (差异 4229)
接收对象中: 100% (11565/11565), 89.61 MiB | 3.06 MiB/s, 完成.
处理 delta 中: 100% (5892/5892), 完成 155 个本地对象.
来自 git://go.suokunlong.cn/lo/translations
* branch 4a12b40c8751323705d82539be43d04990f934a9 -> FETCH_HEAD
子模组路径 'translations':检出 '4a12b40c8751323705d82539be43d04990f934a9'
最后,获取 external_tarballs. 这是 libreoffice 在编译时使用的第三方库等包,默认是从境外服务器去抓取,速度很慢。我已将常用的包放在了境内服务器,您需要从以下位置下载。可以使用下载器一次性全部下载,或者在下面的 make 阶段根据终端输出再去仅下载需要的文件。下载的文件请放置到下列autogen.input中设定的路径下。
https://go.suokunlong.cn:88/dl/libreoffice/external_tarballs/
三、配置编译选项(autogen.input)
你可以不指定编译选项,直接按照下一部分介绍的 autogen.sh命令生成makefile,这样做就会按照默认的编译选项进行。你也可以将编译选项作为autogen.sh运行时的参数传递给它,这种情况下就会使用命令行参数作为编译选项。
但最方便的是通过autogen.input来设置编译选项。这个文件仅在不存在任何命令行参数时才会生效。在克隆的源代码根目录下建立 autogen.input 文件,内容如下。完整的编译配置选项及其含义,见源代码根目录下的configure文件。
# 我一般直接在线浏览帮助文档,因此将帮助禁用了
--without-help
--without-helppack-integration
# 启用简体及繁体中文用户界面
--with-lang=zh-CN zh-TW
# 自己编译的话在线更新及崩溃报告功能就没啥用了,禁用
--disable-online-update
--disable-breakpad
# 禁用 Office Development Kit。若启用 ODK,则额外需要doxygen依赖项。
--disable-odk
--without-doxygen
# 若编译好之后您需要rpm (或deb)包,则需要启用下列两项:
--enable-epm
--with-package-format=rpm
# 若您需要在多个不同版本的编译之间共享external_tarballs第三方源代码包,则可设置下列选项:
# --with-external-tar=<external_tarballs文件夹路径>
# 现在很多功能都用不到java了,因此我直接将其禁用
--without-java
# 我需要用到firebird数据库,因此启用
--enable-firebird-sdbc
--without-system-firebird
--enable-python=internal
四、编译(autogen.sh && make)
在源代码根目录下运行 autogen.sh。该脚本会调用 autogen.input中定义的编译选项。
./autogen.sh
若提示缺少某个包,则很可能是需要手动安装这个包的devel版本。若看到如下的提示,则表示autogen.sh运行无错误:
****************************************************************************
To build, run:
/usr/bin/make
To view some help, run:
/usr/bin/make help
After the build has finished successfully, you can immediately run what you built using the command:
instdir/program/soffice
If you want to run the smoketest, run:
/usr/bin/make check
*************************************
此时就可以运行 make 命令进行编译了:
make
此时,若提示正在从 dev-www.libreoffice.org 下载各种包,但墙内速度很慢的情况下,可以按下 Ctrl-C键中断,然后手动从我的墙内缓存链接下载,并放入 –with-external-tar 编译选项指定的目录。也可以从其他任何地方下载,比如提示下载 Python-3.7.7.tar.xz 时也可以从 http://npm.taobao.org/mirrors/python/3.7.7/ 下载。
编译比较耗时。按照官方wiki上的说法,首次编译大约耗时约 = 8小时 / cpu核心数,后续更改源代码后增量编译耗时从几秒钟到几小时不等,取决于代码更改的程度。若需要频繁重新编译,则安装ccache包是个不错的选择,autogen.sh若检测到你安装了ccache则会自动启用。你也可以用icecream等分布式编译方式加速编译。
编译完成后,执行 .instdir/program/soffice 即可运行。若在autogen.input 中启用了 “–with-package-format=rpm deb” ,则生成的安装包在 workdir/installation中。
常见错误解决
1. configure: error: The missing Perl modules are: FindBin
解决:安装perl的FindBin包,一般情况下你的Linux发行版包管理器中已经有现成的:$ sudo dnf install perl-FindBin
2. configure: error: could not find function ‘com_err’ required for Kerberos 5
$ sudo apt-get install libkrb5
3. _crypt.cpython-3.8.so has suspicious NEEDED: libcrypt.so.2
Question:
when I run make check
(built on the old Fedora 34), I get “instdir/program/python-core-3.8.14/lib/lib-dynload/_crypt.cpython-3.8.so has suspicious NEEDED: libcrypt.so.2” error. What can I do with this error?
Answer:
sberg: (that specific check is only triggered by a non-empty –with-package-format=…), you can silence it with adding to your autogen.input the line: LO_ELFCHECK_ALLOWLIST=libcrypt.so.2
sberg: the error means that the packages you build depend on a lib that’s supposedly not available in LO’s baseline runtime environment (as specified in README.md)
4. configure: error: “patch” not found in $PATH, install it
$ sudo dnf install patch
发表回复