2, 3 次元の偏微分方程式を解くためのプログラム FreeFEMは macOS, Linux, Windows の compile 済みバイナリが用意されていますが、 FreeBSD で使う場合は自分で compile しなければなりません。
FreeFem v4.4.2を FreeBSD で compile する場合の注意点は下記のとおりです。
ソースコード中の sh script の shebang が #!/bin/sh, #!/bin/bash, #!/usr/bin/perl, #!/bin/wget など、 FreeBSD では存在しない場所が指定されているため、 この対応が不可欠で、 しかも、Linux の /bin/sh には bash とか dash が使われているため、 一部の sh script が FreeBSD の /bin/sh では期待された動作になりません。
以下、上記の問題に対処して、作業ディレクトリ /var/local/src/ff で、 FreeFEM v4.42 を FreeBSD-12.1 で compile する方法の1例を説明します。
ソースコードは
https://github.com/FreeFem//FreeFem-sources/archive/v4.4.2.tar.gz
から入手して /var/local/src/ff に展開するか、 git (ports/devel/git) コマンドがインストールしてあれば、
git clone https://github.com/FreeFem/FreeFem-sources /var/local/src/ff
で用意します。
下記のパッチをあてます。
--- src/femlib/CheckPtr.cpp.orig 2019-12-04 12:27:35.821471000 +0900 +++ src/femlib/CheckPtr.cpp 2019-12-04 14:10:38.525992000 +0900 @@ -25,13 +25,7 @@ void* operator new (std::size_t size, const std::nothrow_t& nothrow_value) noexcept; p */ -#if __APPLE__ -#include <malloc/malloc.h> -#elif __FreeBSD__ -#include <stdlib.h> -#else -#include <malloc.h> -#endif +#include <cstdlib> static long verbosity; --- bin/script/PostInstall.m4.orig 2019-12-04 14:16:58.967627000 +0900 +++ bin/script/PostInstall.m4 2019-12-04 14:17:51.216325000 +0900 @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/bash # "-DFF__FVER=$(PACKAGE_VERSION)" # "-DFF_BINDIR=$(bindir)" # "-DFF__DATADIR=$(pkgdatadir) ---
3. libGLU の変更
#glu-9.0.1.tar.xz の用意
ports/graphics/libGLU で作成した /usr/local/lib/libGLU.so は g++ で使えません(ffglut が crush する)ので、 正常に動作する ff-glut を作るために、 gcc でコンパイルした /usr/local/lib/libGLU.so で置き換えます。
# cd /usr/ports/grahics/libGLU # make deinstall # patch <<! --- Makefile.orig 2019-10-31 10:04:58.000000000 +0900 +++ Makefile 2019-12-04 13:16:38.254399000 +0900 @@ -11,6 +11,8 @@ MAINTAINER= x11@FreeBSD.org COMMENT= OpenGL utility library +USE_GCC= 9+ + USES= gl libtool pathfix pkgconfig tar:xz xorg GNU_CONFIGURE= yes CONFIGURE_ARGS= --disable-static ! # make install cleanなお、FreeBSD の libGLU.so を利用せずに、 独自に libGLU を作ってリンクする場合は、 ff++4.42-with-libGLU.a.html を見てください。
前もって、 ports/shells/bash, ports/devel/gmake, ports/devel/cmake, ports/devel/autoconf, ports/devel/libtool, ports/devel/git, ports/ftp/wget ports/lang/gcc, ports/graphics/freeglut, ports/graphics/libGLU がインストールされていることを確認してください。
ソースの中に書かれている make を gmake にしたり、 スクリプトの先頭に書かれた '#! /bash', '#! /usr/bin/perl', '#! /usr/bin/wget' に対応するため、root 権限で一時的に Linux 環境を作ります。
# ln -s /usr/local/bin/perl /usr/bin/perl # ln -s /usr/local/bin/wget /usr/bin/wget # ln -s /usr/local/bin/bash /bin/bash # mv /usr/bin/make /usr/bin/make.bsd # ln -s /usr/local/bin/gmake /usr/bin/make
このコンパイル環境の切替えは面倒なので、 こういったスクリプトを作っておくと良いと思います。
gcc, gfortran, freeglut を使った構成 で MPI(Message Passing Interface) なしの FreeFem++ をコンパイルします。
cd /var/local/src/ff autoreconf -i 3rdparty/getall -a ./configure --enable-download -without-mpi CC=gcc CXX=g++ FC=gfortran \ CXXCPP="gfortran -E" F77=gfortran \ CFLAGS="-I/usr/local/include" \ CXXFLAGS="-I/usr/local/include" makesrc/nw に ffglut, FreeFem++, FreeFem++-nw ができていることを確認します。
ffglut は例えば savemesh(Th, "x.msh") でファイルに書き出した x.msh の内容を "ffglut < x.msh" で表示するプログラムで、 FreeFem++ が画像出力時に呼び出します。
root 権限でインストールします。
cd /var/local/src/ff make installこれで、
/usr/locl/bin/ff-get-dep,ff-pkg-download,ff-c++,ffmaster,ffmedit,ffglut, FreeFem++-nw,FreeFem++ /usr/local/lib/ff++/4.4-2/bin/*,etc/*,idp/*,lib/* /usr/local/share/FreeFEM/4.4-2/*,FreeFEM-documentation.pdfができます。
以前は library を /usr/local/lib に直接置いていましたが、 v3.61 から /usr/local/lib/ff++/version/* に分離してわかりやすくなりました。 example, document の置き場所も以前の /usr/local/share/freefem++ から /usr/local/share/FreeFEM/version/examples, /usr/local/share/FreeFEM/FreeFEM-documentation.pdf に変わっています。
動作確認は
cd /usr/local/share/FreeFEM/4.4-2/examples/misc FreeFem++ demo.edpなどを試してください。 以前のバージョンと比べて、 3d などかなり充実してきました。
FreeFEM++ の動作確認ができれば、 不要なファイルを削除します。
cd /usr/local/src/ff make clean
root 権限で一時的に変更した make や bash, perl, wget を元に戻します。
# rm /usr/bin/perl /usr/bin/wget /usr/bin/make /bin/bash # mv /usr/bin/make.bsd /usr/bin/make
平林 浩一, 2019-12-04