0%

Building GMT under redhat server without internet

有时会用到高性能服务器去做一些计算,其中包含GMT计算程序的调用。而高性能计算机并不给一般用户登录互联网和管理员权限,因此需要在Linux服务器上,使用一般用户的身份手动编译GMT以及全部所需要的依赖程序。最初以为这个很麻烦,但是经过陆续一周的依赖源编译,还是安装成功了,确实很麻烦。

安装环境

假设在如下环境下安装GMT6:

系统:Red Hat Enterprise Linux Server 6.4 (Santiago)
网络:无
权限:无管理员权限

编译步骤

因为没有网络,在这种情况下yum命令无法使用,需要下载依赖源文件进行手工编译。因此在没有网络的Linux服务器或者个人电脑上安装GMT主要就是编译依赖源。

依赖源文件准备

登录GMT的Building帮助页,按照其给出的提示准备依赖程序,由于其假设是链接互联网情况下的安装依赖,而有的依赖还需要依赖别的库或者程序,因此最终准备的依赖要比官网给出多。
官网给的依赖:

Install:

-Ghostscript
-Subversion
-CMake (>=2.8.5)
-netCDF (>=4.0, netCDF-4/HDF5 support mandatory)
-libcurl [for GMT >= 5.4]

Optionally install for more capabilities within GMT:

-PCRE (Regular expression support for gmt convert and -e)
Alternatively, for GMT >= 5.4.4, or the current SVN version, PCRE2 can be used.
-GDAL (Ability to read and write numerous grid and image formats)
-FFTW Single-precision (Fast FFTs [not needed under OS X])
-LAPACK (Fast matrix inversion [not needed under OS X])
-BLAS (Fast matrix multiplications [not needed underr OS X])

Optionally install for building the documentation:

-Texlive
-Sphinx (1.4.x or younger)

Optionally install for running the tests:

-GraphicsMagick

其中subversion(是一个自由开源的版本控制系统)的安装,如果从源程序进行编译(地址1,地址2),需要较多的依赖(和别的程序比较),因此快捷方法是用编译好的rpm。但是网上下载到的subversion rpm不允许修改安装路径,因此需要管理员权限,在没有权限的情况下,我没有安装这个程序。结果表明不安装这个程序,并不影响GMT的最终编译。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[yanglei@ln01 gmt]$ rpm -qpi CollabNetSubversion-client-1.12.2-1.x86_64.rpm
warning: CollabNetSubversion-client-1.12.2-1.x86_64.rpm: Header V4 RSA/SHA1 Signature, key ID 2e45c0ca: NOKEY
Name : CollabNetSubversion-client Relocations: (not relocatable)
Version : 1.12.2 Vendor: CollabNet
Release : 1 Build Date: Fri Jul 26 11:55:39 2019
Install Date: (not installed) Build Host: 1bbe4d7a7f3e
Group : Utilities/System Source RPM: CollabNetSubversion-client-1.12.2-1.src.rpm
Size : 55135440 License: Proprietary
Signature : RSA/SHA1, Fri Jul 26 11:55:53 2019, Key ID 16682a5b2e45c0ca
Packager : Build User (CollabNet) <build@collab.net>
URL : http://open.collab.net
Summary : A Concurrent Versioning system similar to but better than CVS.
Description :
CollabNet Subversion client is a free download of open-source Subversion,
compiled and tested by CollabNet. For more information about CollabNet
Subversion, visit the CollabNet community at http://open.collab.net.
[yanglei@ln01 gmt]$

