平衡点
2014/02/04
_ ax_f90_library_setup.m4 みたいなの
やりたいこと
Cray の Modules の様に、 特定のライブラリの読み込みが環境変数によって指定されている時に そのライブラリ(とFortran >=90の場合はモジュール)の「場所」と「名前」 を取得する。もしくは、指定が不要であることを確認する。
じたばた
autoconf-archives に Autoconf Archive: ax_f90_library_setup があったので、これでいけるかな、と思ったが find でライブラリを探して sed かけてフラグを指定する、 という挙動だったので、ちょっと嬉しくない (例えば /usr/local/stow/ 以下にコンパイラ毎のビルドを置いておくと、 find でみつかった順にフラグを設定する)。
結果
そもそも「環境変数で勝手にフラグが設定されている」という状況なのだから、 別に configure 走らせた結果として FCFLAGS や LDLIBS を追加する、 なんて面倒な事をする必要はないだろう、というか。
# source: m4 AC_DEFUN([DC_FORTRAN_LIBRARY_CHECK],[ AC_LANG_PUSH(Fortran) ac_cv_dcf90_library_check="" AC_MSG_CHECKING([try compile $1 test without any flags]) AC_LINK_IFELSE([ program libcheck $2 end program libcheck], [ac_cv_dcf90_library_check="yes"], [ac_cv_dcf90_library_check="no"]) ac_cv_f90lib_$1_check=$ac_cv_dcf90_library_check AC_LANG_POP(Fortran) if test x"$ac_cv_f90lib_$1_check" = x"no" ; then AC_MSG_RESULT([failed]) AC_MSG_ERROR([specify $1 library file name with --with-$1=]) else AC_MSG_RESULT([ok]) fi ])
あからさまに自由形式なので Fortran >= 90 じゃないと駄目だろう (というか, 今時 FORTRAN77 でプログラム書き始めることも無い).
configure.ac の中で
# source: autoconf DC_FORTRAN_LIBRARY_CHECK( [netcdf],[use netcdf ])
みたいにして呼び出すと,
configure 実行時に default の FC, FCFLAGS, LDFLAGS, LDLIBS と AC_LINK_IFELSE でコンパイル, リンクまでを試す. # source: f90
program libcheck use netcdf end program libcheck
- 結果は ac_cv_f90lib_\$1_check に入っている.
- とはいえ AC_MSG_ERROR でメッセージ出しているので, このマクロを呼んだ時点で「コンパイルとリンクが通らなきゃ駄目よ」みたいな必須library にしか使えない.
例: LAPACK
例えば
# source: m4 DC_FORTRAN_LIBRARY_CHECK( [lapack],[real(8) :: alu(2,2), bb(2) integer :: kp(2), icon alu(1,:) = (/1.0d0,1.0d0/) alu(2,:) = (/1.0d0,0.0d0/) bb(:) = (/2.0d0,0.0d0/) call dgetrf( 2, 2, alu, 2, kp, icon ) call dgetrs('N', 2, 1, alu, 2, kp, bb, 2, icon)])
みたいに.