DCLライブラリ f2c 化の手順


1. DCLライブラリソースの f2c 化

2. デモプログラムの f2c 化

 

1. DCLライブラリソースの f2c 化

1) インターネットからダウンロードした最新 DCL の Fortran77 のソースファイルを展開する。 (例:ソースファイル名がdcl-5.1.tar.gz, 作業フォルダが /job の場合)

% cd /job
% gunzip dcl-5.1.tar.gz
% tar xvf dcl-5.1.tar
% cd dcl-5.1
または、
% zcat dcl-5.1.tar.gz | tar xvf -
% cd dcl-5.1

2) f2c 化用に作成したシェルスクリプト curf2c と changeAllMake 及びプログラムの フォルダを環境変数$PATHの検索範囲内に置く。

curf2c: f2c を用いて、Fortran77 ソースファイルをC言語に変更するシェルスクリプト
changeAllMake: Fortran77 用 Makefile をC言語用に変更するシェルスクリプト

3) f2c で変換する際にエラーになるのを避けるため、./src/math1/syslib 下のファイル glcqnp.g , gliqnp.g 及びglrqnp.g の中にある @REPSL, @INTMAX, @REALMAX, @REALMIN 及び @DS_PATH を数字または文字に変更する。

4) ./src/math1/syslib/Makefileを次のように修正する

line 38:@sed -e "s!@DS_PATH!\'$(DBASEDIR)/\'!" \
---> @sed -e "s!@DS_PATH!$(DBASEDIR)/!" \

5) f2c ツールを利用して、Fortran77 ソースファイルをC言語に変更する。この際、2)のスクリプトファイル curf2c を用いる。

% curf2c ./src

6) すべてのMakefileを修正する。この時、2)のスクリプトファイル changeAllMake を用いる。

% changeAllMake ./src

7) 3)で変更した @REPSL、@INTMAX、@REALMAX と @REALMIN、@DS_PATHを元に戻す。

8) ./configure を修正する。

line 2584に追加:

s%@IF_ONEXIT@%$IF_ONEXIT%g

line 2417以降に以下の内容を追加:

cat << EOF > conftest.c
#include <stdlib.h>
#include <stdio.h>
int fn1(void);
void main( void )
{
atexit( fn1 );
}
int fn1()
{
return 0;
}
EOF
doit='$CC -o conftest ${CFLAGS-} conftest.c'
if { (eval echo configure:2403: \"$doit\") 1>&5; (eval $doit) 2>&5; }; then
IF_ONEXIT="onexit=on_exit"
echo "Checking atexit OK" 1>&6
else
IF_ONEXIT="NO_ONEXIT"
echo "There is no atexit" 1>&6
fi
rm -f conftest conftest.? confval?

line 2321からline 2329を変更:

#ifdef QUOTE
fprintf(fd1, "Z'%08X'\n", fmin.ui);
fprintf(fd2, "Z'%08X'\n", fmax.ui);
fprintf(fd4, "Z'%08X'\n", imax.ui);
#else
fprintf(fd1, "Z%08X\n", fmin.ui);
fprintf(fd2, "Z%08X\n", fmax.ui);
fprintf(fd4, "Z%08X\n", imax.ui);
#endif
----->
/*
#ifdef QUOTE
fprintf(fd1, "Z'%08X'\n", fmin.ui);
fprintf(fd2, "Z'%08X'\n", fmax.ui);
fprintf(fd4, "Z'%08X'\n", imax.ui);
#else
fprintf(fd1, "Z%08X\n", fmin.ui);
fprintf(fd2, "Z%08X\n", fmax.ui);
fprintf(fd4, "Z%08X\n", imax.ui);
#endif
*/
fprintf(fd1, "0x%08X\n", fmin.ui);
fprintf(fd2, "0x%08X\n", fmax.ui);
fprintf(fd4, "0x%08X\n", imax.ui);

※修正した./configure を示す

9) ./Makefile を修正する。

line 38以降に以下の内容を追加:

demos:
@echo "making the demo programs"
@for i in $(DIRDEMO) ; do \
cd $$i ; \
echo "Making $$i/" ; \
$(MAKE) ; \
cd .. ; \
done

line 7からline 11を変更:

DIRSALL = src bin
DIRSINST = src bin
DIRSPACK = src demo
DIRSCLN = src demo
DIRSCLNA = src demo bin doc etc lib ps sys dvlop
----->
DIRSALL = f2csrc src bin
DIRSINST = f2csrc src bin
DIRSPACK = f2csrc src demo
DIRSCLN = f2csrc src demo
DIRSCLNA = f2csrc src demo bin lib sys
DIRDEMO = demo

※修正した./Makefile を示す。

10) ./Mkinclude.in を修正する。

line 63を変更:

LDLIBS = @FLIBS@ $(DCLLIBOPT) @X_EXTRA_LIBS@ $(XLIBOPT) $(MATHLIBOPT)
----->
LDLIBS = @FLIBS@ $(DCLLIBOPT) $(F2CLIBOPT) @X_EXTRA_LIBS@ $(XLIBOPT) $(MATHLIBOPT)

line 62を変更:

LDFLAGS = $(DCLLIBPATH) $(XLIBPATH)
----->
LDFLAGS = $(DCLLIBPATH) $(XLIBPATH) $(F2CLIBPATH)

line 58を変更:

CFLAGS = @CFLAGS@ $(XINCPATH)
----->
CFLAGS = @CFLAGS@ $(XINCPATH) $(F2CINCPATH)

line 50以降に以下の内容を追加:

F2CINCPATH = -I$(DCLDIR)/f2clib
F2CLIBPATH = -L$(DCLDIR)/f2clib
F2CLIBOPT = -lf2c4dcl
LIBF2C = $(DCLDIR)/f2clib/libf2c4dcl.a

line 23からline 25を変更:

BINDIR = $(prefix)/bin
LIBDIR = $(prefix)/lib
DCLDIR = @DCLDIR@
----->
DCLDIR = @DCLDIR@
BINDIR = $(DCLDIR)/bin
LIBDIR = $(DCLDIR)/lib

line 9以降に以下の内容を追加:

.c :
$(CC) $(CFLAGS) -o $@ $< $(LDFLAGS) $(LDLIBS)

ファイルの最後に以下のラインを追加:

#selection of function atexit()
IF_ONEXIT = @IF_ONEXIT@

※修正した./Mkinclude.in を示す。

11)configureを行う。

% configure

12)f2clib と f2csrc の二つのフォルダを作り、DCL用に別途作成したf2c ライブラリのソースファイルを f2csrc のフォルダにコピーし、ヘッダファイル f2c.h を f2clib にコピーする。

13)makeを行う。

% make

14)インストールを行う。

% make install

2. デモプログラムの f2c 化

1) Fortranのソースファイルを f2c を用いてC言語化を行う。

% curf2c ./demo

2) FortranのMakefileをC言語用に変更する。

% changeAllMake ./demo

3) 以下の f2c 化したソースを修正する:

demo/math1/vialib/vial01.c の line 27: int ifna_();----->long ifna_();
demo/math1/viblib/vibl01.c の line 26: int ifnb_();----->long ifnb_();
demo/math1/vralib/vral01.cのline 28: int rfna_(real *r__)-----> doublereal rfna_(real *r__)
demo/math1/vrblib/vrbl01.cのline 26: int rfnb_(real *r__)-----> doublereal rfnb_(real *r__)

4) makeを行う:

% make demos

戻る


Copyright (C) by GFD-Dennou Club, 1999-2000. All rights reserved.