最终从互联网下载源程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
GraphicsMagick-1.3.34.tar.gz  jpegsr6.zip
cmake-3.16.1.tar.gz lapack-3.9.0.tar.gz
curl-7.67.0.tar.gz libpng-1.6.37.tar.gz
dcw-gmt-1.1.4.tar.gz mpc-1.0.3.tar.gz
fftw-3.3.8.tar.gz mpfr-3.1.4.tar.bz2
gcc-9.2.0.tar.gz netcdf-c-4.7.3.tar.gz
gdal-3.0.2.tar.gz openssl-1.1.1d.tar.gz
geos-3.8.0.tar.bz2 pcre2-10.34.tar.gz
ghostscript-9.50.tar.gz proj-6.2.1.tar.gz
gmp-6.1.0.tar.bz2 proj-datumgrid-1.8.zip
gmt-6.0.0-src.tar.gz sqlite-autoconf-3300100.tar.gz
gshhg-gmt-2.3.7.tar.gz subversion-1.10.6.tar.gz
hdf5-1.10.5.tar.gz zlib-1.2.11.tar.gz
isl-0.18.tar.bz2

登录服务器

通过ssh远程登录服务器,为了方便管理依赖文件,建立了GMT文件夹存放,个人的全部程序安装在用户主目录下local文件夹,因为个人用户没有管理员用户权限,无法安装到服务器根目录。

1
2
3
ssh name@ip
mkdir ~/gmt
mkdir ~/local

解压全部的源程序文件

1
2
tar xvf *.tar.*
unzip *.zip

编译依赖源程序

依次编译源程序,编译的顺序按照官网顺序依次编译即可。前后不存在密切的关联,但是CMAKE作为一个编译工具,或许需要提前安装。大部分依赖比较容易安装,以Ghostscript为例。

1
2
3
4
5
tar zxvf ghostscript-9.25.tar.gz
cd ghostscript-9.50
./configure --prefix=~/local #此处需要使用绝对路径
make all
make install

修改系统变量,使系统能够找到手动安装的bin和lib等文件夹位置。

1
2
3
4
5
6
7
8
vi ~/.bash_profile # 修改下面内容

LOCALPATH=~/local #绝对路径
export LOCALPATH
PATH=$PATH:$LOCALPATH/bin
export LD_LIBRARY_PATH=$LOCALPATH/lib

source ~/.bash_profile # 现在生效

安装中遇到的主要困难是CMAKE,首先如果gcc版本低,会出现下面的报错:

Error when bootstrapping CMake:
Cannot find a C++ compiler that supports both C++11 and the specified C++ flags.
Please specify one using environment variable CXX.
The C++ flags are “”.
They can be changed using the environment variable CXXFLAGS.
See cmake_bootstrap.log for compilers attempted.


Log of errors:
~/gmt/cmake-3.16.1/Bootstrap.cmk/cmake_bootstrap.log

因此需要下载新的GCC源,并编译GCC。因为服务器根目录已经有低版本的GCC了,因此系统将存在多个GCC编译器。在具体使用的时候要提高新版本GCC的优先级。网上有多种办法,我是将新GCC的bin路径放到了系统路径的前面。然后查看GCC版本为9.2.0。再进行CMAKE的编译不会上述错误提示。 GCC的安装编译时间较长,大概1小时。

GCC的安装编译还需要依赖其他库,GMP、MPFR、MPC和ISL。可参考安装教程.

CMAKE安装还依赖openssl(一套描述文件处理、加密算法和其他信息技术标准),下载源码并编译openssl。编程成功后再回到CMAKE,编译CMAKE。

1
2
3
./bootstrap
gmake
gmake install

这是可能会提示找不到openssl,如果有该提示,输入如下命令

1
export OPENSSL_ROOT_DIR=~/local/openssl/ #绝对路径

将cmake目录下的CMakeCache.txt删掉,重新从bootstrap开始进行编译。

CMAKE安装结束。

安装NetCDF,需要先安装zlib和hdf5。此外在无网络环境下,可以设置--disable-dap

安装NetCDF提示找不到hdf5,实际上已经安装并且设置系统路径变量。如果出现类似错误,根据错误提示可以做如下设置:

1
2
CPPFLAGS='-I~/local/hdf5/include -I~/local/zlib/include' LDFLAGS='-L~/local/hdf5/lib -L~/local/zlib/lib' ./configure --prefix=~/local/ --disable-dap
make check install

