Index: third_party/sqlite/sqlite-src-3080704/tool/mkvsix.tcl |
diff --git a/third_party/sqlite/sqlite-src-3080704/tool/mkvsix.tcl b/third_party/sqlite/sqlite-src-3080704/tool/mkvsix.tcl |
new file mode 100644 |
index 0000000000000000000000000000000000000000..208ce2b14211e1df899e292f9150be470fa38632 |
--- /dev/null |
+++ b/third_party/sqlite/sqlite-src-3080704/tool/mkvsix.tcl |
@@ -0,0 +1,801 @@ |
+#!/usr/bin/tclsh |
+# |
+# 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", "WinRT81", "WP80", |
+# "WP81", and "Win32". The fourth argument is optional and if present must be |
+# a string containing a list of platforms to include in the VSIX package. The |
+# platform list is "platform1,platform2,platform3". The fifth argument is |
+# optional and if present must contain the version of Visual Studio required by |
+# the package. Currently, the only supported versions are "2012" and "2013". |
+# The package flavors "WinRT81" and "WP81" are only supported when the Visual |
+# Studio version is "2013". 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 |
+ if {!$usage} then {exit 1} |
+ } |
+ |
+ puts stdout "usage:\ |
+[file tail [info nameofexecutable]]\ |
+[file tail [info script]] <binaryDirectory> \[sourceDirectory\]\ |
+\[packageFlavor\] \[platformNames\] \[vsVersion\]" |
+ |
+ exit 1 |
+} |
+ |
+proc getEnvironmentVariable { name } { |
+ # |
+ # NOTE: Returns the value of the specified environment variable or an empty |
+ # string for environment variables that do not exist in the current |
+ # process environment. |
+ # |
+ return [expr {[info exists ::env($name)] ? $::env($name) : ""}] |
+} |
+ |
+proc getTemporaryPath {} { |
+ # |
+ # NOTE: Returns the normalized path to the first temporary directory found |
+ # in the typical set of environment variables used for that purpose |
+ # or an empty string to signal a failure to locate such a directory. |
+ # |
+ set names [list] |
+ |
+ foreach name [list TEMP TMP] { |
+ lappend names [string toupper $name] [string tolower $name] \ |
+ [string totitle $name] |
+ } |
+ |
+ foreach name $names { |
+ set value [getEnvironmentVariable $name] |
+ |
+ if {[string length $value] > 0} then { |
+ return [file normalize $value] |
+ } |
+ } |
+ |
+ return "" |
+} |
+ |
+proc appendArgs { args } { |
+ # |
+ # NOTE: Returns all passed arguments joined together as a single string with |
+ # no intervening spaces between arguments. |
+ # |
+ eval append result $args |
+} |
+ |
+proc readFile { fileName } { |
+ # |
+ # NOTE: Reads and returns the entire contents of the specified file, which |
+ # may contain binary data. |
+ # |
+ set file_id [open $fileName RDONLY] |
+ fconfigure $file_id -encoding binary -translation binary |
+ set result [read $file_id] |
+ close $file_id |
+ return $result |
+} |
+ |
+proc writeFile { fileName data } { |
+ # |
+ # NOTE: Writes the entire contents of the specified file, which may contain |
+ # binary data. |
+ # |
+ set file_id [open $fileName {WRONLY CREAT TRUNC}] |
+ fconfigure $file_id -encoding binary -translation binary |
+ puts -nonewline $file_id $data |
+ close $file_id |
+ return "" |
+} |
+ |
+proc getMinVsVersionXmlChunk { vsVersion } { |
+ switch -exact $vsVersion { |
+ 2012 { |
+ return [appendArgs \ |
+ "\r\n " {MinVSVersion="11.0"}] |
+ } |
+ 2013 { |
+ return [appendArgs \ |
+ "\r\n " {MinVSVersion="12.0"}] |
+ } |
+ default { |
+ return "" |
+ } |
+ } |
+} |
+ |
+proc getMaxPlatformVersionXmlChunk { packageFlavor vsVersion } { |
+ # |
+ # NOTE: Only Visual Studio 2013 supports this SDK manifest attribute. |
+ # |
+ if {![string equal $vsVersion 2013]} then { |
+ return "" |
+ } |
+ |
+ switch -exact $packageFlavor { |
+ WinRT { |
+ return [appendArgs \ |
+ "\r\n " {MaxPlatformVersion="8.0"}] |
+ } |
+ WinRT81 { |
+ return [appendArgs \ |
+ "\r\n " {MaxPlatformVersion="8.1"}] |
+ } |
+ WP80 { |
+ return [appendArgs \ |
+ "\r\n " {MaxPlatformVersion="8.0"}] |
+ } |
+ WP81 { |
+ return [appendArgs \ |
+ "\r\n " {MaxPlatformVersion="8.1"}] |
+ } |
+ default { |
+ return "" |
+ } |
+ } |
+} |
+ |
+proc getExtraFileListXmlChunk { packageFlavor vsVersion } { |
+ # |
+ # NOTE: Windows Phone 8.0 does not require any extra attributes in its VSIX |
+ # package SDK manifests; however, it appears that Windows Phone 8.1 |
+ # does. |
+ # |
+ if {[string equal $packageFlavor WP80]} then { |
+ return "" |
+ } |
+ |
+ set appliesTo [expr {[string equal $packageFlavor Win32] ? \ |
+ "VisualC" : "WindowsAppContainer"}] |
+ |
+ switch -exact $vsVersion { |
+ 2012 { |
+ return [appendArgs \ |
+ "\r\n " AppliesTo=\" $appliesTo \" \ |
+ "\r\n " {DependsOn="Microsoft.VCLibs, version=11.0"}] |
+ } |
+ 2013 { |
+ return [appendArgs \ |
+ "\r\n " AppliesTo=\" $appliesTo \" \ |
+ "\r\n " {DependsOn="Microsoft.VCLibs, version=12.0"}] |
+ } |
+ default { |
+ return "" |
+ } |
+ } |
+} |
+ |
+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 <build> $buildName <platform> $platformName \ |
+ <name> $name] $fileName] |
+} |
+ |
+proc substFile { fileName } { |
+ # |
+ # NOTE: Performs all Tcl command, variable, and backslash substitutions in |
+ # 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]]]] |
+} |
+ |
+# |
+# NOTE: This is the entry point for this script. |
+# |
+set script [file normalize [info script]] |
+ |
+if {[string length $script] == 0} then { |
+ fail "script file currently being evaluated is unknown" true |
+} |
+ |
+set path [file dirname $script] |
+set rootName [file rootname [file tail $script]] |
+ |
+############################################################################### |
+ |
+# |
+# NOTE: Process and verify all the command line arguments. |
+# |
+set argc [llength $argv] |
+if {$argc < 1 || $argc > 5} then {fail} |
+ |
+set binaryDirectory [lindex $argv 0] |
+ |
+if {[string length $binaryDirectory] == 0} then { |
+ fail "invalid binary directory" |
+} |
+ |
+if {![file exists $binaryDirectory] || \ |
+ ![file isdirectory $binaryDirectory]} then { |
+ fail "binary directory does not exist" |
+} |
+ |
+if {$argc >= 2} then { |
+ set sourceDirectory [lindex $argv 1] |
+} else { |
+ # |
+ # NOTE: Assume that the source directory is the parent directory of the one |
+ # that contains this script file. |
+ # |
+ set sourceDirectory [file dirname $path] |
+} |
+ |
+if {[string length $sourceDirectory] == 0} then { |
+ fail "invalid source directory" |
+} |
+ |
+if {![file exists $sourceDirectory] || \ |
+ ![file isdirectory $sourceDirectory]} then { |
+ 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 {$argc >= 4} then { |
+ set platformNames [list] |
+ |
+ foreach platformName [split [lindex $argv 3] ", "] { |
+ set platformName [string trim $platformName] |
+ |
+ if {[string length $platformName] > 0} then { |
+ lappend platformNames $platformName |
+ } |
+ } |
+} |
+ |
+if {$argc >= 5} then { |
+ set vsVersion [lindex $argv 4] |
+} else { |
+ set vsVersion 2012 |
+} |
+ |
+if {[string length $vsVersion] == 0} then { |
+ fail "invalid Visual Studio version" |
+} |
+ |
+if {![string equal $vsVersion 2012] && ![string equal $vsVersion 2013]} then { |
+ fail [appendArgs \ |
+ "unsupported Visual Studio version, must be one of: " \ |
+ [list 2012 2013]] |
+} |
+ |
+set shortNames(WinRT,2012) SQLite.WinRT |
+set shortNames(WinRT,2013) SQLite.WinRT.2013 |
+set shortNames(WinRT81,2013) SQLite.WinRT81 |
+set shortNames(WP80,2012) SQLite.WP80 |
+set shortNames(WP80,2013) SQLite.WP80.2013 |
+set shortNames(WP81,2013) SQLite.WP81 |
+set shortNames(Win32,2012) SQLite.Win32 |
+set shortNames(Win32,2013) SQLite.Win32.2013 |
+ |
+set displayNames(WinRT,2012) "SQLite for Windows Runtime" |
+set displayNames(WinRT,2013) "SQLite for Windows Runtime" |
+set displayNames(WinRT81,2013) "SQLite for Windows Runtime (Windows 8.1)" |
+set displayNames(WP80,2012) "SQLite for Windows Phone" |
+set displayNames(WP80,2013) "SQLite for Windows Phone" |
+set displayNames(WP81,2013) "SQLite for Windows Phone 8.1" |
+set displayNames(Win32,2012) "SQLite for Windows" |
+set displayNames(Win32,2013) "SQLite for Windows" |
+ |
+if {[string equal $packageFlavor WinRT]} then { |
+ set shortName $shortNames($packageFlavor,$vsVersion) |
+ set displayName $displayNames($packageFlavor,$vsVersion) |
+ set targetPlatformIdentifier Windows |
+ set targetPlatformVersion v8.0 |
+ set minVsVersion [getMinVsVersionXmlChunk $vsVersion] |
+ set maxPlatformVersion \ |
+ [getMaxPlatformVersionXmlChunk $packageFlavor $vsVersion] |
+ set extraSdkPath "" |
+ set extraFileListAttributes \ |
+ [getExtraFileListXmlChunk $packageFlavor $vsVersion] |
+} elseif {[string equal $packageFlavor WinRT81]} then { |
+ if {$vsVersion ne "2013"} then { |
+ fail [appendArgs \ |
+ "unsupported combination, package flavor " $packageFlavor \ |
+ " is only supported with Visual Studio 2013"] |
+ } |
+ set shortName $shortNames($packageFlavor,$vsVersion) |
+ set displayName $displayNames($packageFlavor,$vsVersion) |
+ set targetPlatformIdentifier Windows |
+ set targetPlatformVersion v8.1 |
+ set minVsVersion [getMinVsVersionXmlChunk $vsVersion] |
+ set maxPlatformVersion \ |
+ [getMaxPlatformVersionXmlChunk $packageFlavor $vsVersion] |
+ set extraSdkPath "" |
+ set extraFileListAttributes \ |
+ [getExtraFileListXmlChunk $packageFlavor $vsVersion] |
+} elseif {[string equal $packageFlavor WP80]} then { |
+ set shortName $shortNames($packageFlavor,$vsVersion) |
+ set displayName $displayNames($packageFlavor,$vsVersion) |
+ set targetPlatformIdentifier "Windows Phone" |
+ set targetPlatformVersion v8.0 |
+ set minVsVersion [getMinVsVersionXmlChunk $vsVersion] |
+ set maxPlatformVersion \ |
+ [getMaxPlatformVersionXmlChunk $packageFlavor $vsVersion] |
+ set extraSdkPath "\\..\\$targetPlatformIdentifier" |
+ set extraFileListAttributes \ |
+ [getExtraFileListXmlChunk $packageFlavor $vsVersion] |
+} elseif {[string equal $packageFlavor WP81]} then { |
+ if {$vsVersion ne "2013"} then { |
+ fail [appendArgs \ |
+ "unsupported combination, package flavor " $packageFlavor \ |
+ " is only supported with Visual Studio 2013"] |
+ } |
+ set shortName $shortNames($packageFlavor,$vsVersion) |
+ set displayName $displayNames($packageFlavor,$vsVersion) |
+ set targetPlatformIdentifier WindowsPhoneApp |
+ set targetPlatformVersion v8.1 |
+ set minVsVersion [getMinVsVersionXmlChunk $vsVersion] |
+ set maxPlatformVersion \ |
+ [getMaxPlatformVersionXmlChunk $packageFlavor $vsVersion] |
+ set extraSdkPath "\\..\\$targetPlatformIdentifier" |
+ set extraFileListAttributes \ |
+ [getExtraFileListXmlChunk $packageFlavor $vsVersion] |
+} elseif {[string equal $packageFlavor Win32]} then { |
+ set shortName $shortNames($packageFlavor,$vsVersion) |
+ set displayName $displayNames($packageFlavor,$vsVersion) |
+ set targetPlatformIdentifier Windows |
+ set targetPlatformVersion v8.0 |
+ set minVsVersion [getMinVsVersionXmlChunk $vsVersion] |
+ set maxPlatformVersion \ |
+ [getMaxPlatformVersionXmlChunk $packageFlavor $vsVersion] |
+ set extraSdkPath "" |
+ set extraFileListAttributes \ |
+ [getExtraFileListXmlChunk $packageFlavor $vsVersion] |
+} else { |
+ fail [appendArgs \ |
+ "unsupported package flavor, must be one of: " \ |
+ [list WinRT WinRT81 WP80 WP81 Win32]] |
+} |
+ |
+############################################################################### |
+ |
+# |
+# NOTE: Evaluate the user-specific customizations file, if it exists. |
+# |
+set userFile [file join $path [appendArgs \ |
+ $rootName . $tcl_platform(user) .tcl]] |
+ |
+if {[file exists $userFile] && \ |
+ [file isfile $userFile]} then { |
+ source $userFile |
+} |
+ |
+############################################################################### |
+ |
+set templateFile [file join $path win sqlite.vsix] |
+ |
+if {![file exists $templateFile] || \ |
+ ![file isfile $templateFile]} then { |
+ fail [appendArgs "template file \"" $templateFile "\" does not exist"] |
+} |
+ |
+set currentDirectory [pwd] |
+set outputFile [file join $currentDirectory [appendArgs sqlite- \ |
+ $packageFlavor -output.vsix]] |
+ |
+if {[file exists $outputFile]} then { |
+ fail [appendArgs "output file \"" $outputFile "\" already exists"] |
+} |
+ |
+############################################################################### |
+ |
+# |
+# NOTE: Make sure that a valid temporary directory exists. |
+# |
+set temporaryDirectory [getTemporaryPath] |
+ |
+if {[string length $temporaryDirectory] == 0 || \ |
+ ![file exists $temporaryDirectory] || \ |
+ ![file isdirectory $temporaryDirectory]} then { |
+ fail "cannot locate a usable temporary directory" |
+} |
+ |
+# |
+# NOTE: Setup the staging directory to have a unique name inside of the |
+# configured temporary directory. |
+# |
+set stagingDirectory [file normalize [file join $temporaryDirectory \ |
+ [appendArgs $rootName . [pid]]]] |
+ |
+############################################################################### |
+ |
+# |
+# NOTE: Configure the external zipping tool. First, see if it has already |
+# been pre-configured. If not, try to query it from the environment. |
+# Finally, fallback on the default of simply "zip", which will then |
+# be assumed to exist somewhere along the PATH. |
+# |
+if {![info exists zip]} then { |
+ if {[info exists env(ZipTool)]} then { |
+ set zip $env(ZipTool) |
+ } |
+ if {![info exists zip] || ![file exists $zip]} then { |
+ set zip zip |
+ } |
+} |
+ |
+# |
+# NOTE: Configure the external unzipping tool. First, see if it has already |
+# been pre-configured. If not, try to query it from the environment. |
+# Finally, fallback on the default of simply "unzip", which will then |
+# be assumed to exist somewhere along the PATH. |
+# |
+if {![info exists unzip]} then { |
+ if {[info exists env(UnZipTool)]} then { |
+ set unzip $env(UnZipTool) |
+ } |
+ if {![info exists unzip] || ![file exists $unzip]} then { |
+ set unzip unzip |
+ } |
+} |
+ |
+############################################################################### |
+ |
+# |
+# NOTE: Attempt to extract the SQLite version from the "sqlite3.h" header file |
+# in the source directory. This script assumes that the header file has |
+# already been generated by the build process. |
+# |
+set pattern {^#define\s+SQLITE_VERSION\s+"(.*)"$} |
+set data [readFile [file join $sourceDirectory sqlite3.h]] |
+ |
+if {![regexp -line -- $pattern $data dummy version]} then { |
+ fail [appendArgs "cannot locate SQLITE_VERSION value in \"" \ |
+ [file join $sourceDirectory sqlite3.h] \"] |
+} |
+ |
+############################################################################### |
+ |
+# |
+# 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 $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 <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 <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 <build> <platform> sqlite3.pdb] |
+ } |
+} |
+ |
+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(flags) [list noRetail] |
+ } |
+} |
+ |
+############################################################################### |
+ |
+# |
+# 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. These may be |
+# overridden via the command line or the user-specific customizations |
+# file. |
+# |
+if {![info exists platformNames] || [llength $platformNames] == 0} then { |
+ set platformNames [list x86 x64 ARM] |
+} |
+ |
+############################################################################### |
+ |
+# |
+# NOTE: Make sure the staging directory exists, creating it if necessary. |
+# |
+file mkdir $stagingDirectory |
+ |
+# |
+# 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 VSIX package to the staging directory. |
+# |
+eval $extractCommand |
+ |
+############################################################################### |
+ |
+# |
+# 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 build-neutral, then only one build will |
+ # be processed for it, namely "CommonConfiguration"; otherwise, each |
+ # supported build will be processed for it individually. |
+ # |
+ foreach buildName \ |
+ [expr {$isBuildNeutral ? [list CommonConfiguration] : $buildNames}] { |
+ # |
+ # NOTE: Should the current file be skipped for this build? |
+ # |
+ if {[lsearch $fileFlags no${buildName}] != -1} then { |
+ continue |
+ } |
+ |
+ # |
+ # 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. |
+ # |
+ foreach platformName \ |
+ [expr {$isPlatformNeutral ? [list neutral] : $platformNames}] { |
+ # |
+ # NOTE: Use the actual platform name in the destination file name. |
+ # |
+ set newDestinationFileName [replaceFileNameTokens $destinationFileName \ |
+ $shortName $buildName $platformName] |
+ |
+ # |
+ # NOTE: Does the source file need to be copied to the destination file? |
+ # |
+ 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. |
+ # |
+ substFile $newDestinationFileName |
+ } |
+ } |
+ } |
+} |
+ |
+############################################################################### |
+ |
+# |
+# NOTE: Change the current directory to the staging directory so that the |
+# external archive building tool can pickup the necessary files using |
+# relative paths. |
+# |
+cd $stagingDirectory |
+ |
+# |
+# 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 VSIX package archive in the output directory. |
+# |
+eval $archiveCommand |
+ |
+# |
+# NOTE: Change back to the previously saved current directory. |
+# |
+cd $currentDirectory |
+ |
+# |
+# NOTE: Cleanup the temporary staging directory. |
+# |
+file delete -force $stagingDirectory |
+ |
+############################################################################### |
+ |
+# |
+# NOTE: Success, emit the fully qualified path of the generated VSIX file. |
+# |
+puts stdout $outputFile |