1 2set rcsid {$Id: $} 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# 8set ::USAGE_MESSAGE { 9This Tcl script is used to test the various configurations required 10before releasing a new version. Supported command line options (all 11optional) are: 12 13 -makefile PATH-TO-MAKEFILE (default "releasetest.mk") 14 -platform PLATFORM (see below) 15 -quick BOOLEAN (default "0") 16 17The default value for -makefile is "./releasetest.mk". 18 19The script determines the default value for -platform using the 20$tcl_platform(os) and $tcl_platform(machine) variables. Supported 21platforms are "Linux-x86", "Linux-x86_64" and "Darwin-i386". 22 23If the -quick option is set to true, then the "veryquick.test" script 24is run for all compilation configurations. Otherwise, sometimes "all.test" 25is run, sometimes "veryquick.test". 26 27Almost any SQLite makefile (except those generated by configure - see below) 28should 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 34More precisely, the following invocation must be supported: 35 36 make -f $::MAKEFILE fulltest OPTS="-DSQLITE_SECURE_DELETE=1 -DSQLITE_DEBUG=1" 37 38Makefiles generated by the sqlite configure program cannot be used as 39they do not respect the OPTS variable. 40 41Example 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 59array 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 156array set ::Platforms { 157 Linux-x86_64 { 158 "Secure-Delete" test 159 "Unlock-Notify" "QUICKTEST_INCLUDE=notify2.test test" 160 "Update-Delete-Limit" test 161 "Debug-One" 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# End of configuration section. 181######################################################################### 182######################################################################### 183 184foreach {key value} [array get ::Platforms] { 185 foreach {v t} $value { 186 if {0==[info exists ::Configs($v)]} { 187 puts stderr "No such configuration: \"$v\"" 188 exit -1 189 } 190 } 191} 192 193proc run_test_suite {name testtarget config} { 194 195 # Tcl variable $opts is used to build up the value used to set the 196 # OPTS Makefile variable. Variable $cflags holds the value for 197 # CFLAGS. The makefile will pass OPTS to both gcc and lemon, but 198 # CFLAGS is only passed to gcc. 199 # 200 set cflags "" 201 set opts "" 202 foreach arg $config { 203 if {[string match -D* $arg]} { 204 lappend opts $arg 205 } else { 206 lappend cflags $arg 207 } 208 } 209 210 set cflags [join $cflags " "] 211 set opts [join $opts " "] 212 append opts " -DSQLITE_NO_SYNC=1 -DHAVE_USLEEP" 213 214 # Set the sub-directory to use. 215 # 216 set dir [string tolower [string map {- _ " " _} $name]] 217 218 if {$::tcl_platform(platform)=="windows"} { 219 append opts " -DSQLITE_OS_WIN=1" 220 } elseif {$::tcl_platform(platform)=="os2"} { 221 append opts " -DSQLITE_OS_OS2=1" 222 } else { 223 append opts " -DSQLITE_OS_UNIX=1" 224 } 225 226 # Run the test. 227 # 228 set makefile [file normalize $::MAKEFILE] 229 file mkdir $dir 230 puts -nonewline "Testing configuration \"$name\" (logfile=$dir/test.log)..." 231 flush stdout 232 233 set makecmd [concat \ 234 [list exec make -C $dir -f $makefile clean] \ 235 $testtarget \ 236 [list CFLAGS=$cflags OPTS=$opts >& $dir/test.log] \ 237 ] 238 239 set tm1 [clock seconds] 240 set rc [catch $makecmd] 241 set tm2 [clock seconds] 242 243 set minutes [expr {($tm2-$tm1)/60}] 244 set seconds [expr {($tm2-$tm1)%60}] 245 puts -nonewline [format " (%d:%.2d) " $minutes $seconds] 246 if {$rc} { 247 puts "FAILED." 248 } else { 249 puts "Ok." 250 } 251} 252 253 254# This proc processes the command line options passed to this script. 255# Currently the only option supported is "-makefile", default 256# "releasetest.mk". Set the ::MAKEFILE variable to the value of this 257# option. 258# 259proc process_options {argv} { 260 set ::MAKEFILE releasetest.mk ;# Default value 261 set ::QUICK 0 ;# Default value 262 set platform $::tcl_platform(os)-$::tcl_platform(machine) 263 264 for {set i 0} {$i < [llength $argv]} {incr i} { 265 switch -- [lindex $argv $i] { 266 -makefile { 267 incr i 268 set ::MAKEFILE [lindex $argv $i] 269 } 270 271 -platform { 272 incr i 273 set platform [lindex $argv $i] 274 } 275 276 -quick { 277 incr i 278 set ::QUICK [lindex $argv $i] 279 } 280 281 default { 282 puts stderr "" 283 puts stderr [string trim $::USAGE_MESSAGE] 284 exit -1 285 } 286 } 287 } 288 289 set ::MAKEFILE [file normalize $::MAKEFILE] 290 291 if {0==[info exists ::Platforms($platform)]} { 292 puts "Unknown platform: $platform" 293 puts -nonewline "Set the -platform option to " 294 set print [list] 295 foreach p [array names ::Platforms] { 296 lappend print "\"$p\"" 297 } 298 lset print end "or [lindex $print end]" 299 puts "[join $print {, }]." 300 exit 301 } 302 303 set ::CONFIGLIST $::Platforms($platform) 304 puts "Running the following configurations for $platform:" 305 puts " [string trim $::CONFIGLIST]" 306} 307 308# Main routine. 309# 310proc main {argv} { 311 312 # Process any command line options. 313 process_options $argv 314 315 foreach {zConfig target} $::CONFIGLIST { 316 if {$::QUICK} {set target test} 317 set config_options $::Configs($zConfig) 318 319 run_test_suite $zConfig $target $config_options 320 321 # If the configuration included the SQLITE_DEBUG option, then remove 322 # it and run veryquick.test. If it did not include the SQLITE_DEBUG option 323 # add it and run veryquick.test. 324 set debug_idx [lsearch -glob $config_options -DSQLITE_DEBUG*] 325 if {$debug_idx < 0} { 326 run_test_suite "${zConfig}_debug" test [ 327 concat $config_options -DSQLITE_DEBUG=1 328 ] 329 } else { 330 run_test_suite "${zConfig}_ndebug" test [ 331 lreplace $config_options $debug_idx $debug_idx 332 ] 333 } 334 335 } 336} 337 338main $argv 339