AryaWu/sqlite
0
1 2 3 4namespace eval trd {5 variable tcltest6 variable extra7 variable all_configs8 variable build9 10 11 # Tcl tests to run for various builds.12 #13 set tcltest(linux.Fast-One) veryquick14 set tcltest(linux.Debug-One) veryquick15 set tcltest(linux.Debug-Two) veryquick16 set tcltest(linux.Have-Not) veryquick17 set tcltest(linux.Secure-Delete) veryquick18 set tcltest(linux.Unlock-Notify) veryquick19 set tcltest(linux.Update-Delete-Limit) veryquick20 set tcltest(linux.Extra-Robustness) veryquick21 set tcltest(linux.Device-Two) veryquick22 set tcltest(linux.No-lookaside) veryquick23 set tcltest(linux.Devkit) veryquick24 set tcltest(linux.Apple) veryquick25 set tcltest(linux.Android) veryquick26 set tcltest(linux.Sanitize) veryquick27 set tcltest(linux.Device-One) all28 set tcltest(linux.Default) all_plus_autovacuum_crash29 set tcltest(linux.Valgrind) valgrind30 31 set tcltest(osx.Locking-Style) veryquick32 set tcltest(osx.Have-Not) veryquick33 set tcltest(osx.Apple) all_less_no_mutex_try34 35 set tcltest(win.Stdcall) veryquick36 set tcltest(win.Have-Not) veryquick37 set tcltest(win.Windows-Memdebug) veryquick38 set tcltest(win.Windows-Win32Heap) veryquick39 set tcltest(win.Windows-Sanitize) veryquick40 set tcltest(win.Default) {full win_unc_locking}41 42 # Extra [make xyz] tests that should be run for various builds.43 #44 set extra(linux.Check-Symbols) checksymbols45 set extra(linux.Fast-One) {fuzztest sourcetest}46 set extra(linux.Debug-One) {fuzztest sourcetest mptest}47 set extra(linux.Debug-Two) {fuzztest sourcetest}48 set extra(linux.Have-Not) {fuzztest sourcetest}49 set extra(linux.Secure-Delete) {fuzztest sourcetest}50 set extra(linux.Unlock-Notify) {fuzztest sourcetest}51 set extra(linux.Update-Delete-Limit) {fuzztest sourcetest}52 set extra(linux.Extra-Robustness) {fuzztest sourcetest}53 set extra(linux.Device-Two) {fuzztest sourcetest threadtest}54 set extra(linux.No-lookaside) {fuzztest sourcetest}55 set extra(linux.Devkit) {fuzztest sourcetest}56 set extra(linux.Android) {fuzztest sourcetest}57 set extra(linux.Apple) {fuzztest sourcetest}58 set extra(linux.Sanitize) {fuzztest sourcetest}59 set extra(linux.Default) {fuzztest sourcetest threadtest}60 61 set extra(osx.Apple) {fuzztest threadtest}62 set extra(osx.Have-Not) {fuzztest sourcetest}63 set extra(osx.Locking-Style) {mptest fuzztest sourcetest}64 65 set extra(win.Default) mptest66 set extra(win.Stdcall) {fuzztest sourcetest}67 set extra(win.Windows-Memdebug) {fuzztest sourcetest}68 set extra(win.Windows-Win32Heap) {fuzztest sourcetest}69 set extra(win.Windows-Sanitize) fuzztest70 set extra(win.Have-Not) {fuzztest sourcetest}71 72 # The following mirrors the set of test suites invoked by "all.test".73 #74 set all_configs {75 full no_optimization memsubsys1 memsubsys2 singlethread76 multithread onefile utf16 exclusive persistent_journal77 persistent_journal_error no_journal no_journal_error78 autovacuum_ioerr no_mutex_try fullmutex journaltest79 inmemory_journal pcache0 pcache10 pcache50 pcache9080 pcache100 prepare mmap81 }82 83 #-----------------------------------------------------------------------84 # Start of build() definitions.85 #86 set build(Default) {87 -O288 --disable-amalgamation --disable-shared89 --enable-session90 -DSQLITE_ENABLE_RBU91 -DSQLITE_ENABLE_STMT_SCANSTATUS92 }93 94 # These two are used by [testrunner.tcl mdevtest] (All-O0) and95 # [testrunner.tcl sdevtest] (All-Sanitize).96 #97 set build(All-Debug) {98 --with-debug --enable-all99 -DSQLITE_ENABLE_ORDERED_SET_AGGREGATES100 -DSQLITE_ENABLE_NORMALIZE101 }102 set build(All-O0) {103 -O0 --enable-all104 }105 set build(All-Sanitize) {106 -DSQLITE_OMIT_LOOKASIDE=1107 --enable-all -fsanitize=address,undefined -fno-sanitize-recover=undefined108 }109 110 set build(Sanitize) {111 CC=clang -fsanitize=address,undefined -fno-sanitize-recover=undefined112 -DSQLITE_ENABLE_STAT4113 -DSQLITE_OMIT_LOOKASIDE=1114 -DSQLITE_ENABLE_NORMALIZE115 -DCONFIG_SLOWDOWN_FACTOR=5.0116 -DSQLITE_ENABLE_RBU117 --with-debug118 --enable-all119 }120 set build(Stdcall) {121 -DWITHOUT_JIMSH=1122 -DUSE_STDCALL=1123 -DSQLITE_USE_ONLY_WIN32=1124 -O2125 }126 127 # The "Have-Not" configuration sets all possible -UHAVE_feature options128 # in order to verify that the code works even on platforms that lack129 # these support services.130 set build(Have-Not) {131 -DHAVE_FDATASYNC=0132 -DHAVE_GMTIME_R=0133 -DHAVE_ISNAN=0134 -DHAVE_LOCALTIME_R=0135 -DHAVE_LOCALTIME_S=0136 -DHAVE_MALLOC_USABLE_SIZE=0137 -DHAVE_STRCHRNUL=0138 -DHAVE_USLEEP=0139 -DHAVE_UTIME=0140 }141 set build(Unlock-Notify) {142 -O2143 -DSQLITE_ENABLE_UNLOCK_NOTIFY144 -DSQLITE_THREADSAFE145 -DSQLITE_TCL_DEFAULT_FULLMUTEX=1146 }147 set build(Secure-Delete) {148 -O2149 -DSQLITE_SECURE_DELETE=1150 -DSQLITE_SOUNDEX=1151 }152 set build(Update-Delete-Limit) {153 -O2154 -DSQLITE_DEFAULT_FILE_FORMAT=4155 -DSQLITE_ENABLE_UPDATE_DELETE_LIMIT=1156 -DSQLITE_ENABLE_STMT_SCANSTATUS157 -DSQLITE_LIKE_DOESNT_MATCH_BLOBS158 -DSQLITE_ENABLE_CURSOR_HINTS159 }160 set build(Check-Symbols) {161 -DSQLITE_MEMDEBUG=1162 -DSQLITE_ENABLE_FTS3_PARENTHESIS=1163 -DSQLITE_ENABLE_FTS3=1164 -DSQLITE_ENABLE_RTREE=1165 -DSQLITE_ENABLE_MEMSYS5=1166 -DSQLITE_ENABLE_MEMSYS3=1167 -DSQLITE_ENABLE_COLUMN_METADATA=1168 -DSQLITE_ENABLE_UPDATE_DELETE_LIMIT=1169 -DSQLITE_SECURE_DELETE=1170 -DSQLITE_SOUNDEX=1171 -DSQLITE_ENABLE_ATOMIC_WRITE=1172 -DSQLITE_ENABLE_MEMORY_MANAGEMENT=1173 -DSQLITE_ENABLE_NORMALIZE174 -DSQLITE_ENABLE_OVERSIZE_CELL_CHECK=1175 -DSQLITE_ENABLE_STAT4176 -DSQLITE_ENABLE_STMT_SCANSTATUS177 --enable-fts5 --enable-session178 }179 set build(Debug-One) {180 --disable-shared181 -O2 -funsigned-char182 -DSQLITE_DEBUG=1183 -DSQLITE_MEMDEBUG=1184 -DSQLITE_MUTEX_NOOP=1185 -DSQLITE_TCL_DEFAULT_FULLMUTEX=1186 -DSQLITE_ENABLE_FTS3=1187 -DSQLITE_ENABLE_RTREE=1188 -DSQLITE_ENABLE_MEMSYS5=1189 -DSQLITE_ENABLE_NORMALIZE190 -DSQLITE_ENABLE_COLUMN_METADATA=1191 -DSQLITE_ENABLE_STAT4192 -DSQLITE_ENABLE_HIDDEN_COLUMNS193 -DSQLITE_MAX_ATTACHED=125194 -DSQLITE_MUTATION_TEST195 --enable-fts5196 }197 set build(Debug-Two) {198 -DSQLITE_DEFAULT_MEMSTATUS=0199 -DSQLITE_MAX_EXPR_DEPTH=0200 --with-debug201 }202 set build(Fast-One) {203 -O6204 -DSQLITE_ENABLE_FTS4=1205 -DSQLITE_ENABLE_RTREE=1206 -DSQLITE_ENABLE_STAT4207 -DSQLITE_ENABLE_RBU208 -DSQLITE_MAX_ATTACHED=125209 -DSQLITE_MAX_MMAP_SIZE=12884901888210 -DSQLITE_ENABLE_SORTER_MMAP=1211 --enable-session212 }213 set build(Device-One) {214 -O2215 -DSQLITE_DEBUG=1216 -DSQLITE_DEFAULT_AUTOVACUUM=1217 -DSQLITE_DEFAULT_CACHE_SIZE=64218 -DSQLITE_DEFAULT_PAGE_SIZE=1024219 -DSQLITE_DEFAULT_TEMP_CACHE_SIZE=32220 -DSQLITE_DISABLE_LFS=1221 -DSQLITE_ENABLE_ATOMIC_WRITE=1222 -DSQLITE_ENABLE_IOTRACE=1223 -DSQLITE_ENABLE_MEMORY_MANAGEMENT=1224 -DSQLITE_MAX_PAGE_SIZE=4096225 -DSQLITE_OMIT_LOAD_EXTENSION=1226 -DSQLITE_OMIT_PROGRESS_CALLBACK=1227 -DSQLITE_OMIT_VIRTUALTABLE=1228 -DSQLITE_ENABLE_HIDDEN_COLUMNS229 -DSQLITE_TEMP_STORE=3230 }231 set build(Device-Two) {232 -DSQLITE_4_BYTE_ALIGNED_MALLOC=1233 -DSQLITE_DEFAULT_AUTOVACUUM=1234 -DSQLITE_DEFAULT_CACHE_SIZE=1000235 -DSQLITE_DEFAULT_LOCKING_MODE=0236 -DSQLITE_DEFAULT_PAGE_SIZE=1024237 -DSQLITE_DEFAULT_TEMP_CACHE_SIZE=1000238 -DSQLITE_DISABLE_LFS=1239 -DSQLITE_ENABLE_FTS3=1240 -DSQLITE_ENABLE_MEMORY_MANAGEMENT=1241 -DSQLITE_ENABLE_RTREE=1242 -DSQLITE_MAX_COMPOUND_SELECT=50243 -DSQLITE_MAX_PAGE_SIZE=32768244 -DSQLITE_OMIT_TRACE=1245 -DSQLITE_TEMP_STORE=3246 -DSQLITE_THREADSAFE=2247 --enable-fts5 --enable-session248 }249 set build(Locking-Style) {250 -O2251 -DSQLITE_ENABLE_LOCKING_STYLE=1252 }253 set build(Android) {254 -Os255 -DHAVE_USLEEP=1256 -DSQLITE_HAVE_ISNAN257 -DSQLITE_POWERSAFE_OVERWRITE=1258 -DSQLITE_DEFAULT_FILE_FORMAT=4259 -DSQLITE_DEFAULT_AUTOVACUUM=1260 -DSQLITE_ENABLE_MEMORY_MANAGEMENT=1261 -DSQLITE_ENABLE_FTS3262 -DSQLITE_ENABLE_FTS3_BACKWARDS263 -DSQLITE_ENABLE_FTS4264 -DSQLITE_SECURE_DELETE265 -DSQLITE_ENABLE_BATCH_ATOMIC_WRITE266 -DBIONIC_IOCTL_NO_SIGNEDNESS_OVERLOAD267 -DSQLITE_ALLOW_ROWID_IN_VIEW268 -DSQLITE_ENABLE_BYTECODE_VTAB269 -Wno-unused-parameter270 -Werror271 -DUSE_PREAD64272 -Dfdatasync=fdatasync273 -DHAVE_MALLOC_H=1274 -DHAVE_MALLOC_USABLE_SIZE275 -DSQLITE_ENABLE_DBSTAT_VTAB276 }277 # Compile-options used by Android but omitted from these278 # tests:279 # -DNDEBUG=1280 # -DSQLITE_DEFAULT_LEGACY_ALTER_TABLE281 # -DSQLITE_DEFAULT_JOURNAL_SIZE_LIMIT=1048576282 # -DSQLITE_DEFAULT_FILE_PERMISSIONS=0600283 # -DSQLITE_OMIT_BUILTIN_TEST284 # -DSQLITE_OMIT_LOAD_EXTENSION285 # -DSQLITE_OMIT_COMPILEOPTION_DIAGS286 #287 set build(Apple) {288 -Os289 -DHAVE_GMTIME_R=1290 -DHAVE_ISNAN=1291 -DHAVE_LOCALTIME_R=1292 -DHAVE_PREAD=1293 -DHAVE_PWRITE=1294 -DHAVE_UTIME=1295 -DSQLITE_DEFAULT_CACHE_SIZE=1000296 -DSQLITE_DEFAULT_CKPTFULLFSYNC=1297 -DSQLITE_DEFAULT_MEMSTATUS=1298 -DSQLITE_DEFAULT_PAGE_SIZE=1024299 -DSQLITE_DISABLE_PAGECACHE_OVERFLOW_STATS=1300 -DSQLITE_ENABLE_API_ARMOR=1301 -DSQLITE_ENABLE_AUTO_PROFILE=1302 -DSQLITE_ENABLE_FLOCKTIMEOUT=1303 -DSQLITE_ENABLE_FTS3=1304 -DSQLITE_ENABLE_FTS3_PARENTHESIS=1305 -DSQLITE_ENABLE_FTS3_TOKENIZER=1306 -DSQLITE_ENABLE_NORMALIZE=1307 -DSQLITE_ENABLE_PERSIST_WAL=1308 -DSQLITE_ENABLE_PURGEABLE_PCACHE=1309 -DSQLITE_ENABLE_RTREE=1310 -DSQLITE_ENABLE_SETLK_TIMEOUT=2311 -DSQLITE_ENABLE_SNAPSHOT=1312 -DSQLITE_ENABLE_UPDATE_DELETE_LIMIT=1313 -DSQLITE_MAX_LENGTH=2147483645314 -DSQLITE_MAX_VARIABLE_NUMBER=500000315 -DSQLITE_NO_SYNC=1316 -DSQLITE_OMIT_AUTORESET=1317 -DSQLITE_OMIT_LOAD_EXTENSION=1318 -DSQLITE_PREFER_PROXY_LOCKING=1319 -DSQLITE_SERIES_CONSTRAINT_VERIFY=1320 -DSQLITE_THREADSAFE=2321 -DSQLITE_USE_URI=1322 -DSQLITE_WRITE_WALFRAME_PREBUFFERED=1323 -DUSE_GUARDED_FD=1324 -DUSE_PREAD=1325 --enable-fts5326 }327 set build(Extra-Robustness) {328 -DSQLITE_ENABLE_OVERSIZE_CELL_CHECK=1329 -DSQLITE_MAX_ATTACHED=62330 }331 set build(Devkit) {332 -DSQLITE_DEFAULT_FILE_FORMAT=4333 -DSQLITE_MAX_ATTACHED=30334 -DSQLITE_ENABLE_COLUMN_METADATA335 -DSQLITE_ENABLE_FTS4336 -DSQLITE_ENABLE_FTS5337 -DSQLITE_ENABLE_FTS4_PARENTHESIS338 -DSQLITE_DISABLE_FTS4_DEFERRED339 -DSQLITE_ENABLE_RTREE340 --enable-fts5341 }342 set build(No-lookaside) {343 -DSQLITE_TEST_REALLOC_STRESS=1344 -DSQLITE_OMIT_LOOKASIDE=1345 }346 set build(Valgrind) {347 -DSQLITE_ENABLE_STAT4348 -DSQLITE_ENABLE_FTS4349 -DSQLITE_ENABLE_RTREE350 -DSQLITE_ENABLE_HIDDEN_COLUMNS351 -DCONFIG_SLOWDOWN_FACTOR=8.0352 }353 354 set build(Windows-Memdebug) {355 MEMDEBUG=1356 DEBUG=3357 }358 set build(Windows-Win32Heap) {359 WIN32HEAP=1360 DEBUG=4361 ENABLE_SETLK=1362 }363 set build(Windows-Sanitize) {364 ASAN=1365 }366}367 368 369#-------------------------------------------------------------------------370proc trd_import {} {371 uplevel {372 variable ::trd::tcltest373 variable ::trd::extra374 variable ::trd::all_configs375 variable ::trd::build376 }377}378 379proc trd_builds {platform} {380 trd_import381 382 set klist [lsort -uniq [concat \383 [array names tcltest ${platform}.*] \384 [array names extra ${platform}.*] \385 ]]386 if {[llength $klist]==0} {387 error "no such platform: $platform"388 }389 390 set ret ""391 foreach k $klist {392 foreach {p c} [split $k "."] {}393 lappend ret $c394 }395 set ret396}397 398proc trd_configs {platform bld} {399 trd_import400 401 set clist [list]402 403 if {[info exists tcltest($platform.$bld)]} {404 set clist $tcltest($platform.$bld)405 if {$clist=="all"} {406 set clist $all_configs407 } elseif {$clist=="all_plus_autovacuum_crash"} {408 set clist [concat $all_configs autovacuum_crash]409 } elseif {$clist=="all_less_no_mutex_try"} {410 set idx [lsearch $all_configs no_mutex_try]411 set clist [lreplace $all_configs $idx $idx]412 }413 }414 415 set clist416}417 418proc trd_extras {platform bld} {419 trd_import420 if {[info exists extra($platform.$bld)]==0} { return [list] }421 return $extra($platform.$bld)422}423 424# Usage: 425#426# trd_fuzztest_data $buildname427#428# This returns data used by testrunner.tcl to run commands equivalent 429# to [make fuzztest]. The returned value is a list, which should be430# interpreted as a sequence of pairs. The first element of each pair431# is an interpreter name. The second element is a list of files.432# testrunner.tcl automatically creates one job to build each interpreter,433# and one to run each of the files with it once it has been built.434#435# In practice, the returned value looks like this:436#437# {438# {fuzzcheck {$testdir/fuzzdata1.db $testdir/fuzzdata2.db ...}}439# {{sessionfuzz run} $testdir/sessionfuzz-data1.db}440# }441#442# where $testdir is replaced by the full-path to the test-directory (the443# directory containing this file). "fuzzcheck" and "sessionfuzz" have .exe444# extensions on windows.445#446proc trd_fuzztest_data {buildname} {447 set EXE ""448 set lFuzzDb [glob [file join $::testdir fuzzdata*.db]] 449 set lSessionDb [glob [file join $::testdir sessionfuzz-data*.db]]450 set sanBuilds {All-Debug Apple Have-Not Update-Delete-Limit}451 452 if {$::tcl_platform(platform) eq "windows"} {453 return [list fuzzcheck.exe $lFuzzDb]454 } else {455 set lRet [list [trd_get_bin_name fuzzcheck] $lFuzzDb]456 if {[lsearch $sanBuilds $buildname]>=0} {457 lappend lRet [trd_get_bin_name fuzzcheck-asan] $lFuzzDb 458 if {$::tcl_platform(os) ne "OpenBSD"} {459 lappend lRet [trd_get_bin_name fuzzcheck-ubsan] $lFuzzDb 460 }461 }462 lappend lRet {sessionfuzz run} $lSessionDb463 return $lRet464 }465}466 467 468proc trd_all_configs {} {469 trd_import470 set all_configs471}472 473proc trimscript {text} {474 set text [string map {"\n " "\n"} [string trim $text]]475}476 477proc make_sh_script {srcdir opts cflags makeOpts configOpts} {478 479 set tcldir [::tcl::pkgconfig get libdir,install]480 set myopts ""481 if {[info exists ::env(OPTS)]} {482 append myopts "# From environment variable:\n"483 append myopts "OPTS=$::env(OPTS)\n\n"484 }485 foreach o [lsort $opts] { 486 append myopts "OPTS=\"\$OPTS $o\"\n"487 }488 489 return [trimscript [subst -nocommands {490 set -e491 if [ "\$#" -ne 1 ] ; then492 echo "Usage: \$0 <target>"493 exit -1494 fi495 496 SRCDIR="$srcdir"497 TCLDIR="$tcldir"498 499 if [ ! -f Makefile ] ; then500 \$SRCDIR/configure --with-tcl=\$TCLDIR $configOpts 501 fi502 503 $myopts504 CFLAGS="$cflags"505 506 make \$1 "CFLAGS=\$CFLAGS" "OPTS=\$OPTS" $makeOpts507 }]]508}509 510# Generate the text of a *.bat script.511#512proc make_bat_file {srcdir opts cflags makeOpts} {513 set srcdir [file nativename [file normalize $srcdir]]514 515 return [trimscript [subst -nocommands {516 set TARGET=%1517 set TMP=%CD%518 nmake /f $srcdir\\Makefile.msc TOP="$srcdir" %TARGET% "CCOPTS=$cflags" "OPTS=$opts" $makeOpts519 }]]520}521 522 523# Generate the text of a shell script.524#525proc make_script {cfg srcdir bMsvc} {526 set opts [list] ;# OPTS value527 set cflags [expr {$bMsvc ? "-Zi" : "-g"}] ;# CFLAGS value528 set makeOpts [list] ;# Extra args for [make]529 set configOpts [list] ;# Extra args for [configure]530 531 # Define either SQLITE_OS_WIN or SQLITE_OS_UNIX, as appropriate.532 if {$::tcl_platform(os) eq "Windows NT"} {533 lappend opts -DSQLITE_OS_WIN=1534 } else {535 lappend opts -DSQLITE_OS_UNIX=1536 }537 538 # Unless the configuration specifies -DHAVE_USLEEP=0, set -DHAVE_USLEEP=1.539 #540 if {[lsearch $cfg "-DHAVE_USLEEP=0"]<0} {541 lappend cfg -DHAVE_USLEEP=1542 }543 544 # Loop through the parameters of the nominated configuration, updating545 # $opts, $cflags, $makeOpts and $configOpts along the way. Rules are as546 # follows:547 #548 # 1. If the parameter begins with "-D", add it to $opts.549 #550 # 2. If the parameter begins with "--" add it to $configOpts. Unless551 # this command is preparing a script for MSVC - then add an 552 # equivalent to $makeOpts or $opts.553 #554 # 3. If the parameter begins with "-" add it to $cflags. If in MSVC555 # mode and the parameter is an -O<integer> option, instead add556 # an OPTIMIZATIONS=<integer> switch to $makeOpts.557 #558 # 4. If none of the above apply, add the parameter to $makeOpts559 #560 foreach param $cfg {561 562 if {[string range $param 0 1]=="-D"} {563 lappend opts $param564 continue565 }566 567 if {[string range $param 0 1]=="--"} {568 if {$bMsvc==0} {569 lappend configOpts $param570 } else {571 572 switch -- $param {573 --disable-amalgamation {574 lappend makeOpts USE_AMALGAMATION=0575 }576 --disable-shared {577 lappend makeOpts USE_CRT_DLL=0 DYNAMIC_SHELL=0578 }579 --enable-fts5 {580 lappend opts -DSQLITE_ENABLE_FTS5581 }582 --enable-shared {583 lappend makeOpts USE_CRT_DLL=1 DYNAMIC_SHELL=1584 }585 --enable-session {586 lappend opts -DSQLITE_ENABLE_PREUPDATE_HOOK587 lappend opts -DSQLITE_ENABLE_SESSION588 }589 --enable-all {590 }591 --with-debug {592 # lappend makeOpts OPTIMIZATIONS=0593 lappend opts -DSQLITE_DEBUG594 }595 default {596 error "Cannot translate $param for MSVC"597 }598 }599 }600 601 continue602 }603 604 if {[string range $param 0 0]=="-"} {605 606 if {$bMsvc} {607 if {[regexp -- {^-O(\d+)$} $param -> level]} {608 lappend makeOpts OPTIMIZATIONS=$level609 continue610 }611 if {$param eq "-fsanitize=address,undefined"} {612 lappend makeOpts ASAN=1613 continue614 }615 }616 617 lappend cflags $param618 continue619 }620 621 lappend makeOpts $param622 }623 624 if {$bMsvc==0} {625 set zRet [make_sh_script $srcdir $opts $cflags $makeOpts $configOpts]626 } else {627 set zRet [make_bat_file $srcdir $opts $cflags $makeOpts]628 }629}630 631# Usage:632#633# trd_buildscript CONFIG SRCDIR MSVC634#635# This command returns the full text of a script (either a shell script or636# an ms-dos bat file) that may be used to build SQLite source code according637# to a nominated configuration.638#639# Parameter CONFIG must be a configuration defined above in the ::trd::build640# array. SRCDIR is the root directory of an SQLite source tree (the parent641# directory of that containing this script). MSVC is a boolean - true to642# use the MSVC compiler, false otherwise.643#644proc trd_buildscript {config srcdir bMsvc} {645 trd_import646 647 # Ensure that the named configuration exists.648 if {![info exists build($config)]} {649 if {$config!="help"} {650 puts "No such build config: $config"651 }652 puts "Available configurations: [lsort [array names build]]"653 flush stdout654 exit 1655 }656 657 # Generate and return the script.658 return [make_script $build($config) $srcdir $bMsvc]659}660 661# Usage:662#663# trd_test_script_properties PATH664#665# The argument must be a path to a Tcl test script. This function scans the666# first 100 lines of the script for lines that look like:667#668# TESTRUNNER: <properties>669#670# where <properties> is a list of identifiers, each of which defines a 671# property of the test script. Example properties are "slow" or "superslow".672#673proc trd_test_script_properties {path} {674 # Use this global array as a cache:675 global trd_test_script_properties_cache676 677 if {![info exists trd_test_script_properties_cache($path)]} {678 set fd [open $path]679 set ret [list]680 for {set line 0} {$line < 100 && ![eof $fd]} {incr line} {681 set text [gets $fd]682 if {[string match -nocase *testrunner:* $text]} {683 regexp -nocase {.*testrunner:(.*)} $text -> properties684 lappend ret {*}$properties685 }686 }687 set trd_test_script_properties_cache($path) $ret688 close $fd689 }690 691 set trd_test_script_properties_cache($path)692}693 694# Usage:695#696# trd_get_bin_name executable-file-name697#698# If the tcl platform is "unix", return $bin, else return699# ${bin}.exe.700proc trd_get_bin_name {bin} {701 global tcl_platform702 if {"unix" eq $tcl_platform(platform)} {return $bin}703 return $bin.exe704}705 