Linux安装gmpy2

今天下午花了点时间配环境,主要困难是安装Python的gmpy2包。这是一个多精度浮点数快速计算库,因为依赖很多,所以在Linux上源码编译安装比较麻烦,而在Windows上则比较简单,直接下载预编译的wheel即可。本文参考了一篇网络文章,一些细节有所不同。

本文基于的环境是64位的Ubuntu 20.04 LTS,其他版本Linux可能会有出入。一些遇到"permission denied"的操作(如make install),请更换安装目录,或用sudo

另外对于多核的机器,可以用类似make -j4的命令并行编译加快速度。

确定依赖库的安装位置

编译gmpy2需要许多依赖,但是因为以静态库方式编译,所以这些依赖可以不安装在系统库目录里,随后也可以删除。因此可以自行确定方便的目录。本文中,库的安装目录为$HOME/static,如果需要,记得更换为读者自己的目录。

1
$ mkdir $HOME/static

安装m4依赖

这是官方网站.

1
2
3
4
5
$ wget https://ftp.gnu.org/gnu/m4/m4-1.4.18.tar.xz
$ tar Jxf m4-1.4.18.tar.xz
$ cd m4-1.4.18
$ ./configure -prefix=$HOME/static
$ make && make check && make install

可能出现的bug

我在编译m4时出现了类似如下bug:

1
2
3
freadahead.c:91:3: error: #error "Please port gnulib freadahead.c to your platform! Look at the definition of fflush, fread, ungetc on your system, then report this to bug-gnulib."
91 | #error "Please port gnulib freadahead.c to your platform! Look at the definition of fflush, fread, ungetc on your system, then report this to bug-gnulib."
| ^~~~~

经过查询相关资料,根据这篇文章提供的方案解决问题。只需在m4源码目录(在这一目录下存在lib目录)下执行

1
2
sed -i 's/IO_ftrylockfile/IO_EOF_SEEN/' lib/*.c
echo "#define _IO_IN_BACKUP 0x100" >> lib/stdio-impl.h

给源文件打上补丁即可。(后来回忆或许是我不小心下载了老版本的m4?不过本文给出的1.4.18应该是目前的最新版本了)

安装GMP

这是官方网站.

1
2
3
4
5
$ wget https://gmplib.org/download/gmp/gmp-6.2.1.tar.xz
$ tar Jxf gmp-6.2.1.tar.xz
$ cd gmp-6.2.1
$ ./configure --prefix=$HOME/static --enable-static --disable-shared --with-pic
$ make && make check && make install

安装MPFR

这是官方网站.

1
2
3
4
5
$ wget https://www.mpfr.org/mpfr-current/mpfr-4.1.0.tar.xz
$ tar Jxf mpfr-4.1.0.tar.xz
$ cd mpfr-4.1.0
$ ./configure --prefix=$HOME/static --enable-static --disable-shared --with-pic --with-gmp=$HOME/static
$ make && make check && make install

相信读者也看出来了,其实就是每次增加依赖的静态库路径。

安装MPC

这是官方网站.

1
2
3
4
5
$ wget https://ftp.gnu.org/gnu/mpc/mpc-1.2.1.tar.gz
$ tar xzf mpc-1.2.1.tar.gz
$ cd mpc-1.2.1
$ ./configure --prefix=$HOME/static --enable-static --disable-shared --with-pic --with-gmp=$HOME/static --with-mpfr=$HOME/static
$ make && make check && make install

安装gmpy2

终于可以安装gmpy2了。GitHub repo是aleaxit/gmpy,本文安装的是目前最新release 2.1.0b5。

1
2
3
4
5
$ wget https://github.com/aleaxit/gmpy/releases/download/gmpy2-2.1.0b5/gmpy2-2.1.0b5.tar.gz
$ tar xzf gmpy2-2.1.0b5.tar.gz
$ cd gmpy2-2.1.0b5
$ python setup.py build_ext --static-dir=$HOME/static
$ python setup.py install

这里官方的INSTALL似乎有点问题,--static-dir选项写错了。到这为止应该已经安装完成了,可以用输出100以内质数测试一下(来源见参考文献[1]):

1
2
3
4
import gmpy2
for i in range(100):
if gmpy2.is_prime(i):
print(i)

保存gmpy2.egg

如果和队友合作,或者要在不同的几台机器上配相同的环境,每次重复一遍这个流程也太麻烦了。因此可以把这次build的.egg保存下来,之后可以分发,在新机器上用easy_install即可安装。执行完上面的安装以后,应该可以在gmpy2源码目录下的build/bdist.linux-x86_64/gmpy2-2.1.0b5-py3.8-linux-x86_64.egg找到.egg文件。下次安装时可以用

1
$ easy_install gmpy2-2.1.0b5-py3.8-linux-x86_64.egg

参考文献

[1] pcat - gmpy2安装使用方法

[2] gmpy2开发者 - Installing gmpy2 on Unix/Linux

[3] Jun626 - NUC980开源项目24-Please port gnulib freadahead.c to your platform!