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 |