怀怀旧?用老办法整些东西吧(一/aria2篇)

aria2 是一个采用 C++开发,轻量级的多线程下载工具,支持 HTTP/HTTPS/FTP/Bt/BitTorrent/Metalink。相信不少人已经了解或者使用过。
aria2 包括 aria2c 和 libaria2,相信大家绝大多数时候见到的都是 aria2c 本文主要介绍 aria2c 的“土法”构建

本文可能相对有价值的部分在于Windows 版本 aria2 的构建,可以考虑直接跳过前面的废话

简单的安装

Linux

在构建之前稍微提一下 aria2c 的安装。相当多的发行版已经将其纳入到其包管理器的官方源了,所以,一行指令即可完成安装

sudo apt-get install aria2 #Debian/Ubuntu
sudo yum install aria2 #CentOS/Fedora
sudo zypper in aria2 #openSUSE
sudo pacman -S aria2 #Arch Linux
brew install aria2 #Homebrew
apk add aria2 #Alpine
#NixOS/Others
自行解决

Windows

Windows 下的安装其实也很简单
使用包管理器的话以下任选其一即可

winget install aria2
scoop install aria2
choco install aria2

或者

前往Releases · aria2/aria2 · GitHub下载

构建

特性/依赖

因为无论哪个平台都需要这些东西,所以 MWX 把它们单独列在前面(摘自aria2/aria2 (github.com)

特性依赖库
HTTPSOSX or GnuTLS or OpenSSL or Windows
SFTPlibssh2
BitTorrentNone. Optional: libnettle+libgmp or libgcrypt or OpenSSL (see note)
Metalinklibxml2 or Expat.
ChecksumNone. Optional: OSX or libnettle or libgcrypt or OpenSSL or Windows (see note)
gzip, deflate in HTTPzlib
Async DNSC-Ares
Firefox3/Chromium cookielibsqlite3
XML-RPClibxml2 or Expat.
JSON-RPC over WebSocketlibnettle or libgcrypt or OpenSSL

备注:

  • libxml2Expat 同时被安装时会优先选择 libxml2 ,如果希望使用 Expat ,可以在 configure 时使用 --without-libxml2 选项
  • GnuTLSOpenSSL 同时被安装时会优先选择 GnuTLS ,如果希望使用 OpenSSL ,可以手动在 configure 时使用 --without-gnutls --with-openssl 选项
  • libnettlelibgcrypt 同时被安装时会优先选择 libnettle ,如果希望使用 libgcrypt ,可以在 configure 时使用 --without-libnettle --with-libgcrypt 选项,另外,如果已经选择了 OpenSSL ,那么 libnettlelibgcrypt 都不会被用到
  • 在 macOS/Windows 上将会优先使用系统层面的 SSL/TLS 支持,因此不需要安装 GnuTLSOpenSSL 。如需禁用这一行为,在 configure 时可使用 --without-appletls (macOS)/ --without-wintls (Windows) 选项
  • 最后,如果没有选择任何可选摘要库,aria2 将会使用内建的 md5 和 sha1 支持以满足基本需要

总而言之,用户可以选择以下加密/TLS 库搭配

  • OpenSSL
  • GnuTLS + libgcrypt
  • GnuTLS + libnettle
  • Apple TLS (仅限 macOS)
  • Windows TLS (仅限 Windows)

另外,可以提供在configure时使用--disable-bittorrent / --disable-metalink 来禁用 BitTorrent / Metalink 支持
如果需要异步 DNS 支持,还另外需要c-ares

Linux

为了简洁,以下内容使用 openSUSE 演示,Debian 系和 RedHat 系可以直接参考源仓库 README,ArchLinux 如果需要可以参考 Windows 部分

首先安装依赖,MWX 基于个人喜好选择使用 OpenSSL,libxml2 组合(可以少装点)
由于 MWX 决定从 git 仓库获取源代码,所以还需要 git,libtool 和 autotools,当然,还有最基本的编译环境,(这部分内容可以参考让我的代码到处跑之本地构建(CMake篇)
另外,在这里,并没有安装 libcppunit,Sphinx 等用于测试/生成文档的依赖,
运行以下命令来安装他们

sudo zypper in pkgconf pkgconf-pkg-config autoconf automake libtool gcc gcc-c++ gettext-tools sqlite3-devel libssh2-devel libxml2-devel c-ares-devel libopenssl-devel zlib-devel make git

这其中可能有部分包互为依赖,在安装一部分包的同时也会安装另外一部分( libopenssl-devel 依赖 zlib-devel )如,但为了更加清晰,在这里显式的列举了出来

然后我们就可以

git clone https://github.com/aria2/aria2.git
cd aria2
autoreconf -i
./configure
make #可根据构建环境使用-j设置并行任务数量,如make -j8

嗯,平平无奇的构建流程,如果需要增加自己的个性化配置可以参考上面的configure选项
如果一切顺利,我们就可以在 src 目录下看到 aria2c 的可执行文件了,可以执行它试试看,这可是新鲜出炉的 aria2,更多信息可以直接参见 aria2 的Github 仓库,那里有更加详细的介绍,这节就先到这里。

Windows

aria2 看上去起初是为*nix 设计的,所以在 Windows 下需要一些额外的步骤

官方的建议是使用提供的 Dockerfile 来交叉编译,其内部实现使用 Ubuntu 来从源码构建所使用到的依赖,除此之外也仅仅介绍了在 Debian 系 Linux 上使用 mingw-w64 交叉编译的方法,这可能对一般 Windows 用户不太友好,所以在这里我们直接在 Windows 上解决构建问题

为了提供一个类似*nix 的执行环境,我们需要用到MSYS2。可以直接去官网下载,不过有一点小细节,如果安装时网络不好,它可能会在导入软件源/密钥时卡很久,可以考虑把网线拔了之后安装,之后再更换软件源,具体步骤就不在这里讨论了。

安装完成后,我们在开始菜单选择“MSYS2 MSYS”,然后打开他,目前 OpenSSL 和 C-Ares 在 MSYS2 MSYS 环境下似乎有一些兼容性问题,在未来可能会修复,另外,gettext 不太适合 Windows,我们在这里不使用这些库

运行以下命令来安装他们(MSYS2 默认的那个黑框框的粘贴快捷键是 Shift+INS,也可以在右键菜单粘贴)

pacman -S gcc git make automake autoconf libtool libsqlite-devel libssh2-devel libxml2-devel zlib-devel pkgconf libnettle-devel libgnutls-devel

官方提供了一个mingw-config脚本,但我们不去用他

我们直接运行

git clone https://github.com/aria2/aria2.git
cd aria2
autoreconf -i
./configure --without-included-gettext --disable-nls
make

理论上就可以得到一个可用的 aria2c.exe 了,嗯。

现在这里有一个问题,你会发现在这里我们的 ./configure 看上去并没有找到我们的 WinTLS,按照上面的说明,即使安装了 GnuTLS 和 libnettle 在 Windows 上也会优先使用 WinTLS,另外,如果想要使用 OpenSSL 和 C-Ares ,可能 MSYS 的环境也并不能满足我们

(但反正又不是不能用嘛)

好吧,那我们再来点别的方案

首先解释一下,MSYS2 本身类似于一个 Linux 兼容层,其中 MSYS 环境理论上可以最大程度上的让 Linux 程序不经过修改就可以完成构建,MSYS 直接位于 MSYS2 安装目录的/usr 下(其余环境在其对应的子文件夹下)也就是说 MSYS2 的基础环境由 MSYS 提供 ,以 MSYS2 中的 MSYS 配置生成的程序本身比起原版的 Windows 可能更加偏向于 Linux 程序,使用 MSYS 环境构建的应用程序需要带上 MSYS 支持库且并不能方便的调用 Windows 相关 API,但 MSYS2 其实还提供了 MINGW,UCRT,CLANG 等环境来解决这个问题,可以更方便的用于构建更为正宗的 Windows 程序,所以我们继续往下看。

这里我们以 UCRT64 环境为例

在开始菜单中打开“MSYS2 UCRT64”然后在其中运行以下命令来安装针对 UCRT64 的依赖(OpenSSL 和 C-Ares 在 UCRT64 环境下可用)

pacman -S mingw-w64-ucrt-x86_64-libtool mingw-w64-ucrt-x86_64-sqlite3 mingw-w64-ucrt-x86_64-libssh2 mingw-w64-ucrt-x86_64-libxml2 mingw-w64-ucrt-x86_64-zlib mingw-w64-ucrt-x86_64-c-ares mingw-w64-ucrt-x86_64-nettle mingw-w64-ucrt-x86_64-gnutls

如果不想使用 WINTLS,需要使用 OpenSSL 则需要

pacman -S mingw-w64-ucrt-x86_64-openssl

如果使用 GnuTLS + libnettle 则需要

pacman -S mingw-w64-ucrt-x86_64-gnutls mingw-w64-ucrt-x86_64-nettle

GnuTLS + libgcrypt 则

pacman -S mingw-w64-ucrt-x86_64-gnutls mingw-w64-ucrt-x86_64-libgcrypt

然后和前面一样

git clone https://github.com/aria2/aria2.git
cd aria2
autoreconf -i
./configure --without-included-gettext --disable-nls
make

如果一切顺利,现在就可以得到一个健康的 Windows 版 aria2c.exe 了

MacOS

另请高明或参考 Linux 部分

尾声

如果按照以上教程且一切顺利的话,那么恭喜你,你得到了一个新鲜的 aria2c 的可执行文件,你现在可以使用它来下载文件啦~

不过它是动态链接的,这在大部分情况下应该不是问题

但如果比如你想在 Windows 下分发他而不想带上一大堆 dll 的话…

那你可能确实需要静态链接他

你可以考虑在./configure 时尝试使用 ARIA2_STATIC=yes参数,但这大概率会有问题,因为大部分系统的包管理器并没有提供 aria2 依赖中的静态库版本

你可能需要手动从源代码构建这些库,如果嫌麻烦,可以考虑直接使用官方提供的 Windows 版可执行文件(

或者你也可以尝试使用如vcpkg等工具来帮你构建这些依赖

如果有机会,或许我会出一期续集,那么回见~

感谢看到这里噢~ 希望这能给你带来帮助,如果觉得在任何地方有疑问,欢迎联系MWX(如需转载,请注明文章出处噢)!
或者如果大人愿意也可以...
上一篇
下一篇