Annotation of embedaddon/sqlite3/tool/omittest.tcl, revision 1.1.1.1

1.1       misho       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:   } 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>