FreeBSD-11.2 で freefem++-3.61-1 コンパイルする方法

2, 3 次元の偏微分方程式を解くためのプログラム FreeFEMは macOS, Linux, Windows の compile 済みバイナリが用意されていますが、 FreeBSD で使う場合は自分で compile しなければなりません。

http://www3.freefem.org/ff++/ftp/freefem++-3.61-1.tar.gzを 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 では期待された動作になりません。 さらに、Makefile の中で記述された make がが gmake でないと動かない Makefile を処理しなければならないといったものもあります。

以下、上記の問題に対処して、作業ディレクトリ /var/local/src/freefem++-3.61-1 で、 freefem++-3.61-1 を FreeBSD-11.2 で compile する方法の1例を説明します。

1. ソースコードの入手

ソースコードは http://www3.freefem.org/ff++/ftp/freefem++-3.61-1.tar.gzを から入手して /var/local/src/freefem++-3.61-1 に展開します。

2. パッチ

下記のパッチをあてます。

--- src/femlib/CheckPtr.cpp.orig	2018-03-28 16:02:20.000000000 +0900
+++ src/femlib/CheckPtr.cpp	2018-08-23 11:24:23.692449000 +0900
@@ -27,6 +27,8 @@
  */
 #if __APPLE__
 #include <malloc/malloc.h>
+#elif __FreeBSD__
+#include <stdlib.h>
 #else
 #include <malloc.h>
 #endif
--- src/medit/Makefile.am.orig	2018-06-20 21:46:49.000000000 +0900
+++ src/medit/Makefile.am	2018-08-23 11:27:40.013358000 +0900
@@ -25,7 +25,7 @@
 
 ffmedit_DEPENDENCIES=picking.$(OBJEXT)
 picking.$(OBJEXT):picking.c
-	${CC} -c $< $(CNOFLAGS) -o $@ 
+	${CC} -c $< $(CNOFLAGS) $(CFLAGS) -o $@ 
 
 #pinking.no-optffmedit$(EXEEXT):picking.c
 #	rm picking.$(OBJEXT)
--- download/blas/Makefile.am.orig	2018-03-28 16:02:20.000000000 +0900
+++ download/blas/Makefile.am	2018-08-23 18:05:26.714008000 +0900
@@ -109,7 +109,7 @@
 
 BLAS/fait:$(BLAS_TGZ)
 	mkdir -p ../include ../lib
-	pxerbla=`tar tf $(BLAS_TGZ) | grep xerbla.f`; \
+	pxerbla=`tar tf $(BLAS_TGZ) | grep _xerbla.f`; \
 	dirblas=`dirname $$pxerbla` ;\
 	case $$dirblas in \
 	BLAS) tar xvzf $(BLAS_TGZ) ;; \

3. コンパイル

前もって、 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 がインストールされていることを確認してください。

3.1. Linux 環境の作成

ソースの中に書かれている 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

このコンパイル環境の切替えは面倒なので、 こういったスクリプトを作っておくと良いと思います。

3.2. FreeFEM v4.42 のコンパイル

gcc, gfortran, freeglut を使った構成 で MPI(Message Passing Interface) なしの FreeFem++ をコンパイルします。

  cd freefem++-3.61-1
  ./configure --enable-download -without-mpi -with-glut="-lglut -lGLU -lGL" \
   CC=gcc CXX=g++ FC=gfortran F77=gfortran \
   CXXCPP="gfortran -E" \
   CFLAGS="-I/usr/local/include" \
   CXXFLAGS="-I/usr/local/include" \
   LDFLAGS="-lc++"
LDFLAGS="-lc++" は FreeBSD-11 以降の gcc の初期化に於ける clang との矛盾対策 こちらを見てください。

この後、FreeFem++ が利用する 3rd-party のプログラムを download します。 cd freefem++-3.61-1 download/getall を実行し、著作権を確認する質問のすべてに y で答えると、 3rd-party のソースコードを download が始まります。

すべての download か終わったら

  cd freefem++-3.61-1
  make
を実行します。

最後に、src/nw に ffglut, FreeFem++, FreeFem++-nw ができていることを確認します。

ffglut は例えば savemesh(Th, "x.msh") でファイルに書き出した x.msh の内容を "ffglut < x.msh" で表示するプログラムで、 FreeFem++ が画像出力時に呼び出します。

3.4. freefem++-3.61-1 のインストール

root 権限でインストールします。

  cd /var/local/src/freefem++-3.61-1
  # make install
これで、
  /usr/locl/bin/ff-get-dep,ff-pkg-download,ff-c++,ffmaster,ffmedit,ffglut,
	FreeFem++-nw,FreeFem++
  /usr/local/lib/ff++/3.61-1/bin/*,etc/*,idp/*,lib/*
  /usr/local/share/freefem++/3.61-1/*
ができます。

以前は library を /usr/local/lib に直接置いていましたが、 v3.61 から /usr/local/lib/ff++/version/* に分離してわかりやすくなりました。

動作確認は

  cd /usr/local/share/freefem++/3.61-1/examples++
  FreeFem++ demo.edp
などを試してください。 以前のバージョンと比べて、 3d などかなり充実してきました。

3.4. 不要ファイルの削除

FreeFEM++ の動作確認ができれば、 不要なファイルを削除します。

  cd /usr/local/src/freefem++-3.61-1
  make clean

3.5. FreeBSD 環境に戻す

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

4. ports 化の難しさ

上記の方法を含めて、FreeBSD の ports を作れると良いのですが、 --enambe-douwload を指定しないと、インストールできないものが出ますし、 指定すると、ports の patch stage 以前に一部の patch が必要で、 おまけに、あちこちの Makefile 中で make が出てきて、 それが gmake をあてにしていて、 bash, oerl, wget などの shebang 対策が、 複数の stage で必要になるといった Linux 環境とに違いを吸収するのがたいへんで、 途中までやって疲れて中断になってしまいました。 どなたか、やっていただけると嬉しいです。

平林 浩一, 2019-12-04