300 lines
		
	
	
		
			8.8 KiB
		
	
	
	
		
			Tcl
		
	
	
	
	
	
			
		
		
	
	
			300 lines
		
	
	
		
			8.8 KiB
		
	
	
	
		
			Tcl
		
	
	
	
	
	
| 
 | |
| set rcsid {$Id: omittest.tcl,v 1.8 2008/10/13 15:35:09 drh Exp $}
 | |
| 
 | |
| # Documentation for this script. This may be output to stderr
 | |
| # if the script is invoked incorrectly.
 | |
| set ::USAGE_MESSAGE {
 | |
| This Tcl script is used to test the various compile time options 
 | |
| available for omitting code (the SQLITE_OMIT_xxx options). It
 | |
| should be invoked as follows:
 | |
| 
 | |
|     <script> ?test-symbol? ?-makefile PATH-TO-MAKEFILE? ?-skip_run?
 | |
| 
 | |
| The default value for ::MAKEFILE is "../Makefile.linux.gcc".
 | |
| 
 | |
| If -skip_run option is given then only the compile part is attempted.
 | |
| 
 | |
| This script builds the testfixture program and runs the SQLite test suite
 | |
| once with each SQLITE_OMIT_ option defined and then once with all options
 | |
| defined together. Each run is performed in a seperate directory created
 | |
| as a sub-directory of the current directory by the script. The output
 | |
| of the build is saved in <sub-directory>/build.log. The output of the
 | |
| test-suite is saved in <sub-directory>/test.log.
 | |
| 
 | |
| Almost any SQLite makefile (except those generated by configure - see below)
 | |
| should work. The following properties are required:
 | |
| 
 | |
|   * The makefile should support the "testfixture" target.
 | |
|   * The makefile should support the "test" target.
 | |
|   * The makefile should support the variable "OPTS" as a way to pass
 | |
|     options from the make command line to lemon and the C compiler.
 | |
| 
 | |
| More precisely, the following two invocations must be supported:
 | |
| 
 | |
|   $::MAKEBIN -f $::MAKEFILE testfixture OPTS="-DSQLITE_OMIT_ALTERTABLE=1"
 | |
|   $::MAKEBIN -f $::MAKEFILE test
 | |
| 
 | |
| Makefiles generated by the sqlite configure program cannot be used as
 | |
| they do not respect the OPTS variable.
 | |
| }
 | |
| 
 | |
| 
 | |
| # Build a testfixture executable and run quick.test using it. The first
 | |
| # parameter is the name of the directory to create and use to run the
 | |
| # test in. The second parameter is a list of OMIT symbols to define
 | |
| # when doing so. For example:
 | |
| #
 | |
| #     run_quick_test /tmp/testdir {SQLITE_OMIT_TRIGGER SQLITE_OMIT_VIEW}
 | |
| #
 | |
| #
 | |
