|
Namazu for hns による簡易全文検索 詳しくは 詳細指定/ヘルプを参照して下さい |
||||||||||||||||||||||||||||||||||||||||||||||
2014年04月30日(水) 旧暦 [n年日記] [更新:"2014/05/02 15:55:57"]#1 [dejagnu] (dejagnu) make test
make test には dejagnu が良く使われる。dejagnu の中の runtest が呼ばれる。
runtest は、./config/default.exp を参照する 例えば testsuite という directory を作って、その下の config/default.exp に 一言、mytest_init と書いておくと、それを実行しようとする。 (その中身を定義する前に実行して見ると) その様子は次の通り
modena@makoto 12:04:57/140430(..mydirectory/testsuite)% runtest
WARNING: Couldn't find the global config file.
WARNING: No tool specified
Test Run By makoto on Wed Apr 30 12:05:00 2014
Native configuration is x86_64-unknown-netbsd6.1.2
=== tests ===
Schedule of variations:
unix
Running target unix
Using /usr/pkg/share/dejagnu/baseboards/unix.exp as board description file for target.
Using /usr/pkg/share/dejagnu/config/unix.exp as generic interface file for target.
Using ./config/default.exp as tool-and-target-specific interface file.
ERROR: (DejaGnu) proc "mytest_init" does not exist.
The error code is NONE
The info on the error is:
invalid command name "mytest_init"
while executing
"::tcl_unknown mytest_init"
("uplevel" body line 1)
invoked from within
"uplevel 1 ::tcl_unknown $args"
=== Summary ===
modena@makoto 12:05:00/140430(..mydirectory/testsuite)%
そこで、dejagnu 的 hello world はどうなるか、とい話も思い着く。
@ Hello World by dejagnu:modena@makoto 12:18:20/140430(..my_directory/testsuite)% ls -lR total 8 drwxr-xr-x 2 makoto wheel 512 Apr 30 12:16 config drwxr-xr-x 2 makoto wheel 512 Apr 30 12:16 lib ./config: total 4 -rw-r--r-- 1 makoto wheel 37 Apr 30 12:14 default.exp ./lib: total 4 -rw-r--r-- 1 makoto wheel 107 Apr 30 12:15 mytest-defs.exp
modena@makoto 12:18:22/140430(..my_directory/testsuite)% head config/default.exp lib/mytest-defs.exp
==> config/default.exp <==
load_lib mytest-defs.exp
mytest_init
==> lib/mytest-defs.exp <==
proc mytest_init { args } {
# global variable_name
print " *** Hello World ! *** "
return
}
modena@makoto 12:18:36/140430(..my_directory/testsuite)%
少し比較もあるといいかな、と思ったり。
dejagnu の info を見ると、次のような節がある
3.4.3 Remote testing "Hello world" @ proc regexp_diff:
modena@makoto 12:13:47/140501(/export/local-src)% cat -n binutils-2.24/binutils/testsuite/lib/binutils-common.exp | sed -n 181,342p | head -40
181 # Compare two files line-by-line. FILE_1 is the actual output and FILE_2
182 # is the expected output. Ignore blank lines in either file.
183 #
184 # FILE_2 is a series of regexps, comments and # directives. The directives
185 # are:
186 #
187 # #pass
188 # Treat the test as a PASS if everything up till this point has
189 # matched. Ignore any remaining lines in either FILE_1 or FILE_2.
190 #
191 # #failif
192 # Reverse the sense of the test: expect differences to exist.
193 #
194 # #...
195 # REGEXP
196 # Skip all lines in FILE_1 until the first that matches REGEXP.
197 #
198 # Other # lines are comments. Regexp lines starting with the `!' character
199 # specify inverse matching (use `\!' for literal matching against a leading
200 # `!'). Skip empty lines in both files.
201 #
202 # The first optional argument is a list of regexp substitutions of the form:
203 #
204 # EXP1 SUBSPEC1 EXP2 SUBSPEC2 ...
205 #
206 # This tells the function to apply each regexp substitution EXPi->SUBSPECi
207 # in order to every line of FILE_2.
208 #
209 # Return nonzero if differences exist.
210 proc regexp_diff { file_1 file_2 args } {
211 set eof -1
212 set end_1 0
213 set end_2 0
214 set differences 0
215 set diff_pass 0
216 set fail_if_match 0
217 set ref_subst ""
218 if { [llength $args] > 0 } {
219 set ref_subst [lindex $args 0]
220 }
...
333 } else {
334 set differences 0
335 }
336 }
337
338 close $file_a
339 close $file_b
340
341 return $differences
342 }
この regexp_diff は (binutils-2.24 の場合に)
gas/testsuite/gas/all/gas.exp
proc test_cond
gas/testsuite/gas/*/*.exp
gas/testsuite/lib/gas-defs.exp
proc run_dump_test
から呼ばれる
binutils-2.24/gas/testsuite/config/default.exp load_lib gas-defs.exp binutils-2.24/gas/testsuite/lib/gas-defs.expmodena@makoto 11:34:59/140502(~)% grep '^proc ' binutils-2.24/gas/testsuite/lib/gas-defs.exp
proc load_common_lib { name } {
proc gas_version {} {
proc gas_host_run { cmd redir } {
proc gas_run { prog as_opts redir } {
proc gas_run_stdin { prog as_opts redir } {
proc all_ones { args } {
proc gas_start { prog as_opts } {
proc gas_finish { } {
proc want_no_output { testname } {
proc gas_test_old { file as_opts testname } {
proc gas_test { file as_opts var_opts testname } {
proc gas_test_ignore_stdout { file as_opts testname } {
proc gas_test_error { file as_opts testname } {
proc gas_exit {} {}
proc gas_init { args } {
proc get_standard_section_names {} {
proc run_dump_tests { testcases {extra_options {}} } {
proc run_dump_test { name {extra_options {}} } {
proc slurp_options { file } {
proc objdump { opts } {
proc objdump_start_no_subdir { prog opts } {
proc objdump_finish { } {
proc file_contents { filename } {
proc write_file { filename contents } {
proc verbose_eval { expr { level 1 } } {
proc run_list_test { name {opts {}} {testname {}} } {
proc run_list_test_stdin { name {opts {}} {testname {}} } {
config/default.exp -> gas_init を呼出す。gas_init は、次の中に定義してある testsuite/lib/gas-defs.exp proc gas_init @ /usr/pkg/bin/runtest:
which runtest とすると、/usr/pkg/bin/runtest を表示する。これは shell script。
modena@makoto 14:01:39/140502(..binutils-2.24/gas)% file `which runtest` /usr/pkg/bin/runtest: POSIX shell script, ASCII text executableこの中で、runtest.exp を探し # Find runtest.exp. First we look in its installed location, # otherwise start if from the source tree.最後に、次のように runtest.exp を呼んでいる
exec $expectbin $debug -- $runpath/runtest.exp $target ${1+"$@"}
@ runtest.exp, /usr/pkg/share/dejagnu/runtest.exp:
runtest.exp では、いくつかの proc を定義した後で、
modena@makoto 14:13:32/140502(..binutils-2.24/gas)% \
grep ^proc /usr/pkg/share/dejagnu/runtest.exp
proc verbose { args } {
proc transform { name } {
proc findfile { args } {
proc load_file { args } {
proc search_and_load_file { type filelist dirlist } {
proc usage { } {
proc lookfor_file { dir name } {
proc load_lib { file } {
proc get_local_hostname { } {
proc setup_target_hook { whole_name name } {
proc cleanup_target_hook { name } {
proc setup_host_hook { name } {
proc setup_build_hook { name } {
proc load_tool_init { file } {
proc load_generic_config { name } {
proc load_config { args } {
proc load_tool_target_config { name } {
proc load_board_description { board_name args } {
proc load_base_board_description { board_name } {
proc runtest { test_file_name } {
proc process_target_variants { target_list } {
proc iterate_target_variants { target variants } {
proc iterate_target_variants_two { orig_target target variants } {
modena@makoto 14:13:36/140502(..binutils-2.24/gas)%
最後に本体があるmodena@makoto 14:16:25/140502(..share/dejagnu)% cat -n runtest.exp| sed -n 1590,1625p
1590 #
1591 # main test execution loop
1592 #
1593
1594 if {[info exists errorInfo]} {
1595 unset errorInfo
1596 }
1597 # make sure we have only single path delimiters
1598 regsub -all "\(\[^/\]\)//*" $srcdir "\\1/" srcdir
1599
1600 if {![info exists target_list]} {
1601 # Make sure there is at least one target machine. It's probably a Unix box,
1602 # but that's just a guess.
1603 set target_list { "unix" }
1604 } else {
1605 verbose "target list is $target_list"
1606 }
1607
1608 #
1609 # Iterate through the list of targets.
1610 #
1611 global current_target
1612
1613 set target_list [process_target_variants $target_list]
1614
1615 set target_count [llength $target_list]
1616
1617 clone_output "Schedule of variations:"
1618 foreach current_target $target_list {
1619 clone_output " $current_target"
1620 }
1621 clone_output ""
1622
1623
1624 foreach current_target $target_list {
1625 verbose "target is $current_target"
@ site.exp:
runtest.exp の中に
68:set configfile site.exp ;# (local to this file)と 635: load_file $objdir/$configfileという行があるので、 site.exp に何か書いておくと読んでくれる (その他に読むのは何かと調べると) modena@makoto 15:21:52/140502(..my_directory/testsuite)% \ grep -n "^\ *load_file" /usr/pkg/share/dejagnu/runtest.exp 624:load_file ~/.dejagnurc $base_dir/$configfile 635: load_file $objdir/$configfile @ strace:
runtest に --strace N (N は数字)を付けると N 段階までの情報を表示する
( つっこみ )
#2 (dejagnu) Reading info
改めて info の中の dejagnu を読んでいる訳だが、
3.2.1 A simple project without the GNU autotoolsの節に
@ "Hello world" locally:
こんな説明もあった
3.3.4 Testing "Hello world" locally ( つっこみ )
|
最近の日記 2026年01月29日 ・Die Fledermaus at New National theatre 2026/01/29 2025年12月25日 ・pbulk 11.99.3 (emacs30) 2025年11月22日 ・crash dump 2025年10月25日 ・recover from disk error 2025年10月23日 ・dd does not duplicate Windows 11 boot disk ? | ||