2 set rcsid
{$Id: omittest.tcl
,v
1.8 2008/10/13 15:35:09 drh Exp
$}
4 # Documentation for this script. This may be output to stderr
5 # if the script is invoked incorrectly.
7 This
Tcl script is used to test the various compile
time options
8 available
for omitting code
(the SQLITE_OMIT_xxx
options). It
9 should be invoked as follows
:
11 <script
> ?test-symbol? ?
-makefile PATH-TO-MAKEFILE? ?
-skip_run?
13 The
default value
for ::MAKEFILE is
"../Makefile.linux.gcc".
15 If
-skip_run option is given then only the compile part is attempted.
17 This script builds the testfixture program and runs the SQLite test suite
18 once with each SQLITE_OMIT_
option defined and then once with all
options
19 defined together. Each run is performed in a seperate directory created
20 as a sub-directory of the current directory by the script. The output
21 of the build is saved in
<sub-directory
>/build.log. The output of the
22 test-suite is saved in
<sub-directory
>/test.log.
24 Almost any SQLite makefile
(except those generated by configure
- see below
)
25 should work. The following properties are required
:
27 * The makefile should support the
"testfixture" target.
28 * The makefile should support the
"test" target.
29 * The makefile should support the
variable "OPTS" as a way to pass
30 options from the make command line to lemon and the C compiler.
32 More precisely
, the following two invocations must be supported
:
34 make
-f $::MAKEFILE testfixture OPTS
="-DSQLITE_OMIT_ALTERTABLE=1"
35 make
-f $::MAKEFILE test
37 Makefiles generated by the sqlite configure program cannot be used as
38 they do not respect the OPTS
variable.
42 # Build a testfixture executable and run quick.test using it. The first
43 # parameter is the name of the directory to create and use to run the
44 # test in. The second parameter is a list of OMIT symbols to define
45 # when doing so. For example:
47 # run_quick_test /tmp/testdir {SQLITE_OMIT_TRIGGER SQLITE_OMIT_VIEW}
50 proc run_quick_test
{dir omit_symbol_list
} {
51 set target
"testfixture"
52 # Compile the value of the OPTS Makefile variable.
53 set opts
"-DSQLITE_MEMDEBUG -DSQLITE_DEBUG -DSQLITE_NO_SYNC"
54 if {$::tcl_platform(platform
)=="windows"} {
55 append opts
" -DSQLITE_OS_WIN=1"
56 set target
"testfixture.exe"
57 } elseif
{$::tcl_platform(platform
)=="os2"} {
58 append opts
" -DSQLITE_OS_OS2=1"
60 append opts
" -DSQLITE_OS_UNIX=1"
62 foreach sym
$omit_symbol_list {
63 append opts
" -D${sym}=1"
66 # Create the directory and do the build. If an error occurs return
67 # early without attempting to run the test suite.
69 puts -nonewline "Building $dir..."
72 file copy
-force .
/config.h
$dir
73 file copy
-force .
/libtool
$dir
76 exec make
-C $dir -f $::MAKEFILE $target OPTS
=$opts >& $dir/build.log
79 puts "No good. See $dir/build.log."
85 # Create an empty file "$dir/sqlite3". This is to trick the makefile out
86 # of trying to build the sqlite shell. The sqlite shell won't build
87 # with some of the OMIT options (i.e OMIT_COMPLETE).
88 set sqlite3_dummy
$dir/sqlite3
89 if {$::tcl_platform(platform
)=="windows" ||
$::tcl_platform(platform
)=="os2"} {
90 append sqlite3_dummy
".exe"
92 if {![file exists
$sqlite3_dummy]} {
93 set wr
[open $sqlite3_dummy w
]
99 puts "Skip testing $dir."
101 # Run the test suite.
102 puts -nonewline "Testing $dir..."
105 exec make
-C $dir -f $::MAKEFILE test OPTS
=$opts >& $dir/test.log
108 puts "No good. See $dir/test.log."
116 # This proc processes the command line options passed to this script.
117 # Currently the only option supported is "-makefile", default
118 # "../Makefile.linux-gcc". Set the ::MAKEFILE variable to the value of this
121 proc process_options
{argv
} {
122 if {$::tcl_platform(platform
)=="windows" ||
$::tcl_platform(platform
)=="os2"} {
123 set ::MAKEFILE .
/Makefile
;# Default value
125 set ::MAKEFILE .
/Makefile.linux-gcc
;# Default value
127 set ::SKIP_RUN 0 ;# Default to attempt test
129 for {set i
0} {$i < [llength $argv]} {incr i
} {
130 switch -- [lindex $argv $i] {
133 set ::MAKEFILE [lindex $argv $i]
141 if {[info exists
::SYMBOL]} {
142 puts stderr
[string trim
$::USAGE_MESSAGE]
145 set ::SYMBOL [lindex $argv $i]
148 set ::MAKEFILE [file normalize
$::MAKEFILE]
156 # List of SQLITE_OMIT_XXX symbols supported by SQLite.
157 set ::OMIT_SYMBOLS [list \
158 SQLITE_OMIT_ALTERTABLE
\
159 SQLITE_OMIT_ANALYZE
\
161 SQLITE_OMIT_AUTHORIZATION
\
162 SQLITE_OMIT_AUTOINCREMENT
\
163 SQLITE_OMIT_AUTOINIT
\
164 SQLITE_OMIT_AUTOMATIC_INDEX
\
165 SQLITE_OMIT_AUTORESET
\
166 SQLITE_OMIT_AUTOVACUUM
\
167 SQLITE_OMIT_BETWEEN_OPTIMIZATION
\
168 SQLITE_OMIT_BLOB_LITERAL
\
169 SQLITE_OMIT_BTREECOUNT
\
170 SQLITE_OMIT_BUILTIN_TEST
\
173 SQLITE_OMIT_COMPILEOPTION_DIAGS
\
174 SQLITE_OMIT_COMPLETE
\
175 SQLITE_OMIT_COMPOUND_SELECT
\
176 SQLITE_OMIT_DATETIME_FUNCS
\
177 SQLITE_OMIT_DECLTYPE
\
178 SQLITE_OMIT_DEPRECATED
\
179 xxxSQLITE_OMIT_DISKIO
\
180 SQLITE_OMIT_EXPLAIN
\
181 SQLITE_OMIT_FLAG_PRAGMAS
\
182 SQLITE_OMIT_FLOATING_POINT
\
183 SQLITE_OMIT_FOREIGN_KEY
\
184 SQLITE_OMIT_GET_TABLE
\
185 SQLITE_OMIT_INCRBLOB
\
186 SQLITE_OMIT_INTEGRITY_CHECK
\
187 SQLITE_OMIT_LIKE_OPTIMIZATION
\
188 SQLITE_OMIT_LOAD_EXTENSION
\
189 SQLITE_OMIT_LOCALTIME
\
190 SQLITE_OMIT_LOOKASIDE
\
191 SQLITE_OMIT_MEMORYDB
\
192 SQLITE_OMIT_OR_OPTIMIZATION
\
193 SQLITE_OMIT_PAGER_PRAGMAS
\
195 SQLITE_OMIT_PROGRESS_CALLBACK
\
196 SQLITE_OMIT_QUICKBALANCE
\
197 SQLITE_OMIT_REINDEX
\
198 SQLITE_OMIT_SCHEMA_PRAGMAS
\
199 SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS
\
200 SQLITE_OMIT_SHARED_CACHE
\
201 SQLITE_OMIT_SUBQUERY
\
202 SQLITE_OMIT_TCL_VARIABLE
\
205 SQLITE_OMIT_TRIGGER
\
206 SQLITE_OMIT_TRUNCATE_OPTIMIZATION
\
207 SQLITE_OMIT_UNIQUE_ENFORCEMENT
\
211 SQLITE_OMIT_VIRTUALTABLE
\
214 SQLITE_OMIT_XFER_OPT
\
217 set ::ENABLE_SYMBOLS [list \
218 SQLITE_DISABLE_DIRSYNC
\
220 SQLITE_ENABLE_ATOMIC_WRITE
\
221 xxxSQLITE_ENABLE_CEROD
\
222 SQLITE_ENABLE_COLUMN_METADATA
\
223 SQLITE_ENABLE_EXPENSIVE_ASSERT
\
224 xxxSQLITE_ENABLE_FTS1
\
225 xxxSQLITE_ENABLE_FTS2
\
227 SQLITE_ENABLE_FTS3_PARENTHESIS
\
229 xxxSQLITE_ENABLE_ICU
\
230 SQLITE_ENABLE_IOTRACE
\
231 SQLITE_ENABLE_LOAD_EXTENSION
\
232 SQLITE_ENABLE_LOCKING_STYLE
\
233 SQLITE_ENABLE_MEMORY_MANAGEMENT
\
234 SQLITE_ENABLE_MEMSYS3
\
235 SQLITE_ENABLE_MEMSYS5
\
236 SQLITE_ENABLE_OVERSIZE_CELL_CHECK
\
237 SQLITE_ENABLE_RTREE
\
238 SQLITE_ENABLE_STAT2
\
239 SQLITE_ENABLE_UNLOCK_NOTIFY
\
240 SQLITE_ENABLE_UPDATE_DELETE_LIMIT
\
243 # Process any command line options.
244 process_options
$argv
246 if {[info exists
::SYMBOL] } {
249 if {[lsearch $::OMIT_SYMBOLS $sym]<0 && [lsearch $::ENABLE_SYMBOLS $sym]<0} {
250 puts stderr
"No such symbol: $sym"
254 set dirname
"test_[string range $sym 7 end]"
255 run_quick_test
$dirname $sym
257 # First try a test with all OMIT symbols except SQLITE_OMIT_FLOATING_POINT
258 # and SQLITE_OMIT_PRAGMA defined. The former doesn't work (causes segfaults)
259 # and the latter is currently incompatible with the test suite (this should
260 # be fixed, but it will be a lot of work).
262 foreach s
$::OMIT_SYMBOLS {
263 if {$s!="SQLITE_OMIT_FLOATING_POINT" && $s!="SQLITE_OMIT_PRAGMA"} {
267 run_quick_test test_OMIT_EVERYTHING
$allsyms
269 # Now try one quick.test with each of the OMIT symbols defined. Included
270 # are the OMIT_FLOATING_POINT and OMIT_PRAGMA symbols, even though we
271 # know they will fail. It's good to be reminded of this from time to time.
272 foreach sym
$::OMIT_SYMBOLS {
273 set dirname
"test_[string range $sym 7 end]"
274 run_quick_test
$dirname $sym
277 # Try the ENABLE/DISABLE symbols one at a time.
278 # We don't do them all at once since some are conflicting.
279 foreach sym
$::ENABLE_SYMBOLS {
280 set dirname
"test_[string range $sym 7 end]"
281 run_quick_test
$dirname $sym