367 lines
9.8 KiB
Tcl
367 lines
9.8 KiB
Tcl
|
|
||
|
set rcsid {$Id: $}
|
||
|
|
||
|
# Documentation for this script. This may be output to stderr
|
||
|
# if the script is invoked incorrectly. See the [process_options]
|
||
|
# proc below.
|
||
|
#
|
||
|
set ::USAGE_MESSAGE {
|
||
|
This Tcl script is used to test the various configurations required
|
||
|
before releasing a new version. Supported command line options (all
|
||
|
optional) are:
|
||
|
|
||
|
-makefile PATH-TO-MAKEFILE (default "releasetest.mk")
|
||
|
-platform PLATFORM (see below)
|
||
|
-quick BOOLEAN (default "0")
|
||
|
|
||
|
The default value for -makefile is "./releasetest.mk".
|
||
|
|
||
|
The script determines the default value for -platform using the
|
||
|
$tcl_platform(os) and $tcl_platform(machine) variables. Supported
|
||
|
platforms are "Linux-x86", "Linux-x86_64" and "Darwin-i386".
|
||
|
|
||
|
If the -quick option is set to true, then the "veryquick.test" script
|
||
|
is run for all compilation configurations. Otherwise, sometimes "all.test"
|
||
|
is run, sometimes "veryquick.test".
|
||
|
|
||
|
Almost any SQLite makefile (except those generated by configure - see below)
|
||
|
should work. The following properties are required:
|
||
|
|
||
|
* The makefile should support the "fulltest" target.
|
||
|
* The makefile should support the variable "OPTS" as a way to pass
|
||
|
options from the make command line to lemon and the C compiler.
|
||
|
|
||
|
More precisely, the following invocation must be supported:
|
||
|
|
||
|
make -f $::MAKEFILE fulltest OPTS="-DSQLITE_SECURE_DELETE=1 -DSQLITE_DEBUG=1"
|
||
|
|
||
|
Makefiles generated by the sqlite configure program cannot be used as
|
||
|
they do not respect the OPTS variable.
|
||
|
|
||
|
Example Makefile contents:
|
||
|
|
||
|
########################################################
|
||
|
TOP=/home/dan/work/sqlite/sqlite
|
||
|
|
||
|
TCL_FLAGS=-I/home/dan/tcl/include
|
||
|
LIBTCL=-L/home/dan/tcl/lib -ltcl
|
||
|
|
||
|
BCC = gcc
|
||
|
TCC = gcc -ansi -g $(CFLAGS)
|
||
|
NAWK = awk
|
||
|
AR = ar cr
|
||
|
RANLIB = ranlib
|
||
|
THREADLIB = -lpthread -ldl
|
||
|
include $(TOP)/main.mk
|
||
|
########################################################
|
||
|
}
|
||
|
|
||
|
array set ::Configs {
|
||
|
"Default" {
|
||
|
-O2
|
||
|
}
|
||
|
"Ftrapv" {
|
||
|
-O2 -ftrapv
|
||
|
-DSQLITE_MAX_ATTACHED=55
|
||
|
-DSQLITE_TCL_DEFAULT_FULLMUTEX=1
|
||
|
}
|
||
|
"Unlock-Notify" {
|
||
|
-O2
|
||
|
-DSQLITE_ENABLE_UNLOCK_NOTIFY
|
||
|
-DSQLITE_THREADSAFE
|
||
|
-DSQLITE_TCL_DEFAULT_FULLMUTEX=1
|
||
|
}
|
||
|
"Secure-Delete" {
|
||
|
-O2
|
||
|
-DSQLITE_SECURE_DELETE=1
|
||
|
-DSQLITE_SOUNDEX=1
|
||
|
}
|
||
|
"Update-Delete-Limit" {
|
||
|
-O2
|
||
|
-DSQLITE_DEFAULT_FILE_FORMAT=4
|
||
|
-DSQLITE_ENABLE_UPDATE_DELETE_LIMIT=1
|
||
|
}
|
||
|
"Check-Symbols" {
|
||
|
-DSQLITE_MEMDEBUG=1
|
||
|
-DSQLITE_ENABLE_FTS3_PARENTHESIS=1
|
||
|
-DSQLITE_ENABLE_FTS3=1
|
||
|
-DSQLITE_ENABLE_RTREE=1
|
||
|
-DSQLITE_ENABLE_MEMSYS5=1
|
||
|
-DSQLITE_ENABLE_MEMSYS3=1
|
||
|
-DSQLITE_ENABLE_COLUMN_METADATA=1
|
||
|
-DSQLITE_ENABLE_UPDATE_DELETE_LIMIT=1
|
||
|
-DSQLITE_SECURE_DELETE=1
|
||
|
-DSQLITE_SOUNDEX=1
|
||
|
-DSQLITE_ENABLE_ATOMIC_WRITE=1
|
||
|
-DSQLITE_ENABLE_IOTRACE=1
|
||
|
-DSQLITE_ENABLE_MEMORY_MANAGEMENT=1
|
||
|
-DSQLITE_ENABLE_OVERSIZE_CELL_CHECK=1
|
||
|
}
|
||
|
"Debug-One" {
|
||
|
-O2
|
||
|
-DSQLITE_DEBUG=1
|
||
|
-DSQLITE_MEMDEBUG=1
|
||
|
-DSQLITE_MUTEX_NOOP=1
|
||
|
-DSQLITE_TCL_DEFAULT_FULLMUTEX=1
|
||
|
-DSQLITE_ENABLE_FTS3=1
|
||
|
-DSQLITE_ENABLE_RTREE=1
|
||
|
-DSQLITE_ENABLE_MEMSYS5=1
|
||
|
-DSQLITE_ENABLE_MEMSYS3=1
|
||
|
-DSQLITE_ENABLE_COLUMN_METADATA=1
|
||
|
}
|
||
|
"Device-One" {
|
||
|
-O2
|
||
|
-DSQLITE_DEBUG=1
|
||
|
-DSQLITE_DEFAULT_AUTOVACUUM=1
|
||
|
-DSQLITE_DEFAULT_CACHE_SIZE=64
|
||
|
-DSQLITE_DEFAULT_PAGE_SIZE=1024
|
||
|
-DSQLITE_DEFAULT_TEMP_CACHE_SIZE=32
|
||
|
-DSQLITE_DISABLE_LFS=1
|
||
|
-DSQLITE_ENABLE_ATOMIC_WRITE=1
|
||
|
-DSQLITE_ENABLE_IOTRACE=1
|
||
|
-DSQLITE_ENABLE_MEMORY_MANAGEMENT=1
|
||
|
-DSQLITE_MAX_PAGE_SIZE=4096
|
||
|
-DSQLITE_OMIT_LOAD_EXTENSION=1
|
||
|
-DSQLITE_OMIT_PROGRESS_CALLBACK=1
|
||
|
-DSQLITE_OMIT_VIRTUALTABLE=1
|
||
|
-DSQLITE_TEMP_STORE=3
|
||
|
}
|
||
|
"Device-Two" {
|
||
|
-DSQLITE_4_BYTE_ALIGNED_MALLOC=1
|
||
|
-DSQLITE_DEFAULT_AUTOVACUUM=1
|
||
|
-DSQLITE_DEFAULT_CACHE_SIZE=1000
|
||
|
-DSQLITE_DEFAULT_LOCKING_MODE=0
|
||
|
-DSQLITE_DEFAULT_PAGE_SIZE=1024
|
||
|
-DSQLITE_DEFAULT_TEMP_CACHE_SIZE=1000
|
||
|
-DSQLITE_DISABLE_LFS=1
|
||
|
-DSQLITE_ENABLE_FTS3=1
|
||
|
-DSQLITE_ENABLE_MEMORY_MANAGEMENT=1
|
||
|
-DSQLITE_ENABLE_RTREE=1
|
||
|
-DSQLITE_MAX_COMPOUND_SELECT=50
|
||
|
-DSQLITE_MAX_PAGE_SIZE=32768
|
||
|
-DSQLITE_OMIT_TRACE=1
|
||
|
-DSQLITE_TEMP_STORE=3
|
||
|
-DSQLITE_THREADSAFE=2
|
||
|
}
|
||
|
"Locking-Style" {
|
||
|
-O2
|
||
|
-DSQLITE_ENABLE_LOCKING_STYLE=1
|
||
|
}
|
||
|
"OS-X" {
|
||
|
-DSQLITE_OMIT_LOAD_EXTENSION=1
|
||
|
-DSQLITE_DEFAULT_MEMSTATUS=0
|
||
|
-DSQLITE_THREADSAFE=2
|
||
|
-DSQLITE_OS_UNIX=1
|
||
|
-DSQLITE_ENABLE_LOCKING_STYLE=1
|
||
|
-DUSE_PREAD=1
|
||
|
-DSQLITE_ENABLE_RTREE=1
|
||
|
-DSQLITE_ENABLE_FTS3=1
|
||
|
-DSQLITE_ENABLE_FTS3_PARENTHESIS=1
|
||
|
-DSQLITE_DEFAULT_CACHE_SIZE=1000
|
||
|
-DSQLITE_MAX_LENGTH=2147483645
|
||
|
-DSQLITE_MAX_VARIABLE_NUMBER=500000
|
||
|
-DSQLITE_DEBUG=1
|
||
|
-DSQLITE_PREFER_PROXY_LOCKING=1
|
||
|
}
|
||
|
"Extra-Robustness" {
|
||
|
-DSQLITE_ENABLE_OVERSIZE_CELL_CHECK=1
|
||
|
-DSQLITE_MAX_ATTACHED=62
|
||
|
}
|
||
|
"Devkit" {
|
||
|
-DSQLITE_DEFAULT_FILE_FORMAT=4
|
||
|
-DSQLITE_MAX_ATTACHED=30
|
||
|
-DSQLITE_ENABLE_COLUMN_METADATA
|
||
|
-DSQLITE_ENABLE_FTS4
|
||
|
-DSQLITE_ENABLE_FTS4_PARENTHESIS
|
||
|
-DSQLITE_DISABLE_FTS4_DEFERRED
|
||
|
-DSQLITE_ENABLE_RTREE
|
||
|
}
|
||
|
}
|
||
|
|
||
|
array set ::Platforms {
|
||
|
Linux-x86_64 {
|
||
|
"Check-Symbols" checksymbols
|
||
|
"Debug-One" test
|
||
|
"Secure-Delete" test
|
||
|
"Unlock-Notify" "QUICKTEST_INCLUDE=notify2.test test"
|
||
|
"Update-Delete-Limit" test
|
||
|
"Extra-Robustness" test
|
||
|
"Device-Two" test
|
||
|
"Ftrapv" test
|
||
|
"Default" "threadtest test"
|
||
|
"Device-One" fulltest
|
||
|
}
|
||
|
Linux-i686 {
|
||
|
"Devkit" test
|
||
|
"Unlock-Notify" "QUICKTEST_INCLUDE=notify2.test test"
|
||
|
"Device-One" test
|
||
|
"Device-Two" test
|
||
|
"Default" "threadtest fulltest"
|
||
|
}
|
||
|
Darwin-i386 {
|
||
|
"Locking-Style" test
|
||
|
"OS-X" "threadtest fulltest"
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
# End of configuration section.
|
||
|
#########################################################################
|
||
|
#########################################################################
|
||
|
|
||
|
foreach {key value} [array get ::Platforms] {
|
||
|
foreach {v t} $value {
|
||
|
if {0==[info exists ::Configs($v)]} {
|
||
|
puts stderr "No such configuration: \"$v\""
|
||
|
exit -1
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
proc run_test_suite {name testtarget config} {
|
||
|
|
||
|
# Tcl variable $opts is used to build up the value used to set the
|
||
|
# OPTS Makefile variable. Variable $cflags holds the value for
|
||
|
# CFLAGS. The makefile will pass OPTS to both gcc and lemon, but
|
||
|
# CFLAGS is only passed to gcc.
|
||
|
#
|
||
|
set cflags ""
|
||
|
set opts ""
|
||
|
foreach arg $config {
|
||
|
if {[string match -D* $arg]} {
|
||
|
lappend opts $arg
|
||
|
} else {
|
||
|
lappend cflags $arg
|
||
|
}
|
||
|
}
|
||
|
|
||
|
set cflags [join $cflags " "]
|
||
|
set opts [join $opts " "]
|
||
|
append opts " -DSQLITE_NO_SYNC=1 -DHAVE_USLEEP"
|
||
|
|
||
|
# Set the sub-directory to use.
|
||
|
#
|
||
|
set dir [string tolower [string map {- _ " " _} $name]]
|
||
|
|
||
|
if {$::tcl_platform(platform)=="windows"} {
|
||
|
append opts " -DSQLITE_OS_WIN=1"
|
||
|
} else {
|
||
|
append opts " -DSQLITE_OS_UNIX=1"
|
||
|
}
|
||
|
|
||
|
# Run the test.
|
||
|
#
|
||
|
set makefile [file normalize $::MAKEFILE]
|
||
|
file mkdir $dir
|
||
|
puts -nonewline "Testing configuration \"$name\" (logfile=$dir/test.log)..."
|
||
|
flush stdout
|
||
|
|
||
|
set makecmd [concat \
|
||
|
[list exec make -C $dir -f $makefile clean] \
|
||
|
$testtarget \
|
||
|
[list CFLAGS=$cflags OPTS=$opts >& $dir/test.log] \
|
||
|
]
|
||
|
|
||
|
set tm1 [clock seconds]
|
||
|
set rc [catch $makecmd]
|
||
|
set tm2 [clock seconds]
|
||
|
|
||
|
set minutes [expr {($tm2-$tm1)/60}]
|
||
|
set seconds [expr {($tm2-$tm1)%60}]
|
||
|
puts -nonewline [format " (%d:%.2d) " $minutes $seconds]
|
||
|
if {$rc} {
|
||
|
puts "FAILED."
|
||
|
} else {
|
||
|
puts "Ok."
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
# This proc processes the command line options passed to this script.
|
||
|
# Currently the only option supported is "-makefile", default
|
||
|
# "releasetest.mk". Set the ::MAKEFILE variable to the value of this
|
||
|
# option.
|
||
|
#
|
||
|
proc process_options {argv} {
|
||
|
set ::MAKEFILE releasetest.mk ;# Default value
|
||
|
set ::QUICK 0 ;# Default value
|
||
|
set platform $::tcl_platform(os)-$::tcl_platform(machine)
|
||
|
|
||
|
for {set i 0} {$i < [llength $argv]} {incr i} {
|
||
|
switch -- [lindex $argv $i] {
|
||
|
-makefile {
|
||
|
incr i
|
||
|
set ::MAKEFILE [lindex $argv $i]
|
||
|
}
|
||
|
|
||
|
-platform {
|
||
|
incr i
|
||
|
set platform [lindex $argv $i]
|
||
|
}
|
||
|
|
||
|
-quick {
|
||
|
incr i
|
||
|
set ::QUICK [lindex $argv $i]
|
||
|
}
|
||
|
|
||
|
default {
|
||
|
puts stderr ""
|
||
|
puts stderr [string trim $::USAGE_MESSAGE]
|
||
|
exit -1
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
set ::MAKEFILE [file normalize $::MAKEFILE]
|
||
|
|
||
|
if {0==[info exists ::Platforms($platform)]} {
|
||
|
puts "Unknown platform: $platform"
|
||
|
puts -nonewline "Set the -platform option to "
|
||
|
set print [list]
|
||
|
foreach p [array names ::Platforms] {
|
||
|
lappend print "\"$p\""
|
||
|
}
|
||
|
lset print end "or [lindex $print end]"
|
||
|
puts "[join $print {, }]."
|
||
|
exit
|
||
|
}
|
||
|
|
||
|
set ::CONFIGLIST $::Platforms($platform)
|
||
|
puts "Running the following configurations for $platform:"
|
||
|
puts " [string trim $::CONFIGLIST]"
|
||
|
}
|
||
|
|
||
|
# Main routine.
|
||
|
#
|
||
|
proc main {argv} {
|
||
|
|
||
|
# Process any command line options.
|
||
|
process_options $argv
|
||
|
|
||
|
foreach {zConfig target} $::CONFIGLIST {
|
||
|
if {$::QUICK} {set target test}
|
||
|
set config_options $::Configs($zConfig)
|
||
|
|
||
|
run_test_suite $zConfig $target $config_options
|
||
|
|
||
|
# If the configuration included the SQLITE_DEBUG option, then remove
|
||
|
# it and run veryquick.test. If it did not include the SQLITE_DEBUG option
|
||
|
# add it and run veryquick.test.
|
||
|
if {$target!="checksymbols"} {
|
||
|
set debug_idx [lsearch -glob $config_options -DSQLITE_DEBUG*]
|
||
|
if {$debug_idx < 0} {
|
||
|
run_test_suite "${zConfig}_debug" test [
|
||
|
concat $config_options -DSQLITE_DEBUG=1
|
||
|
]
|
||
|
} else {
|
||
|
run_test_suite "${zConfig}_ndebug" test [
|
||
|
lreplace $config_options $debug_idx $debug_idx
|
||
|
]
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
}
|
||
|
|
||
|
main $argv
|