God's in his heaven.
All's right with the world.

0%

编译Windows版的Seafile客户端

Seafile是国内少有的做的还不错的开源产品之一。相信很多朋友都经历过几年前的各大云盘厂商大战然后纷纷衰落的这个过程。金山快盘应该是我用过的个人觉得最好的一款云盘了,和Windows GUI的集成也非常完美。可惜现如今各大云盘不是停止运营了就是今非昔比了。因此与其每天提心吊胆地担心自己宝贵的“资源”是不是会被某度网盘封杀,作为码农的我们何不自己动手来搭建一个私有云盘。Seafile的UI是基于Qt,考虑到可移植性和跨平台兼容性,虽然不能像金山快盘那样拥有一些Windows上的特效,例如在托盘上查看当前在上传/下载哪些文件,以及上传/下载的进度。但优势是多平台,在Linux、安卓,iOS上都有相应的客户端。

Seafile官网只提供了Linux版本客户端的编译方法,并没有提供Windows版本的步骤。搜索了官方论坛,虽然有不少人提问问过,但是官方并没有给出回答。只能说国内的开源的文档还需要进一步完善,遮遮掩掩不算是真正的开源。搭建seafile windows客户端的交叉编译环境这篇文章给出了一种基于MinGW在Fedora上交叉编译Windows版本Seafile的方法。我曾尝试过在Ubuntu 18.04上重复这个步骤,但是因为一些packages的原因没能成功。不同的Linux发行版之间的package有一些区别。我也曾尝试过在Windows上的MinGW上交叉编译,但有一些packages死活找不到在Windows MinGW上对应的版本,而且编译时也有一些错误(Windows上的MinGW好像是跑在Cygwin上面的,也就是说Cygwin上的packages可能不全或者跟Fedora上有一些不同)。最终由于时间关系,我放弃了去弄清楚其中的原因,而是采用在Ubuntu上用docker安装Fedora镜像这种类似作弊的方法来重现这篇文章中的步骤。

基于搭建seafile windows客户端的交叉编译环境这篇文章,我写了一些脚本来自动化整个编译流程以及打包流程,这些脚本我都放到了GitHub上:xnervwang/SeafileClientBuildTools。脚本分成两种,一种是在Host环境(例如我的Ubuntu)上执行的,一种是在docker实例中执行的。先介绍一下各个脚本的作用:

  • InitDockerVerification.sh:这个脚本是在Host环境中执行的。会根据Dockerfile创建相应的Fedora docker image,并且在当前的Host目录创建三个文件夹:build, ms-build, ms-build64,分别用于存放编译出来的Linux版本的Seafile客户端,32位Windows客户端,64位Windows客户端。build, ms-build, ms-build64这三个目录会通过docker volume映射到docker实例内,从而便于docker实例和Host共享目录。

  • DockerfileInitDockerVerification.sh在创建docker image时会使用该文件。这个Dockerfile指定docker镜像在创建时,会git clone我的git repo xnervwang/SeafileClientBuildTools,然后运行其中的InstallDevPackagesFedora.sh安装编译所需要的一些packages。然后基于该docker镜像创建的docker实例会自动执行DockerEntry.sh

  • RunDockerVerification.sh:创建docker实例并启动。

  • DockerEntry.sh:这个脚本被docker实例在启动时执行,会先更新本地的git repo,然后执行OneKey.shOneKey.sh会编译Linux版本的Seafile客户端,32位Windows客户端,64位Windows客户端。然后调用ResolveDllDeps.py这个脚本分别对三种客户端进行打包,打包后的产物分别位于build, ms-build, ms-build64这三个目录内。

  • ResolveDllDeps.py:这是我写的一个比较有意思的脚本。可以自动递归分析binary所依赖的所有.so动态链接库文件,然后将这些.so文件都复制到打包目录中,从而便于发布。需要注意的是编译出来的Seafile客户端还依赖于qt5/plugins/imageformats和qt5/plugins/platforms这两个插件目录,但是我的这个脚本却无法从Seafile客户端的可执行文件推导出这样的依赖关系。我推测可能这两个插件目录中的插件是通过dlopen的方式动态加载的,因此不能通过静态分析获得依赖关系。所以我将这连个目录中的.so也加入到了第一级的binary列表中。

  • Makefile:这个是在docker实例中,在DockerEntry.sh执行编译时所使用的的Makefile。

  • Toolchain-cross-linux.i686.cmake/Toolchain-cross-linux.x86_64.cmake:MinGW编译工具所使用的配置文件,分别用于32位/64位Windows客户端。

  • DropDockerVerification.sh:删除docker实例和相关的生成目录。

因此,基本的使用方法就是,首先基于docker官方文档安装docker环境,然后git clone我的git repo,然后先执行InitDockerVerification.sh环境,然后以后就可以每次通过执行RunDockerVerification.sh来获取编译后的客户端,分别位于Host机器的build, ms-build, ms-build64这三个目录内。


本文地址:http://xnerv.wang/compile-windows-seafile-client/