最近有一些果蝇SNP数据,要根据SNP数据来推测单倍体型(也就是phasing
),通过检索文献,发现shapeit4
应该是一个可以尝试的工具。
shapeit4的安装说明:
https://odelaneau.github.io/shapeit4/
其源代码:
https://github.com/odelaneau/shapeit4
这是我见过的安装最复杂的生信软件了,首先要确定gcc软件版本(<5.0.0的版本会提示错误),还要找到各种编译库,然后还要修改makefile文件。
【提示:下文代码块可以左右滑动】
尝试使用conda安装
在conda中安装软件会方便很多,根据之前的经验,首先想到的是通过conda安装,还真找到了通过conda安装shapeit4的途径。
但是,失败了!面对这些版本问题和依赖关系,conda似乎也无能为力,尤其是在处理一些底层依赖关系的时候。
conda install -c bioconda shapeit4
# UnsatisfiableError: The following specifications were found to be incompatible with each other:
# Output in format: Requested package -> Available versions
# Package libgcc-ng conflicts for:
# shapeit4 -> bzip2[version='>=1.0.8,<2.0a0'] -> libgcc-ng[version='>=4.9|>=9.3.0']
# shapeit4 -> libgcc-ng[version='>=7.3.0|>=7.5.0']
# Package _openmp_mutex conflicts for:
# python=3.9 -> libgcc-ng[version='>=7.3.0'] -> _openmp_mutex[version='>=4.5']
# shapeit4 -> libgcc-ng[version='>=7.5.0'] -> _openmp_mutex[version='>=4.5']
gcc版本更新
本服务器上的gcc版本是4.8.5,显然不符合shapeit4软件的要求。所以要更新gcc版本。
但是gcc这种比较底层软件的安装更新显然是需要系统权限。(通过conda似乎可以更新gcc版本,但是未在此路上继续往下走)。
所以怎样要没有管理员权限的情况下,建立属于自己的gcc软件呢?
结果还真在网上找到可行的方法:
http://cazencott.info/index.php/post/2016/03/14/Local-user-installation-of-gcc
下面就是非管理员权限下安装gcc的流程(本人验证)。
首先在自己的主目录下建立一些文件路径
export PREFIX = $HOME/.local
mkdir $PREFIX/build
mkdir $PREFIX/download
然后,安装GMP
:(不要问我这些软件是干啥的,我也不知道,但是它应该是gcc运行需要的)
cd $PREFIX/download
wget https://gmplib.org/download/gmp/gmp-6.2.1.tar.xz
tar -xf gmp-6.2.1.tar.xz
cd ../build
mkdir build-gmp
cd build-gmp
../../download/gmp-6.2.1/configure --disable-shared --enable-static --prefix=$PREFIX
make
make check
make install
再安装MPFR
,
cd ../../download
wget https://www.mpfr.org/mpfr-current/mpfr-4.1.0.tar.gz
tar zxvf mpfr-4.1.0.tar.gz
cd ../build
mkdir build-mpfr
cd build-mpfr
../../download/mpfr-4.1.0/configure --with-gmp=$PREFIX --disable-shared --enable-static --prefix=$PREFIX/
make
make install
再安装MPC
cd ../../download
wget http://ftp.gnu.org/gnu/mpc/mpc-1.2.1.tar.gz
tar zxvf mpc-1.2.1.tar.gz
cd ../build
mkdir build-mpc
cd build-mpc
../../download/mpc-1.2.1/configure --with-gmp=$PREFIX --with-mpfr=$PREFIX --disable-shared --enable-static --prefix=$PREFIX
make
make install
再安装ISL
ISL
cd ../../download
wget http://isl.gforge.inria.fr/isl-0.14.tar.gz
tar zxvf isl-0.14.tar.gz
cd ../build
mkdir build-isl
cd build-isl/
../../download/isl-0.14/configure --with-gmp-prefix=$PREFIX --disable-shared --enable-static --prefix=$PREFIX
make
make install
在安装CLooG
cd ../../download
wget http://www.bastoul.net/cloog/pages/download/cloog-0.18.3.tar.gz
tar zxvf cloog-0.18.3.tar.gz
cd ../build
mkdir build-cloog
cd build-cloog/
../../download/cloog-0.18.3/configure --with-gmp-prefix=$PREFIX --with-isl-prefix=$PREFIX --disable-shared --enable-static --prefix=$PREFIX
make
make check
make install
上述依次安装了GMP
,MPFR
, MPC
, ISL
和CLooG
,注意上述软件的最新版本未必能够顺利运行(最高版本未必是最合适的),上例中的版本是验证可行的。
下面我们就可以安装gcc了,这儿选择了7.4.0
的软件版本。
同时去掉了--with-isl=$PREFIX
参数,因为发现带着它会出现错误,网上的一些资料也提示isl
不是必须的。
cd ../../download
wget https://ftp.gnu.org/gnu/gcc/gcc-7.4.0/gcc-7.4.0.tar.gz
tar zxvf gcc-7.4.0.tar.gz
cd gcc-7.4.0
cd ../build
mkdir build-gcc
cd build-gcc
export LD_LIBRARY_PATH=$PREFIX/lib
export C_INCLUDE_PATH=$PREFIX/include
export CPLUS_INCLUDE_PATH=$PREFIX/include
../../download/gcc-7.4.0/configure --with-gmp=$PREFIX --with-mpfr=$PREFIX --with-mpc=$PREFIX --with-cloog=$PREFIX --disable-multilib --prefix=$PREFIX --enable-languages=c,c++ --with-pic
# --with-isl=$PREFIX
make
make install
gcc的make
过程需要好长时间,其中有提示warning
的地方,但是还好没有error
。最后终于完成安装。
$gcc --version
# gcc (GCC) 7.4.0
# Copyright (C) 2017 Free Software Foundation, Inc.
# This is free software; see the source for copying conditions. There is NO
# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
在没有管理员权限的情况下,一些软件可以通过./configure --prefix=...
来将软件安装在自己的目录下。
shapeit4的安装
更新完gcc的版本,可以继续安装shapeit4了。但是安装过程中依旧出现各种编译链接问题。
比如在编译haplotype_segment_single.cpp
和haplotype_segment_double.cpp
的过程中总是提示函数重载模糊【isnan()
和isinf
】错误。通过网上检索,只能修改一下源文件,在这两个函数的前面加上std::
的标准库名得到解决。
终于把所有的源文件都编译完成了。
但是在最后连接的时候,又出现了错误,如下:
/localdisk/home/ywang120/.local/bin/htslib-1.9/libhts.a(hfile_libcurl.o): In function `easy_errno':
/localdisk/home/ywang120/.local/bin/htslib-1.9/hfile_libcurl.c:164: undefined reference to `curl_easy_getinfo'
/localdisk/home/ywang120/.local/bin/htslib-1.9/hfile_libcurl.c:178: undefined reference to `curl_easy_getinfo'
/localdisk/home/ywang120/.local/bin/htslib-1.9/libhts.a(hfile_libcurl.o): In function `wait_perform':
/localdisk/home/ywang120/.local/bin/htslib-1.9/hfile_libcurl.c:686: undefined reference to `curl_multi_fdset'
/localdisk/home/ywang120/.local/bin/htslib-1.9/hfile_libcurl.c:707: undefined reference to `curl_multi_perform'
...
本人一直误以为是libhts.a
的静态库存在问题,换了好几个版本的htslib
,依旧没有解决,甚至重装了这个库文件,还是提示错误。
不过仔细看看,好像错误的原因都指向了curl
, 应该是说没有找到它对应的库。网上说,在链接的时候,可以-lcurl
来链接到该库。
所以在链接的时候又添加了几个参数-lcurl -lssl -lcrypto
,如下:
g++ -std=c++11 ....(一大堆.o文件) -o bin/shapeit4.2 -lz -lbz2 -lm -lpthread -llzma -lcurl -lssl -lcrypto
(实际上,相当于把makefile给拆分开一步一步的编译链接)。
最后,终于在bin/
下看到了编译链接好的shapeit4.2
文件。
conda可以很好的解决一些软件的安装和依赖关系,但是并不是所有的软件安装都能够通过conda解决。
在没有管理员权限的情况下,可以尝试通过./configure --prefix=
来将软件安装在自己路径下。同时,本文也提供了没有管理员权限时gcc的安装/更新流程。
动态库、静态库、编译链接等等,让人看得云里雾里,本公众号之前有一篇很好的文章介绍了这方面的内容。了解了这些原理可以帮助我们解决软件安装过程中的问题。
编译过程、静态库和动态库
【THE END】
参考资料:https://www.cprogramming.com/tutorial/shared-libraries-linux-gcc.html
http://cazencott.info/index.php/post/2016/03/14/Local-user-installation-of-gcc