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