有时会用到高性能服务器去做一些计算,其中包含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:
其中subversion(是一个自由开源的版本控制系统)的安装,如果从源程序进行编译(地址1,地址2),需要较多的依赖(和别的程序比较),因此快捷方法是用编译好的rpm。但是网上下载到的subversion rpm不允许修改安装路径,因此需要管理员权限,在没有权限的情况下,我没有安装这个程序。结果表明不安装这个程序,并不影响GMT的最终编译。
1 | [yanglei@ln01 gmt]$ rpm -qpi CollabNetSubversion-client-1.12.2-1.x86_64.rpm |
最终从互联网下载源程序:
1 | GraphicsMagick-1.3.34.tar.gz jpegsr6.zip |
登录服务器
通过ssh远程登录服务器,为了方便管理依赖文件,建立了GMT
文件夹存放,个人的全部程序安装在用户主目录下local
文件夹,因为个人用户没有管理员用户权限,无法安装到服务器根目录。
1 | ssh name@ip |
解压全部的源程序文件
1 | tar xvf *.tar.* |
编译依赖源程序
依次编译源程序,编译的顺序按照官网顺序依次编译即可。前后不存在密切的关联,但是CMAKE作为一个编译工具,或许需要提前安装。大部分依赖比较容易安装,以Ghostscript为例。
1 | tar zxvf ghostscript-9.25.tar.gz |
修改系统变量,使系统能够找到手动安装的bin和lib等文件夹位置。
1 | vi ~/.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 | ./bootstrap |
这是可能会提示找不到openssl,如果有该提示,输入如下命令
1 | export OPENSSL_ROOT_DIR=~/local/openssl/ #绝对路径 |
将cmake目录下的CMakeCache.txt删掉,重新从bootstrap开始进行编译。
CMAKE安装结束。
安装NetCDF,需要先安装zlib和hdf5。此外在无网络环境下,可以设置--disable-dap
。
安装NetCDF提示找不到hdf5,实际上已经安装并且设置系统路径变量。如果出现类似错误,根据错误提示可以做如下设置:
1 | CPPFLAGS='-I~/local/hdf5/include -I~/local/zlib/include' LDFLAGS='-L~/local/hdf5/lib -L~/local/zlib/lib' ./configure --prefix=~/local/ --disable-dap |
libcurl是一些程序的依赖,可以提前安装。但是在没有联网的情况下,安装libcurl可能起不到作用。GMT6的一个特点是数据的网络化,例如以前例子中的数据不再经过安装包提供,而是通过网络进行自动下载到本地。
编译可选择源程序
接下来编译其他的可选程序,PCRE是(Perl Compatible Regular Expressions)是一个Perl库,包括 perl 兼容的正则表达式库。GDAL(Geospatial Data Abstraction Library)是一个在X/MIT许可协议下的开源栅格空间数据转换库,它利用抽象数据模型来表达所支持的各种文件格式,它还有一系列命令行工具来进行数据转换和处理,GDAL在遥感领域使用较多。FFTW、LAPACK、BLAS主要是数学运算的底层库。
GDAL的编译需要依赖proj6和sqlite3. 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 | set (CMAKE_INSTALL_PREFIX /opt/gmt) |
复制cmake文件,并根据自己的系统进行设置。主要是设置路径。
1 | cp cmake/ConfigUserTemplate.cmake cmake/ConfigUser.cmake |
编译GMT:
1 | cd <path to>/gmt |
– 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
静态库文件。