### Makefile - "ツインテールdeエンジェルモード!!"インタプリタ生成用メイクファイル ###
#------------------------------------------------------------------------------------------------#
# パラメーターの設定
#------------------------------------------------------------------------------------------------#
# インタプリタ本体＋各種ファイル
export EXE_ENGINE=tt
export DIR_NAME=twintail_de_angelmode
export TGZ_NAME=twintail_de_angelmode.costume

# BoehmDW-GC ガーベッジコレクタ
BDWGC_PKG = gc-8.0.6.tar.gz
BDWGC_DIR = gc-8.0.6
BDWGC_LIB = gc-8.0.6/.libs/libgc.a

# GCC コンパイラオプション
OPT_WARN = -Wall -Werror -Wno-unused-but-set-variable -Wno-maybe-uninitialized -Wno-format-security
OPT_COMP = -std=gnu9x -g -I. -I../.. -I${BDWGC_DIR}/include -I../../${BDWGC_DIR}/include
OPT_LINK = -lm -lreadline

# Flexスキャナ＋Bisonパーサー
SYN_CONF = syntax/flex.l syntax/fsup.c syntax/bison.y syntax/bsup.c
SYN_OH   = syntax/bison.tab.h
SYN_OC   = syntax/lex.yy.c syntax/bison.tab.c

# Ｃ言語ソースファイル＋仮想実行コードライブラリ
HDR_FILE = main.h admin/*.h
SRC_FILE = main.c help.c admin/*.c data/*.c exec/*.c
LIB_FILE = icode/icode.a

#------------------------------------------------------------------------------------------------#
# ソフトウェア生成ルール
#------------------------------------------------------------------------------------------------#
# インタプリタ本体
${EXE_ENGINE}: ${BDWGC_LIB} ${HDR_FILE} ${SRC_FILE} ${SYN_OH} ${SYN_OC} ${LIB_FILE} FORCE
	gcc     ${OPT_WARN} ${OPT_COMP} -o ${EXE_ENGINE} ${SRC_FILE} ${SYN_OC} ${LIB_FILE} ${BDWGC_LIB} ${OPT_LINK}

# BoehmDW-GC ガーベッジコレクタ
${BDWGC_LIB}: ${BDWGC_PKG}
#	tar zxf ${BDWGC_PKG} ; cd ${BDWGC_DIR} ; ./configure --disable-threads --disable-shared ; make ; make check
	tar zxf ${BDWGC_PKG} ; cd ${BDWGC_DIR} ; ./configure --disable-threads --disable-shared --enable-static ; make

# Flexスキャナ＋Bisonパーサー
${SYN_OH} ${SYN_OC}: ${HDR_FILE} ${SYN_CONF}
	cd syntax ; flex -8 -I flex.l               # -8(BitScan) -I(Interact) /*-i(IgnoreCase)*/
	cd syntax ; bison -d -v bison.y             # -d(MakeHeader) /*-y(PosixYacc)*/ -v(Verbose)

# 仮想実行コードライブラリ
${LIB_FILE}: ${HDR_FILE} icode/*/*.c
	rm -rf ${LIB_FILE}
	for d in icode/* ; \
	do \
		( echo [COMP] DIR = $${d} ; cd $${d} ; gcc -c ${OPT_WARN} ${OPT_COMP} *.c ) || exit 1 ; \
	done
	ar -rs ${LIB_FILE} icode/*/*.o      # -r(File.Append|Replace) -s(Symbol.Generate|Update)

# 強制実行用ダミーターゲット
FORCE:

#------------------------------------------------------------------------------------------------#
# ソフトウェア管理ルール
#------------------------------------------------------------------------------------------------#
# リリースパッケージの生成＆インストール
r: release
release:
	make clean4r ; make ${EXE_ENGINE}
	cp -f ${EXE_ENGINE} /usr/local/bin/${EXE_ENGINE} ; make trytest
	make clean4r ; make tgzfile

# スナップショット版の生成＆インストール
s: snapshot
snapshot:
	make clean4s ; make ${EXE_ENGINE}
	cp -f ${EXE_ENGINE} /usr/local/bin/${EXE_ENGINE} ; make trytest
	make clean4s ;

# 生成ファイルの整理
c: clean4r
clean: clean4r
clean4r:
#	rm -rf ${EXE_ENGINE} ${BDWGC_DIR} ${SYN_OH} ${SYN_OC} ${LIB_FILE} GTAGS GRTAGS GPATH
	rm -rf               ${BDWGC_DIR} ${SYN_OH} ${SYN_OC} ${LIB_FILE} GTAGS GRTAGS GPATH
	rm -rf *.o */*.o */*/*.o a.out syntax/*.output tc ti ta to tr test/try.* test/tc test/ti test/ta test/to test/tr
clean4s:
	rm -rf                            ${SYN_OH} ${SYN_OC} ${LIB_FILE} GTAGS GRTAGS GPATH
	rm -rf *.o */*.o */*/*.o a.out syntax/*.output tc ti ta to tr test/try.* test/tc test/ti test/ta test/to test/tr
	make gtags

# GLOBAL タグファイルの作成
g: gtags
gtags:
	find . -type f -name '*.[hcly]' | egrep -v 'bison.tab.[ch]|lex.yy.c' | gtags -f -

# ソースアーカイブの作成
f: tgzfile
tgzfile:
	CosNmb=`grep TTdeAM_VER main.h | awk '{print substr($$3,2,3)}'` ; cd .. ; \
	tar zcf $${TGZ_NAME}$${CosNmb}.tgz $${DIR_NAME}

# インタプリタの検査
t: trytest
trytest:
	@echo "++++++++++ TryTest(1/2) 開始!! ++++++++++"
	ln -fs test/InitTest.code tc    # テスト対象コードへのリンク設定(デバッグ追跡用)
	ln -fs test/InitTest.answ ta    # 正  常出力データへのリンク設定(デバッグ追跡用)
	${EXE_ENGINE} -x tc >to 2>&1
	diff ta to && rm -rf tc ta to
	@echo "++++++++++ TryTest(2/2) 開始!! ++++++++++"
	ln -fs test/tc tc               # テスト対象コードへのリンク設定(デバッグ追跡用)
	ln -fs test/ti ti               # テスト入力データへのリンク設定(デバッグ追跡用)
	ln -fs test/ta ta               # 正  常出力データへのリンク設定(デバッグ追跡用)
	ln -fs test/to to               # 実  行出力データへのリンク設定(デバッグ追跡用)
	cd test ; \
	for rule in */*.t ; do \
		ln -fs test/$${rule} ../tr ; \
		echo "Testing => test/$${rule}" ; \
		try $${rule} || exit 1 ; \
	done
	rm -rf tc ti ta to tr       # リンク設定の解除(正常終了)
	@echo "++++++++++  !!! 正常終了 !!!  ++++++++++"
