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

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

FreeFem v4.4.2を FreeBSD で compile する場合の注意点は下記のとおりです。

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

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

で用意します。

2. パッチ

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

--- 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 
-#elif __FreeBSD__
-#include 
-#else
-#include 
-#endif
+#include 
 
 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. glu-9.0.1.tar.xz の用意

正常に動作する ff-glut を作るために、Mesa OpenGL Utility library (libGLU) を取得して、 (lib/)libGLU.a を作っておきます。

  cd /var/local/src/ff
  fetch ftp.freedesktop.org/pub/mesa/glu/glu-9.0.1.tar.xz
  tar zxvf glu-9.0.1.tar.xz
  cd glu-9.0.1
  ./configure CC=gcc CXX=g++ PREFIX=`pwd`
  make prefix=`pwd` install

4. コンパイル

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

4.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 /usr/bin/bash
  # mv /usr/bin/make /usr/bin/make.bsd
  # ln -s /usr/local/bin/gmake /usr/bin/make

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

4.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 -with-glut="-lglut -lGLU -lGL" \
	CFLAGS="-I/usr/local/include -Wno-comment" \
	CXXFLAGS="-I/usr/local/include"
  make
src/nw に ffglut, FreeFem++, FreeFem++-nw ができていることを確認します。

4.3. src/nw/ffglut の変更

上記でできた ffglut は起動すると crush するめ、 FreeFem++ で描画ができません。 原因は FreeBSD の ports/graphics/libGLU にありますので、 とりあえず、3. glu-9.0.1.tar.xz の用意で作っておいた libGLU.a を static link した ffglut で置き換えます。

  cd /var/local/src/ff/src/nw
  GLU=../../glu-9.0.1/lib
  g++  -I/usr/local/include -DNDEBUG -O3 -std=c++11 -DBAMG_LONG_LONG \
	-DNCHECKPTR -fPIC  -rdynamic -o ffglut ../femlib/Drawing.o \
	../femlib/fem.o ../fflib/ffapi.o ../femlib/FQuadTree.o \
	../femlib/GQuadTree.o ../femlib/Mesh1dn.o ../femlib/Mesh2dn.o \
	../femlib/Mesh3dn.o ../femlib/MeshSn.o ../femlib/mshptg.o \
	../Graphics/ffglut.o ../Graphics/ffthreads.o ../Graphics/gggg.o \
	../libMesh/libMesh.a -lglut $GLU/libGLU.a -lGL -lpthread -ldl -lm \
	-lrt -lgfortran \ -L/usr/local/lib -L/usr/local/lib -L/usr/local/lib \
	-lm -ldl -lz -lsz  -lhdf5 -lhdf5_hl
ffglut は例えば savemesh(Th, "x.msh") でファイルに書き出した x.msh の内容を "ffglut < x.msh" で表示するプログラムで、 FreeFem++ が画像出力時に呼び出します。

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

4.4. 不要ファイルの削除

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

  cd /usr/local/src/ff
  make clean
  cd glu-9.0.1
  make clean

4.5. FreeBSD 環境に戻す

root 権限で一時的に変更した make や bash, perl, wget を元に戻します。

  # rm /usr/bin/perl /usr/bin/wget /usr/bin/bash /usr/bin/make
  # mv /usr/bin/make.bsd /usr/bin/make

平林 浩一, 2019-12-02