| proc run_quick_test {dir omit_symbol_list} {
 | |
|   # Compile the value of the OPTS Makefile variable.
 | |
|   set opts ""
 | |
|   if {$::tcl_platform(platform)=="windows"} {
 | |
|     append opts "OPTS += -DSQLITE_OS_WIN=1\n"
 | |
|     set target "testfixture.exe"
 | |
|   } else {
 | |
|     append opts "OPTS += -DSQLITE_OS_UNIX=1\n"
 | |
|   }
 | |
|   foreach sym $omit_symbol_list {
 | |
|     append opts "OPTS += -D${sym}=1\n"
 | |
|   }
 | |
| 
 | |
|   # Create the directory and do the build. If an error occurs return
 | |
|   # early without attempting to run the test suite.
 | |
|   file mkdir $dir
 | |
|   puts -nonewline "Building $dir..."
 | |
|   flush stdout
 | |
|   catch {
 | |
|     file copy -force ./config.h $dir
 | |
|     file copy -force ./libtool $dir
 | |
|   }
 | |
|   set fd [open $::MAKEFILE]
 | |
|   set mkfile [read $fd]
 | |
|   close $fd
 | |
|   regsub {\ninclude} $mkfile "\n$opts\ninclude" mkfile
 | |
|   set fd [open $dir/makefile w]
 | |
|   puts $fd $mkfile
 | |
|   close $fd
 | |
|   
 | |
|   set rc [catch {
 | |
|     exec $::MAKEBIN -C $dir -f makefile clean $::TARGET >& $dir/build.log
 | |
|   }]
 | |
|   if {$rc} {
 | |
|     puts "No good. See $dir/build.log."
 | |
|     return
 | |
|   } else {
 | |
|     puts "Ok"
 | |
|   }
 | |
|   
 | |
|   # Create an empty file "$dir/sqlite3". This is to trick the makefile out 
 | |
|   # of trying to build the sqlite shell. The sqlite shell won't build 
 | |
|   # with some of the OMIT options (i.e OMIT_COMPLETE).
 | |
|   set sqlite3_dummy $dir/sqlite3
 | |
|   if {$::tcl_platform(platform)=="windows"} {
 | |
|     append sqlite3_dummy ".exe"
 | |
|   }
 | |
|   if {![file exists $sqlite3_dummy]} {
 | |
|     set wr [open $sqlite3_dummy w]
 | |
|     puts $wr "dummy"
 | |
|     close $wr
 | |
|   }
 | |
| 
 | |
|   if {$::SKIP_RUN} {
 | |
|       puts "Skip testing $dir."
 | |
|   } else {
 | |
|     # Run the test suite.
 | |
|     puts -nonewline "Testing $dir..."
 | |
|     flush stdout
 | |
|     set rc [catch {
 | |
|       exec $::MAKEBIN -C $dir -f makefile test >& $dir/test.log
 | |
|     }]
 | |
|     if {$rc} {
 | |
|       puts "No good. See $dir/test.log."
 | |
|     } else {
 | |
|       puts "Ok"
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| 
 | |
| # This proc processes the command line options passed to this script.
 | |
| # Currently the only option supported is "-makefile", default
 | |
| # "../Makefile.linux-gcc". Set the ::MAKEFILE variable to the value of this
 | |
| # option.
 | |
| #
 | |
| proc process_options {argv} {
 | |
|   set ::MAKEBIN make                        ;# Default value
 | |
|   if {$::tcl_platform(platform)=="windows"} {
 | |
|     set ::MAKEFILE ./Makefile               ;# Default value on Windows
 | |
|   } else {
 | |
|     set ::MAKEFILE ./Makefile.linux-gcc     ;# Default value
 | |
|   }
 | |
|   set ::SKIP_RUN 0                          ;# Default to attempt test
 | |
|   set ::TARGET testfixture                  ;# Default thing to build
 | |
| 
 | |
|   for {set i 0} {$i < [llength $argv]} {incr i} {
 | |
|     switch -- [lindex $argv $i] {
 | |
|       -makefile {
 | |
|         incr i
 | |
|         set ::MAKEFILE [lindex $argv $i]
 | |
|       }
 | |
|   
 | |
|       -nmake {
 | |
|         set ::MAKEBIN nmake
 | |
|         set ::MAKEFILE ./Makefile.msc
 | |
|       }
 | |
| 
 | |
|       -target {
 | |
|         incr i
 | |
|         set ::TARGET [lindex $argv $i]
 | |
|       }
 | |
| 
 | |
|       -skip_run {
 | |
|         set ::SKIP_RUN 1
 | |
|       }
 | |
| 
 | |
|       default {
 | |
|         if {[info exists ::SYMBOL]} {
 | |
|           puts stderr [string trim $::USAGE_MESSAGE]
 | |
|           exit -1
 | |
|         }
 | |
|         set ::SYMBOL [lindex $argv $i]
 | |
|       }
 | |
|     }
 | |
|     set ::MAKEFILE [file normalize $::MAKEFILE]
 | |
|   }
 | |
| }
 | |
| 
 | |
| # Main routine.
 | |
| #
 | |
| 
 | |
| proc main {argv} {
 | |
|   # List of SQLITE_OMIT_XXX symbols supported by SQLite.
 | |
|   set ::OMIT_SYMBOLS [list \
 | |
|     SQLITE_OMIT_ALTERTABLE \
 | |
|     SQLITE_OMIT_ANALYZE \
 | |
|     SQLITE_OMIT_ATTACH \
 | |
|     SQLITE_OMIT_AUTHORIZATION \
 | |
|     SQLITE_OMIT_AUTOINCREMENT \
 | |
|     SQLITE_OMIT_AUTOINIT \
 | |
|     SQLITE_OMIT_AUTOMATIC_INDEX \
 | |
|     SQLITE_OMIT_AUTORESET \
 | |
|     SQLITE_OMIT_AUTOVACUUM \
 | |
|     SQLITE_OMIT_BETWEEN_OPTIMIZATION \
 | |
|     SQLITE_OMIT_BLOB_LITERAL \
 | |
|     SQLITE_OMIT_BTREECOUNT \
 | |
|     SQLITE_OMIT_BUILTIN_TEST \
 | |
|     SQLITE_OMIT_CAST \
 | |
|     SQLITE_OMIT_CHECK \
 | |
|     SQLITE_OMIT_COMPILEOPTION_DIAGS \
 | |
|     SQLITE_OMIT_COMPLETE \
 | |
|     SQLITE_OMIT_COMPOUND_SELECT \
 | |
|     SQLITE_OMIT_CTE \
 | |
|     SQLITE_OMIT_DATETIME_FUNCS \
 | |
|     SQLITE_OMIT_DECLTYPE \
 | |
|     SQLITE_OMIT_DEPRECATED \
 | |
|     SQLITE_OMIT_EXPLAIN \
 | |
|     SQLITE_OMIT_FLAG_PRAGMAS \
 | |
|     SQLITE_OMIT_FLOATING_POINT \
 | |
|     SQLITE_OMIT_FOREIGN_KEY \
 | |
|     SQLITE_OMIT_GET_TABLE \
 | |
|     SQLITE_OMIT_INCRBLOB \
 | |
|     SQLITE_OMIT_INTEGRITY_CHECK \
 | |
|     SQLITE_OMIT_LIKE_OPTIMIZATION \
 | |
|     SQLITE_OMIT_LOAD_EXTENSION \
 | |
|     SQLITE_OMIT_LOCALTIME \
 | |
|     SQLITE_OMIT_LOOKASIDE \
 | |
|     SQLITE_OMIT_MEMORYDB \
 | |
|     SQLITE_OMIT_OR_OPTIMIZATION \
 | |
|     SQLITE_OMIT_PAGER_PRAGMAS \
 | |
|     SQLITE_OMIT_PRAGMA \
 | |
|     SQLITE_OMIT_PROGRESS_CALLBACK \
 | |
|     SQLITE_OMIT_QUICKBALANCE \
 | |
|     SQLITE_OMIT_REINDEX \
 | |
|     SQLITE_OMIT_SCHEMA_PRAGMAS \
 | |
|     SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS \
 | |
|     SQLITE_OMIT_SHARED_CACHE \
 | |
|     SQLITE_OMIT_SUBQUERY \
 | |
|     SQLITE_OMIT_TCL_VARIABLE \
 | |
|     SQLITE_OMIT_TEMPDB \
 | |
|     SQLITE_OMIT_TRACE \
 | |
|     SQLITE_OMIT_TRIGGER \
 | |
|     SQLITE_OMIT_TRUNCATE_OPTIMIZATION \
 | |
|     SQLITE_OMIT_UNIQUE_ENFORCEMENT \
 | |
|     SQLITE_OMIT_UTF16 \
 | |
|     SQLITE_OMIT_VACUUM \
 | |
|     SQLITE_OMIT_VIEW \
 | |
|     SQLITE_OMIT_VIRTUALTABLE \
 | |
|     SQLITE_OMIT_WAL \
 | |
|     SQLITE_OMIT_WSD \
 | |
|     SQLITE_OMIT_XFER_OPT \
 | |
|   ]
 | |
| 
 | |
|   set ::ENABLE_SYMBOLS [list \
 | |
|     SQLITE_DISABLE_DIRSYNC \
 | |
|     SQLITE_DISABLE_LFS \
 | |
|     SQLITE_ENABLE_ATOMIC_WRITE \
 | |
|     SQLITE_ENABLE_COLUMN_METADATA \
 | |
|     SQLITE_ENABLE_EXPENSIVE_ASSERT \
 | |
|     SQLITE_ENABLE_FTS3 \
 | |
|     SQLITE_ENABLE_FTS3_PARENTHESIS \
 | |
|     SQLITE_ENABLE_FTS4 \
 | |
|     SQLITE_ENABLE_IOTRACE \
 | |
|     SQLITE_ENABLE_LOAD_EXTENSION \
 | |
|     SQLITE_ENABLE_LOCKING_STYLE \
 | |
|     SQLITE_ENABLE_MEMORY_MANAGEMENT \
 | |
|     SQLITE_ENABLE_MEMSYS3 \
 | |
|     SQLITE_ENABLE_MEMSYS5 \
 | |
|     SQLITE_ENABLE_OVERSIZE_CELL_CHECK \
 | |
|     SQLITE_ENABLE_RTREE \
 | |
|     SQLITE_ENABLE_STAT3 \
 | |
|     SQLITE_ENABLE_UNLOCK_NOTIFY \
 | |
|     SQLITE_ENABLE_UPDATE_DELETE_LIMIT \
 | |
|   ]
 | |
| 
 | |
|   # Process any command line options.
 | |
|   process_options $argv
 | |
| 
 | |
|   if {[info exists ::SYMBOL] } {
 | |
|     set sym $::SYMBOL
 | |
| 
 | |
|     if {[lsearch $::OMIT_SYMBOLS $sym]<0 && [lsearch $::ENABLE_SYMBOLS $sym]<0} {
 | |
|       puts stderr "No such symbol: $sym"
 | |
|       exit -1
 | |
|     }
 | |
| 
 | |
|     set dirname "test_[regsub -nocase {^x*SQLITE_} $sym {}]"
 | |
|     run_quick_test $dirname $sym
 | |
|   } else {
 | |
|     # First try a test with all OMIT symbols except SQLITE_OMIT_FLOATING_POINT 
 | |
|     # and SQLITE_OMIT_PRAGMA defined. The former doesn't work (causes segfaults)
 | |
|     # and the latter is currently incompatible with the test suite (this should
 | |
|     # be fixed, but it will be a lot of work).
 | |
|     set allsyms [list]
 | |
|     foreach s $::OMIT_SYMBOLS {
 | |
|       if {$s!="SQLITE_OMIT_FLOATING_POINT" && $s!="SQLITE_OMIT_PRAGMA"} {
 | |
|         lappend allsyms $s
 | |
|       }
 | |
|     }
 | |
|     run_quick_test test_OMIT_EVERYTHING $allsyms
 | |
|   
 | |
|     # Now try one quick.test with each of the OMIT symbols defined. Included
 | |
|     # are the OMIT_FLOATING_POINT and OMIT_PRAGMA symbols, even though we
 | |
|     # know they will fail. It's good to be reminded of this from time to time.
 | |
|     foreach sym $::OMIT_SYMBOLS {
 | |
|       set dirname "test_[regsub -nocase {^x*SQLITE_} $sym {}]"
 | |
|       run_quick_test $dirname $sym
 | |
|     }
 | |
|   
 | |
|     # Try the ENABLE/DISABLE symbols one at a time.  
 | |
|     # We don't do them all at once since some are conflicting.
 | |
|     foreach sym $::ENABLE_SYMBOLS {
 | |
|       set dirname "test_[regsub -nocase {^x*SQLITE_} $sym {}]"
 | |
|       run_quick_test $dirname $sym
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| main $argv
 | 
