summaryrefslogtreecommitdiff
path: root/lib/libsqlite3/tool
diff options
context:
space:
mode:
authorMarc Espie <espie@cvs.openbsd.org>2013-03-18 10:45:34 +0000
committerMarc Espie <espie@cvs.openbsd.org>2013-03-18 10:45:34 +0000
commita0973dcf2f139f1ea5c4e7d0c928c5167918d51f (patch)
treefde80635d076a45cce36d02fa18f190863fe833f /lib/libsqlite3/tool
parentb8a430d035021395991d3025ab45ff3dc771b7c5 (diff)
update to 3.7.15.2, tested by landry@/miod@
Diffstat (limited to 'lib/libsqlite3/tool')
-rwxr-xr-xlib/libsqlite3/tool/build-all-msvc.bat320
-rw-r--r--lib/libsqlite3/tool/mkvsix.tcl368
-rw-r--r--lib/libsqlite3/tool/showdb.c4
-rw-r--r--lib/libsqlite3/tool/spaceanal.tcl27
-rw-r--r--lib/libsqlite3/tool/stack_usage.tcl98
-rw-r--r--lib/libsqlite3/tool/vdbe-compress.tcl3
-rw-r--r--lib/libsqlite3/tool/win/sqlite.vsixbin32802 -> 32816 bytes
7 files changed, 632 insertions, 188 deletions
diff --git a/lib/libsqlite3/tool/build-all-msvc.bat b/lib/libsqlite3/tool/build-all-msvc.bat
index a2d7dae3a3e..758036fb757 100755
--- a/lib/libsqlite3/tool/build-all-msvc.bat
+++ b/lib/libsqlite3/tool/build-all-msvc.bat
@@ -6,10 +6,54 @@
:: Multi-Platform Build Tool for MSVC
::
+REM
+REM This batch script is used to build the SQLite DLL for multiple platforms
+REM and configurations using MSVC. The built SQLite DLLs, their associated
+REM import libraries, and optionally their symbols files, are placed within
+REM the directory specified on the command line, in sub-directories named for
+REM their respective platforms and configurations. This batch script must be
+REM run from inside a Visual Studio Command Prompt for the desired version of
+REM Visual Studio ^(the initial platform configured for the command prompt does
+REM not really matter^). Exactly one command line argument is required, the
+REM name of an existing directory to be used as the final destination directory
+REM for the generated output files, which will be placed in sub-directories
+REM created therein. Ideally, the directory specified should be empty.
+REM
+REM Example:
+REM
+REM CD /D C:\dev\sqlite\core
+REM tool\build-all-msvc.bat C:\Temp
+REM
+REM In the example above, "C:\dev\sqlite\core" represents the root of the
+REM source tree for SQLite and "C:\Temp" represents the final destination
+REM directory for the generated output files.
+REM
+REM There are several environment variables that may be set to modify the
+REM behavior of this batch script and its associated Makefile. The list of
+REM platforms to build may be overriden by using the PLATFORMS environment
+REM variable, which should contain a list of platforms ^(e.g. x86 x86_amd64
+REM x86_arm^). All platforms must be supported by the version of Visual Studio
+REM being used. The list of configurations to build may be overridden by
+REM setting the CONFIGURATIONS environment variable, which should contain a
+REM list of configurations to build ^(e.g. Debug Retail^). Neither of these
+REM variable values may contain any double quotes, surrounding or embedded.
+REM Finally, the NCRTLIBPATH and NSDKLIBPATH environment variables may be set
+REM to specify the location of the CRT and SDK, respectively, needed to compile
+REM executables native to the architecture of the build machine during any
+REM cross-compilation that may be necessary, depending on the platforms to be
+REM built. These values in these two variables should be surrounded by double
+REM quotes if they contain spaces.
+REM
+REM Please note that the SQLite build process performed by the Makefile
+REM associated with this batch script requires both Gawk ^(gawk.exe^) and Tcl
+REM 8.5 ^(tclsh85.exe^) to be present in a directory contained in the PATH
+REM environment variable unless a pre-existing amalgamation file is used.
+REM
SETLOCAL
REM SET __ECHO=ECHO
REM SET __ECHO2=ECHO
+REM SET __ECHO3=ECHO
IF NOT DEFINED _AECHO (SET _AECHO=REM)
IF NOT DEFINED _CECHO (SET _CECHO=REM)
IF NOT DEFINED _VECHO (SET _VECHO=REM)
@@ -93,17 +137,35 @@ IF NOT DEFINED PLATFORMS (
%_VECHO% Platforms = '%PLATFORMS%'
REM
+REM NOTE: If the list of configurations is not already set, use the default
+REM list.
+REM
+IF NOT DEFINED CONFIGURATIONS (
+ SET CONFIGURATIONS=Debug Retail
+)
+
+%_VECHO% Configurations = '%CONFIGURATIONS%'
+
+REM
REM NOTE: Setup environment variables to translate between the MSVC platform
REM names and the names to be used for the platform-specific binary
REM directories.
REM
+SET amd64_NAME=x64
+SET arm_NAME=ARM
+SET x64_NAME=x64
SET x86_NAME=x86
SET x86_amd64_NAME=x64
SET x86_arm_NAME=ARM
+SET x86_x64_NAME=x64
+%_VECHO% amd64_Name = '%amd64_NAME%'
+%_VECHO% arm_Name = '%arm_NAME%'
+%_VECHO% x64_Name = '%x64_NAME%'
%_VECHO% x86_Name = '%x86_NAME%'
%_VECHO% x86_amd64_Name = '%x86_amd64_NAME%'
%_VECHO% x86_arm_Name = '%x86_arm_NAME%'
+%_VECHO% x86_x64_Name = '%x86_x64_NAME%'
REM
REM NOTE: Check for the external tools needed during the build process ^(i.e.
@@ -115,6 +177,24 @@ FOR %%T IN (gawk.exe tclsh85.exe) DO (
)
REM
+REM NOTE: The Gawk executable "gawk.exe" is required during the SQLite build
+REM process unless a pre-existing amalgamation file is used.
+REM
+IF NOT DEFINED gawk.exe_PATH (
+ ECHO The Gawk executable "gawk.exe" is required to be in the PATH.
+ GOTO errors
+)
+
+REM
+REM NOTE: The Tcl 8.5 executable "tclsh85.exe" is required during the SQLite
+REM build process unless a pre-existing amalgamation file is used.
+REM
+IF NOT DEFINED tclsh85.exe_PATH (
+ ECHO The Tcl 8.5 executable "tclsh85.exe" is required to be in the PATH.
+ GOTO errors
+)
+
+REM
REM NOTE: Set the TOOLPATH variable to contain all the directories where the
REM external tools were found in the search above.
REM
@@ -127,12 +207,31 @@ REM NOTE: Check for MSVC 2012 because the Windows SDK directory handling is
REM slightly different for that version.
REM
IF "%VisualStudioVersion%" == "11.0" (
- SET SET_NSDKLIBPATH=1
+ REM
+ REM NOTE: If the Windows SDK library path has already been set, do not set
+ REM it to something else later on.
+ REM
+ IF NOT DEFINED NSDKLIBPATH (
+ SET SET_NSDKLIBPATH=1
+ )
) ELSE (
CALL :fn_UnsetVariable SET_NSDKLIBPATH
)
REM
+REM NOTE: Check if this is the Windows Phone SDK. If so, a different batch
+REM file is necessary to setup the build environment. Since the variable
+REM values involved here may contain parenthesis, using GOTO instead of
+REM an IF block is required.
+REM
+IF DEFINED WindowsPhoneKitDir GOTO set_vcvarsall_phone
+SET VCVARSALL=%VCINSTALLDIR%\vcvarsall.bat
+GOTO set_vcvarsall_done
+:set_vcvarsall_phone
+SET VCVARSALL=%VCINSTALLDIR%\WPSDK\WP80\vcvarsphoneall.bat
+:set_vcvarsall_done
+
+REM
REM NOTE: This is the outer loop. There should be exactly one iteration per
REM platform.
REM
@@ -142,7 +241,7 @@ FOR %%P IN (%PLATFORMS%) DO (
REM be used for the name of the platform-specific binary directory via
REM the environment variables setup earlier.
REM
- CALL :fn_SetVariable %%P_NAME PLATFORMNAME
+ CALL :fn_CopyVariable %%P_NAME PLATFORMNAME
REM
REM NOTE: This is the inner loop. There should be exactly one iteration.
@@ -172,6 +271,7 @@ FOR %%P IN (%PLATFORMS%) DO (
CALL :fn_UnsetVariable Platform
REM CALL :fn_UnsetVariable VCINSTALLDIR
CALL :fn_UnsetVariable VSINSTALLDIR
+ CALL :fn_UnsetVariable WindowsPhoneKitDir
CALL :fn_UnsetVariable WindowsSdkDir
CALL :fn_UnsetVariable WindowsSdkDir_35
CALL :fn_UnsetVariable WindowsSdkDir_old
@@ -181,129 +281,151 @@ FOR %%P IN (%PLATFORMS%) DO (
REM
SET PATH=%TOOLPATH%;%SystemRoot%\System32;%SystemRoot%
- REM
- REM NOTE: Launch a nested command shell to perform the following steps:
- REM
- REM 1. Setup the MSVC environment for this platform using the
- REM official batch file.
- REM
- REM 2. Make sure that no stale build output files are present.
- REM
- REM 3. Build the "sqlite3.dll" and "sqlite3.lib" binaries for this
- REM platform.
- REM
- REM 4. Copy the "sqlite3.dll" and "sqlite3.lib" binaries for this
- REM platform to the platform-specific directory beneath the
- REM binary directory.
- REM
- "%ComSpec%" /C (
+ FOR %%B IN (%CONFIGURATIONS%) DO (
REM
- REM NOTE: Attempt to setup the MSVC environment for this platform.
+ REM NOTE: When preparing the debug build, set the DEBUG and MEMDEBUG
+ REM environment variables to be picked up by the MSVC makefile
+ REM itself.
REM
- %__ECHO% CALL "%VCINSTALLDIR%\vcvarsall.bat" %%P
-
- IF ERRORLEVEL 1 (
- ECHO Failed to call "%VCINSTALLDIR%\vcvarsall.bat" for platform %%P.
- GOTO errors
+ IF /I "%%B" == "Debug" (
+ SET DEBUG=2
+ SET MEMDEBUG=1
+ ) ELSE (
+ CALL :fn_UnsetVariable DEBUG
+ CALL :fn_UnsetVariable MEMDEBUG
)
REM
- REM NOTE: If this batch file is not running in "what-if" mode, check to
- REM be sure we were actually able to setup the MSVC environment as
- REM current versions of their official batch file do not set the
- REM exit code upon failure.
+ REM NOTE: Launch a nested command shell to perform the following steps:
REM
- IF NOT DEFINED __ECHO (
- IF NOT DEFINED WindowsSdkDir (
- ECHO Cannot build, Windows SDK not found for platform %%P.
- GOTO errors
- )
- )
-
+ REM 1. Setup the MSVC environment for this platform using the
+ REM official batch file.
REM
- REM NOTE: When using MSVC 2012, the native SDK path cannot simply use
- REM the "lib" sub-directory beneath the location specified in the
- REM WindowsSdkDir environment variable because that location does
- REM not actually contain the necessary library files for x86.
- REM This must be done for each iteration because it relies upon
- REM the WindowsSdkDir environment variable being set by the batch
- REM file used to setup the MSVC environment.
+ REM 2. Make sure that no stale build output files are present.
REM
- IF DEFINED SET_NSDKLIBPATH (
- CALL :fn_SetVariable WindowsSdkDir NSDKLIBPATH
- CALL :fn_AppendVariable NSDKLIBPATH \lib\win8\um\x86
- )
-
+ REM 3. Build the "sqlite3.dll" and "sqlite3.lib" binaries for this
+ REM platform.
REM
- REM NOTE: Unless prevented from doing so, invoke NMAKE with the MSVC
- REM makefile to clean any stale build output from previous
- REM iterations of this loop and/or previous runs of this batch
- REM file, etc.
+ REM 4. Copy the "sqlite3.dll" and "sqlite3.lib" binaries for this
+ REM platform to the platform-specific directory beneath the
+ REM binary directory.
REM
- IF NOT DEFINED NOCLEAN (
- %__ECHO% nmake -f Makefile.msc clean
+ "%ComSpec%" /C (
+ REM
+ REM NOTE: Attempt to setup the MSVC environment for this platform.
+ REM
+ %__ECHO3% CALL "%VCVARSALL%" %%P
IF ERRORLEVEL 1 (
- ECHO Failed to clean for platform %%P.
+ ECHO Failed to call "%VCVARSALL%" for platform %%P.
GOTO errors
)
- ) ELSE (
+
REM
- REM NOTE: Even when the cleaning step has been disabled, we still need
- REM to remove the build output for the files we are specifically
- REM wanting to build for each platform.
+ REM NOTE: If this batch file is not running in "what-if" mode, check to
+ REM be sure we were actually able to setup the MSVC environment
+ REM as current versions of their official batch file do not set
+ REM the exit code upon failure.
REM
- %__ECHO% DEL /Q sqlite3.dll sqlite3.lib sqlite3.pdb
- )
+ IF NOT DEFINED __ECHO3 (
+ IF NOT DEFINED WindowsPhoneKitDir (
+ IF NOT DEFINED WindowsSdkDir (
+ ECHO Cannot build, Windows SDK not found for platform %%P.
+ GOTO errors
+ )
+ )
+ )
- REM
- REM NOTE: Invoke NMAKE with the MSVC makefile to build the "sqlite3.dll"
- REM binary. The x86 compiler will be used to compile the native
- REM command line tools needed during the build process itself.
- REM Also, disable looking for and/or linking to the native Tcl
- REM runtime library.
- REM
- %__ECHO% nmake -f Makefile.msc sqlite3.dll "NCC=""%VCINSTALLDIR%\bin\cl.exe""" USE_NATIVE_LIBPATHS=1 NO_TCL=1 %NMAKE_ARGS%
+ REM
+ REM NOTE: When using MSVC 2012, the native SDK path cannot simply use
+ REM the "lib" sub-directory beneath the location specified in the
+ REM WindowsSdkDir environment variable because that location does
+ REM not actually contain the necessary library files for x86.
+ REM This must be done for each iteration because it relies upon
+ REM the WindowsSdkDir environment variable being set by the batch
+ REM file used to setup the MSVC environment.
+ REM
+ IF DEFINED SET_NSDKLIBPATH (
+ IF DEFINED WindowsPhoneKitDir (
+ CALL :fn_CopyVariable WindowsPhoneKitDir NSDKLIBPATH
+ CALL :fn_AppendVariable NSDKLIBPATH \lib\x86
+ ) ELSE IF DEFINED WindowsSdkDir (
+ CALL :fn_CopyVariable WindowsSdkDir NSDKLIBPATH
+ CALL :fn_AppendVariable NSDKLIBPATH \lib\win8\um\x86
+ )
+ )
- IF ERRORLEVEL 1 (
- ECHO Failed to build "sqlite3.dll" for platform %%P.
- GOTO errors
- )
+ REM
+ REM NOTE: Unless prevented from doing so, invoke NMAKE with the MSVC
+ REM makefile to clean any stale build output from previous
+ REM iterations of this loop and/or previous runs of this batch
+ REM file, etc.
+ REM
+ IF NOT DEFINED NOCLEAN (
+ %__ECHO% nmake -f Makefile.msc clean
+
+ IF ERRORLEVEL 1 (
+ ECHO Failed to clean for platform %%P.
+ GOTO errors
+ )
+ ) ELSE (
+ REM
+ REM NOTE: Even when the cleaning step has been disabled, we still
+ REM need to remove the build output for the files we are
+ REM specifically wanting to build for each platform.
+ REM
+ %__ECHO% DEL /Q sqlite3.dll sqlite3.lib sqlite3.pdb
+ )
- REM
- REM NOTE: Copy the "sqlite3.dll" file to the platform-specific directory
- REM beneath the binary directory.
- REM
- %__ECHO% XCOPY sqlite3.dll "%BINARYDIRECTORY%\%%D\" %FFLAGS% %DFLAGS%
+ REM
+ REM NOTE: Call NMAKE with the MSVC makefile to build the "sqlite3.dll"
+ REM binary. The x86 compiler will be used to compile the native
+ REM command line tools needed during the build process itself.
+ REM Also, disable looking for and/or linking to the native Tcl
+ REM runtime library.
+ REM
+ %__ECHO% nmake -f Makefile.msc sqlite3.dll XCOMPILE=1 USE_NATIVE_LIBPATHS=1 NO_TCL=1 %NMAKE_ARGS%
- IF ERRORLEVEL 1 (
- ECHO Failed to copy "sqlite3.dll" to "%BINARYDIRECTORY%\%%D\".
- GOTO errors
- )
+ IF ERRORLEVEL 1 (
+ ECHO Failed to build %%B "sqlite3.dll" for platform %%P.
+ GOTO errors
+ )
- REM
- REM NOTE: Copy the "sqlite3.lib" file to the platform-specific directory
- REM beneath the binary directory.
- REM
- %__ECHO% XCOPY sqlite3.lib "%BINARYDIRECTORY%\%%D\" %FFLAGS% %DFLAGS%
+ REM
+ REM NOTE: Copy the "sqlite3.dll" file to the appropriate directory for
+ REM the build and platform beneath the binary directory.
+ REM
+ %__ECHO% XCOPY sqlite3.dll "%BINARYDIRECTORY%\%%B\%%D\" %FFLAGS% %DFLAGS%
- IF ERRORLEVEL 1 (
- ECHO Failed to copy "sqlite3.lib" to "%BINARYDIRECTORY%\%%D\".
- GOTO errors
- )
+ IF ERRORLEVEL 1 (
+ ECHO Failed to copy "sqlite3.dll" to "%BINARYDIRECTORY%\%%B\%%D\".
+ GOTO errors
+ )
- REM
- REM NOTE: Copy the "sqlite3.pdb" file to the platform-specific directory
- REM beneath the binary directory unless we are prevented from doing
- REM so.
- REM
- IF NOT DEFINED NOSYMBOLS (
- %__ECHO% XCOPY sqlite3.pdb "%BINARYDIRECTORY%\%%D\" %FFLAGS% %DFLAGS%
+ REM
+ REM NOTE: Copy the "sqlite3.lib" file to the appropriate directory for
+ REM the build and platform beneath the binary directory.
+ REM
+ %__ECHO% XCOPY sqlite3.lib "%BINARYDIRECTORY%\%%B\%%D\" %FFLAGS% %DFLAGS%
IF ERRORLEVEL 1 (
- ECHO Failed to copy "sqlite3.pdb" to "%BINARYDIRECTORY%\%%D\".
+ ECHO Failed to copy "sqlite3.lib" to "%BINARYDIRECTORY%\%%B\%%D\".
GOTO errors
)
+
+ REM
+ REM NOTE: Copy the "sqlite3.pdb" file to the appropriate directory for
+ REM the build and platform beneath the binary directory unless we
+ REM are prevented from doing so.
+ REM
+ IF NOT DEFINED NOSYMBOLS (
+ %__ECHO% XCOPY sqlite3.pdb "%BINARYDIRECTORY%\%%B\%%D\" %FFLAGS% %DFLAGS%
+
+ IF ERRORLEVEL 1 (
+ ECHO Failed to copy "sqlite3.pdb" to "%BINARYDIRECTORY%\%%B\%%D\".
+ GOTO errors
+ )
+ )
)
)
)
@@ -339,7 +461,7 @@ GOTO no_errors
VERIFY MAYBE 2> NUL
GOTO :EOF
-:fn_SetVariable
+:fn_CopyVariable
SETLOCAL
IF NOT DEFINED %1 GOTO :EOF
IF "%2" == "" GOTO :EOF
diff --git a/lib/libsqlite3/tool/mkvsix.tcl b/lib/libsqlite3/tool/mkvsix.tcl
index a7517786c51..e9f1f818dae 100644
--- a/lib/libsqlite3/tool/mkvsix.tcl
+++ b/lib/libsqlite3/tool/mkvsix.tcl
@@ -2,7 +2,95 @@
#
# This script is used to generate a VSIX (Visual Studio Extension) file for
# SQLite usable by Visual Studio.
-
+#
+# PREREQUISITES
+#
+# 1. Tcl 8.4 and later are supported, earlier versions have not been tested.
+#
+# 2. The "sqlite3.h" file is assumed to exist in the parent directory of the
+# directory containing this script. The [optional] second command line
+# argument to this script may be used to specify an alternate location.
+# This script also assumes that the "sqlite3.h" file corresponds with the
+# version of the binaries to be packaged. This assumption is not verified
+# by this script.
+#
+# 3. The temporary directory specified in the TEMP or TMP environment variables
+# must refer to an existing directory writable by the current user.
+#
+# 4. The "zip" and "unzip" command line tools must be located either in a
+# directory contained in the PATH environment variable or specified as the
+# exact file names to execute in the "ZipTool" and "UnZipTool" environment
+# variables, respectively.
+#
+# 5. The template VSIX file (which is basically a zip file) must be located in
+# a "win" directory inside the directory containing this script. It should
+# not contain any executable binaries. It should only contain dynamic
+# textual content files to be processed using [subst] and/or static content
+# files to be copied verbatim.
+#
+# 6. The executable and other compiled binary files to be packaged into the
+# final VSIX file (e.g. DLLs, LIBs, and PDBs) must be located in a single
+# directory tree. The top-level directory of the tree must be specified as
+# the first command line argument to this script. The second level
+# sub-directory names must match those of the build configuration (e.g.
+# "Debug" or "Retail"). The third level sub-directory names must match
+# those of the platform (e.g. "x86", "x64", and "ARM"). For example, the
+# binary files to be packaged would need to be organized as follows when
+# packaging the "Debug" and "Retail" build configurations for the "x86" and
+# "x64" platforms (in this example, "C:\temp" is the top-level directory as
+# specified in the first command line argument):
+#
+# C:\Temp\Debug\x86\sqlite3.lib
+# C:\Temp\Debug\x86\sqlite3.dll
+# C:\Temp\Debug\x86\sqlite3.pdb
+# C:\Temp\Debug\x64\sqlite3.lib
+# C:\Temp\Debug\x64\sqlite3.dll
+# C:\Temp\Debug\x64\sqlite3.pdb
+# C:\Temp\Retail\x86\sqlite3.lib
+# C:\Temp\Retail\x86\sqlite3.dll
+# C:\Temp\Retail\x86\sqlite3.pdb
+# C:\Temp\Retail\x64\sqlite3.lib
+# C:\Temp\Retail\x64\sqlite3.dll
+# C:\Temp\Retail\x64\sqlite3.pdb
+#
+# The above directory tree organization is performed automatically if the
+# "tool\build-all-msvc.bat" batch script is used to build the binary files
+# to be packaged.
+#
+# USAGE
+#
+# The first argument to this script is required and must be the name of the
+# top-level directory containing the directories and files organized into a
+# tree as described in item 6 of the PREREQUISITES section, above. The second
+# argument is optional and if present must contain the name of the directory
+# containing the root of the source tree for SQLite. The third argument is
+# optional and if present must contain the flavor the VSIX package to build.
+# Currently, the only supported package flavors are "WinRT" and "WP80". The
+# fourth argument is optional and if present must be a string containing a list
+# of platforms to include in the VSIX package. The format of the platform list
+# string is "platform1,platform2,platform3". Typically, when on Windows, this
+# script is executed using commands similar to the following from a normal
+# Windows command prompt:
+#
+# CD /D C:\dev\sqlite\core
+# tclsh85 tool\mkvsix.tcl C:\Temp
+#
+# In the example above, "C:\dev\sqlite\core" represents the root of the source
+# tree for SQLite and "C:\Temp" represents the top-level directory containing
+# the executable and other compiled binary files, organized into a directory
+# tree as described in item 6 of the PREREQUISITES section, above.
+#
+# This script should work on non-Windows platforms as well, provided that all
+# the requirements listed in the PREREQUISITES section are met.
+#
+# NOTES
+#
+# The temporary directory is used as a staging area for the final VSIX file.
+# The template VSIX file is extracted, its contents processed, and then the
+# resulting files are packaged into the final VSIX file.
+#
+package require Tcl 8.4
+
proc fail { {error ""} {usage false} } {
if {[string length $error] > 0} then {
puts stdout $error
@@ -11,7 +99,8 @@ proc fail { {error ""} {usage false} } {
puts stdout "usage:\
[file tail [info nameofexecutable]]\
-[file tail [info script]] <binaryDirectory> \[sourceDirectory\]"
+[file tail [info script]] <binaryDirectory> \[sourceDirectory\]\
+\[packageFlavor\] \[platformNames\]"
exit 1
}
@@ -84,20 +173,24 @@ proc writeFile { fileName data } {
proc substFile { fileName } {
#
# NOTE: Performs all Tcl command, variable, and backslash substitutions in
- # the specified file and then re-writes the contents of that same file
+ # the specified file and then rewrites the contents of that same file
# with the substituted data.
#
return [writeFile $fileName [uplevel 1 [list subst [readFile $fileName]]]]
}
-proc replacePlatform { fileName platformName } {
+proc replaceFileNameTokens { fileName name buildName platformName } {
#
# NOTE: Returns the specified file name containing the platform name instead
# of platform placeholder tokens.
#
- return [string map [list <platform> $platformName] $fileName]
+ return [string map [list <build> $buildName <platform> $platformName \
+ <name> $name] $fileName]
}
+#
+# NOTE: This is the entry point for this script.
+#
set script [file normalize [info script]]
if {[string length $script] == 0} then {
@@ -113,7 +206,7 @@ set rootName [file rootname [file tail $script]]
# NOTE: Process and verify all the command line arguments.
#
set argc [llength $argv]
-if {$argc != 1 && $argc != 2} then {fail}
+if {$argc < 1 || $argc > 4} then {fail}
set binaryDirectory [lindex $argv 0]
@@ -126,7 +219,7 @@ if {![file exists $binaryDirectory] || \
fail "binary directory does not exist"
}
-if {$argc == 2} then {
+if {$argc >= 2} then {
set sourceDirectory [lindex $argv 1]
} else {
#
@@ -145,6 +238,47 @@ if {![file exists $sourceDirectory] || \
fail "source directory does not exist"
}
+if {$argc >= 3} then {
+ set packageFlavor [lindex $argv 2]
+} else {
+ #
+ # NOTE: Assume the package flavor is WinRT.
+ #
+ set packageFlavor WinRT
+}
+
+if {[string length $packageFlavor] == 0} then {
+ fail "invalid package flavor"
+}
+
+if {[string equal -nocase $packageFlavor WinRT]} then {
+ set shortName SQLite.WinRT
+ set displayName "SQLite for Windows Runtime"
+ set targetPlatformIdentifier Windows
+ set extraSdkPath ""
+ set extraFileListAttributes [appendArgs \
+ "\r\n " {AppliesTo="WindowsAppContainer"} \
+ "\r\n " {DependsOn="Microsoft.VCLibs, version=11.0"}]
+} elseif {[string equal -nocase $packageFlavor WP80]} then {
+ set shortName SQLite.WP80
+ set displayName "SQLite for Windows Phone"
+ set targetPlatformIdentifier "Windows Phone"
+ set extraSdkPath "\\..\\$targetPlatformIdentifier"
+ set extraFileListAttributes ""
+} else {
+ fail "unsupported package flavor, must be \"WinRT\" or \"WP80\""
+}
+
+if {$argc >= 4} then {
+ set platformNames [list]
+
+ foreach platformName [split [lindex $argv 3] ", "] {
+ if {[string length $platformName] > 0} then {
+ lappend platformNames $platformName
+ }
+ }
+}
+
###############################################################################
#
@@ -168,7 +302,8 @@ if {![file exists $templateFile] || \
}
set currentDirectory [pwd]
-set outputFile [file join $currentDirectory sqlite-output.vsix]
+set outputFile [file join $currentDirectory [appendArgs sqlite- \
+ $packageFlavor -output.vsix]]
if {[file exists $outputFile]} then {
fail [appendArgs "output file \"" $outputFile "\" already exists"]
@@ -244,60 +379,92 @@ if {![regexp -line -- $pattern $data dummy version]} then {
###############################################################################
#
-# NOTE: Setup the master file list data, including the necessary flags.
+# NOTE: Setup all the master file list data. This includes the source file
+# names, the destination file names, and the file processing flags. The
+# possible file processing flags are:
+#
+# "buildNeutral" -- This flag indicates the file location and content do
+# not depend on the build configuration.
+#
+# "platformNeutral" -- This flag indicates the file location and content
+# do not depend on the build platform.
+#
+# "subst" -- This flag indicates that the file contains dynamic textual
+# content that needs to be processed using [subst] prior to
+# packaging the file into the final VSIX package. The primary
+# use of this flag is to insert the name of the VSIX package,
+# some package flavor-specific value, or the SQLite version
+# into a file.
+#
+# "noDebug" -- This flag indicates that the file should be skipped when
+# processing the debug build.
+#
+# "noRetail" -- This flag indicates that the file should be skipped when
+# processing the retail build.
+#
+# "move" -- This flag indicates that the file should be moved from the
+# source to the destination instead of being copied.
+#
+# This file metadata may be overridden, either in whole or in part, via
+# the user-specific customizations file.
#
if {![info exists fileNames(source)]} then {
- set fileNames(source) [list "" "" "" \
- [file join $sourceDirectory sqlite3.h] \
- [file join $binaryDirectory <platform> sqlite3.lib] \
- [file join $binaryDirectory <platform> sqlite3.dll]]
+ set fileNames(source) [list "" "" \
+ [file join $stagingDirectory DesignTime <build> <platform> sqlite3.props] \
+ [file join $sourceDirectory sqlite3.h] \
+ [file join $binaryDirectory <build> <platform> sqlite3.lib] \
+ [file join $binaryDirectory <build> <platform> sqlite3.dll]]
if {![info exists no(symbols)]} then {
lappend fileNames(source) \
- [file join $binaryDirectory <platform> sqlite3.pdb]
+ [file join $binaryDirectory <build> <platform> sqlite3.pdb]
}
}
if {![info exists fileNames(destination)]} then {
set fileNames(destination) [list \
- [file join $stagingDirectory extension.vsixmanifest] \
- [file join $stagingDirectory SDKManifest.xml] \
- [file join $stagingDirectory DesignTime CommonConfiguration \
- <platform> SQLite.WinRT.props] \
- [file join $stagingDirectory DesignTime CommonConfiguration \
- <platform> sqlite3.h] \
- [file join $stagingDirectory DesignTime CommonConfiguration \
- <platform> sqlite3.lib] \
- [file join $stagingDirectory Redist CommonConfiguration \
- <platform> sqlite3.dll]]
+ [file join $stagingDirectory extension.vsixmanifest] \
+ [file join $stagingDirectory SDKManifest.xml] \
+ [file join $stagingDirectory DesignTime <build> <platform> <name>.props] \
+ [file join $stagingDirectory DesignTime <build> <platform> sqlite3.h] \
+ [file join $stagingDirectory DesignTime <build> <platform> sqlite3.lib] \
+ [file join $stagingDirectory Redist <build> <platform> sqlite3.dll]]
if {![info exists no(symbols)]} then {
lappend fileNames(destination) \
- [file join $stagingDirectory Redist Debug \
- <platform> sqlite3.pdb]
+ [file join $stagingDirectory Redist <build> <platform> sqlite3.pdb]
}
}
-if {![info exists fileNames(neutral)]} then {
- set fileNames(neutral) [list 1 1 1 1 0 0]
+if {![info exists fileNames(flags)]} then {
+ set fileNames(flags) [list \
+ [list buildNeutral platformNeutral subst] \
+ [list buildNeutral platformNeutral subst] \
+ [list buildNeutral platformNeutral subst move] \
+ [list buildNeutral platformNeutral] \
+ [list] [list] [list noRetail]]
if {![info exists no(symbols)]} then {
- lappend fileNames(neutral) 0
+ lappend fileNames(flags) [list noRetail]
}
}
-if {![info exists fileNames(subst)]} then {
- set fileNames(subst) [list 1 1 1 0 0 0]
+###############################################################################
- if {![info exists no(symbols)]} then {
- lappend fileNames(subst) 0
- }
+#
+# NOTE: Setup the list of builds supported by this script. These may be
+# overridden via the user-specific customizations file.
+#
+if {![info exists buildNames]} then {
+ set buildNames [list Debug Retail]
}
###############################################################################
#
-# NOTE: Setup the list of platforms supported by this script.
+# NOTE: Setup the list of platforms supported by this script. These may be
+# overridden via the command line or the user-specific customizations
+# file.
#
if {![info exists platformNames]} then {
set platformNames [list x86 x64 ARM]
@@ -311,72 +478,117 @@ if {![info exists platformNames]} then {
file mkdir $stagingDirectory
#
-# NOTE: Build the Tcl command used to extract the template package to the
-# staging directory.
+# NOTE: Build the Tcl command used to extract the template VSIX package to
+# the staging directory.
#
set extractCommand [list exec -- $unzip $templateFile -d $stagingDirectory]
#
-# NOTE: Extract the template package to the staging directory.
+# NOTE: Extract the template VSIX package to the staging directory.
#
eval $extractCommand
###############################################################################
#
-# NOTE: Process each file in the master file list. There are actually four
-# parallel lists that contain the source file names, destination file
-# names, the platform-neutral flags, and the use-subst flags. When the
-# platform-neutral flag is non-zero, the file is not platform-specific.
-# When the use-subst flag is non-zero, the file is considered to be a
-# text file that may contain Tcl variable and/or command replacements,
-# to be dynamically replaced during processing. If the source file name
-# is an empty string, then the destination file name will be assumed to
-# already exist in the staging directory and will not be copied; however,
-# dynamic replacements may still be performed on the destination file
-# prior to the package being re-zipped.
-#
-foreach sourceFileName $fileNames(source) \
- destinationFileName $fileNames(destination) \
- isNeutral $fileNames(neutral) useSubst $fileNames(subst) {
+# NOTE: Process each file in the master file list. There are actually three
+# parallel lists that contain the source file names, the destination file
+# names, and the file processing flags. If the "buildNeutral" flag is
+# present, the file location and content do not depend on the build
+# configuration and "CommonConfiguration" will be used in place of the
+# build configuration name. If the "platformNeutral" flag is present,
+# the file location and content do not depend on the build platform and
+# "neutral" will be used in place of the build platform name. If the
+# "subst" flag is present, the file is assumed to be a text file that may
+# contain Tcl variable, command, and backslash replacements, to be
+# dynamically replaced during processing using the Tcl [subst] command.
+# If the "noDebug" flag is present, the file will be skipped when
+# processing for the debug build. If the "noRetail" flag is present, the
+# file will be skipped when processing for the retail build. If the
+# "move" flag is present, the source file will be deleted after it is
+# copied to the destination file. If the source file name is an empty
+# string, the destination file name will be assumed to already exist in
+# the staging directory and will not be copied; however, Tcl variable,
+# command, and backslash replacements may still be performed on the
+# destination file prior to the final VSIX package being built if the
+# "subst" flag is present.
+#
+foreach sourceFileName $fileNames(source) \
+ destinationFileName $fileNames(destination) \
+ fileFlags $fileNames(flags) {
+ #
+ # NOTE: Process the file flags into separate boolean variables that may be
+ # used within the loop.
+ #
+ set isBuildNeutral [expr {[lsearch $fileFlags buildNeutral] != -1}]
+ set isPlatformNeutral [expr {[lsearch $fileFlags platformNeutral] != -1}]
+ set isMove [expr {[lsearch $fileFlags move] != -1}]
+ set useSubst [expr {[lsearch $fileFlags subst] != -1}]
+
#
- # NOTE: If the current file is platform-neutral, then only one platform will
- # be processed for it, namely "neutral"; otherwise, each supported
- # platform will be processed for it individually.
+ # NOTE: If the current file is build-neutral, then only one build will
+ # be processed for it, namely "CommonConfiguration"; otherwise, each
+ # supported build will be processed for it individually.
#
- foreach platformName [expr {$isNeutral ? [list neutral] : $platformNames}] {
+ foreach buildName \
+ [expr {$isBuildNeutral ? [list CommonConfiguration] : $buildNames}] {
#
- # NOTE: Use the actual platform name in the destination file name.
+ # NOTE: Should the current file be skipped for this build?
#
- set newDestinationFileName [replacePlatform $destinationFileName \
- $platformName]
+ if {[lsearch $fileFlags no${buildName}] != -1} then {
+ continue
+ }
#
- # NOTE: Does the source file need to be copied to the destination file?
+ # NOTE: If the current file is platform-neutral, then only one platform
+ # will be processed for it, namely "neutral"; otherwise, each
+ # supported platform will be processed for it individually.
#
- if {[string length $sourceFileName] > 0} then {
+ foreach platformName \
+ [expr {$isPlatformNeutral ? [list neutral] : $platformNames}] {
#
- # NOTE: First, make sure the destination directory exists.
+ # NOTE: Use the actual platform name in the destination file name.
#
- file mkdir [file dirname $newDestinationFileName]
+ set newDestinationFileName [replaceFileNameTokens $destinationFileName \
+ $shortName $buildName $platformName]
#
- # NOTE: Then, copy the source file to the destination file verbatim.
+ # NOTE: Does the source file need to be copied to the destination file?
#
- file copy [replacePlatform $sourceFileName $platformName] \
- $newDestinationFileName
- }
+ if {[string length $sourceFileName] > 0} then {
+ #
+ # NOTE: First, make sure the destination directory exists.
+ #
+ file mkdir [file dirname $newDestinationFileName]
+
+ #
+ # NOTE: Then, copy the source file to the destination file verbatim.
+ #
+ set newSourceFileName [replaceFileNameTokens $sourceFileName \
+ $shortName $buildName $platformName]
+
+ file copy $newSourceFileName $newDestinationFileName
+
+ #
+ # NOTE: If this is a move instead of a copy, delete the source file
+ # now.
+ #
+ if {$isMove} then {
+ file delete $newSourceFileName
+ }
+ }
- #
- # NOTE: Does the destination file contain dynamic replacements that must
- # be processed now?
- #
- if {$useSubst} then {
#
- # NOTE: Perform any dynamic replacements contained in the destination
- # file and then re-write it in-place.
+ # NOTE: Does the destination file contain dynamic replacements that must
+ # be processed now?
#
- substFile $newDestinationFileName
+ if {$useSubst} then {
+ #
+ # NOTE: Perform any dynamic replacements contained in the destination
+ # file and then re-write it in-place.
+ #
+ substFile $newDestinationFileName
+ }
}
}
}
@@ -391,13 +603,13 @@ foreach sourceFileName $fileNames(source) \
cd $stagingDirectory
#
-# NOTE: Build the Tcl command used to archive the final package in the
+# NOTE: Build the Tcl command used to archive the final VSIX package in the
# output directory.
#
set archiveCommand [list exec -- $zip -r $outputFile *]
#
-# NOTE: Build the final package archive in the output directory.
+# NOTE: Build the final VSIX package archive in the output directory.
#
eval $archiveCommand
diff --git a/lib/libsqlite3/tool/showdb.c b/lib/libsqlite3/tool/showdb.c
index d378d05d367..a100bba4f50 100644
--- a/lib/libsqlite3/tool/showdb.c
+++ b/lib/libsqlite3/tool/showdb.c
@@ -6,7 +6,11 @@
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
+
+#if !defined(_MSC_VER)
#include <unistd.h>
+#endif
+
#include <stdlib.h>
#include <string.h>
#include "sqlite3.h"
diff --git a/lib/libsqlite3/tool/spaceanal.tcl b/lib/libsqlite3/tool/spaceanal.tcl
index fd59670adae..6988f6e8b93 100644
--- a/lib/libsqlite3/tool/spaceanal.tcl
+++ b/lib/libsqlite3/tool/spaceanal.tcl
@@ -30,32 +30,34 @@ foreach arg $argv {
}
}
if {$file_to_analyze==""} usage
-if {![file exists $file_to_analyze]} {
- puts stderr "No such file: $file_to_analyze"
+set root_filename $file_to_analyze
+regexp {^file:(//)?([^?]*)} $file_to_analyze all x1 root_filename
+if {![file exists $root_filename]} {
+ puts stderr "No such file: $root_filename"
exit 1
}
-if {![file readable $file_to_analyze]} {
- puts stderr "File is not readable: $file_to_analyze"
+if {![file readable $root_filename]} {
+ puts stderr "File is not readable: $root_filename"
exit 1
}
-set true_file_size [file size $file_to_analyze]
+set true_file_size [file size $root_filename]
if {$true_file_size<512} {
- puts stderr "Empty or malformed database: $file_to_analyze"
+ puts stderr "Empty or malformed database: $root_filename"
exit 1
}
# Compute the total file size assuming test_multiplexor is being used.
# Assume that SQLITE_ENABLE_8_3_NAMES might be enabled
#
-set extension [file extension $file_to_analyze]
-set pattern $file_to_analyze
+set extension [file extension $root_filename]
+set pattern $root_filename
append pattern {[0-3][0-9][0-9]}
foreach f [glob -nocomplain $pattern] {
incr true_file_size [file size $f]
set extension {}
}
if {[string length $extension]>=2 && [string length $extension]<=4} {
- set pattern [file rootname $file_to_analyze]
+ set pattern [file rootname $root_filename]
append pattern {.[0-3][0-9][0-9]}
foreach f [glob -nocomplain $pattern] {
incr true_file_size [file size $f]
@@ -64,7 +66,10 @@ if {[string length $extension]>=2 && [string length $extension]<=4} {
# Open the database
#
-sqlite3 db $file_to_analyze
+if {[catch {sqlite3 db $file_to_analyze -uri 1} msg]} {
+ puts stderr "error trying to open $file_to_analyze: $msg"
+ exit 1
+}
register_dbstat_vtab db
db eval {SELECT count(*) FROM sqlite_master}
@@ -484,7 +489,7 @@ set user_percent [percent $user_payload $file_bytes]
# Output the summary statistics calculated above.
#
-puts "/** Disk-Space Utilization Report For $file_to_analyze"
+puts "/** Disk-Space Utilization Report For $root_filename"
catch {
puts "*** As of [clock format [clock seconds] -format {%Y-%b-%d %H:%M:%S}]"
}
diff --git a/lib/libsqlite3/tool/stack_usage.tcl b/lib/libsqlite3/tool/stack_usage.tcl
new file mode 100644
index 00000000000..b3574f026e0
--- /dev/null
+++ b/lib/libsqlite3/tool/stack_usage.tcl
@@ -0,0 +1,98 @@
+#!/usr/bin/tclsh
+#
+# Parse the output of
+#
+# objdump -d sqlite3.o
+#
+# for x64 and generate a report showing:
+#
+# (1) Stack used by each function
+# (2) Recursion paths and their aggregate stack depth
+#
+set getStack 0
+while {![eof stdin]} {
+ set line [gets stdin]
+ if {[regexp {^[0-9a-f]+ <([^>]+)>:\s*$} $line all procname]} {
+ set curfunc $procname
+ set root($curfunc) 1
+ set calls($curfunc) {}
+ set calledby($curfunc) {}
+ set recursive($curfunc) {}
+ set stkdepth($curfunc) 0
+ set getStack 1
+ continue
+ }
+ if {[regexp {callq? +[0-9a-z]+ <([^>]+)>} $line all other]} {
+ set key [list $curfunc $other]
+ set callpair($key) 1
+ unset -nocomplain root($curfunc)
+ continue
+ }
+ if {[regexp {sub +\$(0x[0-9a-z]+),%[er]sp} $line all xdepth]} {
+ if {$getStack} {
+ scan $xdepth %x depth
+ set stkdepth($curfunc) $depth
+ set getStack 0
+ }
+ continue
+ }
+}
+
+puts "****************** Stack Usage By Function ********************"
+set sdlist {}
+foreach f [array names stkdepth] {
+ lappend sdlist [list $stkdepth($f) $f]
+}
+foreach sd [lsort -integer -decr -index 0 $sdlist] {
+ foreach {depth fname} $sd break
+ puts [format {%6d %s} $depth $fname]
+}
+
+puts "****************** Stack Usage By Recursion *******************"
+foreach key [array names callpair] {
+ foreach {from to} $key break
+ lappend calls($from) $to
+ # lappend calledby($to) $from
+}
+proc all_descendents {root} {
+ global calls recursive
+ set todo($root) $root
+ set go 1
+ while {$go} {
+ set go 0
+ foreach f [array names todo] {
+ set path $todo($f)
+ unset todo($f)
+ if {![info exists calls($f)]} continue
+ foreach x $calls($f) {
+ if {$x==$root} {
+ lappend recursive($root) [concat $path $root]
+ } elseif {![info exists d($x)]} {
+ set go 1
+ set todo($x) [concat $path $x]
+ set d($x) 1
+ }
+ }
+ }
+ }
+ return [array names d]
+}
+set pathlist {}
+foreach f [array names recursive] {
+ all_descendents $f
+ foreach m $recursive($f) {
+ set depth 0
+ foreach b [lrange $m 0 end-1] {
+ set depth [expr {$depth+$stkdepth($b)}]
+ }
+ lappend pathlist [list $depth $m]
+ }
+}
+foreach path [lsort -integer -decr -index 0 $pathlist] {
+ foreach {depth m} $path break
+ set first [lindex $m 0]
+ puts [format {%6d %s %d} $depth $first $stkdepth($first)]
+ foreach b [lrange $m 1 end] {
+ puts " $b $stkdepth($b)"
+ }
+}
diff --git a/lib/libsqlite3/tool/vdbe-compress.tcl b/lib/libsqlite3/tool/vdbe-compress.tcl
index 3bcff9e5f0b..95cc1ebf5ab 100644
--- a/lib/libsqlite3/tool/vdbe-compress.tcl
+++ b/lib/libsqlite3/tool/vdbe-compress.tcl
@@ -79,6 +79,9 @@ while {![eof stdin]} {
append unionDef " $line\n"
append afterUnion $line\n
lappend vlist $vname
+ } elseif {[regexp {^#(if|endif)} $line] && [llength $vlist]>0} {
+ append unionDef "$line\n"
+ append afterUnion $line\n
} else {
break
}
diff --git a/lib/libsqlite3/tool/win/sqlite.vsix b/lib/libsqlite3/tool/win/sqlite.vsix
index 4bdfda5c7df..93eefac2dbb 100644
--- a/lib/libsqlite3/tool/win/sqlite.vsix
+++ b/lib/libsqlite3/tool/win/sqlite.vsix
Binary files differ