sml.m4
autoconf macro for SMLNJ
Link
SMLNJで記述したプログラムをautoconf,automakeで扱う際の問題について
こちらで説明しています。
Source
sml.m4
Macros
SML_PROG_SML
- 構文
-
SML_PROG_SML
smlコマンドを探し、その名前を変数smlに設定します。
SML_PROG_SMLCM
- 構文
-
SML_PROG_SMLCM
structure CMをもつsmlコマンドを探し、その名前を変数smlcmに設定します。
SML_CHECK_HEAPIMAGESUFFIX
- 構文
-
SML_CHECK_HEAPIMAGESUFFIX
SMLofNJ.exportFnにより生成されるヒープイメージファイルの拡張
子を判定し、変数smlheapimagesuffixに設定します。
SML_CMITEM_CHECK
- 構文
-
SML_CMITEM_CHECK(ITEMNAME, [ACTION-IF-FOUND],
[ACTION-IF-NOTFOUND])
引数で指定された *.{cm,sml,sig}ファイルがCMに認識されるか確認します。
現在のCMでは、structureが定義されているかどうかによって条件コンパイル
が可能ですが、
ファイルが存在するかどうかによって条件コンパイルすることはできません。
たとえばSockUtilを使うためには、古いバージョンでは
unix-lib.cmをsources.cm中に加える必要がありますが、
最近ではunix-lib.cmではなく、inet-lib.cmをsources.cmに
加える必要があります。
このような問題に対処するためのマクロです。
引数のファイルがCMにより正しくコンパイルできた場合は第二引数が評価され
ます。
コンパイルできなかった場合は第三引数が評価されます。
同時に、変数sml_cv_have_cmfile_ITEMNAMEが
yesまたはnoに設定されます。
Usage
- sml.m4をコピーする。
- configure.inを更新する。
- aclocal.m4を更新する。
aclocal -I .
Example
hoge.sml 中でINetSock,SocketUtilを使うと仮定する。
sources.cmのもととなるsources.cm.inで、つぎのようにinet-lib.cmおよび
unix-lib.cmが存在すればそれらがプロジェクトに含まれるようにする。
| souces.cm.in |
Group is
#if @sml_have_inet_lib_cm@ == 1
inet-lib.cm
#endif
#if @sml_have_unix_lib_cm@ == 1
unix-lib.cm
#endif
hoge.sml
|
configure.inで、まずsmlに関する一般的なチェックをおこない、
そのあとで、プロジェクト固有のチェックをおこなう。
| configure.in |
:
SML_PROG_SML
SML_PROG_SMLCM
SML_CHECK_HEAPIMAGESUFFIX
SML_CMITEM_CHECK(inet-lib.cm, sml_have_inet_lib_cm=1, sml_have_inet_lib_cm=0)
SML_CMITEM_CHECK(unix-lib.cm, sml_have_unix_lib_cm=1, sml_have_unix_lib_cm=0)
AC_SUBST(sml_have_inet_lib_cm)
AC_SUBST(sml_have_unix_lib_cm)
:
AC_OUTPUT(sources.cm ...)
|
cofigureによって得られた結果を用いてプロジェクトをコンパイルするように、
Makefile.amを記述する。
この記述内容についてはこちらで説明
している。
| Makefile.am |
sml_sources = hoge.sml
EXTRA_DIST = $(sml_sources) sources.cm.in
bin_SCRIPTS = hoge@script_suffix@
pkgdata_DATA = hoge.@smlheapimagesuffix@
hoge@script_suffix@ :
case @host@ in \
i*86-*-cygwin*) heapwinpath=`cygpath -w $(datadir)/$(PACKAGE)/hoge.@smlheapimagesuffix@ | sed 's;\\\\;\\\\\\\\;g'` ;\
cat `which @sml@` | sed "s;@SMLload=[^ ]*;@SMLload=$$heapwinpath;g" > hoge@script_suffix@ ;; \
*) echo "@sml@ @SMLload=$(datadir)/$(PACKAGE)/hoge.@smlheapimagesuffix@ \$$*" > hoge@script_suffix@ ;; \
esac
hoge.@smlheapimagesuffix@: $(sml_sources)
echo 'CM.make();SMLofNJ.exportFn ("hoge",Hoge.main);' | @smlcm@
|
|