make valgrindで、CMD_VALGRINDファイルがあればそのコマンドを実行
[autotest_mk.git] / template / Define.mk
index e114af6..74f4c33 100644 (file)
+# autotest.mk > test_template > Define.mk
+# 自動テスト用の変数、マクロ定義
+
+ifndef DEFINE_INCLUDED
+DEFINE_INCLUDED = 1
+
+# シェルコマンドをデバッグするときは、DEBUGSH変数を設定してmakeを実行する
+# 例: DEBUGSH=1 make
+ifdef DEBUGSH
+  SHELL := /bin/sh -x
+endif
+
+# 現在の日時
+DATE = $(shell date +"%F %T")
+
+# Makefile
+MAKEFILE := Makefile
+
 ######################################################################
-# ã\83\86ã\82¹ã\83\88ã\83\86ã\83³ã\83\97ã\83¬ã\83¼ã\83\88ã\81®ã\83\87ã\82£ã\83¬ã\82¯ã\83\88ã\83ªã\83¼
+# ã\82³ã\83\9eã\83³ã\83\89
 ######################################################################
-# テストグループのMakefileとしてコピーされるファイル
-GROUP_MAKEFILE = Group.mk
+
+CAT := cat
+CHMOD := chmod
+CP := cp
+DEV_NULL := /dev/null
+DIFF := diff -c
+ECHO := echo
+EXPR := expr
+FILE := file -b -e ascii
+FIND := find
+GREP := grep
+LINECOUNT := wc -l
+LN := ln -s
+MKDIR := mkdir -p
+MV := mv
+PRINTF := printf
+REALPATH := realpath
+SED := sed
+TEST := test
+TIME := time
+TR := tr
+VALGRIND := valgrind
+VALGRIND_LOGFILE := _valgrind.log
+VALGRINDFLAG :=  -q --leak-check=full --show-leak-kinds=all --log-file=$(VALGRIND_LOGFILE)
+VALGRIND_CMDLOGFILE := valgrind.log
 
 ######################################################################
-# ã\83\86ã\82¹ã\83\88ã\82°ã\83«ã\83¼ã\83\97ã\81®ã\83\87ã\82£ã\83¬ã\82¯ã\83\88ã\83ªã\83¼
+# ã\83\86ã\82¹ã\83\88ã\82°ã\83«ã\83¼ã\83\97ã\81¨ã\83\86ã\82¹ã\83\88ã\81§ã\81®å\85±é\80\9aã\83\9eã\82¯ã\83­
 ######################################################################
-# グループディレクトリー
-GROUP_DIR = $(shell pwd)
 
-# グループ名。ディレクトリ名から取得
-GROUP = $(notdir $(GROUP_DIR))
+# chk_var_null: 引数がNULLの場合、エラー
+# 用例: $(call chk_var_null,var)
+define chk_var_null
+    $(if $1,,$(error NULL argument))
+endef
+
+# chk_file_ext: 指定されたファイルが実在する場合、エラー
+# 用例: $(call chk_file_ext,file)
+define chk_file_ext
+    $(if $(wildcard $1),$(error $1 exists in $(CURDIR)))
+endef
+
+# 指定したディレクトリーを作成
+# 引数は、ディレクトリー名
+# 用例: $(call create_dir,name)
+define create_dir
+    $(call chk_var_null,$1)
+    $(call chk_file_ext,$1)
+    $(MKDIR) $1
+endef
+
+
+# ファイル1からファイル2への相対パス
+# 引数は、ファイル名1、ファイル名2
+# 用例: $(call rel_to,file1,file2)
+define rel_to
+    $(strip $(shell $(REALPATH) --relative-to=$1 $2))
+endef
+
+# テストディレクトリーのMakefileを作成
+# 引数は、Makefile名、依存ファイル群
+# 用例: $(call create_makefile,file,list_include_file)
+define create_makefile
+    $(RM) $1
+    $(foreach infile,$2,$(ECHO) "include ../$(infile)" >>$1; )
+    $(if $(filter $(SRC),c),$(call puts_cmd_c,$1))
+endef
+
+# C言語の関数をテストするための設定を、指定されたファイルに出力
+# 引数は、ファイル名
+# 用例: $(call puts_cmd_c,file)
+define puts_cmd_c
+    $(ECHO) >>$1
+    $(ECHO) "CC := gcc" >>$1
+    $(ECHO) "CFLAGS := -Wall" >>$1
+    $(ECHO) >>$1
+    $(ECHO) ".INTERMEDIATE:" "$$""(CMD_FILE)" >>$1
+    $(ECHO) >>$1
+    $(ECHO) "CMDSRC_FILE := cmd.c" >>$1
+    $(ECHO) "TESTTARGET_FILES :=       # Set test target files" >>$1
+    $(ECHO) >>$1
+    $(ECHO) "$$""(CMD_FILE):" "$$""(CMDSRC_FILE)" "$$""(TESTTARGET_FILES)" >>$1
+    $(ECHO) "  ""$$""(CC)" "$$""(CFLAGS)" "-o" "$$""@" "$$""^" >>$1
+endef
 
