gitlab.com/CoiaPrant/sqlite3@v1.19.1/testdata/tcl/releasetest_data.tcl (about)

     1  # 2019 August 01
     2  #
     3  # The author disclaims copyright to this source code.  In place of
     4  # a legal notice, here is a blessing:
     5  #
     6  #    May you do good and not evil.
     7  #    May you find forgiveness for yourself and forgive others.
     8  #    May you share freely, never taking more than you give.
     9  #
    10  #***********************************************************************
    11  #
    12  # This file implements a program that produces scripts (either shell scripts
    13  # or batch files) to implement a particular test that is part of the SQLite
    14  # release testing procedure. For example, to run veryquick.test with a 
    15  # specified set of -D compiler switches.
    16  #
    17  # A "configuration" is a set of options passed to [./configure] and [make]
    18  # to build the SQLite library in a particular fashion. A "platform" is a
    19  # list of tests; most platforms are named after the hardware/OS platform
    20  # that the tests will be run on as part of the release procedure. Each 
    21  # "test" is a combination of a configuration and a makefile target (e.g.
    22  # "fulltest"). The program may be invoked as follows:
    23  #
    24  set USAGE {
    25  $argv0 script ?-msvc? CONFIGURATION TARGET
    26      Given a configuration and make target, return a bash (or, if -msvc
    27      is specified, batch) script to execute the test. The first argument
    28      passed to the script must be a directory containing SQLite source code.
    29  
    30  $argv0 configurations
    31      List available configurations.
    32  
    33  $argv0 platforms
    34      List available platforms.
    35  
    36  $argv0 tests ?-nodebug? PLATFORM
    37      List tests in a specified platform. If the -nodebug switch is 
    38      specified, synthetic debug/ndebug configurations are omitted. Each
    39      test is a combination of a configuration and a makefile target.
    40  }
    41  
    42  # Omit comments (text between # and \n) in a long multi-line string.
    43  #
    44  proc strip_comments {in} {
    45    regsub -all {#[^\n]*\n} $in {} out
    46    return $out
    47  }
    48  
    49  array set ::Configs [strip_comments {
    50    "Default" {
    51      -O2
    52      --disable-amalgamation --disable-shared
    53      --enable-session
    54    }
    55    "Sanitize" {
    56      CC=clang -fsanitize=address,undefined
    57      -DSQLITE_ENABLE_STAT4
    58      -DCONFIG_SLOWDOWN_FACTOR=5.0
    59      --enable-debug
    60      --enable-all
    61    }
    62    "Stdcall" {
    63      -DUSE_STDCALL=1
    64      -O2
    65    }
    66    "Have-Not" {
    67      # The "Have-Not" configuration sets all possible -UHAVE_feature options
    68      # in order to verify that the code works even on platforms that lack
    69      # these support services.
    70      -DHAVE_FDATASYNC=0
    71      -DHAVE_GMTIME_R=0
    72      -DHAVE_ISNAN=0
    73      -DHAVE_LOCALTIME_R=0
    74      -DHAVE_LOCALTIME_S=0
    75      -DHAVE_MALLOC_USABLE_SIZE=0
    76      -DHAVE_STRCHRNUL=0
    77      -DHAVE_USLEEP=0
    78      -DHAVE_UTIME=0
    79    }
    80    "Unlock-Notify" {
    81      -O2
    82      -DSQLITE_ENABLE_UNLOCK_NOTIFY
    83      -DSQLITE_THREADSAFE
    84      -DSQLITE_TCL_DEFAULT_FULLMUTEX=1
    85    }
    86    "User-Auth" {
    87      -O2
    88      -DSQLITE_USER_AUTHENTICATION=1
    89    }
    90    "Secure-Delete" {
    91      -O2
    92      -DSQLITE_SECURE_DELETE=1
    93      -DSQLITE_SOUNDEX=1
    94    }
    95    "Update-Delete-Limit" {
    96      -O2
    97      -DSQLITE_DEFAULT_FILE_FORMAT=4
    98      -DSQLITE_ENABLE_UPDATE_DELETE_LIMIT=1
    99      -DSQLITE_ENABLE_STMT_SCANSTATUS
   100      -DSQLITE_LIKE_DOESNT_MATCH_BLOBS
   101      -DSQLITE_ENABLE_CURSOR_HINTS
   102    }
   103    "Check-Symbols" {
   104      -DSQLITE_MEMDEBUG=1
   105      -DSQLITE_ENABLE_FTS3_PARENTHESIS=1
   106      -DSQLITE_ENABLE_FTS3=1
   107      -DSQLITE_ENABLE_RTREE=1
   108      -DSQLITE_ENABLE_MEMSYS5=1
   109      -DSQLITE_ENABLE_MEMSYS3=1
   110      -DSQLITE_ENABLE_COLUMN_METADATA=1
   111      -DSQLITE_ENABLE_UPDATE_DELETE_LIMIT=1
   112      -DSQLITE_SECURE_DELETE=1
   113      -DSQLITE_SOUNDEX=1
   114      -DSQLITE_ENABLE_ATOMIC_WRITE=1
   115      -DSQLITE_ENABLE_MEMORY_MANAGEMENT=1
   116      -DSQLITE_ENABLE_OVERSIZE_CELL_CHECK=1
   117      -DSQLITE_ENABLE_STAT4
   118      -DSQLITE_ENABLE_STMT_SCANSTATUS
   119      --enable-fts5 --enable-session
   120    }
   121    "Debug-One" {
   122      --disable-shared
   123      -O2 -funsigned-char
   124      -DSQLITE_DEBUG=1
   125      -DSQLITE_MEMDEBUG=1
   126      -DSQLITE_MUTEX_NOOP=1
   127      -DSQLITE_TCL_DEFAULT_FULLMUTEX=1
   128      -DSQLITE_ENABLE_FTS3=1
   129      -DSQLITE_ENABLE_RTREE=1
   130      -DSQLITE_ENABLE_MEMSYS5=1
   131      -DSQLITE_ENABLE_COLUMN_METADATA=1
   132      -DSQLITE_ENABLE_STAT4
   133      -DSQLITE_ENABLE_HIDDEN_COLUMNS
   134      -DSQLITE_MAX_ATTACHED=125
   135      -DSQLITE_MUTATION_TEST
   136      --enable-fts5
   137    }
   138    "Debug-Two" {
   139      -DSQLITE_DEFAULT_MEMSTATUS=0
   140      -DSQLITE_MAX_EXPR_DEPTH=0
   141      --enable-debug
   142    }
   143    "Fast-One" {
   144      -O6
   145      -DSQLITE_ENABLE_FTS4=1
   146      -DSQLITE_ENABLE_RTREE=1
   147      -DSQLITE_ENABLE_STAT4
   148      -DSQLITE_ENABLE_RBU
   149      -DSQLITE_MAX_ATTACHED=125
   150      -DSQLITE_MAX_MMAP_SIZE=12884901888
   151      -DSQLITE_ENABLE_SORTER_MMAP=1
   152      -DLONGDOUBLE_TYPE=double
   153      --enable-session
   154    }
   155    "Device-One" {
   156      -O2
   157      -DSQLITE_DEBUG=1
   158      -DSQLITE_DEFAULT_AUTOVACUUM=1
   159      -DSQLITE_DEFAULT_CACHE_SIZE=64
   160      -DSQLITE_DEFAULT_PAGE_SIZE=1024
   161      -DSQLITE_DEFAULT_TEMP_CACHE_SIZE=32
   162      -DSQLITE_DISABLE_LFS=1
   163      -DSQLITE_ENABLE_ATOMIC_WRITE=1
   164      -DSQLITE_ENABLE_IOTRACE=1
   165      -DSQLITE_ENABLE_MEMORY_MANAGEMENT=1
   166      -DSQLITE_MAX_PAGE_SIZE=4096
   167      -DSQLITE_OMIT_LOAD_EXTENSION=1
   168      -DSQLITE_OMIT_PROGRESS_CALLBACK=1
   169      -DSQLITE_OMIT_VIRTUALTABLE=1
   170      -DSQLITE_ENABLE_HIDDEN_COLUMNS
   171      -DSQLITE_TEMP_STORE=3
   172    }
   173    "Device-Two" {
   174      -DSQLITE_4_BYTE_ALIGNED_MALLOC=1
   175      -DSQLITE_DEFAULT_AUTOVACUUM=1
   176      -DSQLITE_DEFAULT_CACHE_SIZE=1000
   177      -DSQLITE_DEFAULT_LOCKING_MODE=0
   178      -DSQLITE_DEFAULT_PAGE_SIZE=1024
   179      -DSQLITE_DEFAULT_TEMP_CACHE_SIZE=1000
   180      -DSQLITE_DISABLE_LFS=1
   181      -DSQLITE_ENABLE_FTS3=1
   182      -DSQLITE_ENABLE_MEMORY_MANAGEMENT=1
   183      -DSQLITE_ENABLE_RTREE=1
   184      -DSQLITE_MAX_COMPOUND_SELECT=50
   185      -DSQLITE_MAX_PAGE_SIZE=32768
   186      -DSQLITE_OMIT_TRACE=1
   187      -DSQLITE_TEMP_STORE=3
   188      -DSQLITE_THREADSAFE=2
   189      --enable-fts5 --enable-session
   190    }
   191    "Locking-Style" {
   192      -O2
   193      -DSQLITE_ENABLE_LOCKING_STYLE=1
   194    }
   195    "Apple" {
   196      -Os
   197      -DHAVE_GMTIME_R=1
   198      -DHAVE_ISNAN=1
   199      -DHAVE_LOCALTIME_R=1
   200      -DHAVE_PREAD=1
   201      -DHAVE_PWRITE=1
   202      -DHAVE_UTIME=1
   203      -DSQLITE_DEFAULT_CACHE_SIZE=1000
   204      -DSQLITE_DEFAULT_CKPTFULLFSYNC=1
   205      -DSQLITE_DEFAULT_MEMSTATUS=1
   206      -DSQLITE_DEFAULT_PAGE_SIZE=1024
   207      -DSQLITE_DISABLE_PAGECACHE_OVERFLOW_STATS=1
   208      -DSQLITE_ENABLE_API_ARMOR=1
   209      -DSQLITE_ENABLE_AUTO_PROFILE=1
   210      -DSQLITE_ENABLE_FLOCKTIMEOUT=1
   211      -DSQLITE_ENABLE_FTS3=1
   212      -DSQLITE_ENABLE_FTS3_PARENTHESIS=1
   213      -DSQLITE_ENABLE_FTS3_TOKENIZER=1
   214      -DSQLITE_ENABLE_PERSIST_WAL=1
   215      -DSQLITE_ENABLE_PURGEABLE_PCACHE=1
   216      -DSQLITE_ENABLE_RTREE=1
   217      -DSQLITE_ENABLE_SNAPSHOT=1
   218      # -DSQLITE_ENABLE_SQLLOG=1
   219      -DSQLITE_ENABLE_UPDATE_DELETE_LIMIT=1
   220      -DSQLITE_MAX_LENGTH=2147483645
   221      -DSQLITE_MAX_VARIABLE_NUMBER=500000
   222      # -DSQLITE_MEMDEBUG=1
   223      -DSQLITE_NO_SYNC=1
   224      -DSQLITE_OMIT_AUTORESET=1
   225      -DSQLITE_OMIT_LOAD_EXTENSION=1
   226      -DSQLITE_PREFER_PROXY_LOCKING=1
   227      -DSQLITE_SERIES_CONSTRAINT_VERIFY=1
   228      -DSQLITE_THREADSAFE=2
   229      -DSQLITE_USE_URI=1
   230      -DSQLITE_WRITE_WALFRAME_PREBUFFERED=1
   231      -DUSE_GUARDED_FD=1
   232      -DUSE_PREAD=1
   233      --enable-fts5
   234    }
   235    "Extra-Robustness" {
   236      -DSQLITE_ENABLE_OVERSIZE_CELL_CHECK=1
   237      -DSQLITE_MAX_ATTACHED=62
   238    }
   239    "Devkit" {
   240      -DSQLITE_DEFAULT_FILE_FORMAT=4
   241      -DSQLITE_MAX_ATTACHED=30
   242      -DSQLITE_ENABLE_COLUMN_METADATA
   243      -DSQLITE_ENABLE_FTS4
   244      -DSQLITE_ENABLE_FTS5
   245      -DSQLITE_ENABLE_FTS4_PARENTHESIS
   246      -DSQLITE_DISABLE_FTS4_DEFERRED
   247      -DSQLITE_ENABLE_RTREE
   248      --enable-fts5
   249    }
   250    "No-lookaside" {
   251      -DSQLITE_TEST_REALLOC_STRESS=1
   252      -DSQLITE_OMIT_LOOKASIDE=1
   253    }
   254    "Valgrind" {
   255      -DSQLITE_ENABLE_STAT4
   256      -DSQLITE_ENABLE_FTS4
   257      -DSQLITE_ENABLE_RTREE
   258      -DSQLITE_ENABLE_HIDDEN_COLUMNS
   259      -DCONFIG_SLOWDOWN_FACTOR=8.0
   260    }
   261  
   262    "Windows-Memdebug" {
   263      MEMDEBUG=1
   264      DEBUG=3
   265    }
   266    "Windows-Win32Heap" {
   267      WIN32HEAP=1
   268      DEBUG=4
   269    }
   270  
   271    # The next group of configurations are used only by the
   272    # Failure-Detection platform.  They are all the same, but we need
   273    # different names for them all so that they results appear in separate
   274    # subdirectories.
   275    #
   276    Fail0     {-O0}
   277    Fail2     {-O0}
   278    Fail3     {-O0}
   279    Fail4     {-O0}
   280    FuzzFail1 {-O0}
   281    FuzzFail2 {-O0}
   282  }]
   283  if {$tcl_platform(os)=="Darwin"} {
   284    lappend Configs(Apple) -DSQLITE_ENABLE_LOCKING_STYLE=1
   285  }
   286  
   287  array set ::Platforms [strip_comments {
   288    Linux-x86_64 {
   289      "Check-Symbols*"          "" checksymbols
   290      "Fast-One"                QUICKTEST_INCLUDE=rbu.test "fuzztest test"
   291      "Debug-One"               "" "mptest test"
   292      "Debug-Two"               "" test
   293      "Have-Not"                "" test
   294      "Secure-Delete"           "" test
   295      "Unlock-Notify"           QUICKTEST_INCLUDE=notify2.test test
   296      "User-Auth"               "" tcltest
   297      "Update-Delete-Limit"     "" test
   298      "Extra-Robustness"        "" test
   299      "Device-Two"              "" "threadtest test"
   300      "No-lookaside"            "" test
   301      "Devkit"                  "" test
   302      "Apple"                   "" test
   303      "Sanitize*"               "" test
   304      "Device-One"              "" alltest
   305      "Default"                 "" "threadtest fuzztest alltest"
   306      "Valgrind*"               "" valgrindtest
   307    }
   308    Linux-i686 {
   309      "Devkit"                  "" test
   310      "Have-Not"                "" test
   311      "Unlock-Notify"           QUICKTEST_INCLUDE=notify2.test test
   312      "Device-One"              "" test
   313      "Device-Two"              "" test
   314      "Default"                 "" "threadtest fuzztest alltest"
   315    }
   316    Darwin-i386 {
   317      "Locking-Style"           "" "mptest test"
   318      "Have-Not"                "" test
   319      "Apple"                   "" "threadtest fuzztest alltest"
   320    }
   321    Darwin-x86_64 {
   322      "Locking-Style"           "" "mptest test"
   323      "Have-Not"                "" test
   324      "Apple"                   "" "threadtest fuzztest alltest"
   325    }
   326    Darwin-arm64 {
   327      "Locking-Style"           "" "mptest test"
   328      "Have-Not"                "" test
   329      "Apple"                   "" "threadtest fuzztest alltest"
   330    }
   331    "Windows NT-intel" {
   332      "Stdcall"                 "" test
   333      "Have-Not"                "" test
   334      "Windows-Memdebug*"       "" test
   335      "Windows-Win32Heap*"      "" test
   336      "Default"                 "" "mptest fulltestonly"
   337    }
   338    "Windows NT-amd64" {
   339      "Stdcall"                 "" test
   340      "Have-Not"                "" test
   341      "Windows-Memdebug*"       "" test
   342      "Windows-Win32Heap*"      "" test
   343      "Default"                 "" "mptest fulltestonly"
   344    }
   345  
   346    # The Failure-Detection platform runs various tests that deliberately
   347    # fail.  This is used as a test of this script to verify that this script
   348    # correctly identifies failures.
   349    #
   350    Failure-Detection {
   351      Fail0*     "TEST_FAILURE=0" test
   352      Sanitize*  "TEST_FAILURE=1" test
   353      Fail2*     "TEST_FAILURE=2" valgrindtest
   354      Fail3*     "TEST_FAILURE=3" valgrindtest
   355      Fail4*     "TEST_FAILURE=4" test
   356      FuzzFail1* "TEST_FAILURE=5" test
   357      FuzzFail2* "TEST_FAILURE=5" valgrindtest
   358    }
   359  }]
   360  
   361  #--------------------------------------------------------------------------
   362  #--------------------------------------------------------------------------
   363  #--------------------------------------------------------------------------
   364  # End of configuration section.
   365  #--------------------------------------------------------------------------
   366  #--------------------------------------------------------------------------
   367  #--------------------------------------------------------------------------
   368  
   369  # Configuration verification: Check that each entry in the list of configs
   370  # specified for each platforms exists.
   371  #
   372  foreach {key value} [array get ::Platforms] {
   373    foreach {v vars t} $value {
   374      if {[string range $v end end]=="*"} {
   375        set v [string range $v 0 end-1]
   376      }
   377      if {0==[info exists ::Configs($v)]} {
   378        puts stderr "No such configuration: \"$v\""
   379        exit -1
   380      }
   381    }
   382  }
   383  
   384  proc usage {} {
   385    global argv0
   386    puts stderr [subst $::USAGE]
   387    exit 1
   388  }
   389  
   390  proc is_prefix {p str min} {
   391    set n [string length $p]
   392    if {$n<$min} { return 0 }
   393    if {[string range $str 0 [expr $n-1]]!=$p} { return 0 }
   394    return 1
   395  }
   396  
   397  proc main_configurations {} {
   398    foreach k [lsort [array names ::Configs]] {
   399      puts $k
   400    }
   401  }
   402  
   403  proc main_platforms {} {
   404    foreach k [lsort [array names ::Platforms]] {
   405      puts "\"$k\""
   406    }
   407  }
   408  
   409  proc main_script {args} {
   410    set bMsvc 0
   411    set nArg [llength $args]
   412    if {$nArg==3} {
   413      if {![is_prefix [lindex $args 0] -msvc 2]} usage
   414      set bMsvc 1
   415    } elseif {$nArg<2 || $nArg>3} {
   416      usage
   417    }
   418    set config [lindex $args end-1]
   419    set target [lindex $args end]
   420  
   421    set opts       [list]                         ;# OPTS value
   422    set cflags     [expr {$bMsvc ? "-Zi" : "-g"}] ;# CFLAGS value
   423    set makeOpts   [list]                         ;# Extra args for [make]
   424    set configOpts [list]                         ;# Extra args for [configure]
   425  
   426    if {$::tcl_platform(platform)=="windows" || $bMsvc} {
   427      lappend opts -DSQLITE_OS_WIN=1
   428    } else {
   429      lappend opts -DSQLITE_OS_UNIX=1
   430    }
   431  
   432    # Figure out if this is a synthetic ndebug or debug configuration.
   433    #
   434    set bRemoveDebug 0
   435    if {[string match *-ndebug $config]} {
   436      set bRemoveDebug 1
   437      set config [string range $config 0 end-7]
   438    }
   439    if {[string match *-debug $config]} {
   440      lappend opts -DSQLITE_DEBUG
   441      lappend opts -DSQLITE_EXTRA_IFNULLROW
   442      set config [string range $config 0 end-6]
   443    }
   444    regexp {^(.*)-[0-9]+} $config -> config
   445  
   446    # Ensure that the named configuration exists.
   447    #
   448    if {![info exists ::Configs($config)]} {
   449      puts stderr "No such config: $config"
   450      exit 1
   451    }
   452  
   453    # Loop through the parameters of the nominated configuration, updating
   454    # $opts, $cflags, $makeOpts and $configOpts along the way. Rules are as
   455    # follows:
   456    #
   457    #   1. If the parameter begins with a "*", discard it.
   458    #
   459    #   2. If $bRemoveDebug is set and the parameter is -DSQLITE_DEBUG or
   460    #      -DSQLITE_DEBUG=1, discard it
   461    #
   462    #   3. If the parameter begins with "-D", add it to $opts.
   463    #
   464    #   4. If the parameter begins with "--" add it to $configOpts. Unless
   465    #      this command is preparing a script for MSVC - then add an 
   466    #      equivalent to $makeOpts or $opts.
   467    #
   468    #   5. If the parameter begins with "-" add it to $cflags. If in MSVC
   469    #      mode and the parameter is an -O<integer> option, instead add
   470    #      an OPTIMIZATIONS=<integer> switch to $makeOpts.
   471    #
   472    #   6. If none of the above apply, add the parameter to $makeOpts
   473    #
   474    foreach param $::Configs($config) {
   475      if {[string range $param 0 0]=="*"} continue
   476  
   477      if {$bRemoveDebug} {
   478        if {$param=="-DSQLITE_DEBUG" || $param=="-DSQLITE_DEBUG=1"
   479         || $param=="-DSQLITE_MEMDEBUG" || $param=="-DSQLITE_MEMDEBUG=1"
   480         || $param=="--enable-debug"
   481        } {
   482          continue
   483        }
   484      }
   485  
   486      if {[string range $param 0 1]=="-D"} {
   487        lappend opts $param
   488        continue
   489      }
   490  
   491      if {[string range $param 0 1]=="--"} {
   492        if {$bMsvc} {
   493          switch -- $param {
   494            --disable-amalgamation {
   495              lappend makeOpts USE_AMALGAMATION=0
   496            }
   497            --disable-shared {
   498              lappend makeOpts USE_CRT_DLL=0 DYNAMIC_SHELL=0
   499            }
   500            --enable-fts5 {
   501              lappend opts -DSQLITE_ENABLE_FTS5
   502            } 
   503            --enable-shared {
   504              lappend makeOpts USE_CRT_DLL=1 DYNAMIC_SHELL=1
   505            }
   506            --enable-session {
   507              lappend opts -DSQLITE_ENABLE_PREUPDATE_HOOK
   508              lappend opts -DSQLITE_ENABLE_SESSION
   509            }
   510            default {
   511              error "Cannot translate $param for MSVC"
   512            }
   513          }
   514        } else {
   515          lappend configOpts $param
   516        }
   517  
   518        continue
   519      }
   520  
   521      if {[string range $param 0 0]=="-"} {
   522        if {$bMsvc && [regexp -- {^-O(\d+)$} $param -> level]} {
   523          lappend makeOpts OPTIMIZATIONS=$level
   524        } else {
   525          lappend cflags $param
   526        }
   527        continue
   528      }
   529  
   530      lappend makeOpts $param
   531    }
   532  
   533    # Some configurations specify -DHAVE_USLEEP=0. For all others, add
   534    # -DHAVE_USLEEP=1.
   535    #
   536    if {[lsearch $opts "-DHAVE_USLEEP=0"]<0} {
   537      lappend opts -DHAVE_USLEEP=1
   538    }
   539  
   540    if {$bMsvc==0} {
   541      puts {set -e}
   542      puts {}
   543      puts {if [ "$#" -ne 1 ] ; then}
   544      puts {  echo "Usage: $0 <sqlite-src-dir>" }
   545      puts {  exit -1 }
   546      puts {fi }
   547      puts {SRCDIR=$1}
   548      puts {}
   549      puts "TCL=\"[::tcl::pkgconfig get libdir,install]\""
   550  
   551      puts "\$SRCDIR/configure --with-tcl=\$TCL $configOpts"
   552      puts {}
   553      puts {OPTS="      -DSQLITE_NO_SYNC=1"}
   554      foreach o $opts { 
   555        puts "OPTS=\"\$OPTS $o\"" 
   556      }
   557      puts {}
   558      puts "CFLAGS=\"$cflags\""
   559      puts {}
   560      puts "make $target \"CFLAGS=\$CFLAGS\" \"OPTS=\$OPTS\" $makeOpts"
   561    } else {
   562  
   563      puts {set SRCDIR=%1}
   564      set makecmd    "nmake /f %SRCDIR%\\Makefile.msc TOP=%SRCDIR% $target "
   565      append makecmd "\"CFLAGS=$cflags\" \"OPTS=$opts\" $makeOpts"
   566  
   567      puts "set TMP=%CD%"
   568      puts $makecmd
   569    }
   570  }
   571  
   572  proc main_tests {args} {
   573    set bNodebug 0
   574    set nArg [llength $args]
   575    if {$nArg==2} {
   576      if {[is_prefix [lindex $args 0] -nodebug 2]} {
   577        set bNodebug 1
   578      } elseif {[is_prefix [lindex $args 0] -debug 2]} {
   579        set bNodebug 0
   580      } else usage
   581    } elseif {$nArg==0 || $nArg>2} {
   582      usage
   583    }
   584    set p [lindex $args end]
   585    if {![info exists ::Platforms($p)]} {
   586      puts stderr "No such platform: $p"
   587      exit 1
   588    }
   589  
   590    set lTest [list]
   591  
   592    foreach {config vars target} $::Platforms($p) {
   593      if {[string range $config end end]=="*"} {
   594        set config [string range $config 0 end-1]
   595      } elseif {$bNodebug==0} {
   596        set dtarget test
   597        if {[lsearch $target fuzztest]<0 && [lsearch $target test]<0} {
   598          set dtarget tcltest
   599        }
   600        if {$vars!=""} { set dtarget "$vars $dtarget" }
   601  
   602        if {[string first SQLITE_DEBUG $::Configs($config)]>=0
   603         || [string first --enable-debug $::Configs($config)]>=0
   604        } {
   605          lappend lTest "$config-ndebug \"$dtarget\""
   606        } else {
   607          lappend lTest "$config-debug \"$dtarget\""
   608        }
   609      }
   610  
   611      if {[llength $target]==1 && ([string match "*TEST_FAILURE*" $vars] || (
   612          [lsearch $target "valgrindtest"]<0
   613       && [lsearch $target "alltest"]<0
   614       && [lsearch $target "fulltestonly"]<0
   615       && ![string match Sanitize* $config]
   616      ))} {
   617        if {$vars!=""} { set target "$vars $target" }
   618        lappend lTest "$config \"$target\""
   619      } else {
   620        set idir -1
   621        foreach t $target {
   622          if {$t=="valgrindtest" || $t=="alltest" || $t=="fulltestonly"
   623           || [string match Sanitize* $config]
   624          } {
   625            if {$vars!=""} { set t "$vars $t" }
   626            for {set ii 1} {$ii<=4} {incr ii} {
   627              lappend lTest "$config-[incr idir] \"TCLTEST_PART=$ii/4 $t\""
   628            }
   629          } else {
   630            if {$vars!=""} { set t "$vars $t" }
   631            lappend lTest "$config-[incr idir] \"$t\""
   632          }
   633        }
   634      }
   635    }
   636  
   637    foreach l $lTest {
   638      puts $l
   639    }
   640  
   641  }
   642  
   643  if {[llength $argv]==0} { usage }
   644  set cmd [lindex $argv 0]
   645  set n [expr [llength $argv]-1]
   646  if {[string match ${cmd}* configurations] && $n==0} {
   647    main_configurations 
   648  } elseif {[string match ${cmd}* script]} {
   649    main_script {*}[lrange $argv 1 end]
   650  } elseif {[string match ${cmd}* platforms] && $n==0} {
   651    main_platforms
   652  } elseif {[string match ${cmd}* tests]} {
   653    main_tests {*}[lrange $argv 1 end]
   654  } else {
   655    usage
   656  }