Top
Photo Drawings Software Writing Reading Memo Study Profile Bookmark 
Amethyst DumLambda PetitLambda Yamanba JSharp JFlat OOPS yash KumonoIto ML Toys 

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_ITEMNAMEyesまたはnoに設定されます。

Usage

  1. sml.m4をコピーする。
  2. configure.inを更新する。
  3. 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@