CoolFace
Modelpublic

AryaWu/sqlite

sourceHugging Faceupdated 9mo agoView on Hugging Face
0likes
testrunner_data.tcl705 linesDownload Raw Back to test
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