Annotation of embedaddon/sqlite3/tool/omittest.tcl, revision 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>