@@ -66,6 +66,14 @@ USE_STDCALL = 0
6666USE_SEH = 1
6767!ENDIF
6868
69+ # Use STATICALLY_LINK_TCL=1 to statically link against TCL
70+ #
71+ !IFNDEF STATICALLY_LINK_TCL
72+ STATICALLY_LINK_TCL = 0
73+ !ELSEIF $(STATICALLY_LINK_TCL)!=0
74+ CCOPTS = $(CCOPTS) -DSTATIC_BUILD
75+ !ENDIF
76+ 6977# Set this non-0 to have the shell executable link against the core dynamic
7078# link library.
7179#
@@ -379,6 +387,7 @@ SQLITE_TCL_DEP =
379387# the Windows platform.
380388#
381389!IFNDEF OPT_FEATURE_FLAGS
390+ OPT_FEATURE_FLAGS = $(OPT_XTRA)
382391!IF $(MINIMAL_AMALGAMATION)==0
383392OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_FTS3=1
384393OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_FTS5=1
@@ -392,6 +401,14 @@ OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_BYTECODE_VTAB=1
392401OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_COLUMN_METADATA=1
393402!ENDIF
394403
404+ # Additional feature-options above and beyond what are normally used can be
405+ # be added using OPTIONS=.... on the command-line. These values are
406+ # appended to the OPT_FEATURE_FLAGS variable.
407+ #
408+ !IFDEF OPTIONS
409+ OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) $(OPTIONS)
410+ !ENDIF
411+ 395412# Should the session extension be enabled? If so, add compilation options
396413# to enable it.
397414#
@@ -920,16 +937,28 @@ TCC = $(TCC) /fsanitize=address
920937# prior to running nmake in order to match the actual installed location and
921938# version on this machine.
922939#
923- !IFNDEF TCLVERSION 
924- TCLVERSION  = 86 
940+ !IF $(STATICALLY_LINK_TCL)!=0 
941+ TCLSUFFIX  = s 
925942!ENDIF
926- 927943!IFNDEF TCLSUFFIX
928944TCLSUFFIX =
929945!ENDIF
930946
931947!IFNDEF TCLDIR
932- TCLDIR = $(TOP)\compat\tcl
948+ TCLDIR = C:\Tcl
949+ !ENDIF
950+ 951+ !IFNDEF TCLVERSION
952+ !IF EXISTS("$(TCLDIR)\lib\tcl90$(TCLSUFFIX).lib")
953+ TCLVERSION = 90
954+ !ELSEIF EXISTS("$(TCLDIR)\lib\tcl86$(TCLSUFFIX).lib")
955+ TCLVERSION = 86
956+ !ELSEIF EXISTS("$(TCLDIR)\lib\tcl86t.lib")
957+ TCLSUFFIX = t
958+ TCLVERSION = 86
959+ !ELSE
960+ TCLVERSION = 90
961+ !ENDIF
933962!ENDIF
934963
935964!IFNDEF TCLINCDIR
@@ -944,9 +973,21 @@ TCLLIBDIR = $(TCLDIR)\lib
944973LIBTCL = tcl$(TCLVERSION)$(TCLSUFFIX).lib
945974!ENDIF
946975
976+ !IFNDEF TCLLIBS
977+ !IF $(STATICALLY_LINK_TCL)!=0
978+ TCLLIBS = /NODEFAULTLIB:libucrt.lib netapi32.lib user32.lib ucrt.lib
979+ !ELSE
980+ TCLLIBS =
981+ !ENDIF
982+ !ENDIF
983+ 947984!IFNDEF LIBTCLSTUB
985+ !IF EXISTS("$(TCLLIBDIR)\tclstub$(TCLSUFFIX).lib")
986+ LIBTCLSTUB = tclstub$(TCLSUFFIX).lib
987+ !ELSE
948988LIBTCLSTUB = tclstub$(TCLVERSION)$(TCLSUFFIX).lib
949989!ENDIF
990+ !ENDIF
950991
951992!IFNDEF LIBTCLPATH
952993LIBTCLPATH = $(TCLDIR)\bin
@@ -1004,10 +1045,18 @@ LIBICU = icuuc.lib icuin.lib
10041045# specific Tcl shell to use.
10051046#
10061047!IFNDEF TCLSH_CMD
1007- !IF $(USE_TCLSH_IN_PATH)!=0 || !EXIST("$(TCLDIR)\bin\tclsh.exe")
1008- TCLSH_CMD = tclsh
1009- !ELSE
1048+ !IF EXISTS("$(TCLDIR)\bin\tclsh$(TCLVERSION).exe")
1049+ TCLSH_CMD = $(TCLDIR)\bin\tclsh$(TCLVERSION).exe
1050+ !ELSEIF EXISTS("$(TCLDIR)\bin\tclsh90.exe")
1051+ TCLSH_CMD = $(TCLDIR)\bin\tclsh90.exe
1052+ !ELSEIF EXISTS("$(TCLDIR)\bin\tclsh86.exe")
1053+ TCLSH_CMD = $(TCLDIR)\bin\tclsh86.exe
1054+ !ELSEIF EXISTS("$(TCLDIR)\bin\tclsh86t.exe")
1055+ TCLSH_CMD = $(TCLDIR)\bin\tclsh86t.exe
1056+ !ELSEIF EXISTS("$(TCLDIR)\bin\tclsh.exe")
10101057TCLSH_CMD = $(TCLDIR)\bin\tclsh.exe
1058+ !ELSE
1059+ TCLSH_CMD = tclsh
10111060!ENDIF
10121061!ENDIF
10131062# <</mark>>
@@ -1596,6 +1645,7 @@ TESTEXT = \
15961645 $(TOP)\ext\misc\remember.c \
15971646 $(TOP)\ext\misc\series.c \
15981647 $(TOP)\ext\misc\spellfix.c \
1648+  $(TOP)\ext\misc\stmtrand.c \
15991649 $(TOP)\ext\misc\totype.c \
16001650 $(TOP)\ext\misc\unionvtab.c \
16011651 $(TOP)\ext\misc\wholenumber.c \
@@ -1757,6 +1807,7 @@ FUZZCHECK_SRC = $(FUZZCHECK_SRC) $(TOP)\test\fuzzinvariants.c
17571807FUZZCHECK_SRC = $(FUZZCHECK_SRC) $(TOP)\test\vt02.c
17581808FUZZCHECK_SRC = $(FUZZCHECK_SRC) $(TOP)\ext\recover\dbdata.c
17591809FUZZCHECK_SRC = $(FUZZCHECK_SRC) $(TOP)\ext\recover\sqlite3recover.c
1810+ FUZZCHECK_SRC = $(FUZZCHECK_SRC) $(TOP)\ext\misc\percentile.c
17601811FUZZCHECK_SRC = $(FUZZCHECK_SRC) $(TOP)\ext\misc\randomjson.c
17611812
17621813OSSSHELL_SRC = $(TOP)\test\ossshell.c $(TOP)\test\ossfuzz.c
@@ -1813,12 +1864,25 @@ tclsqlite3.def:	tclsqlite.lo
18131864
18141865pkgIndex.tcl:	$(TOP)\VERSION
18151866	for /F %%V in ('type "$(TOP)\VERSION"') do ( \
1816- 		echo package ifneeded sqlite3 @version@ [list load [file join $$dir $(SQLITE3TCLDLL)] sqlite3 ] \
1867+ 		echo package ifneeded sqlite3 @version@ [list load [file join $$dir $(SQLITE3TCLDLL)] Sqlite3 ] \
18171868			| $(TCLSH_CMD) $(TOP)\tool\replace.tcl exact @version@ %%V > pkgIndex.tcl \
18181869	)
18191870
18201871$(SQLITE3TCLDLL):	libtclsqlite3.lib $(LIBRESOBJS) tclsqlite3.def pkgIndex.tcl
18211872	$(LD) $(LDFLAGS) $(LTLINKOPTS) $(LTLIBPATHS) /DLL /DEF:tclsqlite3.def /OUT:$@ libtclsqlite3.lib $(LIBRESOBJS) $(LTLIBS) $(TLIBS)
1873+ 1874+ tclextension:	$(SQLITE3TCLDLL)
1875+ 1876+ tclextension-install:	$(SQLITE3TCLDLL)
1877+ 	$(TCLSH_CMD) $(TOP)\tool\buildtclext.tcl --install-only
1878+ 1879+ tclextension-uninstall:
1880+ 	$(TCLSH_CMD) $(TOP)\tool\buildtclext.tcl --uninstall
1881+ 1882+ tclextension-list:
1883+ 	$(TCLSH_CMD) $(TOP)\tool\buildtclext.tcl --info
1884+ 1885+ 18221886# <</mark>>
18231887
18241888$(SQLITE3DLL):	$(LIBOBJ) $(LIBRESOBJS) $(CORE_LINK_DEP)
@@ -1837,12 +1901,25 @@ $(SQLITE3EXE):	shell.c $(SHELL_CORE_DEP) $(LIBRESOBJS) $(SHELL_CORE_SRC) $(SQLIT
18371901		/link $(SQLITE3EXEPDB) $(LDFLAGS) $(LTLINKOPTS) $(SHELL_LINK_OPTS) $(LTLIBPATHS) $(LIBRESOBJS) $(LIBREADLINE) $(LTLIBS) $(TLIBS)
18381902
18391903# <<mark>>
1840- sqldiff.exe:	$(TOP)\tool\sqldiff.c $(TOP)\ext\consio\console_io .h $(TOP)\ext\consio\console_io .c $(SQLITE3C) $(SQLITE3H) $(LIBRESOBJS)
1841- 	$(LTLINK) $(NO_WARN) -I$(TOP)\ext\consio  $(TOP)\tool\sqldiff.c $(TOP)\ext\consio\console_io .c $(SQLITE3C) /link $(LDFLAGS) $(LTLINKOPTS) $(LIBRESOBJS)
1904+ sqldiff.exe:	$(TOP)\tool\sqldiff.c $(TOP)\ext\misc\sqlite3_stdio .h $(TOP)\ext\misc\sqlite3_stdio .c $(SQLITE3C) $(SQLITE3H) $(LIBRESOBJS)
1905+ 	$(LTLINK) $(NO_WARN) -I$(TOP)\ext\misc  $(TOP)\tool\sqldiff.c $(TOP)\ext\misc\sqlite3_stdio .c $(SQLITE3C) /link $(LDFLAGS) $(LTLINKOPTS) $(LIBRESOBJS)
18421906
18431907dbhash.exe:	$(TOP)\tool\dbhash.c $(SQLITE3C) $(SQLITE3H)
18441908	$(LTLINK) $(NO_WARN) $(TOP)\tool\dbhash.c $(SQLITE3C) /link $(LDFLAGS) $(LTLINKOPTS)
18451909
1910+ RSYNC_SRC = \
1911+  $(TOP)\tool\sqlite3_rsync.c \
1912+  $(SQLITE3C)
1913+ 1914+ RSYNC_OPT = \
1915+  -DSQLITE_ENABLE_DBPAGE_VTAB \
1916+  -DSQLITE_THREADSAFE=0 \
1917+  -DSQLITE_OMIT_LOAD_EXTENSION \
1918+  -DSQLITE_OMIT_DEPRECATED
1919+ 1920+ sqlite3_rsync.exe:	$(RSYNC_SRC) $(LIBRESOBJS)
1921+ 	$(LTLINK) $(RSYNC_OPT) $(NO_WARN) $(RSYNC_SRC) /link $(LDFLAGS) $(LTLINKOPTS) $(LIBRESOBJS)
1922+ 18461923scrub.exe:	$(TOP)\ext\misc\scrub.c $(SQLITE3C) $(SQLITE3H)
18471924	$(LTLINK) $(NO_WARN) -DSCRUB_STANDALONE=1 $(TOP)\ext\misc\scrub.c $(SQLITE3C) /link $(LDFLAGS) $(LTLINKOPTS)
18481925
@@ -1870,6 +1947,10 @@ fuzzcheck.exe:	$(FUZZCHECK_SRC) $(SQLITE3C) $(SQLITE3H)
18701947fuzzcheck-asan.exe:	$(FUZZCHECK_SRC) $(SQLITE3C) $(SQLITE3H)
18711948	$(LTLINK) $(NO_WARN) /fsanitize=address $(FUZZCHECK_OPTS) $(FUZZCHECK_SRC) $(SQLITE3C) /link $(LDFLAGS) $(LTLINKOPTS)
18721949
1950+ run-fuzzcheck:	fuzzcheck.exe fuzzcheck-asan.exe
1951+ 	fuzzcheck --spinner $(FUZZDB)
1952+ 	fuzzcheck-asan --spinner $(FUZZDB)
1953+ 18731954ossshell.exe:	$(OSSSHELL_SRC) $(SQLITE3C) $(SQLITE3H)
18741955	$(LTLINK) $(NO_WARN) $(FUZZCHECK_OPTS) $(OSSSHELL_SRC) $(SQLITE3C) /link $(LDFLAGS) $(LTLINKOPTS)
18751956
@@ -2275,8 +2356,6 @@ keywordhash.h:	$(TOP)\tool\mkkeywordhash.c mkkeywordhash.exe
22752356# Source and header files that shell.c depends on
22762357SHELL_DEP = \
22772358 $(TOP)\src\shell.c.in \
2278-  $(TOP)\ext\consio\console_io.c \
2279-  $(TOP)\ext\consio\console_io.h \
22802359 $(TOP)\ext\expert\sqlite3expert.c \
22812360 $(TOP)\ext\expert\sqlite3expert.h \
22822361 $(TOP)\ext\intck\sqlite3intck.c \
@@ -2290,11 +2369,16 @@ SHELL_DEP = \
22902369 $(TOP)\ext\misc\ieee754.c \
22912370 $(TOP)\ext\misc\memtrace.c \
22922371 $(TOP)\ext\misc\pcachetrace.c \
2372+  $(TOP)\ext\misc\percentile.c \
22932373 $(TOP)\ext\misc\regexp.c \
22942374 $(TOP)\ext\misc\series.c \
2375+  $(TOP)\ext\misc\sha1.c \
22952376 $(TOP)\ext\misc\shathree.c \
22962377 $(TOP)\ext\misc\sqlar.c \
2378+  $(TOP)\ext\misc\sqlite3_stdio.c \
2379+  $(TOP)\ext\misc\sqlite3_stdio.h \
22972380 $(TOP)\ext\misc\uint.c \
2381+  $(TOP)\ext\misc\vfstrace.c \
22982382 $(TOP)\ext\misc\zipfile.c \
22992383 $(TOP)\ext\recover\dbdata.c \
23002384 $(TOP)\ext\recover\sqlite3recover.c \
@@ -2493,7 +2577,7 @@ extensiontest:	testfixture.exe testloadext.dll
24932577	@set PATH=$(LIBTCLPATH);$(PATH)
24942578	.\testfixture.exe $(TOP)\test\loadext.test $(TESTOPTS)
24952579
2496- tool-zip:	testfixture.exe sqlite3.exe sqldiff.exe sqlite3_analyzer.exe $(TOP)\tool\mktoolzip.tcl
2580+ tool-zip:	testfixture.exe sqlite3.exe sqldiff.exe sqlite3_analyzer.exe sqlite3_rsync.exe  $(TOP)\tool\mktoolzip.tcl
24972581	.\testfixture.exe $(TOP)\tool\mktoolzip.tcl
24982582
24992583coretestprogs:	testfixture.exe sqlite3.exe
@@ -2521,6 +2605,13 @@ queryplantest:	testfixture.exe shell
25212605fuzztest:	fuzzcheck.exe
25222606	.\fuzzcheck.exe $(FUZZDATA)
25232607
2608+ # Legacy testing target for third-party integrators. The SQLite
2609+ # developers seldom use this target themselves. Instead
2610+ # they use "nmake /f Makefile.msc devtest" which runs tests on
2611+ # a standard set of options
2612+ #
2613+ test:	$(TESTPROGS) sourcetest fuzztest tcltest
2614+ 25242615# Minimal testing that runs in less than 3 minutes (on a fast machine)
25252616#
25262617quicktest:	testfixture.exe sourcetest
@@ -2530,7 +2621,6 @@ quicktest:	testfixture.exe sourcetest
25302621# This is the common case. Run many tests that do not take too long,
25312622# including fuzzcheck, sqlite3_analyzer, and sqldiff tests.
25322623#
2533- test:	$(TESTPROGS) sourcetest fuzztest tcltest
25342624
25352625# The veryquick.test TCL tests.
25362626#
@@ -2544,17 +2634,27 @@ tcltest: testfixture.exe
25442634testrunner:	testfixture.exe
25452635	.\testfixture.exe $(TOP)\test\testrunner.tcl
25462636
2547- # Runs both fuzztest and testrunner, consecutively.
2637+ # This is the testing target preferred by the core SQLite developers.
2638+ # It runs tests under a standard configuration. The devs run 
2639+ # "nmake /f Makefile.msc devtest" prior to each check-in, at a minimum.
2640+ # Probably other tests too, but at least this one.
25482641#
2549- devtest:	testfixture.exe fuzztest testrunner
2642+ devtest:	srctree-check sourcetest
2643+ 	$(TCLSH_CMD) $(TOP)\test\testrunner.tcl mdevtest
25502644
25512645mdevtest:
25522646	$(TCLSH_CMD) $(TOP)\test\testrunner.tcl mdevtest
25532647
2648+ # Validate that various generated files in the source tree
2649+ # are up-to-date.
2650+ #
2651+ srctree-check:	$(TOP)\tool\srctree-check.tcl
2652+ 	$(TCLSH_CMD) $(TOP)\tool\srctree-check.tcl
2653+ 25542654# Testing for a release
25552655#
2556- releasetest: testfixture.exe 
2557- 	testfixture.exe  $(TOP)\test\testrunner.tcl release
2656+ releasetest:
2657+ 	$(TCLSH_CMD)  $(TOP)\test\testrunner.tcl release
25582658
25592659
25602660smoketest:	$(TESTPROGS)
@@ -2564,7 +2664,7 @@ smoketest:	$(TESTPROGS)
25642664shelltest: $(TESTPROGS)
25652665	.\testfixture.exe $(TOP)\test\permutations.test shell
25662666
2567- sqlite3_analyzer.c:	$(SQLITE3C) $(SQLITE3H) $(TOP)\src\tclsqlite.c $(TOP)\tool\spaceanal.tcl $(TOP)\tool\mkccode.tcl $(TOP)\tool\sqlite3_analyzer.c.in $(TOP)\ext\consio\console_io .h $(TOP)\ext\consio\console_io .c $(SQLITE_TCL_DEP)
2667+ sqlite3_analyzer.c:	$(SQLITE3C) $(SQLITE3H) $(TOP)\src\tclsqlite.c $(TOP)\tool\spaceanal.tcl $(TOP)\tool\mkccode.tcl $(TOP)\tool\sqlite3_analyzer.c.in $(TOP)\ext\misc\sqlite3_stdio .h $(TOP)\ext\misc\sqlite3_stdio .c $(SQLITE_TCL_DEP)
25682668	$(TCLSH_CMD) $(TOP)\tool\mkccode.tcl $(TOP)\tool\sqlite3_analyzer.c.in > $@
25692669
25702670sqlite3_analyzer.exe:	sqlite3_analyzer.c $(LIBRESOBJS)
@@ -2686,6 +2786,16 @@ THREADTEST3_SRC = \
26862786threadtest3.exe: $(THREADTEST3_SRC) $(TOP)\src\test_multiplex.c $(SQLITE3C) $(SQLITE3H)
26872787	$(LTLINK) $(NO_WARN) $(TOP)\test\threadtest3.c $(TOP)\src\test_multiplex.c $(SQLITE3C) /link $(LDFLAGS) $(LTLINKOPTS)
26882788
2789+ # Display key variables that control which version of TCL is to be used.
2790+ #
2791+ tcl-env:
2792+ 	@echo TCLDIR = $(TCLDIR)
2793+ 	@echo TCLVERSION = $(TCLVERSION)
2794+ 	@echo TCLSUFFIX = $(TCLSUFFIX)
2795+ 	@echo LIBTCL = $(LIBTCL)
2796+ 	@echo LIBTCLSTUB = $(LIBTCLSTUB)
2797+ 	@echo TCLSH_CMD = $(TCLSH_CMD)
2798+ 26892799LSMDIR=$(TOP)\ext\lsm1
26902800!INCLUDE $(LSMDIR)\Makefile.msc
26912801
@@ -2719,7 +2829,7 @@ clean:
27192829	del /Q sqlite3.c sqlite3-*.c sqlite3.h 2>NUL
27202830	del /Q sqlite3rc.h 2>NUL
27212831	del /Q shell.c sqlite3ext.h sqlite3session.h 2>NUL
2722- 	del /Q sqlite3_analyzer.exe sqlite3_analyzer.c 2>NUL
2832+ 	del /Q sqlite3_analyzer.exe sqlite3_analyzer.c sqlite3_rsync.exe  2>NUL
27232833	del /Q sqlite-*-output.vsix 2>NUL
27242834	del /Q fuzzershell.exe fuzzcheck.exe sqldiff.exe dbhash.exe 2>NUL
27252835	del /Q sqltclsh.* 2>NUL
0 commit comments