| # Test Procedures For The SQLite TCL Extension |
| |
| ## 1.0 Background |
| |
| The SQLite TCL extension logic (in the |
| "[tclsqlite.c](/file/src/tclsqlite.c)" source |
| file) is statically linked into "textfixture" executable |
| which is the program used to do most of the testing |
| associated with "make test", "make devtest", and/or |
| "make releasetest". So the functionality of the SQLite |
| TCL extension is thoroughly vetted during normal testing. The |
| procedures below are designed to test the loadable extension |
| aspect of the SQLite TCL extension, and in particular to verify |
| that the "make tclextension-install" build target works and that |
| an ordinary tclsh can subsequently run "package require sqlite3". |
| |
| This procedure can also be used as a template for how to set up |
| a local TCL+SQLite development environment. In other words, it |
| can be be used as a guide on how to compile per-user copies of |
| Tcl that are used to develop, test, and debug SQLite. In that |
| case, perhaps make minor changes to the procedure such as: |
| |
| * Make TCLBUILD directory is permanent. |
| * Enable debugging symbols on the Tcl library build. |
| * Reduce the optimization level to -O0 for easier debugging. |
| * Also compile "wish" to go with each "tclsh". |
| |
| |
| <a id="unix"></a> |
| ## 2.0 Testing On Unix-like Systems (Including Mac) |
| |
| See also the [](./compile-for-unix.md) document which provides another |
| perspective on how to compile SQLite on unix-like systems. |
| |
| ### 2.1 Setup |
| |
| <ol type="1"> |
| <li value="1"> |
| [Fossil][] installed. |
| <li> Check out source code and set environment variables: |
| <ol type="a"> |
| <li> **TCLSOURCE** → |
| The top-level directory of a [Fossil][] check-out of the |
| [TCL source tree][tcl-fossil]. |
| <li> **SQLITESOURCE** → |
| A Fossil check-out of the SQLite source tree. |
| <li> **TCLHOME** → |
| A directory that does not exist at the start of the test and which |
| will be deleted at the end of the test, and that will contain the |
| test builds of the TCL libraries and the SQLite TCL Extensions. |
| It is the top-most installation directory, i.e. the one provided |
| to Tcl's `./configure --prefix=/path/to/tcl`. |
| <li> **TCLVERSION** → |
| The `X.Y`-form version of Tcl being used: 8.6, 9.0, 9.1... |
| </ol> |
| </ol> |
| |
| ### 2.2 Testing TCL 8.x and 9.x on unix |
| |
| From a checked-out copy of [the core Tcl tree][tcl-fossil] |
| |
| <ol type="1"> |
| <li value="3">`TCLVERSION=8.6` <br> |
| ↑ A version of your choice. This process has been tested with |
| values of 8.6, 9.0, and 9.1 (as of 2025-04-16). The out-of-life |
| version 8.5 fails some of `make devtest` for undetermined reasons. |
| <li>`TCLHOME=$HOME/tcl/$TCLVERSION` |
| <li>`TCLSOURCE=/path/to/tcl/checkout` |
| <li>`SQLITESOURCE=/path/to/sqlite/checkout` |
| <li>`rm -fr $TCLHOME` <br> |
| ↑ Ensure that no stale Tcl installation is laying around. |
| <li> `cd $TCLSOURCE` |
| <li> `fossil up core-8-6-branch` <br> |
| ↑ The branch corresponding to `$TCLVERSION`, e.g. |
| `core-9-0-branch` or `trunk`. |
| <li> `fossil clean -x` |
| <li> `cd unix` |
| <li> `./configure --prefix=$TCLHOME --disable-shared` <br> |
| ↑ The `--disable-shared` is to avoid the need to set `LD_LIBRARY_PATH` |
| when using this Tcl build. |
| <li> `make install` |
| <li> `cd $SQLITESOURCE` |
| <li> `fossil clean -x` |
| <li> `./configure --with-tcl=$TCLHOME --all` |
| <li> `make tclextension-install` <br> |
| ↑ Verify extension installed at |
| `$TCLHOME/lib/tcl${TCLVERSION}/sqlite<SQLITE_VERSION>`. |
| <li> `make tclextension-list` <br> |
| ↑ Verify TCL extension correctly installed. |
| <li> `make tclextension-verify` <br> |
| ↑ Verify that the correct version is installed. |
| <li> `$TCLHOME/bin/tclsh[89].[0-9] test/testrunner.tcl release --explain` <br> |
| ↑ Verify thousands of lines of output with no errors. Or |
| consider running "devtest" without --explain instead of "release". |
| </ol> |
| |
| ### 2.3 Cleanup |
| |
| <ol type="1"> |
| <li value="29"> `rm -rf $TCLHOME` |
| </ol> |
| |
| <a id="windows"></a> |
| ## 3.0 Testing On Windows |
| |
| See also the [](./compile-for-windows.md) document which provides another |
| perspective on how to compile SQLite on Windows. |
| |
| ### 3.1 Setup for Windows |
| |
| (These docs are not as up-to-date as the Unix docs, above.) |
| |
| <ol type="1"> |
| <li value="1"> |
| [Fossil][] installed. |
| <li> |
| Unix-like command-line tools installed. Example: |
| [unxutils](https://unxutils.sourceforge.net/) |
| <li> [Visual Studio](https://visualstudio.microsoft.com/vs/community/) |
| installed. VS2015 or later required. |
| <li> Check out source code and set environment variables. |
| <ol type="a"> |
| <li> **TCLSOURCE** → |
| The top-level directory of a Fossil check-out of the TCL source tree. |
| <li> **SQLITESOURCE** → |
| A Fossil check-out of the SQLite source tree. |
| <li> **TCLBUILD** → |
| A directory that does not exist at the start of the test and which |
| will be deleted at the end of the test, and that will contain the |
| test builds of the TCL libraries and the SQLite TCL Extensions. |
| <li> **ORIGINALPATH** → |
| The original value of %PATH%. In other words, set as follows: |
| `set ORIGINALPATH %PATH%` |
| </ol> |
| </ol> |
| |
| ### 3.2 Testing TCL 8.6 on Windows |
| |
| <ol type="1"> |
| <li value="5"> `mkdir %TCLBUILD%\tcl86` |
| <li> `cd %TCLSOURCE%\win` |
| <li> `fossil up core-8-6-16` <br> |
| ↑ Or some other version of Tcl8.6. |
| <li> `fossil clean -x` |
| <li> `set INSTALLDIR=%TCLBUILD%\tcl86` |
| <li> `nmake /f makefile.vc release` <br> |
| ⇅ You *must* invoke the "release" and "install" targets |
| using separate "nmake" commands or tclsh86t.exe won't be |
| installed. |
| <li> `nmake /f makefile.vc install` |
| <li> `cd %SQLITESOURCE%` |
| <li> `fossil clean -x` |
| <li> `set TCLDIR=%TCLBUILD%\tcl86` |
| <li> `set PATH=%TCLBUILD%\tcl86\bin;%ORIGINALPATH%` |
| <li> `set TCLSH_CMD=%TCLBUILD%\tcl86\bin\tclsh86t.exe` |
| <li> `nmake /f Makefile.msc tclextension-install` <br> |
| ↑ Verify extension installed at %TCLBUILD%\\tcl86\\lib\\tcl8.6\\sqlite3.* |
| <li> `nmake /f Makefile.msc tclextension-verify` |
| <li>`tclsh86t test/testrunner.tcl release --explain` <br> |
| ↑ Verify thousands of lines of output with no errors. Or |
| consider running "devtest" without --explain instead of "release". |
| </ol> |
| |
| ### 3.3 Testing TCL 9.0 on Windows |
| |
| <ol> |
| <li value="20"> `mkdir %TCLBUILD%\tcl90` |
| <li> `cd %TCLSOURCE%\win` |
| <li> `fossil up core-9-0-0` <br> |
| ↑ Or some other version of Tcl9 |
| <li> `fossil clean -x` |
| <li> `set INSTALLDIR=%TCLBUILD%\tcl90` |
| <li> `nmake /f makefile.vc release` <br> |
| ⇅ You *must* invoke the "release" and "install" targets |
| using separate "nmake" commands or tclsh90.exe won't be |
| installed. |
| <li> `nmake /f makefile.vc install` |
| <li> `cd %SQLITESOURCE%` |
| <li> `fossil clean -x` |
| <li> `set TCLDIR=%TCLBUILD%\tcl90` |
| <li> `set PATH=%TCLBUILD%\tcl90\bin;%ORIGINALPATH%` |
| <li> `set TCLSH_CMD=%TCLBUILD%\tcl90\bin\tclsh90.exe` |
| <li> `nmake /f Makefile.msc tclextension-install` <br> |
| ↑ Verify extension installed at %TCLBUILD%\\tcl90\\lib\\sqlite3.* |
| <li> `nmake /f Makefile.msc tclextension-verify` |
| <li> `tclsh90 test/testrunner.tcl release --explain` <br> |
| ↑ Verify thousands of lines of output with no errors. Or |
| consider running "devtest" without --explain instead of "release". |
| </ol> |
| |
| ### 3.4 Cleanup |
| |
| <ol type="1"> |
| <li value="35"> `rm -rf %TCLBUILD%` |
| </ol> |
| |
| ## 4.0 Testing the TEA(ish) Build (unix only) |
| |
| This part requires following the setup instructions for Unix systems, |
| at the top of this document. |
| |
| The former TEA, now TEA(ish), build of this extension uses the same |
| code as the builds described above but is provided in a form more |
| convenient for downstream Tcl users. |
| |
| It lives in `autoconf/tea` and, as part of the `autoconf` bundle, |
| _cannot be tested directly from the canonical tree_. Instead it has to |
| be packaged. |
| |
| ### 4.1 Teaish Setup |
| |
| Follow the same Tcl- and environment-related related setup described |
| in the first section of this document, up to and including the |
| installation of Tcl (unless, of course, it was already installed using |
| those same instructions). |
| |
| ### 4.2 Teaish Testing |
| |
| <ol> |
| <li>`cd $SQLITESOURCE` |
| <li>Run either `make snapshot-tarball` or `make amalgamation-tarball` |
| ↑ |
| Those steps will leave behind a temp dir called `mkpkg_tmp_dir`, |
| under which the extension is most readily reached. It can optionally |
| be extracted from the generated tarball, but that tarball was |
| generated from this dir, and reusing this dir is a time saver |
| during development. |
| <li> `cd mkpkg_tmp/tea` |
| <li> `./configure --with-tcl=$TCLHOME` |
| <li> `make test install` <br> |
| ↑ Should run to completion without any errors. |
| <li> `make uninstall` <br> |
| ↑ Will uninstall the extension. This _can_ be run |
| in the same invocation as the `install` target, but only |
| if the `-j#` make flag is _not_ used. If it is, the |
| install/uninstall steps will race and make a mess of things. |
| Parallel builds do not help in this build, anyway, as there's |
| only a single C file to compile. |
| </ol> |
| |
| When actively developing and testing the teaish build, which requires |
| going through the tarball generation, there's a caveat about the |
| `mkpkg_tmp_dir` dir: it will be deleted every time a tarball is |
| built, the shell console which is parked in that |
| directory for testing needs to add `cd $PWD &&` to the start of the |
| build commands, like: |
| |
| > |
| ``` |
| [user@host:.../mkpkg_tmp_dir/tea]$ \ |
| cd $PWD && ./configure CFLAGS=-O0 --with-tcl=$TCLHOME \ |
| && make test install uninstall |
| ``` |
| |
| ### 4.3 Teaish Cleanup |
| |
| |
| <ol type="1"> |
| <li> `rm -rf $TCLHOME` |
| <li> `cd $SQLITESOURCE; rm -fr mkpkg_tmp_dir; fossil clean -x` |
| </ol> |
| |
| [Fossil]: https://fossil-scm.org/home |
| [tcl-fossil]: https://core.tcl-lang.org/tcl |