转载请注明:来源于http://my.oschina.net/snnugiser/blog/354991
去年心血来潮,把GAMIT在Windows 下编译安装了一下,当时主要是在Cygwin环境下编译,装好了之后顿时觉得自己逼格高了不少。昨天突然想把Bernese装在linux上,但是手上只有bernese 的 windows版本。
但是bernese毕竟是有源码的,本着事在人为的想法,老衲横下一条心觉得把Bernese的windows版本装在Linux,大不了自己写makefile嘛
主要参考的资料有
1. Installing BERNESE 5.0 on Mac OS X
http://www.ecgs.lu/gilles/blog/installing-bernese-5-0-on-mac-os-x-10-6/
2. bernese compile list
http://www.bernese.unibe.ch/support/cmp_all_list.php
下面开始动手,首先是准备工作
首先是准备安装的文件。把bernese 安装在windows上,完全安装是4个文件夹
四个文件夹包括 BERN52,GPSDATA,GPSTEMP,GPSUSER52
把其中的BERN52 文件夹全部拷贝到linux上,比如~/BERN52. 其他的文件夹后面可以生成。
检查perl是否安装。若没有安装先安装
$ perl --version #if error run next line $ sudo zypper in perl #if rhel use yum or debian use apt-get
3. 检查qt3是否安装,若没有安装先安装
$ find / -name qt3 # if find qt3 and the path is /usr/lib/qt3 run next line $ /usr/lib/qt3/bin/qmake --version #if the version is not 3.x you should install qt3-devel
4. 修改环境变量文件。这一步是用第 Installing BERNESE 5.0 on Mac OS X 的LOADGPS.setvar
注意,要把其中的环境变量改成自己的,比如
export OS="UNIX" export OS_NAME="LINUX" export F_VER="GNU" #if you use gfortran compile export QTBERN="/usr/lib/qt3"
老衲已经把一份修改过的LOADGPS.setvar 文件放在了github上 https://gist.github.com/859a1edd3009280d5a91.git
要把这个文件放在 BERN52/GPS/EXE/ 文件夹下。
5. 修改 BERN52/MENU/menu.pro 文件,把其中一行注释掉,其实是 想在编译的时候加上-lz选项
QMAKE_LIBS += -lz -lQtNetwork
Installing BERNESE 5.0 on Mac OS X 提到将 BERN52/MENU/Makefile 中的一行加上 -lz 选项
LIBS = $(SUBLIBS) -L/opt/local/lib -L$(QTDIR)/lib -L/opt/local/lib -lICE -lSM -ldl -lqt-mt -lXext -lX11 -lm -lz
老衲这样试过,发现Makefile是利用qmake生成的,就算该了这一行,qmake一运行又把这个文件覆盖掉了,索性改qmake的pro文件。加上-lz选项的原因是编译的时候出现uncompress的错误提示,具体原因还不得而知。
6. 编辑BERN52/GPS/EXE/configure.pm文件,将933-937行注释掉
# my $cashFile = "$ENV{QTDIR}/.qmake.cache"; # if (! -f $cashFile) { # die "File $cashFile not found\n". # "Please make sure that the QT library has been installed correctly.\n"; # }
Then edit line 956 to read like from:
system("$qmake -cache $cashFile menu.pro");
to:
system("$qmake menu.pro");
7. 把下面的片段加入BERN52/EXE/Makefile.template文件最前面。这一段是设置编译器和编译选项,来自http://www.bernese.unibe.ch/support/cmp_linux_gnu.php
# GNU Fortran (external preprocessor) # ----------- ifeq ($(F_VERS),GNU) CPP = cpp -traditional-cpp CPPDEFS = -DOS_UNIX -DCMP_GNU -DEPH_$(JPLEPH) -DGRP_$(CGROUP) FPPDEFS = F77 = gfortran FC = gfortran LD = gfortran FCVERS = --version | head -n2 ifeq ($(F_DEBUG),YES) FFLAGS = -c -g -Wall -Wextra -fbacktrace -fbounds-check \ -I. -I$(C)/LIB/OBJ_$(F_VERS)c -I$(I) $(FC_OPTIONS) -fno-automatic FCFLAGS = -c -g -Wall -Wextra -fbacktrace -fbounds-check \ -I. -I$(C)/LIB/OBJ_$(F_VERS)c -I$(I) $(FC_OPTIONS) else FFLAGS = -c -O -Wall -fbacktrace \ -I. -I$(C)/LIB/OBJ_$(F_VERS) -I$(I) $(FC_OPTIONS) -fno-automatic FCFLAGS = -c -O -Wall -fbacktrace \ -I. -I$(C)/LIB/OBJ_$(F_VERS) -I$(I) $(FC_OPTIONS) endif LDFLAGS = endif
8. 修改configure.pm文件 ,将下面几行注释掉
# Not very nice, but it works as /bin/sh in any case... # system("echo \"$$self{C}/GPS/EXE/makemake.pl -r $$self{C} >$complinkLog 2>&1\"|sh"); # system("echo \"$$self{C}/GPS/EXE/CBERN COMPLINK >>$complinkLog 2>&1\"|sh"); # } # else {
这几行是判断如果不是windows平台,就执行这两行,但是我在opensuse下执行,发现这第二行是无法正确解析的,索性注释掉,系统调用外部命令执行。可能对于其他版本的linux,可以不用注释
system("perl $$self{C}/GPS/EXE/makemake.pl -r $$self{C} >$complinkLog 2>&1"); print "start cbern complink\n"; system("perl $$self{C}/GPS/EXE/cbern.pl COMPLINK >>$complinkLog 2>&1");
9. 从这个网址下载三个文件到 BERN52/GPS/DOC/文件夹下
http://www.bernese.unibe.ch/download/
分别是 DATAPOOL.tgz ,CAMPAIGN52.tgz , SAVEDISK.tgz (由于需要解压,机器上应有tar 和 gzip 工具)
准备好之后可以安装了
$ perl configure.pm --init
依次选择1, 2, 3, 4, 5,分别是设置环境变量、添加用户、编译菜单、编译主程序,安装campaigns
最后是设置环境变量,在.bashrc文件中添加两行
source $X/EXE/LOADGPS.setvar alias bern52='$C/MENU/menu $X/PAN/MENU.INP'
重新读取.bashrc后,输入bern52 即可出现BERNESE的主界面。
$ source .bashrc $ bern52&
注意:由于用的bernese是windows版本,因此文本文件行尾是\r\n,而unix/linux默认是\n,所以在编译过错中可能会出错。解决办法是用dos2unix,下面是一个很好的解决办法
find ./ -name *.f*|xargs dos2unix
-----------------------------------------
bernese 的BPE是 $C/BPE/RUNBPE.pm 实现的,其中调用了menu.sh这个文件,然而老衲并没有发现这个文件,于是新建一个menu.sh的文件,内容如下
#!/bin/sh menu $1 $2 $3 $4
实际上是调用sh把参数传给了menu程序.
或者将RUNBPM.pm中的menu.sh改为menu
$irc = system("$xq/menu", "$menuOption", "$menuTodo"); #zhliang changed menu.sh to menu