我平时使用的网络文件存储设备是个服役好几年的 Buffalo Linkstation Live。该系统上安装、配置了 Optware。可惜Optware 软件仓库里只提供 rtorrent v0.8.1。这个版本并不支持TLSv1.2,所以无法连接强制使用 TLS v1.2 的HTTPS 服务器。这个帖子介绍如何在上述系统上编译、安装 rtorrent 0.9.6 的大概步骤。编译后的 rtorrent 0.9.6 将支持 TLS v1.2。
前言
这个帖子介绍了如何在NAS上编译、安装rtorrent 0.9.6的大致步骤。假设该系统已经有软件编译工具。
具体来说,我们需要编译如下一些软件包
rtorrent支持其它工具通过XML-RPC协议与之通讯。由于我用不到相应的功能,所以我在编译rtorrent的时候没有包含和XML-RPC相关的代码。
编译步骤
在下面的编译示例中,软件的安装路径都在/opt/local下面的各个子目录中。
automake
1 2 3 4 5 6 7 8 |
tar zxvf automake-1.16.tar.gz cd automake-1.16 mkdir mybuild cd mybuild ../configure --prefix=/opt/local make # as root make install |
libz
进入zlib-1.2.11.tar.gz所在的子目录
1 2 3 4 5 6 7 8 9 |
tar zxvf zlib-1.2.11.tar.gz cd zlib-1.2.11 mkdir mybuild cd mybuild ../configure --prefix=/opt/local make # as root make install |
OpenSSL
进入openssl-1.1.0g.tar.gz所在的子目录
1 2 3 4 5 6 7 8 9 |
tar zxvf openssl-1.1.0h.tar.gz cd openssl-1.1.0h mkdir mybuild cd mybuild ../config -Wl,--enable-new-dtags --prefix=/opt/local/ssl --openssldir=/opt/local/ssl enable-egd make # as root make install |
注意:安装路径的根目录是/opt/local/ssl。同时需要在配置时加上“enable-egd”,要不然,编译curl时会报错。
curl
进入curl-7.59.0.tar.gz所在的目录
1 2 3 4 5 6 7 8 9 |
tar zxvf curl-7.59.0.tar.gz cd curl-7.59.0 mkdir mybuild cd mybuild PKG_CONFIG_PATH=/opt/local/ssl/lib/pkgconfig ../configure --prefix=/opt/local --with-ssl=/opt/local/ssl --with-libssl-prefix=/opt/local/ssl make # as root make install |
libtorrent
进入libtorrent-0.13.6.tar.gz所在的目录
1 2 3 4 5 6 7 8 9 |
tar zxvf libtorrent-0.13.6.tar.gz cd libtorrent-0.13.6 mkdir mybuild cd mybuild PKG_CONFIG_PATH="/opt/local/ssl/lib/pkgconfig:/opt/local/lib/pkgconfig" ../configure --prefix=/opt/local make # as root make install |
这一步会遇到一些麻烦。编译安装时会出现类似于下面所示的错误
1 |
undefined reference to '__sync_sub_and_fetch_4' |
主要原因是所用的编译器gcc 4.2.3版本太旧,而libtorrent代码中用到了一些和原子操作有关的gcc内部函数,只有在gcc 4.3及以后版本中才有。一般来说有两种解决办法:一是换用较新版本的gcc,这需要编译安装另一版本的gcc;再一个解决办法就是找到新版gcc中关于原子操作函数的代码,这需要找到一个文件(linux-atomic.c),编译后使用。在这里和这里能获得更多详情。
另外,我们其实可以在编译libtorrent时通过使用“-disable-instrumentation”配置选项来避免编译使用到有问题函数的代码。根据我自己的测试,这样虽然能够编译安装libtorrent,但接下来在编译rtorrent仍然会出错。所以我还是采用了上面提到的第二种方案,也就是,使用linux-atomic.c。
接下来,我们切换到另外一个工作目录,比如~/downloads/linux-atomic
1 2 3 |
wget -O linux-atomic.c "http://gcc.gnu.org/git/?p=gcc.git;a=blob_plain;f=libgcc/config/arm/linux-atomic.c;hb=master" libtool --tag=CC --mode=compile gcc -g -O2 -MT linux-atomic.lo -MD -MP -MF linux-atomic.Tpo -c -o linux-atomic.lo linux-atomic.c libtool --tag=CC --mode=link gcc -g -O2 -o liblinux-atomic.la linux-atomic.lo |
切换回libtorrent-0.13.6目录,在我们开始编译之前,我们需要再做一件事,那就是修改两个源文件,这也是我测试出错后才知道的。需要修改的文件分别是src/utils/instrumentation.h和src/utils/instrumentation.cc。具体需要修改的是:把所有的int64_t换成int32_t,再把所有的PRIi64换成PRIi32。做完这些改动之后,回到libtorrent-3.6/mybuild。如果之前运行过configure命令,记得首先运行“make distclean”,然后才执行如下命令
1 2 3 4 5 6 |
# Assume linux-atomic.c is in /home/taohe/downloads/linux-atomic PKG_CONFIG_PATH="/opt/local/ssl/lib/pkgconfig:/opt/local/lib/pkgconfig" ../configure --prefix=/opt/local LDFLAGS="-L/home/taohe/downloads/linux-atomic" LIBS="-llinux-atomic" make # as root make install |
rtorrent
终于要编译rtorrent主程序了。不过在正式操作之前,首先确保系统上有ncurses的头文件。如果是用Optware,我们需要安装”ncurses-dev”以及”ncursesw-dev”两个包(使用ipkg install命令)
进入rtorrent-0.9.6.tar.gz所在的目录
1 2 3 4 5 6 7 8 9 10 |
# Assume linux-atomic.c is in /home/taohe/downloads/linux-atomic tar zxvf rtorrent-0.9.6.tar.gz cd rtorrent-0.9.6 mkdir mybuild cd mybuild PKG_CONFIG_PATH="/opt/local/lib/pkgconfig:/opt/local/ssl/lib/pkgconfig" ../configure --prefix=/opt/local LDFLAGS="-L/home/taohe/downloads/linux-atomic" LIBS="-llinux-atomic" make # as root make install |
搞定! 执行/opt/local/bin/rtorrent,或者把/opt/local/bin加入$PATH,就能启动刚刚编译好的rtorrent 0.9.6。这样编译的rtorrent可以连接强制TLSv1.2的HTTPS服务器。请注意rtorrent 0.9.x的配置文件和旧版0.8.x的不兼容,关于rtorrent 0.9.6的配置以及命令等相关信息,请参考rtorrent wiki网页。
下载
在NAS上编译以上软件包非常耗时。所以我把我的NAS上的/opt/local打包后供有需要的朋友试用。打包后的文件可在本站下载。如果硬件兼容,这些编译好的可执行文件极有可能可以直接运行。