-# テスト名。カレントディレクトリー内の、名前が大文字または.以外で始まるディレクトリー
-TESTS = $(notdir $(shell find -maxdepth 1 -name "[^A-Z.]*" -type d))
+######################################################################
+# テストグループのディレクトリー
+######################################################################
 
-# テストグループとテストの両方で使う変数を定義したファイル
-DEF_FILE = Define.mk
+# テストグループとテストの変数を定義したMakefile
+DEFINE_FILE := Define.mk
 
-# テストのMakefileにインクルードするファイル
-TEST_MAKEFILE = Test.mk
+# テストのターゲットを定義したMakefile
+TEST_MAKEFILE := Test.mk
 
-# ã\83\86ã\82¹ã\83\88ã\82°ã\83«ã\83¼ã\83\97ã\83­ã\82°ファイル
-GROUP_LOG_FILE = $(shell echo $(GROUP) | tr '[a-z]' '[A-Z]').log
+# ã\83\86ã\82¹ã\83\88ã\82°ã\83«ã\83¼ã\83\97ã\81®Makefileã\81¨ã\81\97ã\81¦ã\82³ã\83\94ã\83¼ã\81\95ã\82\8cã\82\8bファイル
+GROUP_MAKEFILE := Group.mk
 
-# 成功したテストの数。テストグループログファイルから取得
-SUCCESS_TEST = $(shell grep "^[^A-Z.].*: Test Success" $(GROUP_LOG_FILE) | wc -l)
+# DEFINE_FILEの相対パス
+DEFINE_FILE_REL = $(call rel_to,$(GROUPDIR),$(DEFINE_FILE))
 
-# 失敗したテストの数。テストグループログファイルから取得
-FAIL_TEST = $(shell grep "^[^A-Z.].*: Test Failure" $(GROUP_LOG_FILE) | wc -l)
+# TEST_MAKEFILEの相対パス
+TEST_MAKEFILE_REL = $(call rel_to,$(GROUPDIR),$(TEST_MAKEFILE))
 
-# すべてのテストの数。
-ALL_TEST = $(shell expr $(SUCCESS_TEST) + $(FAIL_TEST))
+# GROUP_MAKEFILEの相対パス
+GROUP_MAKEFILE_REL = $(call rel_to,$(GROUPDIR),$(GROUP_MAKEFILE))
 
 ######################################################################
 # テストのディレクトリー
 ######################################################################
-# テスト名。カレントディレクトリー名から取得
-TEST = $(notdir $(shell pwd))
 
 # テストコマンドファイル
-CMD_FILE = cmd
+CMD_FILE := cmd
+
+# valgrindテストコマンドファイル
+VALGRIND_CMD_FILE := cmd_valgrind
 
 # テスト説明ファイル
-DESC_FILE = desc.txt
+DESC_FILE := desc.txt
 
-# テスト想定結果ファイル
-TEST0_FILE = 0.txt
+# テスト想定ファイル
+TEST0_FILE := 0.txt
 
 # テスト結果ファイル
-TEST1_FILE = 1.txt
+TEST1_FILE := 1.txt
 
 # テストの、想定結果と結果の差分ファイル
-DIFF_FILE = diff.txt
+DIFF_FILE := diff.log
 
 # テストエラーファイル
-ERR_FILE = err.txt
+ERR_FILE := err.log
 
 # テストログファイル
-LOG_FILE = test.log
+LOG_FILE := summary.log
 
-# 現在の日時
-DATE = `date +"%F %T"`
-
-# テスト実行コマンド。CMD_FILEを実行する。
-# ファイルの内容と、テスト結果を表す標準出力を、ターゲットファイルに保存。
-# エラー発生時は、エラー出力をターゲットファイルとERR_FILEに保存。
-# ターゲットファイルは、TEST0_FILEまたはTEST1_FILE
-CMD = \
-    chmod u+x $(CMD_FILE); \
-    cat $(CMD_FILE) >$@; \
-    ./$(CMD_FILE) >>$@ 2>$(ERR_FILE); \
-    if test -s $(ERR_FILE); then cat $(ERR_FILE) >>$@; else rm -f $(ERR_FILE); fi
+# 実行時間ファイル
+TIME_FILE := time.log
+
+# valgrindによるメモリーチェックファイル
+VALGRIND_FILE := valgrind.log
+
+# テスト詳細レポートファイル
+DETAIL_FILE := detail.log
+
+# テストの結果として作成されるファイル群
+TEST_RES_FILES := $(TEST1_FILE) $(DIFF_FILE) $(ERR_FILE) $(LOG_FILE) $(DETAIL_FILE) $(TIME_FILE)
+
+endif