xref: /sqlite-3.40.0/tool/omittest.tcl (revision 38d69855)
1
2set 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.
6set ::USAGE_MESSAGE {
7This Tcl script is used to test the various compile time options
8available for omitting code (the SQLITE_OMIT_xxx options). It
9should be invoked as follows:
10
11    <script> ?test-symbol? ?-makefile PATH-TO-MAKEFILE? ?-skip_run?
12
13The default value for ::MAKEFILE is "../Makefile.linux.gcc".
14
15If -skip_run option is given then only the compile part is attempted.
16
17This script builds the testfixture program and runs the SQLite test suite
18once with each SQLITE_OMIT_ option defined and then once with all options
19defined together. Each run is performed in a seperate directory created
20as a sub-directory of the current directory by the script. The output
21of the build is saved in <sub-directory>/build.log. The output of the
22test-suite is saved in <sub-directory>/test.log.
23
24Almost any SQLite makefile (except those generated by configure - see below)
25should 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
32More 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
37Makefiles generated by the sqlite configure program cannot be used as
38they 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#
50proc 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#
126proc 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
172proc 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
299main $argv
300