分类目录归档:代码开发

如何编译 LibreOffice

一、安装编译环境依赖

$ sudo dnf builddep libreoffice

$ sudo dnf install 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 格式(即在autogen.input中启用--with-package-format=rpm),则需要安装这两个包

二、克隆源代码及子模块(git clone)

首先克隆主代码。此处克隆 libreoffice-7-0 分支。克隆时,因为我只需要最新的源代码(不需要历次的所有commit),因此使用了depth=1选项。

$ git clone --depth=1 --branch libreoffice-7-0 git://go.suokunlong.cn/lo/core ./libreoffice-7-0
正克隆到 './libreoffice-7-0'…
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-0/
$ 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-0/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.input 文件,内容如下:

# 以下选项复制自 distro-configs 下的 LibreOfficeLinux.conf,
# 并对个别选项进行了修改
--with-system-dicts
--without-myspell-dicts
--with-system-zlib
--without-system-poppler
--without-system-openssl
--without-system-libpng
--without-system-libxml
--without-system-jpeg
--without-system-jars
--without-system-postgresql
--without-junit
--without-help
--without-helppack-integration
--with-linker-hash-style=both
--without-fonts
--with-external-thes-dir=/usr/share/mythes
--with-external-hyph-dir=/usr/share/hyphen
--with-external-dict-dir=/usr/share/hunspell
--enable-avahi
--enable-dbus
--enable-extension-integration
--disable-odk
--enable-gtk3-kde5
--enable-kf5
--enable-gstreamer-1-0
--enable-evolution2
--enable-gio
--enable-scripting-beanshell
--enable-scripting-javascript
--enable-ext-wiki-publisher
--enable-ext-nlpsolver
--enable-epm
--enable-python=internal
--disable-online-update
--enable-breakpad
--disable-dconf
--enable-mergelibs

# 启用简体中文及繁体中文支持,多个语言之间以空格隔开
--with-lang=zh-CN zh-TW

--without-doxygen

--with-external-tar=/home/suokunlong/build/lo/external_tarballs


# 若要启用调试功能,请启用此选项
#--enable-dbgutil

# 部分功能需要用到 java JDK,若需要请自行配置
--without-java

四、编译(autogen.sh && make build-nocheck)

在源代码根目录下运行 autogen.sh。该脚本会调用 autogen.input中定义的编译选项。

./autogen.sh

若提示缺少某个包,则很可能是需要手动安装这个包的devel版本。若没有提示错误,则运行make命令进行编译。以下命令使用了 build-nocheck,以跳过耗时的编译后检查(比如单元测试):

make build-nocheck

此时,若提示正在从 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核心数。

编译完成后,执行 .instdir/program/soffice 即可运行。若需要 deb 或 rpm 包,可在autogen.input中加入 “–with_package_format=rpm deb” 然后编译,生成的安装包在 workdir/installation中。

icecream – configure: error: Could not figure out what C++ library this is

今日在尝试编译libreoffice时,据说启用icecream能够加速编译,于是就在将一台Fedora 26主机设置为scheduler,这台Fedora主机和另一台Ubuntu主机上启用iceccd守护进程。通过icecc-monitor能够看到两台机器上的icecream均正常。但是当在libreoffice源代码下的 autogen.input 中加入 –enable-icecream 选项后,运行autogen.sh出现以下错误:
...
checking whether gcc supports -mno-avx... yes
checking whether gcc supports -fstack-protector-strong... yes
checking whether gcc supports atomic functions... yes
checking whether gcc supports __builtin_ffs... yes
checking whether gcc supports __attribute__((deprecated(message)))... yes
checking whether /usr/sbin/bin/g++ defines __base_class_type_info in cxxabi.h... no
checking whether /usr/sbin/bin/g++ defines __class_type_info in cxxabi.h... no
checking whether /usr/sbin/bin/g++ declares __cxa_allocate_exception in cxxabi.h... no
checking whether /usr/sbin/bin/g++ defines __cxa_eh_globals in cxxabi.h... no
checking whether /usr/sbin/bin/g++ defines __cxa_exceptions in cxxabi.h... no
checking whether /usr/sbin/bin/g++ declares __cxa_get_globals in cxxabi.h... no
checking whether /usr/sbin/bin/g++ declares __cxa_throw in cxxabi.h... no
checking whether /usr/sbin/bin/g++ defines __si_class_type_info in cxxabi.h... no
checking whether /usr/sbin/bin/g++ defines __vmi_class_type_info in cxxabi.h... no
checking whether /usr/sbin/bin/g++ supports __attribute__((warn_unused))... no
checking What the C++ library is... configure: error: Could not figure out what C++ library this is
Error running configure at ./autogen.sh line 293.

经过在irc频道询问,最终找到了如下解决办法:原来,Fedora默认将icecream的c++ wrapper安装到了 /usr/libexec/icecc,在 autogen.input 中加入 –with-gcc-home=/usr/libexec/icecc 重新运行autogen.sh即可解决。

When compile libreoffice in Fedora with icecream, you may encounter the above error message. To fix the above error, add the option “–with-gcc-home=/usr/libexec/icecc” in your autogen.input file.