@@ -24,6 +24,20 @@ USE_AMALGAMATION = 1
2424USE_FULLWARN = 0
2525!ENDIF
2626
27+ # Set this non-0 to enable full runtime error checks (-RTC1, etc). This
28+ # has no effect if (any) optimizations are enabled.
29+ #
30+ !IFNDEF USE_RUNTIME_CHECKS
31+ USE_RUNTIME_CHECKS = 0
32+ !ENDIF
33+
34+ # Set this non-0 to create a SQLite amalgamation file that excludes the
35+ # various built-in extensions.
36+ #
37+ !IFNDEF MINIMAL_AMALGAMATION
38+ MINIMAL_AMALGAMATION = 0
39+ !ENDIF
40+
2741# Set this non-0 to use "stdcall" calling convention for the core library
2842# and shell executable.
2943#
@@ -263,12 +277,39 @@ SQLITE3EXEPDB = /pdb:sqlite3sh.pdb
263277!ENDIF
264278!ENDIF
265279
280+ # <<mark>>
281+ # These are the names of the customized Tcl header files used by various parts
282+ # of this makefile when the stdcall calling convention is in use. It is not
283+ # used for any other purpose.
284+ #
285+ !IFNDEF SQLITETCLH
286+ SQLITETCLH = sqlite_tcl.h
287+ !ENDIF
288+
289+ !IFNDEF SQLITETCLDECLSH
290+ SQLITETCLDECLSH = sqlite_tclDecls.h
291+ !ENDIF
292+
293+ # These are the additional targets that the targets that integrate with the
294+ # Tcl library should depend on when compiling, etc.
295+ #
296+ !IFNDEF SQLITE_TCL_DEP
297+ !IF $(USE_STDCALL)!=0 || $(FOR_WIN10)!=0
298+ SQLITE_TCL_DEP = $(SQLITETCLDECLSH) $(SQLITETCLH)
299+ !ELSE
300+ SQLITE_TCL_DEP =
301+ !ENDIF
302+ !ENDIF
303+ # <</mark>>
304+
266305# These are the "standard" SQLite compilation options used when compiling for
267306# the Windows platform.
268307#
269308!IFNDEF OPT_FEATURE_FLAGS
309+ !IF $(MINIMAL_AMALGAMATION)==0
270310OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_FTS3=1
271311OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_RTREE=1
312+ !ENDIF
272313OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_COLUMN_METADATA=1
273314!ENDIF
274315
@@ -464,20 +505,32 @@ RCC = $(RC) -DSQLITE_OS_WIN=1 -I. -I$(TOP) -I$(TOP)\src $(RCOPTS) $(RCCOPTS)
464505#
465506!IF $(USE_STDCALL)!=0 || $(FOR_WIN10)!=0
466507!IF "$(PLATFORM)"=="x86"
467- CORE_CCONV_OPTS = -Gz -DSQLITE_CDECL=__cdecl -DSQLITE_STDCALL=__stdcall
468- SHELL_CCONV_OPTS = -Gz -DSQLITE_CDECL=__cdecl -DSQLITE_STDCALL=__stdcall
508+ CORE_CCONV_OPTS = -Gz -DSQLITE_CDECL=__cdecl -DSQLITE_APICALL=__stdcall -DSQLITE_CALLBACK=__stdcall -DSQLITE_SYSAPI=__stdcall
509+ SHELL_CCONV_OPTS = -Gz -DSQLITE_CDECL=__cdecl -DSQLITE_APICALL=__stdcall -DSQLITE_CALLBACK=__stdcall -DSQLITE_SYSAPI=__stdcall
510+ # <<mark>>
511+ TEST_CCONV_OPTS = -Gz -DSQLITE_CDECL=__cdecl -DSQLITE_APICALL=__stdcall -DSQLITE_CALLBACK=__stdcall -DSQLITE_SYSAPI=__stdcall -DINCLUDE_SQLITE_TCL_H=1 -DSQLITE_TCLAPI=__cdecl
512+ # <</mark>>
469513!ELSE
470514!IFNDEF PLATFORM
471- CORE_CCONV_OPTS = -Gz -DSQLITE_CDECL=__cdecl -DSQLITE_STDCALL=__stdcall
472- SHELL_CCONV_OPTS = -Gz -DSQLITE_CDECL=__cdecl -DSQLITE_STDCALL=__stdcall
515+ CORE_CCONV_OPTS = -Gz -DSQLITE_CDECL=__cdecl -DSQLITE_APICALL=__stdcall -DSQLITE_CALLBACK=__stdcall -DSQLITE_SYSAPI=__stdcall
516+ SHELL_CCONV_OPTS = -Gz -DSQLITE_CDECL=__cdecl -DSQLITE_APICALL=__stdcall -DSQLITE_CALLBACK=__stdcall -DSQLITE_SYSAPI=__stdcall
517+ # <<mark>>
518+ TEST_CCONV_OPTS = -Gz -DSQLITE_CDECL=__cdecl -DSQLITE_APICALL=__stdcall -DSQLITE_CALLBACK=__stdcall -DSQLITE_SYSAPI=__stdcall -DINCLUDE_SQLITE_TCL_H=1 -DSQLITE_TCLAPI=__cdecl
519+ # <</mark>>
473520!ELSE
474521CORE_CCONV_OPTS =
475522SHELL_CCONV_OPTS =
523+ # <<mark>>
524+ TEST_CCONV_OPTS =
525+ # <</mark>>
476526!ENDIF
477527!ENDIF
478528!ELSE
479529CORE_CCONV_OPTS =
480530SHELL_CCONV_OPTS =
531+ # <<mark>>
532+ TEST_CCONV_OPTS =
533+ # <</mark>>
481534!ENDIF
482535
483536# These are additional compiler options used for the core library.
@@ -630,12 +683,35 @@ RCC = $(RCC) -I$(TOP)\ext\session
630683# options are necessary in order to allow debugging symbols to
631684# work correctly with Visual Studio when using the amalgamation.
632685#
686+ !IFNDEF MKSQLITE3C_TOOL
687+ !IF $(MINIMAL_AMALGAMATION)!=0
688+ MKSQLITE3C_TOOL = $(TOP)\tool\mksqlite3c-noext.tcl
689+ !ELSE
690+ MKSQLITE3C_TOOL = $(TOP)\tool\mksqlite3c.tcl
691+ !ENDIF
692+ !ENDIF
693+
633694!IFNDEF MKSQLITE3C_ARGS
634695!IF $(DEBUG)>1
635696MKSQLITE3C_ARGS = --linemacros
636697!ELSE
637698MKSQLITE3C_ARGS =
638699!ENDIF
700+ !IF $(USE_STDCALL)!=0 || $(FOR_WIN10)!=0
701+ MKSQLITE3C_ARGS = $(MKSQLITE3C_ARGS) --useapicall
702+ !ENDIF
703+ !ENDIF
704+
705+ # The mksqlite3h.tcl script accepts some options on the command line.
706+ # When compiling with stdcall support, some of these options are
707+ # necessary.
708+ #
709+ !IFNDEF MKSQLITE3H_ARGS
710+ !IF $(USE_STDCALL)!=0 || $(FOR_WIN10)!=0
711+ MKSQLITE3H_ARGS = --useapicall
712+ !ELSE
713+ MKSQLITE3H_ARGS =
714+ !ENDIF
639715!ENDIF
640716# <</mark>>
641717
@@ -835,6 +911,10 @@ RCC = $(RCC) -D_DEBUG
835911!IF $(DEBUG)>1 || $(OPTIMIZATIONS)==0
836912TCC = $(TCC) -Od
837913BCC = $(BCC) -Od
914+ !IF $(USE_RUNTIME_CHECKS)!=0
915+ TCC = $(TCC) -RTC1
916+ BCC = $(BCC) -RTC1
917+ !ENDIF
838918!ELSEIF $(OPTIMIZATIONS)>=3
839919TCC = $(TCC) -Ox
840920BCC = $(BCC) -Ox
@@ -1235,6 +1315,16 @@ SRC11 = \
12351315 parse.h \
12361316 $(SQLITE3H)
12371317
1318+ # Generated Tcl header files
1319+ #
1320+ !IF $(USE_STDCALL)!=0 || $(FOR_WIN10)!=0
1321+ SRC12 = \
1322+ $(SQLITETCLH) \
1323+ $(SQLITETCLDECLSH)
1324+ !ELSE
1325+ SRC12 =
1326+ !ENDIF
1327+
12381328# All source code files.
12391329#
12401330SRC = $(SRC00) $(SRC01) $(SRC02) $(SRC03) $(SRC04) $(SRC05) $(SRC06) $(SRC07) $(SRC08) $(SRC09) $(SRC10) $(SRC11)
@@ -1341,7 +1431,7 @@ HDR = \
13411431 parse.h \
13421432 $(TOP)\src\pragma.h \
13431433 $(SQLITE3H) \
1344- $(TOP)\src\ sqlite3ext.h \
1434+ sqlite3ext.h \
13451435 $(TOP)\src\sqliteInt.h \
13461436 $(TOP)\src\sqliteLimit.h \
13471437 $(TOP)\src\vdbe.h \
@@ -1499,7 +1589,7 @@ mptest: mptester.exe
14991589# files are automatically generated. This target takes care of
15001590# all that automatic generation.
15011591#
1502- .target_source: $(SRC) $(TOP)\tool\vdbe-compress.tcl fts5.c
1592+ .target_source: $(SRC) $(TOP)\tool\vdbe-compress.tcl fts5.c $(SQLITE_TCL_DEP)
15031593 -rmdir /Q/S tsrc 2>NUL
15041594 -mkdir tsrc
15051595 for %i in ($(SRC00)) do copy /Y %i tsrc
@@ -1514,15 +1604,16 @@ mptest: mptester.exe
15141604 for %i in ($(SRC09)) do copy /Y %i tsrc
15151605 for %i in ($(SRC10)) do copy /Y %i tsrc
15161606 for %i in ($(SRC11)) do copy /Y %i tsrc
1607+ for %i in ($(SRC12)) do copy /Y %i tsrc
15171608 copy /Y fts5.c tsrc
15181609 copy /Y fts5.h tsrc
15191610 del /Q tsrc\sqlite.h.in tsrc\parse.y 2>NUL
15201611 $(TCLSH_CMD) $(TOP)\tool\vdbe-compress.tcl $(OPTS) < tsrc\vdbe.c > vdbe.new
15211612 move vdbe.new tsrc\vdbe.c
15221613 echo > .target_source
15231614
1524- sqlite3.c: .target_source sqlite3ext.h $(TOP)\tool\mksqlite3c.tcl
1525- $(TCLSH_CMD) $(TOP)\tool\mksqlite3c.tcl $(MKSQLITE3C_ARGS)
1615+ sqlite3.c: .target_source sqlite3ext.h $(MKSQLITE3C_TOOL)
1616+ $(TCLSH_CMD) $(MKSQLITE3C_TOOL) $(MKSQLITE3C_ARGS)
15261617 copy tsrc\shell.c .
15271618 copy $(TOP)\ext\session\sqlite3session.h .
15281619
@@ -1795,10 +1886,10 @@ wherecode.lo: $(TOP)\src\wherecode.c $(HDR)
17951886whereexpr.lo: $(TOP)\src\whereexpr.c $(HDR)
17961887 $(LTCOMPILE) $(CORE_COMPILE_OPTS) -c $(TOP)\src\whereexpr.c
17971888
1798- tclsqlite.lo: $(TOP)\src\tclsqlite.c $(HDR)
1889+ tclsqlite.lo: $(TOP)\src\tclsqlite.c $(HDR) $(SQLITE_TCL_DEP)
17991890 $(LTCOMPILE) $(NO_WARN) -DUSE_TCL_STUBS=1 -DBUILD_sqlite -I$(TCLINCDIR) -c $(TOP)\src\tclsqlite.c
18001891
1801- tclsqlite-shell.lo: $(TOP)\src\tclsqlite.c $(HDR)
1892+ tclsqlite-shell.lo: $(TOP)\src\tclsqlite.c $(HDR) $(SQLITE_TCL_DEP)
18021893 $(LTCOMPILE) $(NO_WARN) -DTCLSH=1 -DBUILD_sqlite -I$(TCLINCDIR) -c $(TOP)\src\tclsqlite.c
18031894
18041895tclsqlite3.exe: tclsqlite-shell.lo $(SQLITE3C) $(SQLITE3H) $(LIBRESOBJS)
@@ -1824,10 +1915,16 @@ parse.c: $(TOP)\src\parse.y lemon.exe $(TOP)\tool\addopcodes.tcl
18241915 $(TCLSH_CMD) $(TOP)\tool\addopcodes.tcl parse.h.temp > parse.h
18251916
18261917$(SQLITE3H): $(TOP)\src\sqlite.h.in $(TOP)\manifest.uuid $(TOP)\VERSION
1827- $(TCLSH_CMD) $(TOP)\tool\mksqlite3h.tcl $(TOP:\=/) > $(SQLITE3H)
1918+ $(TCLSH_CMD) $(TOP)\tool\mksqlite3h.tcl $(TOP:\=/) > $(SQLITE3H) $(MKSQLITE3H_ARGS)
18281919
18291920sqlite3ext.h: .target_source
1830- copy tsrc\sqlite3ext.h .
1921+ !IF $(USE_STDCALL)!=0 || $(FOR_WIN10)!=0
1922+ type tsrc\sqlite3ext.h | $(TCLSH_CMD) $(TOP)\tool\replace.tcl regsub "\(\*\)" "(SQLITE_CALLBACK *)" \
1923+ | $(TCLSH_CMD) $(TOP)\tool\replace.tcl regsub "\(\*" "(SQLITE_APICALL *" > sqlite3ext.h
1924+ copy /Y sqlite3ext.h tsrc\sqlite3ext.h
1925+ !ELSE
1926+ copy /Y tsrc\sqlite3ext.h sqlite3ext.h
1927+ !ENDIF
18311928
18321929mkkeywordhash.exe: $(TOP)\tool\mkkeywordhash.c
18331930 $(BCC) $(NO_WARN) -Fe$@ $(REQ_FEATURE_FLAGS) $(OPT_FEATURE_FLAGS) $(EXT_FEATURE_FLAGS) $(OPTS) \
@@ -1960,6 +2057,7 @@ TESTFIXTURE_FLAGS = $(TESTFIXTURE_FLAGS) -DSQLITE_SERVER=1 -DSQLITE_PRIVATE=""
19602057TESTFIXTURE_FLAGS = $(TESTFIXTURE_FLAGS) -DSQLITE_CORE $(NO_WARN)
19612058TESTFIXTURE_FLAGS = $(TESTFIXTURE_FLAGS) -DSQLITE_SERIES_CONSTRAINT_VERIFY=1
19622059TESTFIXTURE_FLAGS = $(TESTFIXTURE_FLAGS) -DSQLITE_DEFAULT_PAGE_SIZE=1024
2060+ TESTFIXTURE_FLAGS = $(TESTFIXTURE_FLAGS) $(TEST_CCONV_OPTS)
19632061
19642062TESTFIXTURE_SRC0 = $(TESTEXT) $(TESTSRC2)
19652063TESTFIXTURE_SRC1 = $(TESTEXT) $(SQLITE3C)
@@ -1969,7 +2067,27 @@ TESTFIXTURE_SRC = $(TESTSRC) $(TOP)\src\tclsqlite.c $(TESTFIXTURE_SRC0)
19692067TESTFIXTURE_SRC = $(TESTSRC) $(TOP)\src\tclsqlite.c $(TESTFIXTURE_SRC1)
19702068!ENDIF
19712069
1972- testfixture.exe: $(TESTFIXTURE_SRC) $(SQLITE3H) $(LIBRESOBJS) $(HDR)
2070+ !IF $(USE_STDCALL)!=0 || $(FOR_WIN10)!=0
2071+ sqlite_tclDecls.h:
2072+ echo #ifndef SQLITE_TCLAPI > $(SQLITETCLDECLSH)
2073+ echo # define SQLITE_TCLAPI >> $(SQLITETCLDECLSH)
2074+ echo #endif >> $(SQLITETCLDECLSH)
2075+ type "$(TCLINCDIR)\tclDecls.h" \
2076+ | $(TCLSH_CMD) $(TOP)\tool\replace.tcl regsub "^(EXTERN(?: CONST\d+?)?\s+?[^\(]*?\s+?)Tcl_" "\1 SQLITE_TCLAPI Tcl_" \
2077+ | $(TCLSH_CMD) $(TOP)\tool\replace.tcl regsub "^(EXTERN\s+?(?:void|VOID)\s+?)TclFreeObj" "\1 SQLITE_TCLAPI TclFreeObj" \
2078+ | $(TCLSH_CMD) $(TOP)\tool\replace.tcl regsub "\(\*tcl_" "(SQLITE_TCLAPI *tcl_" \
2079+ | $(TCLSH_CMD) $(TOP)\tool\replace.tcl regsub "\(\*tclFreeObj" "(SQLITE_TCLAPI *tclFreeObj" \
2080+ | $(TCLSH_CMD) $(TOP)\tool\replace.tcl regsub "\(\*" "(SQLITE_TCLAPI *" >> $(SQLITETCLDECLSH)
2081+
2082+ sqlite_tcl.h:
2083+ type "$(TCLINCDIR)\tcl.h" | $(TCLSH_CMD) $(TOP)\tool\replace.tcl exact tclDecls.h sqlite_tclDecls.h \
2084+ | $(TCLSH_CMD) $(TOP)\tool\replace.tcl regsub "typedef (.*?)\(Tcl_" "typedef \1 (SQLITE_TCLAPI Tcl_" \
2085+ | $(TCLSH_CMD) $(TOP)\tool\replace.tcl exact "void (*freeProc)" "void (SQLITE_TCLAPI *freeProc)" \
2086+ | $(TCLSH_CMD) $(TOP)\tool\replace.tcl exact "Tcl_HashEntry *(*findProc)" "Tcl_HashEntry *(SQLITE_TCLAPI *findProc)" \
2087+ | $(TCLSH_CMD) $(TOP)\tool\replace.tcl exact "Tcl_HashEntry *(*createProc)" "Tcl_HashEntry *(SQLITE_TCLAPI *createProc)" >> $(SQLITETCLH)
2088+ !ENDIF
2089+
2090+ testfixture.exe: $(TESTFIXTURE_SRC) $(SQLITE3H) $(LIBRESOBJS) $(HDR) $(SQLITE_TCL_DEP)
19732091 $(LTLINK) -DSQLITE_NO_SYNC=1 $(TESTFIXTURE_FLAGS) \
19742092 -DBUILD_sqlite -I$(TCLINCDIR) \
19752093 $(TESTFIXTURE_SRC) \
@@ -2018,7 +2136,7 @@ smoketest: $(TESTPROGS)
20182136 @set PATH=$(LIBTCLPATH);$(PATH)
20192137 .\testfixture.exe $(TOP)\test\main.test $(TESTOPTS)
20202138
2021- sqlite3_analyzer.c: $(SQLITE3C) $(SQLITE3H) $(TOP)\src\tclsqlite.c $(TOP)\tool\spaceanal.tcl
2139+ sqlite3_analyzer.c: $(SQLITE3C) $(SQLITE3H) $(TOP)\src\tclsqlite.c $(TOP)\tool\spaceanal.tcl $(SQLITE_TCL_DEP)
20222140 echo #define TCLSH 2 > $@
20232141 echo #define SQLITE_ENABLE_DBSTAT_VTAB 1 >> $@
20242142 copy $@ + $(SQLITE3C) + $(TOP)\src\tclsqlite.c $@
@@ -2098,7 +2216,7 @@ clean:
20982216 -rmdir /Q/S .libs 2>NUL
20992217 -rmdir /Q/S tsrc 2>NUL
21002218 del /Q .target_source 2>NUL
2101- del /Q tclsqlite3.exe 2>NUL
2219+ del /Q tclsqlite3.exe $(SQLITETCLH) $(SQLITETCLDECLSH) 2>NUL
21022220 del /Q testloadext.dll 2>NUL
21032221 del /Q testfixture.exe test.db 2>NUL
21042222 del /Q LogEst.exe fts3view.exe rollback-test.exe showdb.exe 2>NUL
0 commit comments