平衡点


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 走らせた結果として FCFLAGSLDLIBS を追加する、 なんて面倒な事をする必要はないだろう、というか。

# 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, LDLIBSAC_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)])

みたいに.


連絡先など
最近の日記
一覧
2006|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|02|03|04|08|09|10|11|12|
2013|01|02|03|04|05|06|08|09|10|11|12|
2014|01|02|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|09|10|
2016|02|03|
2017|01|02|03|05|06|07|09|11|12|
2018|03|06|07|10|11|12|
2019|01|02|03|04|05|07|10|12|
2020|01|02|03|04|05|08|09|10|11|12|
2021|01|02|03|05|06|07|08|09|11|12|
2022|01|02|03|04|05|06|08|10|11|12|
2023|02|03|04|06|08|09|11|12|
2024|01|02|03|
Back to Top ▲