1:
2: set rcsid {$Id: omittest.tcl,v 1.1.1.1 2012/02/21 17:04:17 misho Exp $}
3:
4: # Documentation for this script. This may be output to stderr
5: # if the script is invoked incorrectly.
6: set ::USAGE_MESSAGE {
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:
10:
11: <script> ?test-symbol? ?-makefile PATH-TO-MAKEFILE? ?-skip_run?
12:
13: The default value for ::MAKEFILE is "../Makefile.linux.gcc".
14:
15: If -skip_run option is given then only the compile part is attempted.
16:
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.
23:
24: Almost any SQLite makefile (except those generated by configure - see below)
25: should work. The following properties are required:
26:
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.
31:
32: More precisely, the following two invocations must be supported:
33:
34: $::MAKEBIN -f $::MAKEFILE testfixture OPTS="-DSQLITE_OMIT_ALTERTABLE=1"
35: $::MAKEBIN -f $::MAKEFILE test
36:
37: Makefiles generated by the sqlite configure program cannot be used as
38: they do not respect the OPTS variable.
39: }
40:
41:
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:
46: #
47: # run_quick_test /tmp/testdir {SQLITE_OMIT_TRIGGER SQLITE_OMIT_VIEW}
48: #
49: #
50: proc run_quick_test {dir omit_symbol_list} {
51: # Compile the value of the OPTS Makefile variable.
52: set opts ""
53: if {$::tcl_platform(platform)=="windows"} {
54: append opts "OPTS += -DSQLITE_OS_WIN=1\n"
55: set target "testfixture.exe"
56: } elseif {$::tcl_platform(platform)=="os2"} {
57: append opts "OPTS += -DSQLITE_OS_OS2=1\n"
58: } else {
59: append opts "OPTS += -DSQLITE_OS_UNIX=1\n"
60: }
61: foreach sym $omit_symbol_list {
62: append opts "OPTS += -D${sym}=1\n"
63: }
64:
65: # Create the directory and do the build. If an error occurs return
66: # early without attempting to run the test suite.
67: file mkdir $dir
68: puts -nonewline "Building $dir..."
69: flush stdout
70: catch {
71: file copy -force ./config.h $dir
72: file copy -force ./libtool $dir
73: }
74: set fd [open $::MAKEFILE]
75: set mkfile [read $fd]
76: close $fd
77: regsub {\ninclude} $mkfile "\n$opts\ninclude" mkfile
78: set fd [open $dir/makefile w]
79: puts $fd $mkfile
80: close $fd
81:
82: set rc [catch {
83: exec $::MAKEBIN -C $dir -f makefile clean $::TARGET >& $dir/build.log
84: }]
85: if {$rc} {
86: puts "No good. See $dir/build.log."
87: return
88: } else {
89: puts "Ok"
90: }
91:
92: # Create an empty file "$dir/sqlite3". This is to trick the makefile out
93: # of trying to build the sqlite shell. The sqlite shell won't build
94: # with some of the OMIT options (i.e OMIT_COMPLETE).
95: set sqlite3_dummy $dir/sqlite3
96: if {$::tcl_platform(platform)=="windows" || $::tcl_platform(platform)=="os2"} {
97: append sqlite3_dummy ".exe"
98: }
99: if {![file exists $sqlite3_dummy]} {
100: set wr [open $sqlite3_dummy w]
101: puts $wr "dummy"
102: close $wr
103: }
104:
105: if {$::SKIP_RUN} {
106: puts "Skip testing $dir."
107: } else {
108: # Run the test suite.
109: puts -nonewline "Testing $dir..."
110: flush stdout
111: set rc [catch {
112: exec $::MAKEBIN -C $dir -f makefile test >& $dir/test.log
113: }]
114: if {$rc} {
115: puts "No good. See $dir/test.log."
116: } else {
117: puts "Ok"
118: }
119: }
120: }
121:
122:
123: # This proc processes the command line options passed to this script.
124: # Currently the only option supported is "-makefile", default
125: # "../Makefile.linux-gcc". Set the ::MAKEFILE variable to the value of this
126: # option.
127: #
128: proc process_options {argv} {
129: set ::MAKEBIN make ;# Default value
130: if {$::tcl_platform(platform)=="windows" || $::tcl_platform(platform)=="os2"} {
131: set ::MAKEFILE ./Makefile ;# Default value on Windows and OS2
132: } else {
133: set ::MAKEFILE ./Makefile.linux-gcc ;# Default value
134: }
135: set ::SKIP_RUN 0 ;# Default to attempt test
136: set ::TARGET testfixture ;# Default thing to build
137:
138: for {set i 0} {$i < [llength $argv]} {incr i} {
139: switch -- [lindex $argv $i] {
140: -makefile {
141: incr i
142: set ::MAKEFILE [lindex $argv $i]
143: }
144:
145: -nmake {
146: set ::MAKEBIN nmake
147: set ::MAKEFILE ./Makefile.msc
148: }
149:
150: -target {
151: incr i
152: set ::TARGET [lindex $argv $i]
153: }
154:
155: -skip_run {
156: set ::SKIP_RUN 1
157: }
158:
159: default {
160: if {[info exists ::SYMBOL]} {
161: puts stderr [string trim $::USAGE_MESSAGE]
162: exit -1
163: }
164: set ::SYMBOL [lindex $argv $i]
165: }
166: }
167: set ::MAKEFILE [file normalize $::MAKEFILE]
168: }
169: }
170:
171: # Main routine.
172: #
173:
174: proc main {argv} {
175: # List of SQLITE_OMIT_XXX symbols supported by SQLite.
176: set ::OMIT_SYMBOLS [list \
177: SQLITE_OMIT_ALTERTABLE \
178: SQLITE_OMIT_ANALYZE \
179: SQLITE_OMIT_ATTACH \
180: SQLITE_OMIT_AUTHORIZATION \
181: SQLITE_OMIT_AUTOINCREMENT \
182: SQLITE_OMIT_AUTOINIT \
183: SQLITE_OMIT_AUTOMATIC_INDEX \
184: SQLITE_OMIT_AUTORESET \
185: SQLITE_OMIT_AUTOVACUUM \
186: SQLITE_OMIT_BETWEEN_OPTIMIZATION \
187: SQLITE_OMIT_BLOB_LITERAL \
188: SQLITE_OMIT_BTREECOUNT \
189: SQLITE_OMIT_BUILTIN_TEST \
190: SQLITE_OMIT_CAST \
191: SQLITE_OMIT_CHECK \
192: SQLITE_OMIT_COMPILEOPTION_DIAGS \
193: SQLITE_OMIT_COMPLETE \
194: SQLITE_OMIT_COMPOUND_SELECT \
195: SQLITE_OMIT_DATETIME_FUNCS \
196: SQLITE_OMIT_DECLTYPE \
197: SQLITE_OMIT_DEPRECATED \
198: SQLITE_OMIT_EXPLAIN \
199: SQLITE_OMIT_FLAG_PRAGMAS \
200: SQLITE_OMIT_FLOATING_POINT \
201: SQLITE_OMIT_FOREIGN_KEY \
202: SQLITE_OMIT_GET_TABLE \
203: SQLITE_OMIT_INCRBLOB \
204: SQLITE_OMIT_INTEGRITY_CHECK \
205: SQLITE_OMIT_LIKE_OPTIMIZATION \
206: SQLITE_OMIT_LOAD_EXTENSION \
207: SQLITE_OMIT_LOCALTIME \
208: SQLITE_OMIT_LOOKASIDE \
209: SQLITE_OMIT_MEMORYDB \
210: SQLITE_OMIT_OR_OPTIMIZATION \
211: SQLITE_OMIT_PAGER_PRAGMAS \
212: SQLITE_OMIT_PRAGMA \
213: SQLITE_OMIT_PROGRESS_CALLBACK \
214: SQLITE_OMIT_QUICKBALANCE \
215: SQLITE_OMIT_REINDEX \
216: SQLITE_OMIT_SCHEMA_PRAGMAS \
217: SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS \
218: SQLITE_OMIT_SHARED_CACHE \
219: SQLITE_OMIT_SUBQUERY \
220: SQLITE_OMIT_TCL_VARIABLE \
221: SQLITE_OMIT_TEMPDB \
222: SQLITE_OMIT_TRACE \
223: SQLITE_OMIT_TRIGGER \
224: SQLITE_OMIT_TRUNCATE_OPTIMIZATION \
225: SQLITE_OMIT_UNIQUE_ENFORCEMENT \
226: SQLITE_OMIT_UTF16 \
227: SQLITE_OMIT_VACUUM \
228: SQLITE_OMIT_VIEW \
229: SQLITE_OMIT_VIRTUALTABLE \
230: SQLITE_OMIT_WAL \
231: SQLITE_OMIT_WSD \
232: SQLITE_OMIT_XFER_OPT \
233: ]
234:
235: set ::ENABLE_SYMBOLS [list \
236: SQLITE_DISABLE_DIRSYNC \
237: SQLITE_DISABLE_LFS \
238: SQLITE_ENABLE_ATOMIC_WRITE \
239: SQLITE_ENABLE_COLUMN_METADATA \
240: SQLITE_ENABLE_EXPENSIVE_ASSERT \
241: SQLITE_ENABLE_FTS3 \
242: SQLITE_ENABLE_FTS3_PARENTHESIS \
243: SQLITE_ENABLE_FTS4 \
244: SQLITE_ENABLE_IOTRACE \
245: SQLITE_ENABLE_LOAD_EXTENSION \
246: SQLITE_ENABLE_LOCKING_STYLE \
247: SQLITE_ENABLE_MEMORY_MANAGEMENT \
248: SQLITE_ENABLE_MEMSYS3 \
249: SQLITE_ENABLE_MEMSYS5 \
250: SQLITE_ENABLE_OVERSIZE_CELL_CHECK \
251: SQLITE_ENABLE_RTREE \
252: SQLITE_ENABLE_STAT3 \
253: SQLITE_ENABLE_UNLOCK_NOTIFY \
254: SQLITE_ENABLE_UPDATE_DELETE_LIMIT \
255: ]
256:
257: # Process any command line options.
258: process_options $argv
259:
260: if {[info exists ::SYMBOL] } {
261: set sym $::SYMBOL
262:
263: if {[lsearch $::OMIT_SYMBOLS $sym]<0 && [lsearch $::ENABLE_SYMBOLS $sym]<0} {
264: puts stderr "No such symbol: $sym"
265: exit -1
266: }
267:
268: set dirname "test_[regsub -nocase {^x*SQLITE_} $sym {}]"
269: run_quick_test $dirname $sym
270: } else {
271: # First try a test with all OMIT symbols except SQLITE_OMIT_FLOATING_POINT
272: # and SQLITE_OMIT_PRAGMA defined. The former doesn't work (causes segfaults)
273: # and the latter is currently incompatible with the test suite (this should
274: # be fixed, but it will be a lot of work).
275: set allsyms [list]
276: foreach s $::OMIT_SYMBOLS {
277: if {$s!="SQLITE_OMIT_FLOATING_POINT" && $s!="SQLITE_OMIT_PRAGMA"} {
278: lappend allsyms $s
279: }
280: }
281: run_quick_test test_OMIT_EVERYTHING $allsyms
282:
283: # Now try one quick.test with each of the OMIT symbols defined. Included
284: # are the OMIT_FLOATING_POINT and OMIT_PRAGMA symbols, even though we
285: # know they will fail. It's good to be reminded of this from time to time.
286: foreach sym $::OMIT_SYMBOLS {
287: set dirname "test_[regsub -nocase {^x*SQLITE_} $sym {}]"
288: run_quick_test $dirname $sym
289: }
290:
291: # Try the ENABLE/DISABLE symbols one at a time.
292: # We don't do them all at once since some are conflicting.
293: foreach sym $::ENABLE_SYMBOLS {
294: set dirname "test_[regsub -nocase {^x*SQLITE_} $sym {}]"
295: run_quick_test $dirname $sym
296: }
297: }
298: }
299:
300: main $argv
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>