File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / sqlite3 / tool / omittest.tcl
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 17:04:17 2012 UTC (12 years, 10 months ago) by misho
Branches: sqlite3, MAIN
CVS tags: v3_7_10, HEAD
sqlite3

    1: 
    2: set rcsid {$Id: omittest.tcl,v 1.1.1.1 2012/02/21 17:04:17 misho 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>