FreeBSD-12.1 で FreeFEM v4.42 をコンパイルする方法

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 では期待された動作になりません。 さらに、Makefile の中で記述された make がが gmake でないと動かない Makefile を処理しなければならないといったものもあります。

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

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

で用意します。

github から取得した archive は FreeFem-sources-4.4.2 ディレクトリが 第一階層になっていますから、ff ディレクトリ下に展開する場合は

  cd ff
  tar zxvf v4.4.2.tar.gz --strip-components 1
などを使います。

2. パッチ

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

--- bin/script/PostInstall.m4.orig	2019-12-06 14:30:17.545521000 +0900
+++ bin/script/PostInstall.m4	2019-12-06 14:34:57.074724000 +0900
@@ -3,14 +3,18 @@
 # "-DFF_BINDIR=$(bindir)" 
 # "-DFF__DATADIR=$(pkgdatadir)
 #  "FFBIN="@prefix@"/bin
-ff_desktop="$HOME/Desktop/FreeFem++-""FF__FVER"
-mkdir -p -m 0755 /etc/paths.d
-ln -sf "FF__DATADIR"/"freefem++doc.pdf" "$HOME/Desktop"
-test -e "$ff_desktop" || ln -sf "FF__DATADIR"/"FF__FVER" "$ff_desktop"
-echo Install /etc/paths.d/FreeFem++ file:  "FF_BINDIR"
 
-echo "FF_BINDIR" > /etc/paths.d/FreeFem++
-chmod a+r /etc/paths.d/FreeFem++
+if [ "$(uname)" = "Darwin" ]; then
+  ff_desktop="$HOME/Desktop/FreeFem++-""FF__FVER"
+  mkdir -p -m 0755 /etc/paths.d
+  ln -sf "FF__DATADIR"/"freefem++doc.pdf" "$HOME/Desktop"
+  test -e "$ff_desktop" || ln -sf "FF__DATADIR"/"FF__FVER" "$ff_desktop"
+  echo Install /etc/paths.d/FreeFem++ file:  "FF_BINDIR"
+
+  echo "FF_BINDIR" > /etc/paths.d/FreeFem++
+  chmod a+r /etc/paths.d/FreeFem++
+fi
+
 echo " Try to Clean old file version "
 if [ -d  /usr/local/bin ] ; then  
   cd /usr/local/bin
@@ -23,9 +27,10 @@
       fi
   done
 
-
-echo ln -s FF_BINDIR/FreeFem++-CoCoa  /usr/local/bin/ 
-ln -s FF_BINDIR/FreeFem++-CoCoa  /usr/local/bin/ 
+  if [ "$(uname)" = "Darwin" ]; then
+    echo ln -s FF_BINDIR/FreeFem++-CoCoa  /usr/local/bin/ 
+    ln -s FF_BINDIR/FreeFem++-CoCoa  /usr/local/bin/ 
+  fi
 
 fi
 # bluid new link to new 
--- 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;
 
--- Makefile.am.orig	2019-12-05 13:03:35.789753000 +0900
+++ Makefile.am	2019-12-05 13:04:17.552930000 +0900
@@ -279,7 +279,7 @@
 	 if [ -f $$i ] ; then 	$(INSTALL)  -m 555 $$i $(DESTDIR)$(ff_prefix_dir)/idp; fi; done
 
 bin/script/PostInstall.sh:./Makefile bin/script/PostInstall.m4
-	m4 bin/script/PostInstall.m4 "-DFF__FVER=$(PACKAGE_VERSION)" "-DFF_BINDIR=$(bindir)" "-DFF__DATADIR=$(pkgdatadir)" > bin/script/PostInstall.sh
+	m4 "-DFF__FVER=$(PACKAGE_VERSION)" "-DFF_BINDIR=$(bindir)" "-DFF__DATADIR=$(pkgdatadir)" bin/script/PostInstall.m4 > bin/script/PostInstall.sh
 	chmod a+x bin/script/PostInstall.sh
 
 FreeFEM-documentation.pdf:Makefile

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 /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" \
	LDFLAGS="-lc++"
  make
LDFLAGS="-lc++" は FreeBSD-11 以降の gcc の初期化に於ける clang との矛盾対策 ですが、port/graphics/libGLU を gcc でコンパイルしておけば不要になります。 この方法を使う場合は こちらを見てください。

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

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

3.4. FreeFEM v4.42 のインストール

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 などかなり充実してきました。

3.4. 不要ファイルの削除

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

  cd /usr/local/src/ff
  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