libcurl是一些程序的依赖,可以提前安装。但是在没有联网的情况下,安装libcurl可能起不到作用。GMT6的一个特点是数据的网络化,例如以前例子中的数据不再经过安装包提供,而是通过网络进行自动下载到本地。

编译可选择源程序

接下来编译其他的可选程序,PCRE是(Perl Compatible Regular Expressions)是一个Perl库,包括 perl 兼容的正则表达式库。GDAL(Geospatial Data Abstraction Library)是一个在X/MIT许可协议下的开源栅格空间数据转换库,它利用抽象数据模型来表达所支持的各种文件格式,它还有一系列命令行工具来进行数据转换和处理,GDAL在遥感领域使用较多。FFTW、LAPACK、BLAS主要是数学运算的底层库。

GDAL的编译需要依赖proj6sqlite3. Proj软件自1983至今在不断的维护。主要是用于坐标转换,GMT中的mapproject等程序直接或间接调用了proj接口,其用法和proj非常接近。在安装proj时,根据提示可能需要设置PKG_CONFIG_PATH。

1
export PKG_CONFIG_PATH=~local/lib/pkgconfig/

为配合GDAL,我还安装了geos,虽然看起来没起到作用。

回到GDAL,进行编译,可能还出现如下错误:

checking for PROJ >= 6 library… checking for proj_create_from_wkt in -lproj… no
checking for internal_proj_create_from_wkt in -lproj… no
checking for internal_proj_create_from_wkt in -linternalproj… no
configure: error: PROJ 6 symbols not found

需要进行如下设置,使其找到正确的路径。

1
./configure --prefix= ~/local/gdal --with-proj= ~/local

然后编译GDAL,无错误。大概需要1个小时,其编译速度很慢。

编译三个数学库,FFTW较为简单,其他两个可参考教程,编译起来一般没有问题。

为了制作动画,选择性的编译GraphicsMagick(GM),GM依赖libpng-devel,编译没有出现问题。

编译文档生成工具

因为服务器没有界面,故忽略了帮助文档的编译工具安装。

编译GMT

按照官网的说明进行编译。需要先下载GSHHG和DCW数据,并解压到任意路径。
首先设置GMT的安装和海岸线、国界线数据搜索路径:

1
2
3
set (CMAKE_INSTALL_PREFIX /opt/gmt)
set (GSHHG_ROOT <path to gshhg>)
set (DCW_ROOT <path to dcw>)

复制cmake文件,并根据自己的系统进行设置。主要是设置路径。

1
2
cp cmake/ConfigUserTemplate.cmake  cmake/ConfigUser.cmake
vi cmake/ConfigUser.cmake

编译GMT:

1
2
3
4
5
6
cd <path to>/gmt
mkdir build
cd build
cmake ..
make
make install

– Found NETCDF: ~/local/netcdf/lib/libnetcdf.so
CMake Error at ~/local/cmake/share/cmake-3.16/Modules/FindPackageHandleStandardArgs.cmake:146 (message):
Could NOT find CURL (missing: CURL_LIBRARY CURL_INCLUDE_DIR)


提示找不到curl的两个安装路径,找到ConfigUser.cmake中的如下位置,进行编辑。

#Set location of CURL (can be root directory or path to header file) [auto]:
set (CURL_ROOT ~/local/curl)

然后再次make,发现lapack还有点问题,于是注释掉liblapack行,保留BLAS行。

#Set LAPACK location. Use this when want to link with LAPACK and it’s not found automatically
#set (LAPACK_LIBRARY ~/local/lib/liblapack.a)
set (BLAS_LIBRARY ~/local/lib/libblas.a)

再次make,编程GMT成功。

在此次编译中,虽然成功安装(?)liblapack,并且在cmake文件中指定了路径,但是GMT安装中依然无法识别liblapack.a静态库文件。