1:
2: set rcsid {$Id: releasetest.tcl,v 1.1.1.1 2012/02/21 17:04:16 misho Exp $}
3:
4: # Documentation for this script. This may be output to stderr
5: # if the script is invoked incorrectly. See the [process_options]
6: # proc below.
7: #
8: set ::USAGE_MESSAGE {
9: This Tcl script is used to test the various configurations required
10: before releasing a new version. Supported command line options (all
11: optional) are:
12:
13: -makefile PATH-TO-MAKEFILE (default "releasetest.mk")
14: -platform PLATFORM (see below)
15: -quick BOOLEAN (default "0")
16:
17: The default value for -makefile is "./releasetest.mk".
18:
19: The script determines the default value for -platform using the
20: $tcl_platform(os) and $tcl_platform(machine) variables. Supported
21: platforms are "Linux-x86", "Linux-x86_64" and "Darwin-i386".
22:
23: If the -quick option is set to true, then the "veryquick.test" script
24: is run for all compilation configurations. Otherwise, sometimes "all.test"
25: is run, sometimes "veryquick.test".
26:
27: Almost any SQLite makefile (except those generated by configure - see below)
28: should work. The following properties are required:
29:
30: * The makefile should support the "fulltest" target.
31: * The makefile should support the variable "OPTS" as a way to pass
32: options from the make command line to lemon and the C compiler.
33:
34: More precisely, the following invocation must be supported:
35:
36: make -f $::MAKEFILE fulltest OPTS="-DSQLITE_SECURE_DELETE=1 -DSQLITE_DEBUG=1"
37:
38: Makefiles generated by the sqlite configure program cannot be used as
39: they do not respect the OPTS variable.
40:
41: Example Makefile contents:
42:
43: ########################################################
44: TOP=/home/dan/work/sqlite/sqlite
45:
46: TCL_FLAGS=-I/home/dan/tcl/include
47: LIBTCL=-L/home/dan/tcl/lib -ltcl
48:
49: BCC = gcc
50: TCC = gcc -ansi -g $(CFLAGS)
51: NAWK = awk
52: AR = ar cr
53: RANLIB = ranlib
54: THREADLIB = -lpthread -ldl
55: include $(TOP)/main.mk
56: ########################################################
57: }
58:
59: array set ::Configs {
60: "Default" {
61: -O2
62: }
63: "Ftrapv" {
64: -O2 -ftrapv
65: -DSQLITE_MAX_ATTACHED=55
66: -DSQLITE_TCL_DEFAULT_FULLMUTEX=1
67: }
68: "Unlock-Notify" {
69: -O2
70: -DSQLITE_ENABLE_UNLOCK_NOTIFY
71: -DSQLITE_THREADSAFE
72: -DSQLITE_TCL_DEFAULT_FULLMUTEX=1
73: }
74: "Secure-Delete" {
75: -O2
76: -DSQLITE_SECURE_DELETE=1
77: -DSQLITE_SOUNDEX=1
78: }
79: "Update-Delete-Limit" {
80: -O2
81: -DSQLITE_DEFAULT_FILE_FORMAT=4
82: -DSQLITE_ENABLE_UPDATE_DELETE_LIMIT=1
83: }
84: "Debug-One" {
85: -O2
86: -DSQLITE_DEBUG=1
87: -DSQLITE_MEMDEBUG=1
88: -DSQLITE_MUTEX_NOOP=1
89: -DSQLITE_TCL_DEFAULT_FULLMUTEX=1
90: -DSQLITE_ENABLE_FTS3=1
91: -DSQLITE_ENABLE_RTREE=1
92: -DSQLITE_ENABLE_MEMSYS5=1
93: -DSQLITE_ENABLE_MEMSYS3=1
94: -DSQLITE_ENABLE_COLUMN_METADATA=1
95: }
96: "Device-One" {
97: -O2
98: -DSQLITE_DEBUG=1
99: -DSQLITE_DEFAULT_AUTOVACUUM=1
100: -DSQLITE_DEFAULT_CACHE_SIZE=64
101: -DSQLITE_DEFAULT_PAGE_SIZE=1024
102: -DSQLITE_DEFAULT_TEMP_CACHE_SIZE=32
103: -DSQLITE_DISABLE_LFS=1
104: -DSQLITE_ENABLE_ATOMIC_WRITE=1
105: -DSQLITE_ENABLE_IOTRACE=1
106: -DSQLITE_ENABLE_MEMORY_MANAGEMENT=1
107: -DSQLITE_MAX_PAGE_SIZE=4096
108: -DSQLITE_OMIT_LOAD_EXTENSION=1
109: -DSQLITE_OMIT_PROGRESS_CALLBACK=1
110: -DSQLITE_OMIT_VIRTUALTABLE=1
111: -DSQLITE_TEMP_STORE=3
112: }
113: "Device-Two" {
114: -DSQLITE_4_BYTE_ALIGNED_MALLOC=1
115: -DSQLITE_DEFAULT_AUTOVACUUM=1
116: -DSQLITE_DEFAULT_CACHE_SIZE=1000
117: -DSQLITE_DEFAULT_LOCKING_MODE=0
118: -DSQLITE_DEFAULT_PAGE_SIZE=1024
119: -DSQLITE_DEFAULT_TEMP_CACHE_SIZE=1000
120: -DSQLITE_DISABLE_LFS=1
121: -DSQLITE_ENABLE_FTS3=1
122: -DSQLITE_ENABLE_MEMORY_MANAGEMENT=1
123: -DSQLITE_ENABLE_RTREE=1
124: -DSQLITE_MAX_COMPOUND_SELECT=50
125: -DSQLITE_MAX_PAGE_SIZE=32768
126: -DSQLITE_OMIT_TRACE=1
127: -DSQLITE_TEMP_STORE=3
128: -DSQLITE_THREADSAFE=2
129: }
130: "Locking-Style" {
131: -O2
132: -DSQLITE_ENABLE_LOCKING_STYLE=1
133: }
134: "OS-X" {
135: -DSQLITE_OMIT_LOAD_EXTENSION=1
136: -DSQLITE_DEFAULT_MEMSTATUS=0
137: -DSQLITE_THREADSAFE=2
138: -DSQLITE_OS_UNIX=1
139: -DSQLITE_ENABLE_LOCKING_STYLE=1
140: -DUSE_PREAD=1
141: -DSQLITE_ENABLE_RTREE=1
142: -DSQLITE_ENABLE_FTS3=1
143: -DSQLITE_ENABLE_FTS3_PARENTHESIS=1
144: -DSQLITE_DEFAULT_CACHE_SIZE=1000
145: -DSQLITE_MAX_LENGTH=2147483645
146: -DSQLITE_MAX_VARIABLE_NUMBER=500000
147: -DSQLITE_DEBUG=1
148: -DSQLITE_PREFER_PROXY_LOCKING=1
149: }
150: "Extra-Robustness" {
151: -DSQLITE_ENABLE_OVERSIZE_CELL_CHECK=1
152: -DSQLITE_MAX_ATTACHED=62
153: }
154: }
155:
156: array set ::Platforms {
157: Linux-x86_64 {
158: "Debug-One" "checksymbols test"
159: "Secure-Delete" test
160: "Unlock-Notify" "QUICKTEST_INCLUDE=notify2.test test"
161: "Update-Delete-Limit" test
162: "Extra-Robustness" test
163: "Device-Two" test
164: "Ftrapv" test
165: "Default" "threadtest test"
166: "Device-One" fulltest
167: }
168: Linux-i686 {
169: "Unlock-Notify" "QUICKTEST_INCLUDE=notify2.test test"
170: "Device-One" test
171: "Device-Two" test
172: "Default" "threadtest fulltest"
173: }
174: Darwin-i386 {
175: "Locking-Style" test
176: "OS-X" "threadtest fulltest"
177: }
178: }
179:
180:
181: # End of configuration section.
182: #########################################################################
183: #########################################################################
184:
185: foreach {key value} [array get ::Platforms] {
186: foreach {v t} $value {
187: if {0==[info exists ::Configs($v)]} {
188: puts stderr "No such configuration: \"$v\""
189: exit -1
190: }
191: }
192: }
193:
194: proc run_test_suite {name testtarget config} {
195:
196: # Tcl variable $opts is used to build up the value used to set the
197: # OPTS Makefile variable. Variable $cflags holds the value for
198: # CFLAGS. The makefile will pass OPTS to both gcc and lemon, but
199: # CFLAGS is only passed to gcc.
200: #
201: set cflags ""
202: set opts ""
203: foreach arg $config {
204: if {[string match -D* $arg]} {
205: lappend opts $arg
206: } else {
207: lappend cflags $arg
208: }
209: }
210:
211: set cflags [join $cflags " "]
212: set opts [join $opts " "]
213: append opts " -DSQLITE_NO_SYNC=1 -DHAVE_USLEEP"
214:
215: # Set the sub-directory to use.
216: #
217: set dir [string tolower [string map {- _ " " _} $name]]
218:
219: if {$::tcl_platform(platform)=="windows"} {
220: append opts " -DSQLITE_OS_WIN=1"
221: } elseif {$::tcl_platform(platform)=="os2"} {
222: append opts " -DSQLITE_OS_OS2=1"
223: } else {
224: append opts " -DSQLITE_OS_UNIX=1"
225: }
226:
227: # Run the test.
228: #
229: set makefile [file normalize $::MAKEFILE]
230: file mkdir $dir
231: puts -nonewline "Testing configuration \"$name\" (logfile=$dir/test.log)..."
232: flush stdout
233:
234: set makecmd [concat \
235: [list exec make -C $dir -f $makefile clean] \
236: $testtarget \
237: [list CFLAGS=$cflags OPTS=$opts >& $dir/test.log] \
238: ]
239:
240: set tm1 [clock seconds]
241: set rc [catch $makecmd]
242: set tm2 [clock seconds]
243:
244: set minutes [expr {($tm2-$tm1)/60}]
245: set seconds [expr {($tm2-$tm1)%60}]
246: puts -nonewline [format " (%d:%.2d) " $minutes $seconds]
247: if {$rc} {
248: puts "FAILED."
249: } else {
250: puts "Ok."
251: }
252: }
253:
254:
255: # This proc processes the command line options passed to this script.
256: # Currently the only option supported is "-makefile", default
257: # "releasetest.mk". Set the ::MAKEFILE variable to the value of this
258: # option.
259: #
260: proc process_options {argv} {
261: set ::MAKEFILE releasetest.mk ;# Default value
262: set ::QUICK 0 ;# Default value
263: set platform $::tcl_platform(os)-$::tcl_platform(machine)
264:
265: for {set i 0} {$i < [llength $argv]} {incr i} {
266: switch -- [lindex $argv $i] {
267: -makefile {
268: incr i
269: set ::MAKEFILE [lindex $argv $i]
270: }
271:
272: -platform {
273: incr i
274: set platform [lindex $argv $i]
275: }
276:
277: -quick {
278: incr i
279: set ::QUICK [lindex $argv $i]
280: }
281:
282: default {
283: puts stderr ""
284: puts stderr [string trim $::USAGE_MESSAGE]
285: exit -1
286: }
287: }
288: }
289:
290: set ::MAKEFILE [file normalize $::MAKEFILE]
291:
292: if {0==[info exists ::Platforms($platform)]} {
293: puts "Unknown platform: $platform"
294: puts -nonewline "Set the -platform option to "
295: set print [list]
296: foreach p [array names ::Platforms] {
297: lappend print "\"$p\""
298: }
299: lset print end "or [lindex $print end]"
300: puts "[join $print {, }]."
301: exit
302: }
303:
304: set ::CONFIGLIST $::Platforms($platform)
305: puts "Running the following configurations for $platform:"
306: puts " [string trim $::CONFIGLIST]"
307: }
308:
309: # Main routine.
310: #
311: proc main {argv} {
312:
313: # Process any command line options.
314: process_options $argv
315:
316: foreach {zConfig target} $::CONFIGLIST {
317: if {$::QUICK} {set target test}
318: set config_options $::Configs($zConfig)
319:
320: run_test_suite $zConfig $target $config_options
321:
322: # If the configuration included the SQLITE_DEBUG option, then remove
323: # it and run veryquick.test. If it did not include the SQLITE_DEBUG option
324: # add it and run veryquick.test.
325: set debug_idx [lsearch -glob $config_options -DSQLITE_DEBUG*]
326: if {$debug_idx < 0} {
327: run_test_suite "${zConfig}_debug" test [
328: concat $config_options -DSQLITE_DEBUG=1
329: ]
330: } else {
331: run_test_suite "${zConfig}_ndebug" test [
332: lreplace $config_options $debug_idx $debug_idx
333: ]
334: }
335:
336: }
337: }
338:
339: main $argv
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>