# 現在の日時
DATE = $(shell date +"%F %T")
-# 現在のディレクトリー
-CURRDIR = $(shell pwd)
-
# Makefile
MAKEFILE := Makefile
# コマンド
######################################################################
-MV ?= mv
-
-CP ?= cp
-
-CAT ?= cat
-
-MKDIR ?= mkdir -p
-
-RM ?= rm -f
-
-ECHO ?= echo
-
-TIME ?= time
-
-DIFF ?= diff -c
-
-DEV_NULL ?= /dev/null
-
-CHMOD ?= chmod
-
-GREP ?= grep
-
-LINECOUNT ?= wc -l
-
-FIND ?= find
-
-TR ?= tr
-
-EXPR ?= expr
-
-LN ?= ln -s
-
-SED ?= sed
+CAT := cat
+CHMOD := chmod
+CP := cp
+DEV_NULL := /dev/null
+DIFF := diff -c
+ECHO := echo
+EXPR := expr
+FIND := find
+GREP := grep
+LINECOUNT := wc -l
+LN := ln -s
+MKDIR := mkdir -p
+MV := mv
+SED := sed
+TIME := time
+TR := tr
######################################################################
# テストグループとテストでの共通マクロ
# chk_file_ext: 指定されたファイルが実在する場合、エラー
# 用例: $(call chk_file_ext,file)
define chk_file_ext
- $(if $(wildcard $1),$(error $1 exists in $(CURRDIR)))
+ $(if $(wildcard $1),$(error $1 exists in $(CURDIR)))
endef
# 指定したディレクトリーを作成
MAKEFILES := $(DEFINE_FILE) $(TEST_MAKEFILE)
# すべてのMakefile群の絶対パス
-MAKEFILES_ABS := $(foreach file,$(MAKEFILES),$(CURRDIR)/$(file))
+MAKEFILES_ABS := $(foreach file,$(MAKEFILES),$(CURDIR)/$(file))
######################################################################
# テストのディレクトリー
# make time : すべてのテストを実行し、実行時間をログファイルに出力
# make create : TESTNAMEで指定されたテストを新規に作成
# make clean : すべてのテストで、"make" で生成されたファイルをクリア
-# make cleantime: すべてのテストで、実行時間のログファイルをクリア
+# make time-clean: すべてのテストで、実行時間のログファイルをクリア
SHELL = /bin/sh
include Define.mk
+verbose ?= 1
+
######################################################################
# テストグループのディレクトリー
######################################################################
# グループディレクトリー
-GROUP_DIR := $(CURRDIR)
+GROUP_DIR := $(CURDIR)
# グループ名。ディレクトリ名から取得
GROUP := $(notdir $(GROUP_DIR))
# 引数は、テストのリスト、グループファイル、テストファイル
# 用例: $(call group_log,files_test_log,file_group_log)
define group_log
+ $(if $(filter 1,$(verbose)),$(ECHO) '$(CURDIR) - $(words $1) tests')
$(foreach target,$1,$(call group_log_each,$(target),$2))
+ $(if $(filter 1,$(verbose)),$(ECHO))
endef
# テストのログファイルをグループログファイルに出力。引数は、テスト、グループログファイル
# 用例: $(call group_log_each,file_test_log,file_group_log)
define group_log_each
+ $(if $(filter 1,$(verbose)),$(ECHO) -n '.')
$(ECHO) $(dir $1) >>$2;
if test -s $1; then $(CAT) $1 >>$2; else $(ECHO) $(dir $1)": no log" >>$2; fi
$(ECHO) >>$2;
-
endef
# 成功したテストの数。テストグループログファイルから取得
# 引数は、グループ名、グループログファイル、グループレポートファイル
# 用例: $(call group_report,name,file_log,file_report)
define group_report
- $(ECHO) "$1: $(SUCCESS_TEST) / $(ALL_TEST) tests passed. Details in $(GROUP_DIR)/$2" >$3;
+ $(ECHO) '$1: $(SUCCESS_TEST) / $(ALL_TEST) tests passed. Details in $(GROUP_DIR)/$2' >$3
if test $(FAIL_TEST) -eq 0; then $(ECHO) "$1: All tests are succeded." >>$3; fi
endef
# リストで指定したディレクトリーでmakeを実行
-# 用例: $(call make_tests,list_dir,target)
-define make_tests
- $(foreach dir,$1,$(call make_test_each,$(dir),$2))
+# 用例: $(call make_targets,list_dir,target)
+define make_targets
+ $(if $(filter 1,$(verbose)),$(ECHO) '$(CURDIR) - $2';)
+ $(foreach dir,$1,$(call make_target_each,$(dir),$2))
endef
# 指定したディレクトリーでmakeを実行
-# 用例: $(call make_test_each,tests,target)
-define make_test_each
+# 用例: $(call make_target_each,tests,target)
+define make_target_each
$(MAKE) $2 -sC $1;
-
endef
-.PHONY: check checkall time create clean cleantime
+.PHONY: check checkall time create clean time-clean
check checkall: clean $(GROUP_REPORT_FILE)
@$(CAT) $(GROUP_REPORT_FILE)
+ @exit $(FAIL_TEST)
-time: cleantime $(GROUP_TIME_FILE)
+time: time-clean $(GROUP_TIME_FILE)
@$(CAT) $(GROUP_TIME_FILE)
create:
@$(call create_makefile,$(TEST)/$(MAKEFILE),$(MAKEFILES))
clean:
- @$(call make_tests,$(TESTS),$@)
- @$(RM) $(GROUP_RES_FILES)
+ @$(call make_targets,$(TESTS),$@)
+ @$(RM) $(GROUP_RES_FILES);
-cleantime:
- @$(call make_tests,$(TESTS),$@)
- @$(RM) $(GROUP_TIME_FILE)
+time-clean:
+ @$(call make_targets,$(TESTS),$@)
+ @$(RM) $(GROUP_TIME_FILE);
$(GROUP_REPORT_FILE): $(GROUP_LOG_FILE)
@$(call group_report,$(GROUP),$^,$@)
# make set : CMDの標準出力をTEST0_FILEに保存。TEST0_FILEが存在する場合は実行しない
# make reset : CMDの標準出力をTEST0_FILEに保存。TEST0_FILEが存在する場合は上書き
# make time : CMDの実行にかかった時間をTIME_FILEに保存し、出力
-# make cleantime: "make time" で作成されたファイルをクリア
+# make time-clean: "make time" で作成されたファイルをクリア
# make clean : "make" で作成されたファイルをクリア
-# make cleanall: "make" と "make set" で作成されたファイルをクリア
+# make all-clean: "make" と "make set" で作成されたファイルをクリア
SHELL = /bin/bash
######################################################################
if test ! -x $1; then $(CHMOD) u+x $1; fi
./$1 >>$2 2>$3
if test -s $3; then $(CAT) $3 >>$2; fi
- $(MV) $2 $2.tmp && $(SED) -e "s%$(CURRDIR)%\$$PWD%g" $2.tmp >$2 && $(RM) $2.tmp
+ $(MV) $2 $2.tmp && $(SED) -e "s%$(CURDIR)%\$$PWD%g" $2.tmp >$2 && $(RM) $2.tmp
$(call rm_null,$3)
endef
define test_log
$(call desc_log,$3)
if test ! -s $2; then RES=Success; else RES=Failure; fi; $(ECHO) "$1: Test $$RES $(DATE)" >>$3
- $(ECHO) "Details in $(CURRDIR)/$(DETAIL_FILE)" >>$3
+ $(ECHO) "Details in $(CURDIR)/$(DETAIL_FILE)" >>$3
endef
# NODISPが設定されていない時は、ログファイルを表示
endef
# テスト名。カレントディレクトリー名から取得
-TEST = $(notdir $(CURRDIR))
+TEST = $(notdir $(CURDIR))
# コマンドファイルのソース
CMDSRC_FILE ?= $(CMD_FILE)
-.PHONY: check set reset clean cleanall time cleantime
+.PHONY: check set reset clean all-clean time time-clean
check: clean $(DETAIL_FILE)
@$(call disp_test_log,$(LOG_FILE))
@-$(call exec_cmd,$(CMD_FILE),$(TEST0_FILE),$(ERR_FILE))
@$(CAT) $(TEST0_FILE)
-reset: cleanall $(CMD_FILE)
+reset: all-clean $(CMD_FILE)
@-$(call exec_cmd,$(CMD_FILE),$(TEST0_FILE),$(ERR_FILE))
@$(CAT) $(TEST0_FILE)
clean:
@$(RM) $(TEST_RES_FILES)
-cleanall: clean
+all-clean: clean
@$(RM) $(TEST0_FILE)
-time: cleantime $(TIME_FILE)
+time: time-clean $(TIME_FILE)
@$(CAT) $(TIME_FILE)
-cleantime:
+time-clean:
@$(RM) $(TIME_FILE)
$(TEST1_FILE): $(CMD_FILE)