/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 4abcaf3267171b2faadaf9b82a0dfbaa6e98f8b7:


0000: 23 21 2f 75 73 72 2f 62 69 6e 2f 74 63 6c 73 68  #!/usr/bin/tclsh
0010: 0a 23 0a 23 20 54 68 69 73 20 73 63 72 69 70 74  .#.# This script
0020: 20 69 73 20 75 73 65 64 20 74 6f 20 67 65 6e 65   is used to gene
0030: 72 61 74 65 20 61 20 56 53 49 58 20 28 56 69 73  rate a VSIX (Vis
0040: 75 61 6c 20 53 74 75 64 69 6f 20 45 78 74 65 6e  ual Studio Exten
0050: 73 69 6f 6e 29 20 66 69 6c 65 20 66 6f 72 0a 23  sion) file for.#
0060: 20 53 51 4c 69 74 65 20 75 73 61 62 6c 65 20 62   SQLite usable b
0070: 79 20 56 69 73 75 61 6c 20 53 74 75 64 69 6f 2e  y Visual Studio.
0080: 0a 23 0a 23 20 50 52 45 52 45 51 55 49 53 49 54  .#.# PREREQUISIT
0090: 45 53 0a 23 0a 23 20 31 2e 20 54 63 6c 20 38 2e  ES.#.# 1. Tcl 8.
00a0: 34 20 61 6e 64 20 6c 61 74 65 72 20 61 72 65 20  4 and later are 
00b0: 73 75 70 70 6f 72 74 65 64 2c 20 65 61 72 6c 69  supported, earli
00c0: 65 72 20 76 65 72 73 69 6f 6e 73 20 68 61 76 65  er versions have
00d0: 20 6e 6f 74 20 62 65 65 6e 20 74 65 73 74 65 64   not been tested
00e0: 2e 0a 23 0a 23 20 32 2e 20 54 68 65 20 22 73 71  ..#.# 2. The "sq
00f0: 6c 69 74 65 33 2e 68 22 20 66 69 6c 65 20 69 73  lite3.h" file is
0100: 20 61 73 73 75 6d 65 64 20 74 6f 20 65 78 69 73   assumed to exis
0110: 74 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20  t in the parent 
0120: 64 69 72 65 63 74 6f 72 79 20 6f 66 20 74 68 65  directory of the
0130: 0a 23 20 20 20 20 64 69 72 65 63 74 6f 72 79 20  .#    directory 
0140: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20  containing this 
0150: 73 63 72 69 70 74 2e 20 20 54 68 65 20 5b 6f 70  script.  The [op
0160: 74 69 6f 6e 61 6c 5d 20 73 65 63 6f 6e 64 20 63  tional] second c
0170: 6f 6d 6d 61 6e 64 20 6c 69 6e 65 0a 23 20 20 20  ommand line.#   
0180: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
0190: 73 20 73 63 72 69 70 74 20 6d 61 79 20 62 65 20  s script may be 
01a0: 75 73 65 64 20 74 6f 20 73 70 65 63 69 66 79 20  used to specify 
01b0: 61 6e 20 61 6c 74 65 72 6e 61 74 65 20 6c 6f 63  an alternate loc
01c0: 61 74 69 6f 6e 2e 0a 23 20 20 20 20 54 68 69 73  ation..#    This
01d0: 20 73 63 72 69 70 74 20 61 6c 73 6f 20 61 73 73   script also ass
01e0: 75 6d 65 73 20 74 68 61 74 20 74 68 65 20 22 73  umes that the "s
01f0: 71 6c 69 74 65 33 2e 68 22 20 66 69 6c 65 20 63  qlite3.h" file c
0200: 6f 72 72 65 73 70 6f 6e 64 73 20 77 69 74 68 20  orresponds with 
0210: 74 68 65 0a 23 20 20 20 20 76 65 72 73 69 6f 6e  the.#    version
0220: 20 6f 66 20 74 68 65 20 62 69 6e 61 72 69 65 73   of the binaries
0230: 20 74 6f 20 62 65 20 70 61 63 6b 61 67 65 64 2e   to be packaged.
0240: 20 20 54 68 69 73 20 61 73 73 75 6d 70 74 69 6f    This assumptio
0250: 6e 20 69 73 20 6e 6f 74 20 76 65 72 69 66 69 65  n is not verifie
0260: 64 0a 23 20 20 20 20 62 79 20 74 68 69 73 20 73  d.#    by this s
0270: 63 72 69 70 74 2e 0a 23 0a 23 20 33 2e 20 54 68  cript..#.# 3. Th
0280: 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65  e temporary dire
0290: 63 74 6f 72 79 20 73 70 65 63 69 66 69 65 64 20  ctory specified 
02a0: 69 6e 20 74 68 65 20 54 45 4d 50 20 6f 72 20 54  in the TEMP or T
02b0: 4d 50 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76  MP environment v
02c0: 61 72 69 61 62 6c 65 73 0a 23 20 20 20 20 6d 75  ariables.#    mu
02d0: 73 74 20 72 65 66 65 72 20 74 6f 20 61 6e 20 65  st refer to an e
02e0: 78 69 73 74 69 6e 67 20 64 69 72 65 63 74 6f 72  xisting director
02f0: 79 20 77 72 69 74 61 62 6c 65 20 62 79 20 74 68  y writable by th
0300: 65 20 63 75 72 72 65 6e 74 20 75 73 65 72 2e 0a  e current user..
0310: 23 0a 23 20 34 2e 20 54 68 65 20 22 7a 69 70 22  #.# 4. The "zip"
0320: 20 61 6e 64 20 22 75 6e 7a 69 70 22 20 63 6f 6d   and "unzip" com
0330: 6d 61 6e 64 20 6c 69 6e 65 20 74 6f 6f 6c 73 20  mand line tools 
0340: 6d 75 73 74 20 62 65 20 6c 6f 63 61 74 65 64 20  must be located 
0350: 65 69 74 68 65 72 20 69 6e 20 61 0a 23 20 20 20  either in a.#   
0360: 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61   directory conta
0370: 69 6e 65 64 20 69 6e 20 74 68 65 20 50 41 54 48  ined in the PATH
0380: 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72   environment var
0390: 69 61 62 6c 65 20 6f 72 20 73 70 65 63 69 66 69  iable or specifi
03a0: 65 64 20 61 73 20 74 68 65 0a 23 20 20 20 20 65  ed as the.#    e
03b0: 78 61 63 74 20 66 69 6c 65 20 6e 61 6d 65 73 20  xact file names 
03c0: 74 6f 20 65 78 65 63 75 74 65 20 69 6e 20 74 68  to execute in th
03d0: 65 20 22 5a 69 70 54 6f 6f 6c 22 20 61 6e 64 20  e "ZipTool" and 
03e0: 22 55 6e 5a 69 70 54 6f 6f 6c 22 20 65 6e 76 69  "UnZipTool" envi
03f0: 72 6f 6e 6d 65 6e 74 0a 23 20 20 20 20 76 61 72  ronment.#    var
0400: 69 61 62 6c 65 73 2c 20 72 65 73 70 65 63 74 69  iables, respecti
0410: 76 65 6c 79 2e 0a 23 0a 23 20 35 2e 20 54 68 65  vely..#.# 5. The
0420: 20 74 65 6d 70 6c 61 74 65 20 56 53 49 58 20 66   template VSIX f
0430: 69 6c 65 20 28 77 68 69 63 68 20 69 73 20 62 61  ile (which is ba
0440: 73 69 63 61 6c 6c 79 20 61 20 7a 69 70 20 66 69  sically a zip fi
0450: 6c 65 29 20 6d 75 73 74 20 62 65 20 6c 6f 63 61  le) must be loca
0460: 74 65 64 20 69 6e 0a 23 20 20 20 20 61 20 22 77  ted in.#    a "w
0470: 69 6e 22 20 64 69 72 65 63 74 6f 72 79 20 69 6e  in" directory in
0480: 73 69 64 65 20 74 68 65 20 64 69 72 65 63 74 6f  side the directo
0490: 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ry containing th
04a0: 69 73 20 73 63 72 69 70 74 2e 20 20 49 74 20 73  is script.  It s
04b0: 68 6f 75 6c 64 0a 23 20 20 20 20 6e 6f 74 20 63  hould.#    not c
04c0: 6f 6e 74 61 69 6e 20 61 6e 79 20 65 78 65 63 75  ontain any execu
04d0: 74 61 62 6c 65 20 62 69 6e 61 72 69 65 73 2e 20  table binaries. 
04e0: 20 49 74 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20   It should only 
04f0: 63 6f 6e 74 61 69 6e 20 64 79 6e 61 6d 69 63 0a  contain dynamic.
0500: 23 20 20 20 20 74 65 78 74 75 61 6c 20 63 6f 6e  #    textual con
0510: 74 65 6e 74 20 66 69 6c 65 73 20 74 6f 20 62 65  tent files to be
0520: 20 70 72 6f 63 65 73 73 65 64 20 75 73 69 6e 67   processed using
0530: 20 5b 73 75 62 73 74 5d 20 61 6e 64 2f 6f 72 20   [subst] and/or 
0540: 73 74 61 74 69 63 20 63 6f 6e 74 65 6e 74 0a 23  static content.#
0550: 20 20 20 20 66 69 6c 65 73 20 74 6f 20 62 65 20      files to be 
0560: 63 6f 70 69 65 64 20 76 65 72 62 61 74 69 6d 2e  copied verbatim.
0570: 0a 23 0a 23 20 36 2e 20 54 68 65 20 65 78 65 63  .#.# 6. The exec
0580: 75 74 61 62 6c 65 20 61 6e 64 20 6f 74 68 65 72  utable and other
0590: 20 63 6f 6d 70 69 6c 65 64 20 62 69 6e 61 72 79   compiled binary
05a0: 20 66 69 6c 65 73 20 74 6f 20 62 65 20 70 61 63   files to be pac
05b0: 6b 61 67 65 64 20 69 6e 74 6f 20 74 68 65 0a 23  kaged into the.#
05c0: 20 20 20 20 66 69 6e 61 6c 20 56 53 49 58 20 66      final VSIX f
05d0: 69 6c 65 20 28 65 2e 67 2e 20 44 4c 4c 73 2c 20  ile (e.g. DLLs, 
05e0: 4c 49 42 73 2c 20 61 6e 64 20 50 44 42 73 29 20  LIBs, and PDBs) 
05f0: 6d 75 73 74 20 62 65 20 6c 6f 63 61 74 65 64 20  must be located 
0600: 69 6e 20 61 20 73 69 6e 67 6c 65 0a 23 20 20 20  in a single.#   
0610: 20 64 69 72 65 63 74 6f 72 79 20 74 72 65 65 2e   directory tree.
0620: 20 20 54 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20    The top-level 
0630: 64 69 72 65 63 74 6f 72 79 20 6f 66 20 74 68 65  directory of the
0640: 20 74 72 65 65 20 6d 75 73 74 20 62 65 20 73 70   tree must be sp
0650: 65 63 69 66 69 65 64 20 61 73 0a 23 20 20 20 20  ecified as.#    
0660: 74 68 65 20 66 69 72 73 74 20 63 6f 6d 6d 61 6e  the first comman
0670: 64 20 6c 69 6e 65 20 61 72 67 75 6d 65 6e 74 20  d line argument 
0680: 74 6f 20 74 68 69 73 20 73 63 72 69 70 74 2e 20  to this script. 
0690: 20 54 68 65 20 73 65 63 6f 6e 64 20 6c 65 76 65   The second leve
06a0: 6c 0a 23 20 20 20 20 73 75 62 2d 64 69 72 65 63  l.#    sub-direc
06b0: 74 6f 72 79 20 6e 61 6d 65 73 20 6d 75 73 74 20  tory names must 
06c0: 6d 61 74 63 68 20 74 68 6f 73 65 20 6f 66 20 74  match those of t
06d0: 68 65 20 62 75 69 6c 64 20 63 6f 6e 66 69 67 75  he build configu
06e0: 72 61 74 69 6f 6e 20 28 65 2e 67 2e 0a 23 20 20  ration (e.g..#  
06f0: 20 20 22 44 65 62 75 67 22 20 6f 72 20 22 52 65    "Debug" or "Re
0700: 74 61 69 6c 22 29 2e 20 20 54 68 65 20 74 68 69  tail").  The thi
0710: 72 64 20 6c 65 76 65 6c 20 73 75 62 2d 64 69 72  rd level sub-dir
0720: 65 63 74 6f 72 79 20 6e 61 6d 65 73 20 6d 75 73  ectory names mus
0730: 74 20 6d 61 74 63 68 0a 23 20 20 20 20 74 68 6f  t match.#    tho
0740: 73 65 20 6f 66 20 74 68 65 20 70 6c 61 74 66 6f  se of the platfo
0750: 72 6d 20 28 65 2e 67 2e 20 22 78 38 36 22 2c 20  rm (e.g. "x86", 
0760: 22 78 36 34 22 2c 20 61 6e 64 20 22 41 52 4d 22  "x64", and "ARM"
0770: 29 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  ).  For example,
0780: 20 74 68 65 0a 23 20 20 20 20 62 69 6e 61 72 79   the.#    binary
0790: 20 66 69 6c 65 73 20 74 6f 20 62 65 20 70 61 63   files to be pac
07a0: 6b 61 67 65 64 20 77 6f 75 6c 64 20 6e 65 65 64  kaged would need
07b0: 20 74 6f 20 62 65 20 6f 72 67 61 6e 69 7a 65 64   to be organized
07c0: 20 61 73 20 66 6f 6c 6c 6f 77 73 20 77 68 65 6e   as follows when
07d0: 0a 23 20 20 20 20 70 61 63 6b 61 67 69 6e 67 20  .#    packaging 
07e0: 74 68 65 20 22 44 65 62 75 67 22 20 61 6e 64 20  the "Debug" and 
07f0: 22 52 65 74 61 69 6c 22 20 62 75 69 6c 64 20 63  "Retail" build c
0800: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 66 6f  onfigurations fo
0810: 72 20 74 68 65 20 22 78 38 36 22 20 61 6e 64 0a  r the "x86" and.
0820: 23 20 20 20 20 22 78 36 34 22 20 70 6c 61 74 66  #    "x64" platf
0830: 6f 72 6d 73 20 28 69 6e 20 74 68 69 73 20 65 78  orms (in this ex
0840: 61 6d 70 6c 65 2c 20 22 43 3a 5c 74 65 6d 70 22  ample, "C:\temp"
0850: 20 69 73 20 74 68 65 20 74 6f 70 2d 6c 65 76 65   is the top-leve
0860: 6c 20 64 69 72 65 63 74 6f 72 79 20 61 73 0a 23  l directory as.#
0870: 20 20 20 20 73 70 65 63 69 66 69 65 64 20 69 6e      specified in
0880: 20 74 68 65 20 66 69 72 73 74 20 63 6f 6d 6d 61   the first comma
0890: 6e 64 20 6c 69 6e 65 20 61 72 67 75 6d 65 6e 74  nd line argument
08a0: 29 3a 0a 23 0a 23 20 20 20 20 20 20 20 20 20 20  ):.#.#          
08b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43                 C
08c0: 3a 5c 54 65 6d 70 5c 44 65 62 75 67 5c 78 38 36  :\Temp\Debug\x86
08d0: 5c 73 71 6c 69 74 65 33 2e 6c 69 62 0a 23 20 20  \sqlite3.lib.#  
08e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08f0: 20 20 20 20 20 20 20 43 3a 5c 54 65 6d 70 5c 44         C:\Temp\D
0900: 65 62 75 67 5c 78 38 36 5c 73 71 6c 69 74 65 33  ebug\x86\sqlite3
0910: 2e 64 6c 6c 0a 23 20 20 20 20 20 20 20 20 20 20  .dll.#          
0920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43                 C
0930: 3a 5c 54 65 6d 70 5c 44 65 62 75 67 5c 78 38 36  :\Temp\Debug\x86
0940: 5c 73 71 6c 69 74 65 33 2e 70 64 62 0a 23 20 20  \sqlite3.pdb.#  
0950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0960: 20 20 20 20 20 20 20 43 3a 5c 54 65 6d 70 5c 44         C:\Temp\D
0970: 65 62 75 67 5c 78 36 34 5c 73 71 6c 69 74 65 33  ebug\x64\sqlite3
0980: 2e 6c 69 62 0a 23 20 20 20 20 20 20 20 20 20 20  .lib.#          
0990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43                 C
09a0: 3a 5c 54 65 6d 70 5c 44 65 62 75 67 5c 78 36 34  :\Temp\Debug\x64
09b0: 5c 73 71 6c 69 74 65 33 2e 64 6c 6c 0a 23 20 20  \sqlite3.dll.#  
09c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09d0: 20 20 20 20 20 20 20 43 3a 5c 54 65 6d 70 5c 44         C:\Temp\D
09e0: 65 62 75 67 5c 78 36 34 5c 73 71 6c 69 74 65 33  ebug\x64\sqlite3
09f0: 2e 70 64 62 0a 23 20 20 20 20 20 20 20 20 20 20  .pdb.#          
0a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43                 C
0a10: 3a 5c 54 65 6d 70 5c 52 65 74 61 69 6c 5c 78 38  :\Temp\Retail\x8
0a20: 36 5c 73 71 6c 69 74 65 33 2e 6c 69 62 0a 23 20  6\sqlite3.lib.# 
0a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a40: 20 20 20 20 20 20 20 20 43 3a 5c 54 65 6d 70 5c          C:\Temp\
0a50: 52 65 74 61 69 6c 5c 78 38 36 5c 73 71 6c 69 74  Retail\x86\sqlit
0a60: 65 33 2e 64 6c 6c 0a 23 20 20 20 20 20 20 20 20  e3.dll.#        
0a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a80: 20 43 3a 5c 54 65 6d 70 5c 52 65 74 61 69 6c 5c   C:\Temp\Retail\
0a90: 78 38 36 5c 73 71 6c 69 74 65 33 2e 70 64 62 0a  x86\sqlite3.pdb.
0aa0: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
0ab0: 20 20 20 20 20 20 20 20 20 20 43 3a 5c 54 65 6d            C:\Tem
0ac0: 70 5c 52 65 74 61 69 6c 5c 78 36 34 5c 73 71 6c  p\Retail\x64\sql
0ad0: 69 74 65 33 2e 6c 69 62 0a 23 20 20 20 20 20 20  ite3.lib.#      
0ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0af0: 20 20 20 43 3a 5c 54 65 6d 70 5c 52 65 74 61 69     C:\Temp\Retai
0b00: 6c 5c 78 36 34 5c 73 71 6c 69 74 65 33 2e 64 6c  l\x64\sqlite3.dl
0b10: 6c 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  l.#             
0b20: 20 20 20 20 20 20 20 20 20 20 20 20 43 3a 5c 54              C:\T
0b30: 65 6d 70 5c 52 65 74 61 69 6c 5c 78 36 34 5c 73  emp\Retail\x64\s
0b40: 71 6c 69 74 65 33 2e 70 64 62 0a 23 0a 23 20 20  qlite3.pdb.#.#  
0b50: 20 20 54 68 65 20 61 62 6f 76 65 20 64 69 72 65    The above dire
0b60: 63 74 6f 72 79 20 74 72 65 65 20 6f 72 67 61 6e  ctory tree organ
0b70: 69 7a 61 74 69 6f 6e 20 69 73 20 70 65 72 66 6f  ization is perfo
0b80: 72 6d 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  rmed automatical
0b90: 6c 79 20 69 66 20 74 68 65 0a 23 20 20 20 20 22  ly if the.#    "
0ba0: 74 6f 6f 6c 5c 62 75 69 6c 64 2d 61 6c 6c 2d 6d  tool\build-all-m
0bb0: 73 76 63 2e 62 61 74 22 20 62 61 74 63 68 20 73  svc.bat" batch s
0bc0: 63 72 69 70 74 20 69 73 20 75 73 65 64 20 74 6f  cript is used to
0bd0: 20 62 75 69 6c 64 20 74 68 65 20 62 69 6e 61 72   build the binar
0be0: 79 20 66 69 6c 65 73 0a 23 20 20 20 20 74 6f 20  y files.#    to 
0bf0: 62 65 20 70 61 63 6b 61 67 65 64 2e 0a 23 0a 23  be packaged..#.#
0c00: 20 55 53 41 47 45 0a 23 0a 23 20 54 68 65 20 66   USAGE.#.# The f
0c10: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
0c20: 20 74 68 69 73 20 73 63 72 69 70 74 20 69 73 20   this script is 
0c30: 72 65 71 75 69 72 65 64 20 61 6e 64 20 6d 75 73  required and mus
0c40: 74 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66  t be the name of
0c50: 20 74 68 65 0a 23 20 74 6f 70 2d 6c 65 76 65 6c   the.# top-level
0c60: 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61   directory conta
0c70: 69 6e 69 6e 67 20 74 68 65 20 64 69 72 65 63 74  ining the direct
0c80: 6f 72 69 65 73 20 61 6e 64 20 66 69 6c 65 73 20  ories and files 
0c90: 6f 72 67 61 6e 69 7a 65 64 20 69 6e 74 6f 20 61  organized into a
0ca0: 0a 23 20 74 72 65 65 20 61 73 20 64 65 73 63 72  .# tree as descr
0cb0: 69 62 65 64 20 69 6e 20 69 74 65 6d 20 36 20 6f  ibed in item 6 o
0cc0: 66 20 74 68 65 20 50 52 45 52 45 51 55 49 53 49  f the PREREQUISI
0cd0: 54 45 53 20 73 65 63 74 69 6f 6e 2c 20 61 62 6f  TES section, abo
0ce0: 76 65 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 0a  ve.  The second.
0cf0: 23 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6f 70  # argument is op
0d00: 74 69 6f 6e 61 6c 20 61 6e 64 20 69 66 20 70 72  tional and if pr
0d10: 65 73 65 6e 74 20 6d 75 73 74 20 63 6f 6e 74 61  esent must conta
0d20: 69 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  in the name of t
0d30: 68 65 20 64 69 72 65 63 74 6f 72 79 0a 23 20 63  he directory.# c
0d40: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 72 6f  ontaining the ro
0d50: 6f 74 20 6f 66 20 74 68 65 20 73 6f 75 72 63 65  ot of the source
0d60: 20 74 72 65 65 20 66 6f 72 20 53 51 4c 69 74 65   tree for SQLite
0d70: 2e 20 20 54 68 65 20 74 68 69 72 64 20 61 72 67  .  The third arg
0d80: 75 6d 65 6e 74 20 69 73 0a 23 20 6f 70 74 69 6f  ument is.# optio
0d90: 6e 61 6c 20 61 6e 64 20 69 66 20 70 72 65 73 65  nal and if prese
0da0: 6e 74 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20  nt must contain 
0db0: 74 68 65 20 66 6c 61 76 6f 72 20 74 68 65 20 56  the flavor the V
0dc0: 53 49 58 20 70 61 63 6b 61 67 65 20 74 6f 20 62  SIX package to b
0dd0: 75 69 6c 64 2e 0a 23 20 43 75 72 72 65 6e 74 6c  uild..# Currentl
0de0: 79 2c 20 74 68 65 20 6f 6e 6c 79 20 73 75 70 70  y, the only supp
0df0: 6f 72 74 65 64 20 70 61 63 6b 61 67 65 20 66 6c  orted package fl
0e00: 61 76 6f 72 73 20 61 72 65 20 22 57 69 6e 52 54  avors are "WinRT
0e10: 22 2c 20 22 57 69 6e 52 54 38 31 22 2c 20 22 57  ", "WinRT81", "W
0e20: 50 38 30 22 2c 0a 23 20 22 57 50 38 31 22 2c 20  P80",.# "WP81", 
0e30: 61 6e 64 20 22 57 69 6e 33 32 22 2e 20 20 54 68  and "Win32".  Th
0e40: 65 20 66 6f 75 72 74 68 20 61 72 67 75 6d 65 6e  e fourth argumen
0e50: 74 20 69 73 20 6f 70 74 69 6f 6e 61 6c 20 61 6e  t is optional an
0e60: 64 20 69 66 20 70 72 65 73 65 6e 74 20 6d 75 73  d if present mus
0e70: 74 20 62 65 0a 23 20 61 20 73 74 72 69 6e 67 20  t be.# a string 
0e80: 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 6c 69 73  containing a lis
0e90: 74 20 6f 66 20 70 6c 61 74 66 6f 72 6d 73 20 74  t of platforms t
0ea0: 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20 74 68 65  o include in the
0eb0: 20 56 53 49 58 20 70 61 63 6b 61 67 65 2e 20 20   VSIX package.  
0ec0: 54 68 65 0a 23 20 70 6c 61 74 66 6f 72 6d 20 6c  The.# platform l
0ed0: 69 73 74 20 69 73 20 22 70 6c 61 74 66 6f 72 6d  ist is "platform
0ee0: 31 2c 70 6c 61 74 66 6f 72 6d 32 2c 70 6c 61 74  1,platform2,plat
0ef0: 66 6f 72 6d 33 22 2e 20 20 54 68 65 20 66 69 66  form3".  The fif
0f00: 74 68 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 23  th argument is.#
0f10: 20 6f 70 74 69 6f 6e 61 6c 20 61 6e 64 20 69 66   optional and if
0f20: 20 70 72 65 73 65 6e 74 20 6d 75 73 74 20 63 6f   present must co
0f30: 6e 74 61 69 6e 20 74 68 65 20 76 65 72 73 69 6f  ntain the versio
0f40: 6e 20 6f 66 20 56 69 73 75 61 6c 20 53 74 75 64  n of Visual Stud
0f50: 69 6f 20 72 65 71 75 69 72 65 64 20 62 79 0a 23  io required by.#
0f60: 20 74 68 65 20 70 61 63 6b 61 67 65 2e 20 20 43   the package.  C
0f70: 75 72 72 65 6e 74 6c 79 2c 20 74 68 65 20 6f 6e  urrently, the on
0f80: 6c 79 20 73 75 70 70 6f 72 74 65 64 20 76 65 72  ly supported ver
0f90: 73 69 6f 6e 73 20 61 72 65 20 22 32 30 31 32 22  sions are "2012"
0fa0: 20 61 6e 64 20 22 32 30 31 33 22 2e 0a 23 20 54   and "2013"..# T
0fb0: 68 65 20 70 61 63 6b 61 67 65 20 66 6c 61 76 6f  he package flavo
0fc0: 72 73 20 22 57 69 6e 52 54 38 31 22 20 61 6e 64  rs "WinRT81" and
0fd0: 20 22 57 50 38 31 22 20 61 72 65 20 6f 6e 6c 79   "WP81" are only
0fe0: 20 73 75 70 70 6f 72 74 65 64 20 77 68 65 6e 20   supported when 
0ff0: 74 68 65 20 56 69 73 75 61 6c 0a 23 20 53 74 75  the Visual.# Stu
1000: 64 69 6f 20 76 65 72 73 69 6f 6e 20 69 73 20 22  dio version is "
1010: 32 30 31 33 22 2e 20 20 54 79 70 69 63 61 6c 6c  2013".  Typicall
1020: 79 2c 20 77 68 65 6e 20 6f 6e 20 57 69 6e 64 6f  y, when on Windo
1030: 77 73 2c 20 74 68 69 73 20 73 63 72 69 70 74 20  ws, this script 
1040: 69 73 0a 23 20 65 78 65 63 75 74 65 64 20 75 73  is.# executed us
1050: 69 6e 67 20 63 6f 6d 6d 61 6e 64 73 20 73 69 6d  ing commands sim
1060: 69 6c 61 72 20 74 6f 20 74 68 65 20 66 6f 6c 6c  ilar to the foll
1070: 6f 77 69 6e 67 20 66 72 6f 6d 20 61 20 6e 6f 72  owing from a nor
1080: 6d 61 6c 20 57 69 6e 64 6f 77 73 0a 23 20 63 6f  mal Windows.# co
1090: 6d 6d 61 6e 64 20 70 72 6f 6d 70 74 3a 0a 23 0a  mmand prompt:.#.
10a0: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
10b0: 20 20 20 20 20 20 20 20 20 20 43 44 20 2f 44 20            CD /D 
10c0: 43 3a 5c 64 65 76 5c 73 71 6c 69 74 65 5c 63 6f  C:\dev\sqlite\co
10d0: 72 65 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  re.#            
10e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 63 6c               tcl
10f0: 73 68 38 35 20 74 6f 6f 6c 5c 6d 6b 76 73 69 78  sh85 tool\mkvsix
1100: 2e 74 63 6c 20 43 3a 5c 54 65 6d 70 0a 23 0a 23  .tcl C:\Temp.#.#
1110: 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 20   In the example 
1120: 61 62 6f 76 65 2c 20 22 43 3a 5c 64 65 76 5c 73  above, "C:\dev\s
1130: 71 6c 69 74 65 5c 63 6f 72 65 22 20 72 65 70 72  qlite\core" repr
1140: 65 73 65 6e 74 73 20 74 68 65 20 72 6f 6f 74 20  esents the root 
1150: 6f 66 20 74 68 65 20 73 6f 75 72 63 65 0a 23 20  of the source.# 
1160: 74 72 65 65 20 66 6f 72 20 53 51 4c 69 74 65 20  tree for SQLite 
1170: 61 6e 64 20 22 43 3a 5c 54 65 6d 70 22 20 72 65  and "C:\Temp" re
1180: 70 72 65 73 65 6e 74 73 20 74 68 65 20 74 6f 70  presents the top
1190: 2d 6c 65 76 65 6c 20 64 69 72 65 63 74 6f 72 79  -level directory
11a0: 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 23 20 74 68   containing.# th
11b0: 65 20 65 78 65 63 75 74 61 62 6c 65 20 61 6e 64  e executable and
11c0: 20 6f 74 68 65 72 20 63 6f 6d 70 69 6c 65 64 20   other compiled 
11d0: 62 69 6e 61 72 79 20 66 69 6c 65 73 2c 20 6f 72  binary files, or
11e0: 67 61 6e 69 7a 65 64 20 69 6e 74 6f 20 61 20 64  ganized into a d
11f0: 69 72 65 63 74 6f 72 79 0a 23 20 74 72 65 65 20  irectory.# tree 
1200: 61 73 20 64 65 73 63 72 69 62 65 64 20 69 6e 20  as described in 
1210: 69 74 65 6d 20 36 20 6f 66 20 74 68 65 20 50 52  item 6 of the PR
1220: 45 52 45 51 55 49 53 49 54 45 53 20 73 65 63 74  EREQUISITES sect
1230: 69 6f 6e 2c 20 61 62 6f 76 65 2e 0a 23 0a 23 20  ion, above..#.# 
1240: 54 68 69 73 20 73 63 72 69 70 74 20 73 68 6f 75  This script shou
1250: 6c 64 20 77 6f 72 6b 20 6f 6e 20 6e 6f 6e 2d 57  ld work on non-W
1260: 69 6e 64 6f 77 73 20 70 6c 61 74 66 6f 72 6d 73  indows platforms
1270: 20 61 73 20 77 65 6c 6c 2c 20 70 72 6f 76 69 64   as well, provid
1280: 65 64 20 74 68 61 74 20 61 6c 6c 0a 23 20 74 68  ed that all.# th
1290: 65 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20 6c  e requirements l
12a0: 69 73 74 65 64 20 69 6e 20 74 68 65 20 50 52 45  isted in the PRE
12b0: 52 45 51 55 49 53 49 54 45 53 20 73 65 63 74 69  REQUISITES secti
12c0: 6f 6e 20 61 72 65 20 6d 65 74 2e 0a 23 0a 23 20  on are met..#.# 
12d0: 4e 4f 54 45 53 0a 23 0a 23 20 54 68 65 20 74 65  NOTES.#.# The te
12e0: 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72  mporary director
12f0: 79 20 69 73 20 75 73 65 64 20 61 73 20 61 20 73  y is used as a s
1300: 74 61 67 69 6e 67 20 61 72 65 61 20 66 6f 72 20  taging area for 
1310: 74 68 65 20 66 69 6e 61 6c 20 56 53 49 58 20 66  the final VSIX f
1320: 69 6c 65 2e 0a 23 20 54 68 65 20 74 65 6d 70 6c  ile..# The templ
1330: 61 74 65 20 56 53 49 58 20 66 69 6c 65 20 69 73  ate VSIX file is
1340: 20 65 78 74 72 61 63 74 65 64 2c 20 69 74 73 20   extracted, its 
1350: 63 6f 6e 74 65 6e 74 73 20 70 72 6f 63 65 73 73  contents process
1360: 65 64 2c 20 61 6e 64 20 74 68 65 6e 20 74 68 65  ed, and then the
1370: 0a 23 20 72 65 73 75 6c 74 69 6e 67 20 66 69 6c  .# resulting fil
1380: 65 73 20 61 72 65 20 70 61 63 6b 61 67 65 64 20  es are packaged 
1390: 69 6e 74 6f 20 74 68 65 20 66 69 6e 61 6c 20 56  into the final V
13a0: 53 49 58 20 66 69 6c 65 2e 0a 23 0a 70 61 63 6b  SIX file..#.pack
13b0: 61 67 65 20 72 65 71 75 69 72 65 20 54 63 6c 20  age require Tcl 
13c0: 38 2e 34 0a 0c 0a 70 72 6f 63 20 66 61 69 6c 20  8.4...proc fail 
13d0: 7b 20 7b 65 72 72 6f 72 20 22 22 7d 20 7b 75 73  { {error ""} {us
13e0: 61 67 65 20 66 61 6c 73 65 7d 20 7d 20 7b 0a 20  age false} } {. 
13f0: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
1400: 67 74 68 20 24 65 72 72 6f 72 5d 20 3e 20 30 7d  gth $error] > 0}
1410: 20 74 68 65 6e 20 7b 0a 20 20 20 20 70 75 74 73   then {.    puts
1420: 20 73 74 64 6f 75 74 20 24 65 72 72 6f 72 0a 20   stdout $error. 
1430: 20 20 20 69 66 20 7b 21 24 75 73 61 67 65 7d 20     if {!$usage} 
1440: 74 68 65 6e 20 7b 65 78 69 74 20 31 7d 0a 20 20  then {exit 1}.  
1450: 7d 0a 0a 20 20 70 75 74 73 20 73 74 64 6f 75 74  }..  puts stdout
1460: 20 22 75 73 61 67 65 3a 5c 0a 5b 66 69 6c 65 20   "usage:\.[file 
1470: 74 61 69 6c 20 5b 69 6e 66 6f 20 6e 61 6d 65 6f  tail [info nameo
1480: 66 65 78 65 63 75 74 61 62 6c 65 5d 5d 5c 0a 5b  fexecutable]]\.[
1490: 66 69 6c 65 20 74 61 69 6c 20 5b 69 6e 66 6f 20  file tail [info 
14a0: 73 63 72 69 70 74 5d 5d 20 3c 62 69 6e 61 72 79  script]] <binary
14b0: 44 69 72 65 63 74 6f 72 79 3e 20 5c 5b 73 6f 75  Directory> \[sou
14c0: 72 63 65 44 69 72 65 63 74 6f 72 79 5c 5d 5c 0a  rceDirectory\]\.
14d0: 5c 5b 70 61 63 6b 61 67 65 46 6c 61 76 6f 72 5c  \[packageFlavor\
14e0: 5d 20 5c 5b 70 6c 61 74 66 6f 72 6d 4e 61 6d 65  ] \[platformName
14f0: 73 5c 5d 20 5c 5b 76 73 56 65 72 73 69 6f 6e 5c  s\] \[vsVersion\
1500: 5d 22 0a 0a 20 20 65 78 69 74 20 31 0a 7d 0a 0c  ]"..  exit 1.}..
1510: 0a 70 72 6f 63 20 67 65 74 45 6e 76 69 72 6f 6e  .proc getEnviron
1520: 6d 65 6e 74 56 61 72 69 61 62 6c 65 20 7b 20 6e  mentVariable { n
1530: 61 6d 65 20 7d 20 7b 0a 20 20 23 0a 20 20 23 20  ame } {.  #.  # 
1540: 4e 4f 54 45 3a 20 52 65 74 75 72 6e 73 20 74 68  NOTE: Returns th
1550: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73  e value of the s
1560: 70 65 63 69 66 69 65 64 20 65 6e 76 69 72 6f 6e  pecified environ
1570: 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 20 6f 72  ment variable or
1580: 20 61 6e 20 65 6d 70 74 79 0a 20 20 23 20 20 20   an empty.  #   
1590: 20 20 20 20 73 74 72 69 6e 67 20 66 6f 72 20 65      string for e
15a0: 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61  nvironment varia
15b0: 62 6c 65 73 20 74 68 61 74 20 64 6f 20 6e 6f 74  bles that do not
15c0: 20 65 78 69 73 74 20 69 6e 20 74 68 65 20 63 75   exist in the cu
15d0: 72 72 65 6e 74 0a 20 20 23 20 20 20 20 20 20 20  rrent.  #       
15e0: 70 72 6f 63 65 73 73 20 65 6e 76 69 72 6f 6e 6d  process environm
15f0: 65 6e 74 2e 0a 20 20 23 0a 20 20 72 65 74 75 72  ent..  #.  retur
1600: 6e 20 5b 65 78 70 72 20 7b 5b 69 6e 66 6f 20 65  n [expr {[info e
1610: 78 69 73 74 73 20 3a 3a 65 6e 76 28 24 6e 61 6d  xists ::env($nam
1620: 65 29 5d 20 3f 20 24 3a 3a 65 6e 76 28 24 6e 61  e)] ? $::env($na
1630: 6d 65 29 20 3a 20 22 22 7d 5d 0a 7d 0a 0c 0a 70  me) : ""}].}...p
1640: 72 6f 63 20 67 65 74 54 65 6d 70 6f 72 61 72 79  roc getTemporary
1650: 50 61 74 68 20 7b 7d 20 7b 0a 20 20 23 0a 20 20  Path {} {.  #.  
1660: 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 73 20  # NOTE: Returns 
1670: 74 68 65 20 6e 6f 72 6d 61 6c 69 7a 65 64 20 70  the normalized p
1680: 61 74 68 20 74 6f 20 74 68 65 20 66 69 72 73 74  ath to the first
1690: 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63   temporary direc
16a0: 74 6f 72 79 20 66 6f 75 6e 64 0a 20 20 23 20 20  tory found.  #  
16b0: 20 20 20 20 20 69 6e 20 74 68 65 20 74 79 70 69       in the typi
16c0: 63 61 6c 20 73 65 74 20 6f 66 20 65 6e 76 69 72  cal set of envir
16d0: 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 73  onment variables
16e0: 20 75 73 65 64 20 66 6f 72 20 74 68 61 74 20 70   used for that p
16f0: 75 72 70 6f 73 65 0a 20 20 23 20 20 20 20 20 20  urpose.  #      
1700: 20 6f 72 20 61 6e 20 65 6d 70 74 79 20 73 74 72   or an empty str
1710: 69 6e 67 20 74 6f 20 73 69 67 6e 61 6c 20 61 20  ing to signal a 
1720: 66 61 69 6c 75 72 65 20 74 6f 20 6c 6f 63 61 74  failure to locat
1730: 65 20 73 75 63 68 20 61 20 64 69 72 65 63 74 6f  e such a directo
1740: 72 79 2e 0a 20 20 23 0a 20 20 73 65 74 20 6e 61  ry..  #.  set na
1750: 6d 65 73 20 5b 6c 69 73 74 5d 0a 0a 20 20 66 6f  mes [list]..  fo
1760: 72 65 61 63 68 20 6e 61 6d 65 20 5b 6c 69 73 74  reach name [list
1770: 20 54 45 4d 50 20 54 4d 50 5d 20 7b 0a 20 20 20   TEMP TMP] {.   
1780: 20 6c 61 70 70 65 6e 64 20 6e 61 6d 65 73 20 5b   lappend names [
1790: 73 74 72 69 6e 67 20 74 6f 75 70 70 65 72 20 24  string toupper $
17a0: 6e 61 6d 65 5d 20 5b 73 74 72 69 6e 67 20 74 6f  name] [string to
17b0: 6c 6f 77 65 72 20 24 6e 61 6d 65 5d 20 5c 0a 20  lower $name] \. 
17c0: 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 74         [string t
17d0: 6f 74 69 74 6c 65 20 24 6e 61 6d 65 5d 0a 20 20  otitle $name].  
17e0: 7d 0a 0a 20 20 66 6f 72 65 61 63 68 20 6e 61 6d  }..  foreach nam
17f0: 65 20 24 6e 61 6d 65 73 20 7b 0a 20 20 20 20 73  e $names {.    s
1800: 65 74 20 76 61 6c 75 65 20 5b 67 65 74 45 6e 76  et value [getEnv
1810: 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65  ironmentVariable
1820: 20 24 6e 61 6d 65 5d 0a 0a 20 20 20 20 69 66 20   $name]..    if 
1830: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
1840: 24 76 61 6c 75 65 5d 20 3e 20 30 7d 20 74 68 65  $value] > 0} the
1850: 6e 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  n {.      return
1860: 20 5b 66 69 6c 65 20 6e 6f 72 6d 61 6c 69 7a 65   [file normalize
1870: 20 24 76 61 6c 75 65 5d 0a 20 20 20 20 7d 0a 20   $value].    }. 
1880: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 22 22 0a   }..  return "".
1890: 7d 0a 0c 0a 70 72 6f 63 20 61 70 70 65 6e 64 41  }...proc appendA
18a0: 72 67 73 20 7b 20 61 72 67 73 20 7d 20 7b 0a 20  rgs { args } {. 
18b0: 20 23 0a 20 20 23 20 4e 4f 54 45 3a 20 52 65 74   #.  # NOTE: Ret
18c0: 75 72 6e 73 20 61 6c 6c 20 70 61 73 73 65 64 20  urns all passed 
18d0: 61 72 67 75 6d 65 6e 74 73 20 6a 6f 69 6e 65 64  arguments joined
18e0: 20 74 6f 67 65 74 68 65 72 20 61 73 20 61 20 73   together as a s
18f0: 69 6e 67 6c 65 20 73 74 72 69 6e 67 20 77 69 74  ingle string wit
1900: 68 0a 20 20 23 20 20 20 20 20 20 20 6e 6f 20 69  h.  #       no i
1910: 6e 74 65 72 76 65 6e 69 6e 67 20 73 70 61 63 65  ntervening space
1920: 73 20 62 65 74 77 65 65 6e 20 61 72 67 75 6d 65  s between argume
1930: 6e 74 73 2e 0a 20 20 23 0a 20 20 65 76 61 6c 20  nts..  #.  eval 
1940: 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20 24 61  append result $a
1950: 72 67 73 0a 7d 0a 0c 0a 70 72 6f 63 20 72 65 61  rgs.}...proc rea
1960: 64 46 69 6c 65 20 7b 20 66 69 6c 65 4e 61 6d 65  dFile { fileName
1970: 20 7d 20 7b 0a 20 20 23 0a 20 20 23 20 4e 4f 54   } {.  #.  # NOT
1980: 45 3a 20 52 65 61 64 73 20 61 6e 64 20 72 65 74  E: Reads and ret
1990: 75 72 6e 73 20 74 68 65 20 65 6e 74 69 72 65 20  urns the entire 
19a0: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
19b0: 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 2c 20  specified file, 
19c0: 77 68 69 63 68 0a 20 20 23 20 20 20 20 20 20 20  which.  #       
19d0: 6d 61 79 20 63 6f 6e 74 61 69 6e 20 62 69 6e 61  may contain bina
19e0: 72 79 20 64 61 74 61 2e 0a 20 20 23 0a 20 20 73  ry data..  #.  s
19f0: 65 74 20 66 69 6c 65 5f 69 64 20 5b 6f 70 65 6e  et file_id [open
1a00: 20 24 66 69 6c 65 4e 61 6d 65 20 52 44 4f 4e 4c   $fileName RDONL
1a10: 59 5d 0a 20 20 66 63 6f 6e 66 69 67 75 72 65 20  Y].  fconfigure 
1a20: 24 66 69 6c 65 5f 69 64 20 2d 65 6e 63 6f 64 69  $file_id -encodi
1a30: 6e 67 20 62 69 6e 61 72 79 20 2d 74 72 61 6e 73  ng binary -trans
1a40: 6c 61 74 69 6f 6e 20 62 69 6e 61 72 79 0a 20 20  lation binary.  
1a50: 73 65 74 20 72 65 73 75 6c 74 20 5b 72 65 61 64  set result [read
1a60: 20 24 66 69 6c 65 5f 69 64 5d 0a 20 20 63 6c 6f   $file_id].  clo
1a70: 73 65 20 24 66 69 6c 65 5f 69 64 0a 20 20 72 65  se $file_id.  re
1a80: 74 75 72 6e 20 24 72 65 73 75 6c 74 0a 7d 0a 0c  turn $result.}..
1a90: 0a 70 72 6f 63 20 77 72 69 74 65 46 69 6c 65 20  .proc writeFile 
1aa0: 7b 20 66 69 6c 65 4e 61 6d 65 20 64 61 74 61 20  { fileName data 
1ab0: 7d 20 7b 0a 20 20 23 0a 20 20 23 20 4e 4f 54 45  } {.  #.  # NOTE
1ac0: 3a 20 57 72 69 74 65 73 20 74 68 65 20 65 6e 74  : Writes the ent
1ad0: 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ire contents of 
1ae0: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69  the specified fi
1af0: 6c 65 2c 20 77 68 69 63 68 20 6d 61 79 20 63 6f  le, which may co
1b00: 6e 74 61 69 6e 0a 20 20 23 20 20 20 20 20 20 20  ntain.  #       
1b10: 62 69 6e 61 72 79 20 64 61 74 61 2e 0a 20 20 23  binary data..  #
1b20: 0a 20 20 73 65 74 20 66 69 6c 65 5f 69 64 20 5b  .  set file_id [
1b30: 6f 70 65 6e 20 24 66 69 6c 65 4e 61 6d 65 20 7b  open $fileName {
1b40: 57 52 4f 4e 4c 59 20 43 52 45 41 54 20 54 52 55  WRONLY CREAT TRU
1b50: 4e 43 7d 5d 0a 20 20 66 63 6f 6e 66 69 67 75 72  NC}].  fconfigur
1b60: 65 20 24 66 69 6c 65 5f 69 64 20 2d 65 6e 63 6f  e $file_id -enco
1b70: 64 69 6e 67 20 62 69 6e 61 72 79 20 2d 74 72 61  ding binary -tra
1b80: 6e 73 6c 61 74 69 6f 6e 20 62 69 6e 61 72 79 0a  nslation binary.
1b90: 20 20 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e    puts -nonewlin
1ba0: 65 20 24 66 69 6c 65 5f 69 64 20 24 64 61 74 61  e $file_id $data
1bb0: 0a 20 20 63 6c 6f 73 65 20 24 66 69 6c 65 5f 69  .  close $file_i
1bc0: 64 0a 20 20 72 65 74 75 72 6e 20 22 22 0a 7d 0a  d.  return "".}.
1bd0: 0c 0a 23 0a 23 20 54 4f 44 4f 3a 20 4d 6f 64 69  ..#.# TODO: Modi
1be0: 66 79 20 74 68 69 73 20 70 72 6f 63 65 64 75 72  fy this procedur
1bf0: 65 20 77 68 65 6e 20 61 20 6e 65 77 20 76 65 72  e when a new ver
1c00: 73 69 6f 6e 20 6f 66 20 56 69 73 75 61 6c 20 53  sion of Visual S
1c10: 74 75 64 69 6f 20 69 73 20 72 65 6c 65 61 73 65  tudio is release
1c20: 64 2e 0a 23 0a 70 72 6f 63 20 67 65 74 4d 69 6e  d..#.proc getMin
1c30: 56 73 56 65 72 73 69 6f 6e 58 6d 6c 43 68 75 6e  VsVersionXmlChun
1c40: 6b 20 7b 20 76 73 56 65 72 73 69 6f 6e 20 7d 20  k { vsVersion } 
1c50: 7b 0a 20 20 73 77 69 74 63 68 20 2d 65 78 61 63  {.  switch -exac
1c60: 74 20 24 76 73 56 65 72 73 69 6f 6e 20 7b 0a 20  t $vsVersion {. 
1c70: 20 20 20 32 30 31 32 20 7b 0a 20 20 20 20 20 20     2012 {.      
1c80: 72 65 74 75 72 6e 20 5b 61 70 70 65 6e 64 41 72  return [appendAr
1c90: 67 73 20 5c 0a 20 20 20 20 20 20 20 20 20 20 22  gs \.          "
1ca0: 5c 72 5c 6e 20 20 20 20 22 20 7b 4d 69 6e 56 53  \r\n    " {MinVS
1cb0: 56 65 72 73 69 6f 6e 3d 22 31 31 2e 30 22 7d 5d  Version="11.0"}]
1cc0: 0a 20 20 20 20 7d 0a 20 20 20 20 32 30 31 33 20  .    }.    2013 
1cd0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b  {.      return [
1ce0: 61 70 70 65 6e 64 41 72 67 73 20 5c 0a 20 20 20  appendArgs \.   
1cf0: 20 20 20 20 20 20 20 22 5c 72 5c 6e 20 20 20 20         "\r\n    
1d00: 22 20 7b 4d 69 6e 56 53 56 65 72 73 69 6f 6e 3d  " {MinVSVersion=
1d10: 22 31 32 2e 30 22 7d 5d 0a 20 20 20 20 7d 0a 20  "12.0"}].    }. 
1d20: 20 20 20 32 30 31 35 20 7b 0a 20 20 20 20 20 20     2015 {.      
1d30: 72 65 74 75 72 6e 20 5b 61 70 70 65 6e 64 41 72  return [appendAr
1d40: 67 73 20 5c 0a 20 20 20 20 20 20 20 20 20 20 22  gs \.          "
1d50: 5c 72 5c 6e 20 20 20 20 22 20 7b 4d 69 6e 56 53  \r\n    " {MinVS
1d60: 56 65 72 73 69 6f 6e 3d 22 31 34 2e 30 22 7d 5d  Version="14.0"}]
1d70: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
1d80: 6c 74 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  lt {.      retur
1d90: 6e 20 22 22 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  n "".    }.  }.}
1da0: 0a 0c 0a 23 0a 23 20 54 4f 44 4f 3a 20 4d 6f 64  ...#.# TODO: Mod
1db0: 69 66 79 20 74 68 69 73 20 70 72 6f 63 65 64 75  ify this procedu
1dc0: 72 65 20 77 68 65 6e 20 61 20 6e 65 77 20 76 65  re when a new ve
1dd0: 72 73 69 6f 6e 20 6f 66 20 56 69 73 75 61 6c 20  rsion of Visual 
1de0: 53 74 75 64 69 6f 20 69 73 20 72 65 6c 65 61 73  Studio is releas
1df0: 65 64 2e 0a 23 0a 70 72 6f 63 20 67 65 74 4d 61  ed..#.proc getMa
1e00: 78 50 6c 61 74 66 6f 72 6d 56 65 72 73 69 6f 6e  xPlatformVersion
1e10: 58 6d 6c 43 68 75 6e 6b 20 7b 20 70 61 63 6b 61  XmlChunk { packa
1e20: 67 65 46 6c 61 76 6f 72 20 76 73 56 65 72 73 69  geFlavor vsVersi
1e30: 6f 6e 20 7d 20 7b 0a 20 20 23 0a 20 20 23 20 4e  on } {.  #.  # N
1e40: 4f 54 45 3a 20 4f 6e 6c 79 20 56 69 73 75 61 6c  OTE: Only Visual
1e50: 20 53 74 75 64 69 6f 20 32 30 31 33 20 61 6e 64   Studio 2013 and
1e60: 20 6c 61 74 65 72 20 73 75 70 70 6f 72 74 20 74   later support t
1e70: 68 69 73 20 61 74 74 72 69 62 75 74 65 20 77 69  his attribute wi
1e80: 74 68 69 6e 20 74 68 65 0a 20 20 23 20 20 20 20  thin the.  #    
1e90: 20 20 20 53 44 4b 20 6d 61 6e 69 66 65 73 74 2e     SDK manifest.
1ea0: 0a 20 20 23 0a 20 20 69 66 20 7b 21 5b 73 74 72  .  #.  if {![str
1eb0: 69 6e 67 20 65 71 75 61 6c 20 24 76 73 56 65 72  ing equal $vsVer
1ec0: 73 69 6f 6e 20 32 30 31 33 5d 20 26 26 20 5c 0a  sion 2013] && \.
1ed0: 20 20 20 20 20 20 21 5b 73 74 72 69 6e 67 20 65        ![string e
1ee0: 71 75 61 6c 20 24 76 73 56 65 72 73 69 6f 6e 20  qual $vsVersion 
1ef0: 32 30 31 35 5d 7d 20 74 68 65 6e 20 7b 0a 20 20  2015]} then {.  
1f00: 20 20 72 65 74 75 72 6e 20 22 22 0a 20 20 7d 0a    return "".  }.
1f10: 0a 20 20 73 77 69 74 63 68 20 2d 65 78 61 63 74  .  switch -exact
1f20: 20 24 70 61 63 6b 61 67 65 46 6c 61 76 6f 72 20   $packageFlavor 
1f30: 7b 0a 20 20 20 20 57 69 6e 52 54 20 7b 0a 20 20  {.    WinRT {.  
1f40: 20 20 20 20 72 65 74 75 72 6e 20 5b 61 70 70 65      return [appe
1f50: 6e 64 41 72 67 73 20 5c 0a 20 20 20 20 20 20 20  ndArgs \.       
1f60: 20 20 20 22 5c 72 5c 6e 20 20 20 20 22 20 7b 4d     "\r\n    " {M
1f70: 61 78 50 6c 61 74 66 6f 72 6d 56 65 72 73 69 6f  axPlatformVersio
1f80: 6e 3d 22 38 2e 30 22 7d 5d 0a 20 20 20 20 7d 0a  n="8.0"}].    }.
1f90: 20 20 20 20 57 69 6e 52 54 38 31 20 7b 0a 20 20      WinRT81 {.  
1fa0: 20 20 20 20 72 65 74 75 72 6e 20 5b 61 70 70 65      return [appe
1fb0: 6e 64 41 72 67 73 20 5c 0a 20 20 20 20 20 20 20  ndArgs \.       
1fc0: 20 20 20 22 5c 72 5c 6e 20 20 20 20 22 20 7b 4d     "\r\n    " {M
1fd0: 61 78 50 6c 61 74 66 6f 72 6d 56 65 72 73 69 6f  axPlatformVersio
1fe0: 6e 3d 22 38 2e 31 22 7d 5d 0a 20 20 20 20 7d 0a  n="8.1"}].    }.
1ff0: 20 20 20 20 57 50 38 30 20 7b 0a 20 20 20 20 20      WP80 {.     
2000: 20 72 65 74 75 72 6e 20 5b 61 70 70 65 6e 64 41   return [appendA
2010: 72 67 73 20 5c 0a 20 20 20 20 20 20 20 20 20 20  rgs \.          
2020: 22 5c 72 5c 6e 20 20 20 20 22 20 7b 4d 61 78 50  "\r\n    " {MaxP
2030: 6c 61 74 66 6f 72 6d 56 65 72 73 69 6f 6e 3d 22  latformVersion="
2040: 38 2e 30 22 7d 5d 0a 20 20 20 20 7d 0a 20 20 20  8.0"}].    }.   
2050: 20 57 50 38 31 20 7b 0a 20 20 20 20 20 20 72 65   WP81 {.      re
2060: 74 75 72 6e 20 5b 61 70 70 65 6e 64 41 72 67 73  turn [appendArgs
2070: 20 5c 0a 20 20 20 20 20 20 20 20 20 20 22 5c 72   \.          "\r
2080: 5c 6e 20 20 20 20 22 20 7b 4d 61 78 50 6c 61 74  \n    " {MaxPlat
2090: 66 6f 72 6d 56 65 72 73 69 6f 6e 3d 22 38 2e 31  formVersion="8.1
20a0: 22 7d 5d 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  "}].    }.    de
20b0: 66 61 75 6c 74 20 7b 0a 20 20 20 20 20 20 72 65  fault {.      re
20c0: 74 75 72 6e 20 22 22 0a 20 20 20 20 7d 0a 20 20  turn "".    }.  
20d0: 7d 0a 7d 0a 0c 0a 23 0a 23 20 54 4f 44 4f 3a 20  }.}...#.# TODO: 
20e0: 4d 6f 64 69 66 79 20 74 68 69 73 20 70 72 6f 63  Modify this proc
20f0: 65 64 75 72 65 20 77 68 65 6e 20 61 20 6e 65 77  edure when a new
2100: 20 76 65 72 73 69 6f 6e 20 6f 66 20 56 69 73 75   version of Visu
2110: 61 6c 20 53 74 75 64 69 6f 20 69 73 20 72 65 6c  al Studio is rel
2120: 65 61 73 65 64 2e 0a 23 0a 70 72 6f 63 20 67 65  eased..#.proc ge
2130: 74 45 78 74 72 61 46 69 6c 65 4c 69 73 74 58 6d  tExtraFileListXm
2140: 6c 43 68 75 6e 6b 20 7b 20 70 61 63 6b 61 67 65  lChunk { package
2150: 46 6c 61 76 6f 72 20 76 73 56 65 72 73 69 6f 6e  Flavor vsVersion
2160: 20 7d 20 7b 0a 20 20 23 0a 20 20 23 20 4e 4f 54   } {.  #.  # NOT
2170: 45 3a 20 57 69 6e 64 6f 77 73 20 50 68 6f 6e 65  E: Windows Phone
2180: 20 38 2e 30 20 64 6f 65 73 20 6e 6f 74 20 72 65   8.0 does not re
2190: 71 75 69 72 65 20 61 6e 79 20 65 78 74 72 61 20  quire any extra 
21a0: 61 74 74 72 69 62 75 74 65 73 20 69 6e 20 69 74  attributes in it
21b0: 73 20 56 53 49 58 0a 20 20 23 20 20 20 20 20 20  s VSIX.  #      
21c0: 20 70 61 63 6b 61 67 65 20 53 44 4b 20 6d 61 6e   package SDK man
21d0: 69 66 65 73 74 73 3b 20 68 6f 77 65 76 65 72 2c  ifests; however,
21e0: 20 69 74 20 61 70 70 65 61 72 73 20 74 68 61 74   it appears that
21f0: 20 57 69 6e 64 6f 77 73 20 50 68 6f 6e 65 20 38   Windows Phone 8
2200: 2e 31 0a 20 20 23 20 20 20 20 20 20 20 64 6f 65  .1.  #       doe
2210: 73 2e 0a 20 20 23 0a 20 20 69 66 20 7b 5b 73 74  s..  #.  if {[st
2220: 72 69 6e 67 20 65 71 75 61 6c 20 24 70 61 63 6b  ring equal $pack
2230: 61 67 65 46 6c 61 76 6f 72 20 57 50 38 30 5d 7d  ageFlavor WP80]}
2240: 20 74 68 65 6e 20 7b 0a 20 20 20 20 72 65 74 75   then {.    retu
2250: 72 6e 20 22 22 0a 20 20 7d 0a 0a 20 20 73 65 74  rn "".  }..  set
2260: 20 61 70 70 6c 69 65 73 54 6f 20 5b 65 78 70 72   appliesTo [expr
2270: 20 7b 5b 73 74 72 69 6e 67 20 65 71 75 61 6c 20   {[string equal 
2280: 24 70 61 63 6b 61 67 65 46 6c 61 76 6f 72 20 57  $packageFlavor W
2290: 69 6e 33 32 5d 20 3f 20 5c 0a 20 20 20 20 20 20  in32] ? \.      
22a0: 22 56 69 73 75 61 6c 43 22 20 3a 20 22 57 69 6e  "VisualC" : "Win
22b0: 64 6f 77 73 41 70 70 43 6f 6e 74 61 69 6e 65 72  dowsAppContainer
22c0: 22 7d 5d 0a 0a 20 20 73 77 69 74 63 68 20 2d 65  "}]..  switch -e
22d0: 78 61 63 74 20 24 76 73 56 65 72 73 69 6f 6e 20  xact $vsVersion 
22e0: 7b 0a 20 20 20 20 32 30 31 32 20 7b 0a 20 20 20  {.    2012 {.   
22f0: 20 20 20 72 65 74 75 72 6e 20 5b 61 70 70 65 6e     return [appen
2300: 64 41 72 67 73 20 5c 0a 20 20 20 20 20 20 20 20  dArgs \.        
2310: 20 20 22 5c 72 5c 6e 20 20 20 20 22 20 41 70 70    "\r\n    " App
2320: 6c 69 65 73 54 6f 3d 5c 22 20 24 61 70 70 6c 69  liesTo=\" $appli
2330: 65 73 54 6f 20 5c 22 20 5c 0a 20 20 20 20 20 20  esTo \" \.      
2340: 20 20 20 20 22 5c 72 5c 6e 20 20 20 20 22 20 7b      "\r\n    " {
2350: 44 65 70 65 6e 64 73 4f 6e 3d 22 4d 69 63 72 6f  DependsOn="Micro
2360: 73 6f 66 74 2e 56 43 4c 69 62 73 2c 20 76 65 72  soft.VCLibs, ver
2370: 73 69 6f 6e 3d 31 31 2e 30 22 7d 5d 0a 20 20 20  sion=11.0"}].   
2380: 20 7d 0a 20 20 20 20 32 30 31 33 20 7b 0a 20 20   }.    2013 {.  
2390: 20 20 20 20 72 65 74 75 72 6e 20 5b 61 70 70 65      return [appe
23a0: 6e 64 41 72 67 73 20 5c 0a 20 20 20 20 20 20 20  ndArgs \.       
23b0: 20 20 20 22 5c 72 5c 6e 20 20 20 20 22 20 41 70     "\r\n    " Ap
23c0: 70 6c 69 65 73 54 6f 3d 5c 22 20 24 61 70 70 6c  pliesTo=\" $appl
23d0: 69 65 73 54 6f 20 5c 22 20 5c 0a 20 20 20 20 20  iesTo \" \.     
23e0: 20 20 20 20 20 22 5c 72 5c 6e 20 20 20 20 22 20       "\r\n    " 
23f0: 7b 44 65 70 65 6e 64 73 4f 6e 3d 22 4d 69 63 72  {DependsOn="Micr
2400: 6f 73 6f 66 74 2e 56 43 4c 69 62 73 2c 20 76 65  osoft.VCLibs, ve
2410: 72 73 69 6f 6e 3d 31 32 2e 30 22 7d 5d 0a 20 20  rsion=12.0"}].  
2420: 20 20 7d 0a 20 20 20 20 32 30 31 35 20 7b 0a 20    }.    2015 {. 
2430: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 61 70 70       return [app
2440: 65 6e 64 41 72 67 73 20 5c 0a 20 20 20 20 20 20  endArgs \.      
2450: 20 20 20 20 22 5c 72 5c 6e 20 20 20 20 22 20 41      "\r\n    " A
2460: 70 70 6c 69 65 73 54 6f 3d 5c 22 20 24 61 70 70  ppliesTo=\" $app
2470: 6c 69 65 73 54 6f 20 5c 22 20 5c 0a 20 20 20 20  liesTo \" \.    
2480: 20 20 20 20 20 20 22 5c 72 5c 6e 20 20 20 20 22        "\r\n    "
2490: 20 7b 44 65 70 65 6e 64 73 4f 6e 3d 22 4d 69 63   {DependsOn="Mic
24a0: 72 6f 73 6f 66 74 2e 56 43 4c 69 62 73 2c 20 76  rosoft.VCLibs, v
24b0: 65 72 73 69 6f 6e 3d 31 34 2e 30 22 7d 5d 0a 20  ersion=14.0"}]. 
24c0: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
24d0: 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
24e0: 22 22 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0c  "".    }.  }.}..
24f0: 0a 70 72 6f 63 20 72 65 70 6c 61 63 65 46 69 6c  .proc replaceFil
2500: 65 4e 61 6d 65 54 6f 6b 65 6e 73 20 7b 20 66 69  eNameTokens { fi
2510: 6c 65 4e 61 6d 65 20 6e 61 6d 65 20 62 75 69 6c  leName name buil
2520: 64 4e 61 6d 65 20 70 6c 61 74 66 6f 72 6d 4e 61  dName platformNa
2530: 6d 65 20 7d 20 7b 0a 20 20 23 0a 20 20 23 20 4e  me } {.  #.  # N
2540: 4f 54 45 3a 20 52 65 74 75 72 6e 73 20 74 68 65  OTE: Returns the
2550: 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 20   specified file 
2560: 6e 61 6d 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  name containing 
2570: 74 68 65 20 70 6c 61 74 66 6f 72 6d 20 6e 61 6d  the platform nam
2580: 65 20 69 6e 73 74 65 61 64 0a 20 20 23 20 20 20  e instead.  #   
2590: 20 20 20 20 6f 66 20 70 6c 61 74 66 6f 72 6d 20      of platform 
25a0: 70 6c 61 63 65 68 6f 6c 64 65 72 20 74 6f 6b 65  placeholder toke
25b0: 6e 73 2e 0a 20 20 23 0a 20 20 72 65 74 75 72 6e  ns..  #.  return
25c0: 20 5b 73 74 72 69 6e 67 20 6d 61 70 20 5b 6c 69   [string map [li
25d0: 73 74 20 3c 62 75 69 6c 64 3e 20 24 62 75 69 6c  st <build> $buil
25e0: 64 4e 61 6d 65 20 3c 70 6c 61 74 66 6f 72 6d 3e  dName <platform>
25f0: 20 24 70 6c 61 74 66 6f 72 6d 4e 61 6d 65 20 5c   $platformName \
2600: 0a 20 20 20 20 20 20 3c 6e 61 6d 65 3e 20 24 6e  .      <name> $n
2610: 61 6d 65 5d 20 24 66 69 6c 65 4e 61 6d 65 5d 0a  ame] $fileName].
2620: 7d 0a 0c 0a 70 72 6f 63 20 73 75 62 73 74 46 69  }...proc substFi
2630: 6c 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7d 20  le { fileName } 
2640: 7b 0a 20 20 23 0a 20 20 23 20 4e 4f 54 45 3a 20  {.  #.  # NOTE: 
2650: 50 65 72 66 6f 72 6d 73 20 61 6c 6c 20 54 63 6c  Performs all Tcl
2660: 20 63 6f 6d 6d 61 6e 64 2c 20 76 61 72 69 61 62   command, variab
2670: 6c 65 2c 20 61 6e 64 20 62 61 63 6b 73 6c 61 73  le, and backslas
2680: 68 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20  h substitutions 
2690: 69 6e 0a 20 20 23 20 20 20 20 20 20 20 74 68 65  in.  #       the
26a0: 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 20   specified file 
26b0: 61 6e 64 20 74 68 65 6e 20 72 65 77 72 69 74 65  and then rewrite
26c0: 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  s the contents o
26d0: 66 20 74 68 61 74 20 73 61 6d 65 20 66 69 6c 65  f that same file
26e0: 0a 20 20 23 20 20 20 20 20 20 20 77 69 74 68 20  .  #       with 
26f0: 74 68 65 20 73 75 62 73 74 69 74 75 74 65 64 20  the substituted 
2700: 64 61 74 61 2e 0a 20 20 23 0a 20 20 72 65 74 75  data..  #.  retu
2710: 72 6e 20 5b 77 72 69 74 65 46 69 6c 65 20 24 66  rn [writeFile $f
2720: 69 6c 65 4e 61 6d 65 20 5b 75 70 6c 65 76 65 6c  ileName [uplevel
2730: 20 31 20 5b 6c 69 73 74 20 73 75 62 73 74 20 5b   1 [list subst [
2740: 72 65 61 64 46 69 6c 65 20 24 66 69 6c 65 4e 61  readFile $fileNa
2750: 6d 65 5d 5d 5d 5d 0a 7d 0a 0c 0a 23 0a 23 20 4e  me]]]].}...#.# N
2760: 4f 54 45 3a 20 54 68 69 73 20 69 73 20 74 68 65  OTE: This is the
2770: 20 65 6e 74 72 79 20 70 6f 69 6e 74 20 66 6f 72   entry point for
2780: 20 74 68 69 73 20 73 63 72 69 70 74 2e 0a 23 0a   this script..#.
2790: 73 65 74 20 73 63 72 69 70 74 20 5b 66 69 6c 65  set script [file
27a0: 20 6e 6f 72 6d 61 6c 69 7a 65 20 5b 69 6e 66 6f   normalize [info
27b0: 20 73 63 72 69 70 74 5d 5d 0a 0a 69 66 20 7b 5b   script]]..if {[
27c0: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 73  string length $s
27d0: 63 72 69 70 74 5d 20 3d 3d 20 30 7d 20 74 68 65  cript] == 0} the
27e0: 6e 20 7b 0a 20 20 66 61 69 6c 20 22 73 63 72 69  n {.  fail "scri
27f0: 70 74 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c  pt file currentl
2800: 79 20 62 65 69 6e 67 20 65 76 61 6c 75 61 74 65  y being evaluate
2810: 64 20 69 73 20 75 6e 6b 6e 6f 77 6e 22 20 74 72  d is unknown" tr
2820: 75 65 0a 7d 0a 0a 73 65 74 20 70 61 74 68 20 5b  ue.}..set path [
2830: 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 73 63  file dirname $sc
2840: 72 69 70 74 5d 0a 73 65 74 20 72 6f 6f 74 4e 61  ript].set rootNa
2850: 6d 65 20 5b 66 69 6c 65 20 72 6f 6f 74 6e 61 6d  me [file rootnam
2860: 65 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 73 63  e [file tail $sc
2870: 72 69 70 74 5d 5d 0a 0a 23 23 23 23 23 23 23 23  ript]]..########
2880: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2890: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
28a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
28b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
28c0: 23 23 23 23 23 23 23 0a 0a 23 0a 23 20 4e 4f 54  #######..#.# NOT
28d0: 45 3a 20 50 72 6f 63 65 73 73 20 61 6e 64 20 76  E: Process and v
28e0: 65 72 69 66 79 20 61 6c 6c 20 74 68 65 20 63 6f  erify all the co
28f0: 6d 6d 61 6e 64 20 6c 69 6e 65 20 61 72 67 75 6d  mmand line argum
2900: 65 6e 74 73 2e 0a 23 0a 73 65 74 20 61 72 67 63  ents..#.set argc
2910: 20 5b 6c 6c 65 6e 67 74 68 20 24 61 72 67 76 5d   [llength $argv]
2920: 0a 69 66 20 7b 24 61 72 67 63 20 3c 20 31 20 7c  .if {$argc < 1 |
2930: 7c 20 24 61 72 67 63 20 3e 20 35 7d 20 74 68 65  | $argc > 5} the
2940: 6e 20 7b 66 61 69 6c 7d 0a 0a 73 65 74 20 62 69  n {fail}..set bi
2950: 6e 61 72 79 44 69 72 65 63 74 6f 72 79 20 5b 6c  naryDirectory [l
2960: 69 6e 64 65 78 20 24 61 72 67 76 20 30 5d 0a 0a  index $argv 0]..
2970: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
2980: 74 68 20 24 62 69 6e 61 72 79 44 69 72 65 63 74  th $binaryDirect
2990: 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ory] == 0} then 
29a0: 7b 0a 20 20 66 61 69 6c 20 22 69 6e 76 61 6c 69  {.  fail "invali
29b0: 64 20 62 69 6e 61 72 79 20 64 69 72 65 63 74 6f  d binary directo
29c0: 72 79 22 0a 7d 0a 0a 69 66 20 7b 21 5b 66 69 6c  ry".}..if {![fil
29d0: 65 20 65 78 69 73 74 73 20 24 62 69 6e 61 72 79  e exists $binary
29e0: 44 69 72 65 63 74 6f 72 79 5d 20 7c 7c 20 5c 0a  Directory] || \.
29f0: 20 20 20 20 21 5b 66 69 6c 65 20 69 73 64 69 72      ![file isdir
2a00: 65 63 74 6f 72 79 20 24 62 69 6e 61 72 79 44 69  ectory $binaryDi
2a10: 72 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b  rectory]} then {
2a20: 0a 20 20 66 61 69 6c 20 22 62 69 6e 61 72 79 20  .  fail "binary 
2a30: 64 69 72 65 63 74 6f 72 79 20 64 6f 65 73 20 6e  directory does n
2a40: 6f 74 20 65 78 69 73 74 22 0a 7d 0a 0a 69 66 20  ot exist".}..if 
2a50: 7b 24 61 72 67 63 20 3e 3d 20 32 7d 20 74 68 65  {$argc >= 2} the
2a60: 6e 20 7b 0a 20 20 73 65 74 20 73 6f 75 72 63 65  n {.  set source
2a70: 44 69 72 65 63 74 6f 72 79 20 5b 6c 69 6e 64 65  Directory [linde
2a80: 78 20 24 61 72 67 76 20 31 5d 0a 7d 20 65 6c 73  x $argv 1].} els
2a90: 65 20 7b 0a 20 20 23 0a 20 20 23 20 4e 4f 54 45  e {.  #.  # NOTE
2aa0: 3a 20 41 73 73 75 6d 65 20 74 68 61 74 20 74 68  : Assume that th
2ab0: 65 20 73 6f 75 72 63 65 20 64 69 72 65 63 74 6f  e source directo
2ac0: 72 79 20 69 73 20 74 68 65 20 70 61 72 65 6e 74  ry is the parent
2ad0: 20 64 69 72 65 63 74 6f 72 79 20 6f 66 20 74 68   directory of th
2ae0: 65 20 6f 6e 65 0a 20 20 23 20 20 20 20 20 20 20  e one.  #       
2af0: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
2b00: 69 73 20 73 63 72 69 70 74 20 66 69 6c 65 2e 0a  is script file..
2b10: 20 20 23 0a 20 20 73 65 74 20 73 6f 75 72 63 65    #.  set source
2b20: 44 69 72 65 63 74 6f 72 79 20 5b 66 69 6c 65 20  Directory [file 
2b30: 64 69 72 6e 61 6d 65 20 24 70 61 74 68 5d 0a 7d  dirname $path].}
2b40: 0a 0a 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65  ..if {[string le
2b50: 6e 67 74 68 20 24 73 6f 75 72 63 65 44 69 72 65  ngth $sourceDire
2b60: 63 74 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65  ctory] == 0} the
2b70: 6e 20 7b 0a 20 20 66 61 69 6c 20 22 69 6e 76 61  n {.  fail "inva
2b80: 6c 69 64 20 73 6f 75 72 63 65 20 64 69 72 65 63  lid source direc
2b90: 74 6f 72 79 22 0a 7d 0a 0a 69 66 20 7b 21 5b 66  tory".}..if {![f
2ba0: 69 6c 65 20 65 78 69 73 74 73 20 24 73 6f 75 72  ile exists $sour
2bb0: 63 65 44 69 72 65 63 74 6f 72 79 5d 20 7c 7c 20  ceDirectory] || 
2bc0: 5c 0a 20 20 20 20 21 5b 66 69 6c 65 20 69 73 64  \.    ![file isd
2bd0: 69 72 65 63 74 6f 72 79 20 24 73 6f 75 72 63 65  irectory $source
2be0: 44 69 72 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e  Directory]} then
2bf0: 20 7b 0a 20 20 66 61 69 6c 20 22 73 6f 75 72 63   {.  fail "sourc
2c00: 65 20 64 69 72 65 63 74 6f 72 79 20 64 6f 65 73  e directory does
2c10: 20 6e 6f 74 20 65 78 69 73 74 22 0a 7d 0a 0a 69   not exist".}..i
2c20: 66 20 7b 24 61 72 67 63 20 3e 3d 20 33 7d 20 74  f {$argc >= 3} t
2c30: 68 65 6e 20 7b 0a 20 20 73 65 74 20 70 61 63 6b  hen {.  set pack
2c40: 61 67 65 46 6c 61 76 6f 72 20 5b 6c 69 6e 64 65  ageFlavor [linde
2c50: 78 20 24 61 72 67 76 20 32 5d 0a 7d 20 65 6c 73  x $argv 2].} els
2c60: 65 20 7b 0a 20 20 23 0a 20 20 23 20 4e 4f 54 45  e {.  #.  # NOTE
2c70: 3a 20 41 73 73 75 6d 65 20 74 68 65 20 70 61 63  : Assume the pac
2c80: 6b 61 67 65 20 66 6c 61 76 6f 72 20 69 73 20 57  kage flavor is W
2c90: 69 6e 52 54 2e 0a 20 20 23 0a 20 20 73 65 74 20  inRT..  #.  set 
2ca0: 70 61 63 6b 61 67 65 46 6c 61 76 6f 72 20 57 69  packageFlavor Wi
2cb0: 6e 52 54 0a 7d 0a 0a 69 66 20 7b 5b 73 74 72 69  nRT.}..if {[stri
2cc0: 6e 67 20 6c 65 6e 67 74 68 20 24 70 61 63 6b 61  ng length $packa
2cd0: 67 65 46 6c 61 76 6f 72 5d 20 3d 3d 20 30 7d 20  geFlavor] == 0} 
2ce0: 74 68 65 6e 20 7b 0a 20 20 66 61 69 6c 20 22 69  then {.  fail "i
2cf0: 6e 76 61 6c 69 64 20 70 61 63 6b 61 67 65 20 66  nvalid package f
2d00: 6c 61 76 6f 72 22 0a 7d 0a 0a 69 66 20 7b 24 61  lavor".}..if {$a
2d10: 72 67 63 20 3e 3d 20 34 7d 20 74 68 65 6e 20 7b  rgc >= 4} then {
2d20: 0a 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 4e  .  set platformN
2d30: 61 6d 65 73 20 5b 6c 69 73 74 5d 0a 0a 20 20 66  ames [list]..  f
2d40: 6f 72 65 61 63 68 20 70 6c 61 74 66 6f 72 6d 4e  oreach platformN
2d50: 61 6d 65 20 5b 73 70 6c 69 74 20 5b 6c 69 6e 64  ame [split [lind
2d60: 65 78 20 24 61 72 67 76 20 33 5d 20 22 2c 20 22  ex $argv 3] ", "
2d70: 5d 20 7b 0a 20 20 20 20 73 65 74 20 70 6c 61 74  ] {.    set plat
2d80: 66 6f 72 6d 4e 61 6d 65 20 5b 73 74 72 69 6e 67  formName [string
2d90: 20 74 72 69 6d 20 24 70 6c 61 74 66 6f 72 6d 4e   trim $platformN
2da0: 61 6d 65 5d 0a 0a 20 20 20 20 69 66 20 7b 5b 73  ame]..    if {[s
2db0: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c  tring length $pl
2dc0: 61 74 66 6f 72 6d 4e 61 6d 65 5d 20 3e 20 30 7d  atformName] > 0}
2dd0: 20 74 68 65 6e 20 7b 0a 20 20 20 20 20 20 6c 61   then {.      la
2de0: 70 70 65 6e 64 20 70 6c 61 74 66 6f 72 6d 4e 61  ppend platformNa
2df0: 6d 65 73 20 24 70 6c 61 74 66 6f 72 6d 4e 61 6d  mes $platformNam
2e00: 65 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 69  e.    }.  }.}..i
2e10: 66 20 7b 24 61 72 67 63 20 3e 3d 20 35 7d 20 74  f {$argc >= 5} t
2e20: 68 65 6e 20 7b 0a 20 20 73 65 74 20 76 73 56 65  hen {.  set vsVe
2e30: 72 73 69 6f 6e 20 5b 6c 69 6e 64 65 78 20 24 61  rsion [lindex $a
2e40: 72 67 76 20 34 5d 0a 7d 20 65 6c 73 65 20 7b 0a  rgv 4].} else {.
2e50: 20 20 73 65 74 20 76 73 56 65 72 73 69 6f 6e 20    set vsVersion 
2e60: 32 30 31 32 0a 7d 0a 0a 69 66 20 7b 5b 73 74 72  2012.}..if {[str
2e70: 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 73 56 65  ing length $vsVe
2e80: 72 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65  rsion] == 0} the
2e90: 6e 20 7b 0a 20 20 66 61 69 6c 20 22 69 6e 76 61  n {.  fail "inva
2ea0: 6c 69 64 20 56 69 73 75 61 6c 20 53 74 75 64 69  lid Visual Studi
2eb0: 6f 20 76 65 72 73 69 6f 6e 22 0a 7d 0a 0a 69 66  o version".}..if
2ec0: 20 7b 21 5b 73 74 72 69 6e 67 20 65 71 75 61 6c   {![string equal
2ed0: 20 24 76 73 56 65 72 73 69 6f 6e 20 32 30 31 32   $vsVersion 2012
2ee0: 5d 20 26 26 20 21 5b 73 74 72 69 6e 67 20 65 71  ] && ![string eq
2ef0: 75 61 6c 20 24 76 73 56 65 72 73 69 6f 6e 20 32  ual $vsVersion 2
2f00: 30 31 33 5d 20 26 26 20 5c 0a 20 20 20 20 21 5b  013] && \.    ![
2f10: 73 74 72 69 6e 67 20 65 71 75 61 6c 20 24 76 73  string equal $vs
2f20: 56 65 72 73 69 6f 6e 20 32 30 31 35 5d 7d 20 74  Version 2015]} t
2f30: 68 65 6e 20 7b 0a 20 20 66 61 69 6c 20 5b 61 70  hen {.  fail [ap
2f40: 70 65 6e 64 41 72 67 73 20 5c 0a 20 20 20 20 20  pendArgs \.     
2f50: 20 22 75 6e 73 75 70 70 6f 72 74 65 64 20 56 69   "unsupported Vi
2f60: 73 75 61 6c 20 53 74 75 64 69 6f 20 76 65 72 73  sual Studio vers
2f70: 69 6f 6e 2c 20 6d 75 73 74 20 62 65 20 6f 6e 65  ion, must be one
2f80: 20 6f 66 3a 20 22 20 5c 0a 20 20 20 20 20 20 5b   of: " \.      [
2f90: 6c 69 73 74 20 32 30 31 32 20 32 30 31 33 20 32  list 2012 2013 2
2fa0: 30 31 35 5d 5d 0a 7d 0a 0a 73 65 74 20 73 68 6f  015]].}..set sho
2fb0: 72 74 4e 61 6d 65 73 28 57 69 6e 52 54 2c 32 30  rtNames(WinRT,20
2fc0: 31 32 29 20 53 51 4c 69 74 65 2e 57 69 6e 52 54  12) SQLite.WinRT
2fd0: 0a 73 65 74 20 73 68 6f 72 74 4e 61 6d 65 73 28  .set shortNames(
2fe0: 57 69 6e 52 54 2c 32 30 31 33 29 20 53 51 4c 69  WinRT,2013) SQLi
2ff0: 74 65 2e 57 69 6e 52 54 2e 32 30 31 33 0a 73 65  te.WinRT.2013.se
3000: 74 20 73 68 6f 72 74 4e 61 6d 65 73 28 57 69 6e  t shortNames(Win
3010: 52 54 38 31 2c 32 30 31 33 29 20 53 51 4c 69 74  RT81,2013) SQLit
3020: 65 2e 57 69 6e 52 54 38 31 0a 73 65 74 20 73 68  e.WinRT81.set sh
3030: 6f 72 74 4e 61 6d 65 73 28 57 50 38 30 2c 32 30  ortNames(WP80,20
3040: 31 32 29 20 53 51 4c 69 74 65 2e 57 50 38 30 0a  12) SQLite.WP80.
3050: 73 65 74 20 73 68 6f 72 74 4e 61 6d 65 73 28 57  set shortNames(W
3060: 50 38 30 2c 32 30 31 33 29 20 53 51 4c 69 74 65  P80,2013) SQLite
3070: 2e 57 50 38 30 2e 32 30 31 33 0a 73 65 74 20 73  .WP80.2013.set s
3080: 68 6f 72 74 4e 61 6d 65 73 28 57 50 38 31 2c 32  hortNames(WP81,2
3090: 30 31 33 29 20 53 51 4c 69 74 65 2e 57 50 38 31  013) SQLite.WP81
30a0: 0a 73 65 74 20 73 68 6f 72 74 4e 61 6d 65 73 28  .set shortNames(
30b0: 57 69 6e 33 32 2c 32 30 31 32 29 20 53 51 4c 69  Win32,2012) SQLi
30c0: 74 65 2e 57 69 6e 33 32 0a 73 65 74 20 73 68 6f  te.Win32.set sho
30d0: 72 74 4e 61 6d 65 73 28 57 69 6e 33 32 2c 32 30  rtNames(Win32,20
30e0: 31 33 29 20 53 51 4c 69 74 65 2e 57 69 6e 33 32  13) SQLite.Win32
30f0: 2e 32 30 31 33 0a 73 65 74 20 73 68 6f 72 74 4e  .2013.set shortN
3100: 61 6d 65 73 28 55 57 50 2c 32 30 31 35 29 20 53  ames(UWP,2015) S
3110: 51 4c 69 74 65 2e 55 57 50 2e 32 30 31 35 0a 0a  QLite.UWP.2015..
3120: 73 65 74 20 64 69 73 70 6c 61 79 4e 61 6d 65 73  set displayNames
3130: 28 57 69 6e 52 54 2c 32 30 31 32 29 20 22 53 51  (WinRT,2012) "SQ
3140: 4c 69 74 65 20 66 6f 72 20 57 69 6e 64 6f 77 73  Lite for Windows
3150: 20 52 75 6e 74 69 6d 65 22 0a 73 65 74 20 64 69   Runtime".set di
3160: 73 70 6c 61 79 4e 61 6d 65 73 28 57 69 6e 52 54  splayNames(WinRT
3170: 2c 32 30 31 33 29 20 22 53 51 4c 69 74 65 20 66  ,2013) "SQLite f
3180: 6f 72 20 57 69 6e 64 6f 77 73 20 52 75 6e 74 69  or Windows Runti
3190: 6d 65 22 0a 73 65 74 20 64 69 73 70 6c 61 79 4e  me".set displayN
31a0: 61 6d 65 73 28 57 69 6e 52 54 38 31 2c 32 30 31  ames(WinRT81,201
31b0: 33 29 20 22 53 51 4c 69 74 65 20 66 6f 72 20 57  3) "SQLite for W
31c0: 69 6e 64 6f 77 73 20 52 75 6e 74 69 6d 65 20 28  indows Runtime (
31d0: 57 69 6e 64 6f 77 73 20 38 2e 31 29 22 0a 73 65  Windows 8.1)".se
31e0: 74 20 64 69 73 70 6c 61 79 4e 61 6d 65 73 28 57  t displayNames(W
31f0: 50 38 30 2c 32 30 31 32 29 20 22 53 51 4c 69 74  P80,2012) "SQLit
3200: 65 20 66 6f 72 20 57 69 6e 64 6f 77 73 20 50 68  e for Windows Ph
3210: 6f 6e 65 22 0a 73 65 74 20 64 69 73 70 6c 61 79  one".set display
3220: 4e 61 6d 65 73 28 57 50 38 30 2c 32 30 31 33 29  Names(WP80,2013)
3230: 20 22 53 51 4c 69 74 65 20 66 6f 72 20 57 69 6e   "SQLite for Win
3240: 64 6f 77 73 20 50 68 6f 6e 65 22 0a 73 65 74 20  dows Phone".set 
3250: 64 69 73 70 6c 61 79 4e 61 6d 65 73 28 57 50 38  displayNames(WP8
3260: 31 2c 32 30 31 33 29 20 22 53 51 4c 69 74 65 20  1,2013) "SQLite 
3270: 66 6f 72 20 57 69 6e 64 6f 77 73 20 50 68 6f 6e  for Windows Phon
3280: 65 20 38 2e 31 22 0a 73 65 74 20 64 69 73 70 6c  e 8.1".set displ
3290: 61 79 4e 61 6d 65 73 28 57 69 6e 33 32 2c 32 30  ayNames(Win32,20
32a0: 31 32 29 20 22 53 51 4c 69 74 65 20 66 6f 72 20  12) "SQLite for 
32b0: 57 69 6e 64 6f 77 73 22 0a 73 65 74 20 64 69 73  Windows".set dis
32c0: 70 6c 61 79 4e 61 6d 65 73 28 57 69 6e 33 32 2c  playNames(Win32,
32d0: 32 30 31 33 29 20 22 53 51 4c 69 74 65 20 66 6f  2013) "SQLite fo
32e0: 72 20 57 69 6e 64 6f 77 73 22 0a 73 65 74 20 64  r Windows".set d
32f0: 69 73 70 6c 61 79 4e 61 6d 65 73 28 55 57 50 2c  isplayNames(UWP,
3300: 32 30 31 35 29 20 22 53 51 4c 69 74 65 20 66 6f  2015) "SQLite fo
3310: 72 20 55 6e 69 76 65 72 73 61 6c 20 57 69 6e 64  r Universal Wind
3320: 6f 77 73 20 50 6c 61 74 66 6f 72 6d 22 0a 0a 69  ows Platform"..i
3330: 66 20 7b 5b 73 74 72 69 6e 67 20 65 71 75 61 6c  f {[string equal
3340: 20 24 70 61 63 6b 61 67 65 46 6c 61 76 6f 72 20   $packageFlavor 
3350: 57 69 6e 52 54 5d 7d 20 74 68 65 6e 20 7b 0a 20  WinRT]} then {. 
3360: 20 73 65 74 20 73 68 6f 72 74 4e 61 6d 65 20 24   set shortName $
3370: 73 68 6f 72 74 4e 61 6d 65 73 28 24 70 61 63 6b  shortNames($pack
3380: 61 67 65 46 6c 61 76 6f 72 2c 24 76 73 56 65 72  ageFlavor,$vsVer
3390: 73 69 6f 6e 29 0a 20 20 73 65 74 20 64 69 73 70  sion).  set disp
33a0: 6c 61 79 4e 61 6d 65 20 24 64 69 73 70 6c 61 79  layName $display
33b0: 4e 61 6d 65 73 28 24 70 61 63 6b 61 67 65 46 6c  Names($packageFl
33c0: 61 76 6f 72 2c 24 76 73 56 65 72 73 69 6f 6e 29  avor,$vsVersion)
33d0: 0a 20 20 73 65 74 20 74 61 72 67 65 74 50 6c 61  .  set targetPla
33e0: 74 66 6f 72 6d 49 64 65 6e 74 69 66 69 65 72 20  tformIdentifier 
33f0: 57 69 6e 64 6f 77 73 0a 20 20 73 65 74 20 74 61  Windows.  set ta
3400: 72 67 65 74 50 6c 61 74 66 6f 72 6d 56 65 72 73  rgetPlatformVers
3410: 69 6f 6e 20 76 38 2e 30 0a 20 20 73 65 74 20 6d  ion v8.0.  set m
3420: 69 6e 56 73 56 65 72 73 69 6f 6e 20 5b 67 65 74  inVsVersion [get
3430: 4d 69 6e 56 73 56 65 72 73 69 6f 6e 58 6d 6c 43  MinVsVersionXmlC
3440: 68 75 6e 6b 20 24 76 73 56 65 72 73 69 6f 6e 5d  hunk $vsVersion]
3450: 0a 20 20 73 65 74 20 6d 61 78 50 6c 61 74 66 6f  .  set maxPlatfo
3460: 72 6d 56 65 72 73 69 6f 6e 20 5c 0a 20 20 20 20  rmVersion \.    
3470: 20 20 5b 67 65 74 4d 61 78 50 6c 61 74 66 6f 72    [getMaxPlatfor
3480: 6d 56 65 72 73 69 6f 6e 58 6d 6c 43 68 75 6e 6b  mVersionXmlChunk
3490: 20 24 70 61 63 6b 61 67 65 46 6c 61 76 6f 72 20   $packageFlavor 
34a0: 24 76 73 56 65 72 73 69 6f 6e 5d 0a 20 20 73 65  $vsVersion].  se
34b0: 74 20 65 78 74 72 61 53 64 6b 50 61 74 68 20 22  t extraSdkPath "
34c0: 22 0a 20 20 73 65 74 20 65 78 74 72 61 46 69 6c  ".  set extraFil
34d0: 65 4c 69 73 74 41 74 74 72 69 62 75 74 65 73 20  eListAttributes 
34e0: 5c 0a 20 20 20 20 20 20 5b 67 65 74 45 78 74 72  \.      [getExtr
34f0: 61 46 69 6c 65 4c 69 73 74 58 6d 6c 43 68 75 6e  aFileListXmlChun
3500: 6b 20 24 70 61 63 6b 61 67 65 46 6c 61 76 6f 72  k $packageFlavor
3510: 20 24 76 73 56 65 72 73 69 6f 6e 5d 0a 7d 20 65   $vsVersion].} e
3520: 6c 73 65 69 66 20 7b 5b 73 74 72 69 6e 67 20 65  lseif {[string e
3530: 71 75 61 6c 20 24 70 61 63 6b 61 67 65 46 6c 61  qual $packageFla
3540: 76 6f 72 20 57 69 6e 52 54 38 31 5d 7d 20 74 68  vor WinRT81]} th
3550: 65 6e 20 7b 0a 20 20 69 66 20 7b 24 76 73 56 65  en {.  if {$vsVe
3560: 72 73 69 6f 6e 20 6e 65 20 22 32 30 31 33 22 7d  rsion ne "2013"}
3570: 20 74 68 65 6e 20 7b 0a 20 20 20 20 66 61 69 6c   then {.    fail
3580: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0a 20   [appendArgs \. 
3590: 20 20 20 20 20 20 20 22 75 6e 73 75 70 70 6f 72         "unsuppor
35a0: 74 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 2c  ted combination,
35b0: 20 70 61 63 6b 61 67 65 20 66 6c 61 76 6f 72 20   package flavor 
35c0: 22 20 24 70 61 63 6b 61 67 65 46 6c 61 76 6f 72  " $packageFlavor
35d0: 20 5c 0a 20 20 20 20 20 20 20 20 22 20 69 73 20   \.        " is 
35e0: 6f 6e 6c 79 20 73 75 70 70 6f 72 74 65 64 20 77  only supported w
35f0: 69 74 68 20 56 69 73 75 61 6c 20 53 74 75 64 69  ith Visual Studi
3600: 6f 20 32 30 31 33 22 5d 0a 20 20 7d 0a 20 20 73  o 2013"].  }.  s
3610: 65 74 20 73 68 6f 72 74 4e 61 6d 65 20 24 73 68  et shortName $sh
3620: 6f 72 74 4e 61 6d 65 73 28 24 70 61 63 6b 61 67  ortNames($packag
3630: 65 46 6c 61 76 6f 72 2c 24 76 73 56 65 72 73 69  eFlavor,$vsVersi
3640: 6f 6e 29 0a 20 20 73 65 74 20 64 69 73 70 6c 61  on).  set displa
3650: 79 4e 61 6d 65 20 24 64 69 73 70 6c 61 79 4e 61  yName $displayNa
3660: 6d 65 73 28 24 70 61 63 6b 61 67 65 46 6c 61 76  mes($packageFlav
3670: 6f 72 2c 24 76 73 56 65 72 73 69 6f 6e 29 0a 20  or,$vsVersion). 
3680: 20 73 65 74 20 74 61 72 67 65 74 50 6c 61 74 66   set targetPlatf
3690: 6f 72 6d 49 64 65 6e 74 69 66 69 65 72 20 57 69  ormIdentifier Wi
36a0: 6e 64 6f 77 73 0a 20 20 73 65 74 20 74 61 72 67  ndows.  set targ
36b0: 65 74 50 6c 61 74 66 6f 72 6d 56 65 72 73 69 6f  etPlatformVersio
36c0: 6e 20 76 38 2e 31 0a 20 20 73 65 74 20 6d 69 6e  n v8.1.  set min
36d0: 56 73 56 65 72 73 69 6f 6e 20 5b 67 65 74 4d 69  VsVersion [getMi
36e0: 6e 56 73 56 65 72 73 69 6f 6e 58 6d 6c 43 68 75  nVsVersionXmlChu
36f0: 6e 6b 20 24 76 73 56 65 72 73 69 6f 6e 5d 0a 20  nk $vsVersion]. 
3700: 20 73 65 74 20 6d 61 78 50 6c 61 74 66 6f 72 6d   set maxPlatform
3710: 56 65 72 73 69 6f 6e 20 5c 0a 20 20 20 20 20 20  Version \.      
3720: 5b 67 65 74 4d 61 78 50 6c 61 74 66 6f 72 6d 56  [getMaxPlatformV
3730: 65 72 73 69 6f 6e 58 6d 6c 43 68 75 6e 6b 20 24  ersionXmlChunk $
3740: 70 61 63 6b 61 67 65 46 6c 61 76 6f 72 20 24 76  packageFlavor $v
3750: 73 56 65 72 73 69 6f 6e 5d 0a 20 20 73 65 74 20  sVersion].  set 
3760: 65 78 74 72 61 53 64 6b 50 61 74 68 20 22 22 0a  extraSdkPath "".
3770: 20 20 73 65 74 20 65 78 74 72 61 46 69 6c 65 4c    set extraFileL
3780: 69 73 74 41 74 74 72 69 62 75 74 65 73 20 5c 0a  istAttributes \.
3790: 20 20 20 20 20 20 5b 67 65 74 45 78 74 72 61 46        [getExtraF
37a0: 69 6c 65 4c 69 73 74 58 6d 6c 43 68 75 6e 6b 20  ileListXmlChunk 
37b0: 24 70 61 63 6b 61 67 65 46 6c 61 76 6f 72 20 24  $packageFlavor $
37c0: 76 73 56 65 72 73 69 6f 6e 5d 0a 7d 20 65 6c 73  vsVersion].} els
37d0: 65 69 66 20 7b 5b 73 74 72 69 6e 67 20 65 71 75  eif {[string equ
37e0: 61 6c 20 24 70 61 63 6b 61 67 65 46 6c 61 76 6f  al $packageFlavo
37f0: 72 20 57 50 38 30 5d 7d 20 74 68 65 6e 20 7b 0a  r WP80]} then {.
3800: 20 20 73 65 74 20 73 68 6f 72 74 4e 61 6d 65 20    set shortName 
3810: 24 73 68 6f 72 74 4e 61 6d 65 73 28 24 70 61 63  $shortNames($pac
3820: 6b 61 67 65 46 6c 61 76 6f 72 2c 24 76 73 56 65  kageFlavor,$vsVe
3830: 72 73 69 6f 6e 29 0a 20 20 73 65 74 20 64 69 73  rsion).  set dis
3840: 70 6c 61 79 4e 61 6d 65 20 24 64 69 73 70 6c 61  playName $displa
3850: 79 4e 61 6d 65 73 28 24 70 61 63 6b 61 67 65 46  yNames($packageF
3860: 6c 61 76 6f 72 2c 24 76 73 56 65 72 73 69 6f 6e  lavor,$vsVersion
3870: 29 0a 20 20 73 65 74 20 74 61 72 67 65 74 50 6c  ).  set targetPl
3880: 61 74 66 6f 72 6d 49 64 65 6e 74 69 66 69 65 72  atformIdentifier
3890: 20 22 57 69 6e 64 6f 77 73 20 50 68 6f 6e 65 22   "Windows Phone"
38a0: 0a 20 20 73 65 74 20 74 61 72 67 65 74 50 6c 61  .  set targetPla
38b0: 74 66 6f 72 6d 56 65 72 73 69 6f 6e 20 76 38 2e  tformVersion v8.
38c0: 30 0a 20 20 73 65 74 20 6d 69 6e 56 73 56 65 72  0.  set minVsVer
38d0: 73 69 6f 6e 20 5b 67 65 74 4d 69 6e 56 73 56 65  sion [getMinVsVe
38e0: 72 73 69 6f 6e 58 6d 6c 43 68 75 6e 6b 20 24 76  rsionXmlChunk $v
38f0: 73 56 65 72 73 69 6f 6e 5d 0a 20 20 73 65 74 20  sVersion].  set 
3900: 6d 61 78 50 6c 61 74 66 6f 72 6d 56 65 72 73 69  maxPlatformVersi
3910: 6f 6e 20 5c 0a 20 20 20 20 20 20 5b 67 65 74 4d  on \.      [getM
3920: 61 78 50 6c 61 74 66 6f 72 6d 56 65 72 73 69 6f  axPlatformVersio
3930: 6e 58 6d 6c 43 68 75 6e 6b 20 24 70 61 63 6b 61  nXmlChunk $packa
3940: 67 65 46 6c 61 76 6f 72 20 24 76 73 56 65 72 73  geFlavor $vsVers
3950: 69 6f 6e 5d 0a 20 20 73 65 74 20 65 78 74 72 61  ion].  set extra
3960: 53 64 6b 50 61 74 68 20 22 5c 5c 2e 2e 5c 5c 24  SdkPath "\\..\\$
3970: 74 61 72 67 65 74 50 6c 61 74 66 6f 72 6d 49 64  targetPlatformId
3980: 65 6e 74 69 66 69 65 72 22 0a 20 20 73 65 74 20  entifier".  set 
3990: 65 78 74 72 61 46 69 6c 65 4c 69 73 74 41 74 74  extraFileListAtt
39a0: 72 69 62 75 74 65 73 20 5c 0a 20 20 20 20 20 20  ributes \.      
39b0: 5b 67 65 74 45 78 74 72 61 46 69 6c 65 4c 69 73  [getExtraFileLis
39c0: 74 58 6d 6c 43 68 75 6e 6b 20 24 70 61 63 6b 61  tXmlChunk $packa
39d0: 67 65 46 6c 61 76 6f 72 20 24 76 73 56 65 72 73  geFlavor $vsVers
39e0: 69 6f 6e 5d 0a 7d 20 65 6c 73 65 69 66 20 7b 5b  ion].} elseif {[
39f0: 73 74 72 69 6e 67 20 65 71 75 61 6c 20 24 70 61  string equal $pa
3a00: 63 6b 61 67 65 46 6c 61 76 6f 72 20 57 50 38 31  ckageFlavor WP81
3a10: 5d 7d 20 74 68 65 6e 20 7b 0a 20 20 69 66 20 7b  ]} then {.  if {
3a20: 24 76 73 56 65 72 73 69 6f 6e 20 6e 65 20 22 32  $vsVersion ne "2
3a30: 30 31 33 22 7d 20 74 68 65 6e 20 7b 0a 20 20 20  013"} then {.   
3a40: 20 66 61 69 6c 20 5b 61 70 70 65 6e 64 41 72 67   fail [appendArg
3a50: 73 20 5c 0a 20 20 20 20 20 20 20 20 22 75 6e 73  s \.        "uns
3a60: 75 70 70 6f 72 74 65 64 20 63 6f 6d 62 69 6e 61  upported combina
3a70: 74 69 6f 6e 2c 20 70 61 63 6b 61 67 65 20 66 6c  tion, package fl
3a80: 61 76 6f 72 20 22 20 24 70 61 63 6b 61 67 65 46  avor " $packageF
3a90: 6c 61 76 6f 72 20 5c 0a 20 20 20 20 20 20 20 20  lavor \.        
3aa0: 22 20 69 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72  " is only suppor
3ab0: 74 65 64 20 77 69 74 68 20 56 69 73 75 61 6c 20  ted with Visual 
3ac0: 53 74 75 64 69 6f 20 32 30 31 33 22 5d 0a 20 20  Studio 2013"].  
3ad0: 7d 0a 20 20 73 65 74 20 73 68 6f 72 74 4e 61 6d  }.  set shortNam
3ae0: 65 20 24 73 68 6f 72 74 4e 61 6d 65 73 28 24 70  e $shortNames($p
3af0: 61 63 6b 61 67 65 46 6c 61 76 6f 72 2c 24 76 73  ackageFlavor,$vs
3b00: 56 65 72 73 69 6f 6e 29 0a 20 20 73 65 74 20 64  Version).  set d
3b10: 69 73 70 6c 61 79 4e 61 6d 65 20 24 64 69 73 70  isplayName $disp
3b20: 6c 61 79 4e 61 6d 65 73 28 24 70 61 63 6b 61 67  layNames($packag
3b30: 65 46 6c 61 76 6f 72 2c 24 76 73 56 65 72 73 69  eFlavor,$vsVersi
3b40: 6f 6e 29 0a 20 20 73 65 74 20 74 61 72 67 65 74  on).  set target
3b50: 50 6c 61 74 66 6f 72 6d 49 64 65 6e 74 69 66 69  PlatformIdentifi
3b60: 65 72 20 57 69 6e 64 6f 77 73 50 68 6f 6e 65 41  er WindowsPhoneA
3b70: 70 70 0a 20 20 73 65 74 20 74 61 72 67 65 74 50  pp.  set targetP
3b80: 6c 61 74 66 6f 72 6d 56 65 72 73 69 6f 6e 20 76  latformVersion v
3b90: 38 2e 31 0a 20 20 73 65 74 20 6d 69 6e 56 73 56  8.1.  set minVsV
3ba0: 65 72 73 69 6f 6e 20 5b 67 65 74 4d 69 6e 56 73  ersion [getMinVs
3bb0: 56 65 72 73 69 6f 6e 58 6d 6c 43 68 75 6e 6b 20  VersionXmlChunk 
3bc0: 24 76 73 56 65 72 73 69 6f 6e 5d 0a 20 20 73 65  $vsVersion].  se
3bd0: 74 20 6d 61 78 50 6c 61 74 66 6f 72 6d 56 65 72  t maxPlatformVer
3be0: 73 69 6f 6e 20 5c 0a 20 20 20 20 20 20 5b 67 65  sion \.      [ge
3bf0: 74 4d 61 78 50 6c 61 74 66 6f 72 6d 56 65 72 73  tMaxPlatformVers
3c00: 69 6f 6e 58 6d 6c 43 68 75 6e 6b 20 24 70 61 63  ionXmlChunk $pac
3c10: 6b 61 67 65 46 6c 61 76 6f 72 20 24 76 73 56 65  kageFlavor $vsVe
3c20: 72 73 69 6f 6e 5d 0a 20 20 73 65 74 20 65 78 74  rsion].  set ext
3c30: 72 61 53 64 6b 50 61 74 68 20 22 5c 5c 2e 2e 5c  raSdkPath "\\..\
3c40: 5c 24 74 61 72 67 65 74 50 6c 61 74 66 6f 72 6d  \$targetPlatform
3c50: 49 64 65 6e 74 69 66 69 65 72 22 0a 20 20 73 65  Identifier".  se
3c60: 74 20 65 78 74 72 61 46 69 6c 65 4c 69 73 74 41  t extraFileListA
3c70: 74 74 72 69 62 75 74 65 73 20 5c 0a 20 20 20 20  ttributes \.    
3c80: 20 20 5b 67 65 74 45 78 74 72 61 46 69 6c 65 4c    [getExtraFileL
3c90: 69 73 74 58 6d 6c 43 68 75 6e 6b 20 24 70 61 63  istXmlChunk $pac
3ca0: 6b 61 67 65 46 6c 61 76 6f 72 20 24 76 73 56 65  kageFlavor $vsVe
3cb0: 72 73 69 6f 6e 5d 0a 7d 20 65 6c 73 65 69 66 20  rsion].} elseif 
3cc0: 7b 5b 73 74 72 69 6e 67 20 65 71 75 61 6c 20 24  {[string equal $
3cd0: 70 61 63 6b 61 67 65 46 6c 61 76 6f 72 20 55 57  packageFlavor UW
3ce0: 50 5d 7d 20 74 68 65 6e 20 7b 0a 20 20 69 66 20  P]} then {.  if 
3cf0: 7b 24 76 73 56 65 72 73 69 6f 6e 20 6e 65 20 22  {$vsVersion ne "
3d00: 32 30 31 35 22 7d 20 74 68 65 6e 20 7b 0a 20 20  2015"} then {.  
3d10: 20 20 66 61 69 6c 20 5b 61 70 70 65 6e 64 41 72    fail [appendAr
3d20: 67 73 20 5c 0a 20 20 20 20 20 20 20 20 22 75 6e  gs \.        "un
3d30: 73 75 70 70 6f 72 74 65 64 20 63 6f 6d 62 69 6e  supported combin
3d40: 61 74 69 6f 6e 2c 20 70 61 63 6b 61 67 65 20 66  ation, package f
3d50: 6c 61 76 6f 72 20 22 20 24 70 61 63 6b 61 67 65  lavor " $package
3d60: 46 6c 61 76 6f 72 20 5c 0a 20 20 20 20 20 20 20  Flavor \.       
3d70: 20 22 20 69 73 20 6f 6e 6c 79 20 73 75 70 70 6f   " is only suppo
3d80: 72 74 65 64 20 77 69 74 68 20 56 69 73 75 61 6c  rted with Visual
3d90: 20 53 74 75 64 69 6f 20 32 30 31 35 22 5d 0a 20   Studio 2015"]. 
3da0: 20 7d 0a 20 20 73 65 74 20 73 68 6f 72 74 4e 61   }.  set shortNa
3db0: 6d 65 20 24 73 68 6f 72 74 4e 61 6d 65 73 28 24  me $shortNames($
3dc0: 70 61 63 6b 61 67 65 46 6c 61 76 6f 72 2c 24 76  packageFlavor,$v
3dd0: 73 56 65 72 73 69 6f 6e 29 0a 20 20 73 65 74 20  sVersion).  set 
3de0: 64 69 73 70 6c 61 79 4e 61 6d 65 20 24 64 69 73  displayName $dis
3df0: 70 6c 61 79 4e 61 6d 65 73 28 24 70 61 63 6b 61  playNames($packa
3e00: 67 65 46 6c 61 76 6f 72 2c 24 76 73 56 65 72 73  geFlavor,$vsVers
3e10: 69 6f 6e 29 0a 20 20 73 65 74 20 74 61 72 67 65  ion).  set targe
3e20: 74 50 6c 61 74 66 6f 72 6d 49 64 65 6e 74 69 66  tPlatformIdentif
3e30: 69 65 72 20 55 41 50 3b 20 23 20 4e 4f 54 45 3a  ier UAP; # NOTE:
3e40: 20 4e 6f 74 20 22 55 57 50 22 2e 0a 20 20 73 65   Not "UWP"..  se
3e50: 74 20 74 61 72 67 65 74 50 6c 61 74 66 6f 72 6d  t targetPlatform
3e60: 56 65 72 73 69 6f 6e 20 76 30 2e 38 2e 30 2e 30  Version v0.8.0.0
3e70: 0a 20 20 73 65 74 20 6d 69 6e 56 73 56 65 72 73  .  set minVsVers
3e80: 69 6f 6e 20 5b 67 65 74 4d 69 6e 56 73 56 65 72  ion [getMinVsVer
3e90: 73 69 6f 6e 58 6d 6c 43 68 75 6e 6b 20 24 76 73  sionXmlChunk $vs
3ea0: 56 65 72 73 69 6f 6e 5d 0a 20 20 73 65 74 20 6d  Version].  set m
3eb0: 61 78 50 6c 61 74 66 6f 72 6d 56 65 72 73 69 6f  axPlatformVersio
3ec0: 6e 20 5c 0a 20 20 20 20 20 20 5b 67 65 74 4d 61  n \.      [getMa
3ed0: 78 50 6c 61 74 66 6f 72 6d 56 65 72 73 69 6f 6e  xPlatformVersion
3ee0: 58 6d 6c 43 68 75 6e 6b 20 24 70 61 63 6b 61 67  XmlChunk $packag
3ef0: 65 46 6c 61 76 6f 72 20 24 76 73 56 65 72 73 69  eFlavor $vsVersi
3f00: 6f 6e 5d 0a 20 20 73 65 74 20 65 78 74 72 61 53  on].  set extraS
3f10: 64 6b 50 61 74 68 20 22 5c 5c 2e 2e 5c 5c 24 74  dkPath "\\..\\$t
3f20: 61 72 67 65 74 50 6c 61 74 66 6f 72 6d 49 64 65  argetPlatformIde
3f30: 6e 74 69 66 69 65 72 22 0a 20 20 73 65 74 20 65  ntifier".  set e
3f40: 78 74 72 61 46 69 6c 65 4c 69 73 74 41 74 74 72  xtraFileListAttr
3f50: 69 62 75 74 65 73 20 5c 0a 20 20 20 20 20 20 5b  ibutes \.      [
3f60: 67 65 74 45 78 74 72 61 46 69 6c 65 4c 69 73 74  getExtraFileList
3f70: 58 6d 6c 43 68 75 6e 6b 20 24 70 61 63 6b 61 67  XmlChunk $packag
3f80: 65 46 6c 61 76 6f 72 20 24 76 73 56 65 72 73 69  eFlavor $vsVersi
3f90: 6f 6e 5d 0a 7d 20 65 6c 73 65 69 66 20 7b 5b 73  on].} elseif {[s
3fa0: 74 72 69 6e 67 20 65 71 75 61 6c 20 24 70 61 63  tring equal $pac
3fb0: 6b 61 67 65 46 6c 61 76 6f 72 20 57 69 6e 33 32  kageFlavor Win32
3fc0: 5d 7d 20 74 68 65 6e 20 7b 0a 20 20 73 65 74 20  ]} then {.  set 
3fd0: 73 68 6f 72 74 4e 61 6d 65 20 24 73 68 6f 72 74  shortName $short
3fe0: 4e 61 6d 65 73 28 24 70 61 63 6b 61 67 65 46 6c  Names($packageFl
3ff0: 61 76 6f 72 2c 24 76 73 56 65 72 73 69 6f 6e 29  avor,$vsVersion)
4000: 0a 20 20 73 65 74 20 64 69 73 70 6c 61 79 4e 61  .  set displayNa
4010: 6d 65 20 24 64 69 73 70 6c 61 79 4e 61 6d 65 73  me $displayNames
4020: 28 24 70 61 63 6b 61 67 65 46 6c 61 76 6f 72 2c  ($packageFlavor,
4030: 24 76 73 56 65 72 73 69 6f 6e 29 0a 20 20 73 65  $vsVersion).  se
4040: 74 20 74 61 72 67 65 74 50 6c 61 74 66 6f 72 6d  t targetPlatform
4050: 49 64 65 6e 74 69 66 69 65 72 20 57 69 6e 64 6f  Identifier Windo
4060: 77 73 0a 20 20 73 65 74 20 74 61 72 67 65 74 50  ws.  set targetP
4070: 6c 61 74 66 6f 72 6d 56 65 72 73 69 6f 6e 20 76  latformVersion v
4080: 38 2e 30 0a 20 20 73 65 74 20 6d 69 6e 56 73 56  8.0.  set minVsV
4090: 65 72 73 69 6f 6e 20 5b 67 65 74 4d 69 6e 56 73  ersion [getMinVs
40a0: 56 65 72 73 69 6f 6e 58 6d 6c 43 68 75 6e 6b 20  VersionXmlChunk 
40b0: 24 76 73 56 65 72 73 69 6f 6e 5d 0a 20 20 73 65  $vsVersion].  se
40c0: 74 20 6d 61 78 50 6c 61 74 66 6f 72 6d 56 65 72  t maxPlatformVer
40d0: 73 69 6f 6e 20 5c 0a 20 20 20 20 20 20 5b 67 65  sion \.      [ge
40e0: 74 4d 61 78 50 6c 61 74 66 6f 72 6d 56 65 72 73  tMaxPlatformVers
40f0: 69 6f 6e 58 6d 6c 43 68 75 6e 6b 20 24 70 61 63  ionXmlChunk $pac
4100: 6b 61 67 65 46 6c 61 76 6f 72 20 24 76 73 56 65  kageFlavor $vsVe
4110: 72 73 69 6f 6e 5d 0a 20 20 73 65 74 20 65 78 74  rsion].  set ext
4120: 72 61 53 64 6b 50 61 74 68 20 22 22 0a 20 20 73  raSdkPath "".  s
4130: 65 74 20 65 78 74 72 61 46 69 6c 65 4c 69 73 74  et extraFileList
4140: 41 74 74 72 69 62 75 74 65 73 20 5c 0a 20 20 20  Attributes \.   
4150: 20 20 20 5b 67 65 74 45 78 74 72 61 46 69 6c 65     [getExtraFile
4160: 4c 69 73 74 58 6d 6c 43 68 75 6e 6b 20 24 70 61  ListXmlChunk $pa
4170: 63 6b 61 67 65 46 6c 61 76 6f 72 20 24 76 73 56  ckageFlavor $vsV
4180: 65 72 73 69 6f 6e 5d 0a 7d 20 65 6c 73 65 20 7b  ersion].} else {
4190: 0a 20 20 66 61 69 6c 20 5b 61 70 70 65 6e 64 41  .  fail [appendA
41a0: 72 67 73 20 5c 0a 20 20 20 20 20 20 22 75 6e 73  rgs \.      "uns
41b0: 75 70 70 6f 72 74 65 64 20 70 61 63 6b 61 67 65  upported package
41c0: 20 66 6c 61 76 6f 72 2c 20 6d 75 73 74 20 62 65   flavor, must be
41d0: 20 6f 6e 65 20 6f 66 3a 20 22 20 5c 0a 20 20 20   one of: " \.   
41e0: 20 20 20 5b 6c 69 73 74 20 57 69 6e 52 54 20 57     [list WinRT W
41f0: 69 6e 52 54 38 31 20 57 50 38 30 20 57 50 38 31  inRT81 WP80 WP81
4200: 20 55 57 50 20 57 69 6e 33 32 5d 5d 0a 7d 0a 0a   UWP Win32]].}..
4210: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4220: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4230: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4240: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4250: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a  ###############.
4260: 0a 23 0a 23 20 4e 4f 54 45 3a 20 45 76 61 6c 75  .#.# NOTE: Evalu
4270: 61 74 65 20 74 68 65 20 75 73 65 72 2d 73 70 65  ate the user-spe
4280: 63 69 66 69 63 20 63 75 73 74 6f 6d 69 7a 61 74  cific customizat
4290: 69 6f 6e 73 20 66 69 6c 65 2c 20 69 66 20 69 74  ions file, if it
42a0: 20 65 78 69 73 74 73 2e 0a 23 0a 73 65 74 20 75   exists..#.set u
42b0: 73 65 72 46 69 6c 65 20 5b 66 69 6c 65 20 6a 6f  serFile [file jo
42c0: 69 6e 20 24 70 61 74 68 20 5b 61 70 70 65 6e 64  in $path [append
42d0: 41 72 67 73 20 5c 0a 20 20 20 20 24 72 6f 6f 74  Args \.    $root
42e0: 4e 61 6d 65 20 2e 20 24 74 63 6c 5f 70 6c 61 74  Name . $tcl_plat
42f0: 66 6f 72 6d 28 75 73 65 72 29 20 2e 74 63 6c 5d  form(user) .tcl]
4300: 5d 0a 0a 69 66 20 7b 5b 66 69 6c 65 20 65 78 69  ]..if {[file exi
4310: 73 74 73 20 24 75 73 65 72 46 69 6c 65 5d 20 26  sts $userFile] &
4320: 26 20 5c 0a 20 20 20 20 5b 66 69 6c 65 20 69 73  & \.    [file is
4330: 66 69 6c 65 20 24 75 73 65 72 46 69 6c 65 5d 7d  file $userFile]}
4340: 20 74 68 65 6e 20 7b 0a 20 20 73 6f 75 72 63 65   then {.  source
4350: 20 24 75 73 65 72 46 69 6c 65 0a 7d 0a 0a 23 23   $userFile.}..##
4360: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4370: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4380: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4390: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
43a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 0a 73  #############..s
43b0: 65 74 20 74 65 6d 70 6c 61 74 65 46 69 6c 65 20  et templateFile 
43c0: 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 70 61 74 68  [file join $path
43d0: 20 77 69 6e 20 73 71 6c 69 74 65 2e 76 73 69 78   win sqlite.vsix
43e0: 5d 0a 0a 69 66 20 7b 21 5b 66 69 6c 65 20 65 78  ]..if {![file ex
43f0: 69 73 74 73 20 24 74 65 6d 70 6c 61 74 65 46 69  ists $templateFi
4400: 6c 65 5d 20 7c 7c 20 5c 0a 20 20 20 20 21 5b 66  le] || \.    ![f
4410: 69 6c 65 20 69 73 66 69 6c 65 20 24 74 65 6d 70  ile isfile $temp
4420: 6c 61 74 65 46 69 6c 65 5d 7d 20 74 68 65 6e 20  lateFile]} then 
4430: 7b 0a 20 20 66 61 69 6c 20 5b 61 70 70 65 6e 64  {.  fail [append
4440: 41 72 67 73 20 22 74 65 6d 70 6c 61 74 65 20 66  Args "template f
4450: 69 6c 65 20 5c 22 22 20 24 74 65 6d 70 6c 61 74  ile \"" $templat
4460: 65 46 69 6c 65 20 22 5c 22 20 64 6f 65 73 20 6e  eFile "\" does n
4470: 6f 74 20 65 78 69 73 74 22 5d 0a 7d 0a 0a 73 65  ot exist"].}..se
4480: 74 20 63 75 72 72 65 6e 74 44 69 72 65 63 74 6f  t currentDirecto
4490: 72 79 20 5b 70 77 64 5d 0a 73 65 74 20 6f 75 74  ry [pwd].set out
44a0: 70 75 74 46 69 6c 65 20 5b 66 69 6c 65 20 6a 6f  putFile [file jo
44b0: 69 6e 20 24 63 75 72 72 65 6e 74 44 69 72 65 63  in $currentDirec
44c0: 74 6f 72 79 20 5b 61 70 70 65 6e 64 41 72 67 73  tory [appendArgs
44d0: 20 73 71 6c 69 74 65 2d 20 5c 0a 20 20 20 20 24   sqlite- \.    $
44e0: 70 61 63 6b 61 67 65 46 6c 61 76 6f 72 20 2d 6f  packageFlavor -o
44f0: 75 74 70 75 74 2e 76 73 69 78 5d 5d 0a 0a 69 66  utput.vsix]]..if
4500: 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24   {[file exists $
4510: 6f 75 74 70 75 74 46 69 6c 65 5d 7d 20 74 68 65  outputFile]} the
4520: 6e 20 7b 0a 20 20 66 61 69 6c 20 5b 61 70 70 65  n {.  fail [appe
4530: 6e 64 41 72 67 73 20 22 6f 75 74 70 75 74 20 66  ndArgs "output f
4540: 69 6c 65 20 5c 22 22 20 24 6f 75 74 70 75 74 46  ile \"" $outputF
4550: 69 6c 65 20 22 5c 22 20 61 6c 72 65 61 64 79 20  ile "\" already 
4560: 65 78 69 73 74 73 22 5d 0a 7d 0a 0a 23 23 23 23  exists"].}..####
4570: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4580: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4590: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
45a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
45b0: 23 23 23 23 23 23 23 23 23 23 23 0a 0a 23 0a 23  ###########..#.#
45c0: 20 4e 4f 54 45 3a 20 4d 61 6b 65 20 73 75 72 65   NOTE: Make sure
45d0: 20 74 68 61 74 20 61 20 76 61 6c 69 64 20 74 65   that a valid te
45e0: 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72  mporary director
45f0: 79 20 65 78 69 73 74 73 2e 0a 23 0a 73 65 74 20  y exists..#.set 
4600: 74 65 6d 70 6f 72 61 72 79 44 69 72 65 63 74 6f  temporaryDirecto
4610: 72 79 20 5b 67 65 74 54 65 6d 70 6f 72 61 72 79  ry [getTemporary
4620: 50 61 74 68 5d 0a 0a 69 66 20 7b 5b 73 74 72 69  Path]..if {[stri
4630: 6e 67 20 6c 65 6e 67 74 68 20 24 74 65 6d 70 6f  ng length $tempo
4640: 72 61 72 79 44 69 72 65 63 74 6f 72 79 5d 20 3d  raryDirectory] =
4650: 3d 20 30 20 7c 7c 20 5c 0a 20 20 20 20 21 5b 66  = 0 || \.    ![f
4660: 69 6c 65 20 65 78 69 73 74 73 20 24 74 65 6d 70  ile exists $temp
4670: 6f 72 61 72 79 44 69 72 65 63 74 6f 72 79 5d 20  oraryDirectory] 
4680: 7c 7c 20 5c 0a 20 20 20 20 21 5b 66 69 6c 65 20  || \.    ![file 
4690: 69 73 64 69 72 65 63 74 6f 72 79 20 24 74 65 6d  isdirectory $tem
46a0: 70 6f 72 61 72 79 44 69 72 65 63 74 6f 72 79 5d  poraryDirectory]
46b0: 7d 20 74 68 65 6e 20 7b 0a 20 20 66 61 69 6c 20  } then {.  fail 
46c0: 22 63 61 6e 6e 6f 74 20 6c 6f 63 61 74 65 20 61  "cannot locate a
46d0: 20 75 73 61 62 6c 65 20 74 65 6d 70 6f 72 61 72   usable temporar
46e0: 79 20 64 69 72 65 63 74 6f 72 79 22 0a 7d 0a 0a  y directory".}..
46f0: 23 0a 23 20 4e 4f 54 45 3a 20 53 65 74 75 70 20  #.# NOTE: Setup 
4700: 74 68 65 20 73 74 61 67 69 6e 67 20 64 69 72 65  the staging dire
4710: 63 74 6f 72 79 20 74 6f 20 68 61 76 65 20 61 20  ctory to have a 
4720: 75 6e 69 71 75 65 20 6e 61 6d 65 20 69 6e 73 69  unique name insi
4730: 64 65 20 6f 66 20 74 68 65 0a 23 20 20 20 20 20  de of the.#     
4740: 20 20 63 6f 6e 66 69 67 75 72 65 64 20 74 65 6d    configured tem
4750: 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 79  porary directory
4760: 2e 0a 23 0a 73 65 74 20 73 74 61 67 69 6e 67 44  ..#.set stagingD
4770: 69 72 65 63 74 6f 72 79 20 5b 66 69 6c 65 20 6e  irectory [file n
4780: 6f 72 6d 61 6c 69 7a 65 20 5b 66 69 6c 65 20 6a  ormalize [file j
4790: 6f 69 6e 20 24 74 65 6d 70 6f 72 61 72 79 44 69  oin $temporaryDi
47a0: 72 65 63 74 6f 72 79 20 5c 0a 20 20 20 20 5b 61  rectory \.    [a
47b0: 70 70 65 6e 64 41 72 67 73 20 24 72 6f 6f 74 4e  ppendArgs $rootN
47c0: 61 6d 65 20 2e 20 5b 70 69 64 5d 5d 5d 5d 0a 0a  ame . [pid]]]]..
47d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
47e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
47f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4800: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4810: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a  ###############.
4820: 0a 23 0a 23 20 4e 4f 54 45 3a 20 43 6f 6e 66 69  .#.# NOTE: Confi
4830: 67 75 72 65 20 74 68 65 20 65 78 74 65 72 6e 61  gure the externa
4840: 6c 20 7a 69 70 70 69 6e 67 20 74 6f 6f 6c 2e 20  l zipping tool. 
4850: 20 46 69 72 73 74 2c 20 73 65 65 20 69 66 20 69   First, see if i
4860: 74 20 68 61 73 20 61 6c 72 65 61 64 79 0a 23 20  t has already.# 
4870: 20 20 20 20 20 20 62 65 65 6e 20 70 72 65 2d 63        been pre-c
4880: 6f 6e 66 69 67 75 72 65 64 2e 20 20 49 66 20 6e  onfigured.  If n
4890: 6f 74 2c 20 74 72 79 20 74 6f 20 71 75 65 72 79  ot, try to query
48a0: 20 69 74 20 66 72 6f 6d 20 74 68 65 20 65 6e 76   it from the env
48b0: 69 72 6f 6e 6d 65 6e 74 2e 0a 23 20 20 20 20 20  ironment..#     
48c0: 20 20 46 69 6e 61 6c 6c 79 2c 20 66 61 6c 6c 62    Finally, fallb
48d0: 61 63 6b 20 6f 6e 20 74 68 65 20 64 65 66 61 75  ack on the defau
48e0: 6c 74 20 6f 66 20 73 69 6d 70 6c 79 20 22 7a 69  lt of simply "zi
48f0: 70 22 2c 20 77 68 69 63 68 20 77 69 6c 6c 20 74  p", which will t
4900: 68 65 6e 0a 23 20 20 20 20 20 20 20 62 65 20 61  hen.#       be a
4910: 73 73 75 6d 65 64 20 74 6f 20 65 78 69 73 74 20  ssumed to exist 
4920: 73 6f 6d 65 77 68 65 72 65 20 61 6c 6f 6e 67 20  somewhere along 
4930: 74 68 65 20 50 41 54 48 2e 0a 23 0a 69 66 20 7b  the PATH..#.if {
4940: 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 7a 69  ![info exists zi
4950: 70 5d 7d 20 74 68 65 6e 20 7b 0a 20 20 69 66 20  p]} then {.  if 
4960: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 65 6e  {[info exists en
4970: 76 28 5a 69 70 54 6f 6f 6c 29 5d 7d 20 74 68 65  v(ZipTool)]} the
4980: 6e 20 7b 0a 20 20 20 20 73 65 74 20 7a 69 70 20  n {.    set zip 
4990: 24 65 6e 76 28 5a 69 70 54 6f 6f 6c 29 0a 20 20  $env(ZipTool).  
49a0: 7d 0a 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65  }.  if {![info e
49b0: 78 69 73 74 73 20 7a 69 70 5d 20 7c 7c 20 21 5b  xists zip] || ![
49c0: 66 69 6c 65 20 65 78 69 73 74 73 20 24 7a 69 70  file exists $zip
49d0: 5d 7d 20 74 68 65 6e 20 7b 0a 20 20 20 20 73 65  ]} then {.    se
49e0: 74 20 7a 69 70 20 7a 69 70 0a 20 20 7d 0a 7d 0a  t zip zip.  }.}.
49f0: 0a 23 0a 23 20 4e 4f 54 45 3a 20 43 6f 6e 66 69  .#.# NOTE: Confi
4a00: 67 75 72 65 20 74 68 65 20 65 78 74 65 72 6e 61  gure the externa
4a10: 6c 20 75 6e 7a 69 70 70 69 6e 67 20 74 6f 6f 6c  l unzipping tool
4a20: 2e 20 20 46 69 72 73 74 2c 20 73 65 65 20 69 66  .  First, see if
4a30: 20 69 74 20 68 61 73 20 61 6c 72 65 61 64 79 0a   it has already.
4a40: 23 20 20 20 20 20 20 20 62 65 65 6e 20 70 72 65  #       been pre
4a50: 2d 63 6f 6e 66 69 67 75 72 65 64 2e 20 20 49 66  -configured.  If
4a60: 20 6e 6f 74 2c 20 74 72 79 20 74 6f 20 71 75 65   not, try to que
4a70: 72 79 20 69 74 20 66 72 6f 6d 20 74 68 65 20 65  ry it from the e
4a80: 6e 76 69 72 6f 6e 6d 65 6e 74 2e 0a 23 20 20 20  nvironment..#   
4a90: 20 20 20 20 46 69 6e 61 6c 6c 79 2c 20 66 61 6c      Finally, fal
4aa0: 6c 62 61 63 6b 20 6f 6e 20 74 68 65 20 64 65 66  lback on the def
4ab0: 61 75 6c 74 20 6f 66 20 73 69 6d 70 6c 79 20 22  ault of simply "
4ac0: 75 6e 7a 69 70 22 2c 20 77 68 69 63 68 20 77 69  unzip", which wi
4ad0: 6c 6c 20 74 68 65 6e 0a 23 20 20 20 20 20 20 20  ll then.#       
4ae0: 62 65 20 61 73 73 75 6d 65 64 20 74 6f 20 65 78  be assumed to ex
4af0: 69 73 74 20 73 6f 6d 65 77 68 65 72 65 20 61 6c  ist somewhere al
4b00: 6f 6e 67 20 74 68 65 20 50 41 54 48 2e 0a 23 0a  ong the PATH..#.
4b10: 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
4b20: 73 20 75 6e 7a 69 70 5d 7d 20 74 68 65 6e 20 7b  s unzip]} then {
4b30: 0a 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69  .  if {[info exi
4b40: 73 74 73 20 65 6e 76 28 55 6e 5a 69 70 54 6f 6f  sts env(UnZipToo
4b50: 6c 29 5d 7d 20 74 68 65 6e 20 7b 0a 20 20 20 20  l)]} then {.    
4b60: 73 65 74 20 75 6e 7a 69 70 20 24 65 6e 76 28 55  set unzip $env(U
4b70: 6e 5a 69 70 54 6f 6f 6c 29 0a 20 20 7d 0a 20 20  nZipTool).  }.  
4b80: 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
4b90: 73 20 75 6e 7a 69 70 5d 20 7c 7c 20 21 5b 66 69  s unzip] || ![fi
4ba0: 6c 65 20 65 78 69 73 74 73 20 24 75 6e 7a 69 70  le exists $unzip
4bb0: 5d 7d 20 74 68 65 6e 20 7b 0a 20 20 20 20 73 65  ]} then {.    se
4bc0: 74 20 75 6e 7a 69 70 20 75 6e 7a 69 70 0a 20 20  t unzip unzip.  
4bd0: 7d 0a 7d 0a 0a 23 23 23 23 23 23 23 23 23 23 23  }.}..###########
4be0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4bf0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4c00: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4c10: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4c20: 23 23 23 23 0a 0a 23 0a 23 20 4e 4f 54 45 3a 20  ####..#.# NOTE: 
4c30: 41 74 74 65 6d 70 74 20 74 6f 20 65 78 74 72 61  Attempt to extra
4c40: 63 74 20 74 68 65 20 53 51 4c 69 74 65 20 76 65  ct the SQLite ve
4c50: 72 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 22  rsion from the "
4c60: 73 71 6c 69 74 65 33 2e 68 22 20 68 65 61 64 65  sqlite3.h" heade
4c70: 72 20 66 69 6c 65 0a 23 20 20 20 20 20 20 20 69  r file.#       i
4c80: 6e 20 74 68 65 20 73 6f 75 72 63 65 20 64 69 72  n the source dir
4c90: 65 63 74 6f 72 79 2e 20 20 54 68 69 73 20 73 63  ectory.  This sc
4ca0: 72 69 70 74 20 61 73 73 75 6d 65 73 20 74 68 61  ript assumes tha
4cb0: 74 20 74 68 65 20 68 65 61 64 65 72 20 66 69 6c  t the header fil
4cc0: 65 20 68 61 73 0a 23 20 20 20 20 20 20 20 61 6c  e has.#       al
4cd0: 72 65 61 64 79 20 62 65 65 6e 20 67 65 6e 65 72  ready been gener
4ce0: 61 74 65 64 20 62 79 20 74 68 65 20 62 75 69 6c  ated by the buil
4cf0: 64 20 70 72 6f 63 65 73 73 2e 0a 23 0a 73 65 74  d process..#.set
4d00: 20 70 61 74 74 65 72 6e 20 7b 5e 23 64 65 66 69   pattern {^#defi
4d10: 6e 65 5c 73 2b 53 51 4c 49 54 45 5f 56 45 52 53  ne\s+SQLITE_VERS
4d20: 49 4f 4e 5c 73 2b 22 28 2e 2a 29 22 24 7d 0a 73  ION\s+"(.*)"$}.s
4d30: 65 74 20 64 61 74 61 20 5b 72 65 61 64 46 69 6c  et data [readFil
4d40: 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 73 6f  e [file join $so
4d50: 75 72 63 65 44 69 72 65 63 74 6f 72 79 20 73 71  urceDirectory sq
4d60: 6c 69 74 65 33 2e 68 5d 5d 0a 0a 69 66 20 7b 21  lite3.h]]..if {!
4d70: 5b 72 65 67 65 78 70 20 2d 6c 69 6e 65 20 2d 2d  [regexp -line --
4d80: 20 24 70 61 74 74 65 72 6e 20 24 64 61 74 61 20   $pattern $data 
4d90: 64 75 6d 6d 79 20 76 65 72 73 69 6f 6e 5d 7d 20  dummy version]} 
4da0: 74 68 65 6e 20 7b 0a 20 20 66 61 69 6c 20 5b 61  then {.  fail [a
4db0: 70 70 65 6e 64 41 72 67 73 20 22 63 61 6e 6e 6f  ppendArgs "canno
4dc0: 74 20 6c 6f 63 61 74 65 20 53 51 4c 49 54 45 5f  t locate SQLITE_
4dd0: 56 45 52 53 49 4f 4e 20 76 61 6c 75 65 20 69 6e  VERSION value in
4de0: 20 5c 22 22 20 5c 0a 20 20 20 20 20 20 5b 66 69   \"" \.      [fi
4df0: 6c 65 20 6a 6f 69 6e 20 24 73 6f 75 72 63 65 44  le join $sourceD
4e00: 69 72 65 63 74 6f 72 79 20 73 71 6c 69 74 65 33  irectory sqlite3
4e10: 2e 68 5d 20 5c 22 5d 0a 7d 0a 0a 23 23 23 23 23  .h] \"].}..#####
4e20: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4e30: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4e40: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4e50: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4e60: 23 23 23 23 23 23 23 23 23 23 0a 0a 23 0a 23 20  ##########..#.# 
4e70: 4e 4f 54 45 3a 20 53 65 74 75 70 20 61 6c 6c 20  NOTE: Setup all 
4e80: 74 68 65 20 6d 61 73 74 65 72 20 66 69 6c 65 20  the master file 
4e90: 6c 69 73 74 20 64 61 74 61 2e 20 20 54 68 69 73  list data.  This
4ea0: 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 73 6f   includes the so
4eb0: 75 72 63 65 20 66 69 6c 65 0a 23 20 20 20 20 20  urce file.#     
4ec0: 20 20 6e 61 6d 65 73 2c 20 74 68 65 20 64 65 73    names, the des
4ed0: 74 69 6e 61 74 69 6f 6e 20 66 69 6c 65 20 6e 61  tination file na
4ee0: 6d 65 73 2c 20 61 6e 64 20 74 68 65 20 66 69 6c  mes, and the fil
4ef0: 65 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6c 61  e processing fla
4f00: 67 73 2e 20 20 54 68 65 0a 23 20 20 20 20 20 20  gs.  The.#      
4f10: 20 70 6f 73 73 69 62 6c 65 20 66 69 6c 65 20 70   possible file p
4f20: 72 6f 63 65 73 73 69 6e 67 20 66 6c 61 67 73 20  rocessing flags 
4f30: 61 72 65 3a 0a 23 0a 23 20 20 20 20 20 20 20 22  are:.#.#       "
4f40: 62 75 69 6c 64 4e 65 75 74 72 61 6c 22 20 2d 2d  buildNeutral" --
4f50: 20 54 68 69 73 20 66 6c 61 67 20 69 6e 64 69 63   This flag indic
4f60: 61 74 65 73 20 74 68 65 20 66 69 6c 65 20 6c 6f  ates the file lo
4f70: 63 61 74 69 6f 6e 20 61 6e 64 20 63 6f 6e 74 65  cation and conte
4f80: 6e 74 20 64 6f 0a 23 20 20 20 20 20 20 20 20 20  nt do.#         
4f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4fa0: 6e 6f 74 20 64 65 70 65 6e 64 20 6f 6e 20 74 68  not depend on th
4fb0: 65 20 62 75 69 6c 64 20 63 6f 6e 66 69 67 75 72  e build configur
4fc0: 61 74 69 6f 6e 2e 0a 23 0a 23 20 20 20 20 20 20  ation..#.#      
4fd0: 20 22 70 6c 61 74 66 6f 72 6d 4e 65 75 74 72 61   "platformNeutra
4fe0: 6c 22 20 2d 2d 20 54 68 69 73 20 66 6c 61 67 20  l" -- This flag 
4ff0: 69 6e 64 69 63 61 74 65 73 20 74 68 65 20 66 69  indicates the fi
5000: 6c 65 20 6c 6f 63 61 74 69 6f 6e 20 61 6e 64 20  le location and 
5010: 63 6f 6e 74 65 6e 74 0a 23 20 20 20 20 20 20 20  content.#       
5020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5030: 20 20 20 20 20 64 6f 20 6e 6f 74 20 64 65 70 65       do not depe
5040: 6e 64 20 6f 6e 20 74 68 65 20 62 75 69 6c 64 20  nd on the build 
5050: 70 6c 61 74 66 6f 72 6d 2e 0a 23 0a 23 20 20 20  platform..#.#   
5060: 20 20 20 20 22 73 75 62 73 74 22 20 2d 2d 20 54      "subst" -- T
5070: 68 69 73 20 66 6c 61 67 20 69 6e 64 69 63 61 74  his flag indicat
5080: 65 73 20 74 68 61 74 20 74 68 65 20 66 69 6c 65  es that the file
5090: 20 63 6f 6e 74 61 69 6e 73 20 64 79 6e 61 6d 69   contains dynami
50a0: 63 20 74 65 78 74 75 61 6c 0a 23 20 20 20 20 20  c textual.#     
50b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
50c0: 74 65 6e 74 20 74 68 61 74 20 6e 65 65 64 73 20  tent that needs 
50d0: 74 6f 20 62 65 20 70 72 6f 63 65 73 73 65 64 20  to be processed 
50e0: 75 73 69 6e 67 20 5b 73 75 62 73 74 5d 20 70 72  using [subst] pr
50f0: 69 6f 72 20 74 6f 0a 23 20 20 20 20 20 20 20 20  ior to.#        
5100: 20 20 20 20 20 20 20 20 20 20 70 61 63 6b 61 67            packag
5110: 69 6e 67 20 74 68 65 20 66 69 6c 65 20 69 6e 74  ing the file int
5120: 6f 20 74 68 65 20 66 69 6e 61 6c 20 56 53 49 58  o the final VSIX
5130: 20 70 61 63 6b 61 67 65 2e 20 20 54 68 65 20 70   package.  The p
5140: 72 69 6d 61 72 79 0a 23 20 20 20 20 20 20 20 20  rimary.#        
5150: 20 20 20 20 20 20 20 20 20 20 75 73 65 20 6f 66            use of
5160: 20 74 68 69 73 20 66 6c 61 67 20 69 73 20 74 6f   this flag is to
5170: 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65   insert the name
5180: 20 6f 66 20 74 68 65 20 56 53 49 58 20 70 61 63   of the VSIX pac
5190: 6b 61 67 65 2c 0a 23 20 20 20 20 20 20 20 20 20  kage,.#         
51a0: 20 20 20 20 20 20 20 20 20 73 6f 6d 65 20 70 61           some pa
51b0: 63 6b 61 67 65 20 66 6c 61 76 6f 72 2d 73 70 65  ckage flavor-spe
51c0: 63 69 66 69 63 20 76 61 6c 75 65 2c 20 6f 72 20  cific value, or 
51d0: 74 68 65 20 53 51 4c 69 74 65 20 76 65 72 73 69  the SQLite versi
51e0: 6f 6e 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  on.#            
51f0: 20 20 20 20 20 20 69 6e 74 6f 20 61 20 66 69 6c        into a fil
5200: 65 2e 0a 23 0a 23 20 20 20 20 20 20 20 22 6e 6f  e..#.#       "no
5210: 44 65 62 75 67 22 20 2d 2d 20 54 68 69 73 20 66  Debug" -- This f
5220: 6c 61 67 20 69 6e 64 69 63 61 74 65 73 20 74 68  lag indicates th
5230: 61 74 20 74 68 65 20 66 69 6c 65 20 73 68 6f 75  at the file shou
5240: 6c 64 20 62 65 20 73 6b 69 70 70 65 64 20 77 68  ld be skipped wh
5250: 65 6e 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  en.#            
5260: 20 20 20 20 20 20 20 20 70 72 6f 63 65 73 73 69          processi
5270: 6e 67 20 74 68 65 20 64 65 62 75 67 20 62 75 69  ng the debug bui
5280: 6c 64 2e 0a 23 0a 23 20 20 20 20 20 20 20 22 6e  ld..#.#       "n
5290: 6f 52 65 74 61 69 6c 22 20 2d 2d 20 54 68 69 73  oRetail" -- This
52a0: 20 66 6c 61 67 20 69 6e 64 69 63 61 74 65 73 20   flag indicates 
52b0: 74 68 61 74 20 74 68 65 20 66 69 6c 65 20 73 68  that the file sh
52c0: 6f 75 6c 64 20 62 65 20 73 6b 69 70 70 65 64 20  ould be skipped 
52d0: 77 68 65 6e 0a 23 20 20 20 20 20 20 20 20 20 20  when.#          
52e0: 20 20 20 20 20 20 20 20 20 20 20 70 72 6f 63 65             proce
52f0: 73 73 69 6e 67 20 74 68 65 20 72 65 74 61 69 6c  ssing the retail
5300: 20 62 75 69 6c 64 2e 0a 23 0a 23 20 20 20 20 20   build..#.#     
5310: 20 20 22 6d 6f 76 65 22 20 2d 2d 20 54 68 69 73    "move" -- This
5320: 20 66 6c 61 67 20 69 6e 64 69 63 61 74 65 73 20   flag indicates 
5330: 74 68 61 74 20 74 68 65 20 66 69 6c 65 20 73 68  that the file sh
5340: 6f 75 6c 64 20 62 65 20 6d 6f 76 65 64 20 66 72  ould be moved fr
5350: 6f 6d 20 74 68 65 0a 23 20 20 20 20 20 20 20 20  om the.#        
5360: 20 20 20 20 20 20 20 20 20 73 6f 75 72 63 65 20           source 
5370: 74 6f 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  to the destinati
5380: 6f 6e 20 69 6e 73 74 65 61 64 20 6f 66 20 62 65  on instead of be
5390: 69 6e 67 20 63 6f 70 69 65 64 2e 0a 23 0a 23 20  ing copied..#.# 
53a0: 20 20 20 20 20 20 54 68 69 73 20 66 69 6c 65 20        This file 
53b0: 6d 65 74 61 64 61 74 61 20 6d 61 79 20 62 65 20  metadata may be 
53c0: 6f 76 65 72 72 69 64 64 65 6e 2c 20 65 69 74 68  overridden, eith
53d0: 65 72 20 69 6e 20 77 68 6f 6c 65 20 6f 72 20 69  er in whole or i
53e0: 6e 20 70 61 72 74 2c 20 76 69 61 0a 23 20 20 20  n part, via.#   
53f0: 20 20 20 20 74 68 65 20 75 73 65 72 2d 73 70 65      the user-spe
5400: 63 69 66 69 63 20 63 75 73 74 6f 6d 69 7a 61 74  cific customizat
5410: 69 6f 6e 73 20 66 69 6c 65 2e 0a 23 0a 69 66 20  ions file..#.if 
5420: 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 66  {![info exists f
5430: 69 6c 65 4e 61 6d 65 73 28 73 6f 75 72 63 65 29  ileNames(source)
5440: 5d 7d 20 74 68 65 6e 20 7b 0a 20 20 73 65 74 20  ]} then {.  set 
5450: 66 69 6c 65 4e 61 6d 65 73 28 73 6f 75 72 63 65  fileNames(source
5460: 29 20 5b 6c 69 73 74 20 22 22 20 22 22 20 5c 0a  ) [list "" "" \.
5470: 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24      [file join $
5480: 73 74 61 67 69 6e 67 44 69 72 65 63 74 6f 72 79  stagingDirectory
5490: 20 44 65 73 69 67 6e 54 69 6d 65 20 3c 62 75 69   DesignTime <bui
54a0: 6c 64 3e 20 3c 70 6c 61 74 66 6f 72 6d 3e 20 73  ld> <platform> s
54b0: 71 6c 69 74 65 33 2e 70 72 6f 70 73 5d 20 5c 0a  qlite3.props] \.
54c0: 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24      [file join $
54d0: 73 6f 75 72 63 65 44 69 72 65 63 74 6f 72 79 20  sourceDirectory 
54e0: 73 71 6c 69 74 65 33 2e 68 5d 20 5c 0a 20 20 20  sqlite3.h] \.   
54f0: 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 62 69 6e   [file join $bin
5500: 61 72 79 44 69 72 65 63 74 6f 72 79 20 3c 62 75  aryDirectory <bu
5510: 69 6c 64 3e 20 3c 70 6c 61 74 66 6f 72 6d 3e 20  ild> <platform> 
5520: 73 71 6c 69 74 65 33 2e 6c 69 62 5d 20 5c 0a 20  sqlite3.lib] \. 
5530: 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 62     [file join $b
5540: 69 6e 61 72 79 44 69 72 65 63 74 6f 72 79 20 3c  inaryDirectory <
5550: 62 75 69 6c 64 3e 20 3c 70 6c 61 74 66 6f 72 6d  build> <platform
5560: 3e 20 73 71 6c 69 74 65 33 2e 64 6c 6c 5d 5d 0a  > sqlite3.dll]].
5570: 0a 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78  .  if {![info ex
5580: 69 73 74 73 20 6e 6f 28 73 79 6d 62 6f 6c 73 29  ists no(symbols)
5590: 5d 7d 20 74 68 65 6e 20 7b 0a 20 20 20 20 6c 61  ]} then {.    la
55a0: 70 70 65 6e 64 20 66 69 6c 65 4e 61 6d 65 73 28  ppend fileNames(
55b0: 73 6f 75 72 63 65 29 20 5c 0a 20 20 20 20 20 20  source) \.      
55c0: 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 62 69    [file join $bi
55d0: 6e 61 72 79 44 69 72 65 63 74 6f 72 79 20 3c 62  naryDirectory <b
55e0: 75 69 6c 64 3e 20 3c 70 6c 61 74 66 6f 72 6d 3e  uild> <platform>
55f0: 20 73 71 6c 69 74 65 33 2e 70 64 62 5d 0a 20 20   sqlite3.pdb].  
5600: 7d 0a 7d 0a 0a 69 66 20 7b 21 5b 69 6e 66 6f 20  }.}..if {![info 
5610: 65 78 69 73 74 73 20 66 69 6c 65 4e 61 6d 65 73  exists fileNames
5620: 28 64 65 73 74 69 6e 61 74 69 6f 6e 29 5d 7d 20  (destination)]} 
5630: 74 68 65 6e 20 7b 0a 20 20 73 65 74 20 66 69 6c  then {.  set fil
5640: 65 4e 61 6d 65 73 28 64 65 73 74 69 6e 61 74 69  eNames(destinati
5650: 6f 6e 29 20 5b 6c 69 73 74 20 5c 0a 20 20 20 20  on) [list \.    
5660: 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 73 74 61 67  [file join $stag
5670: 69 6e 67 44 69 72 65 63 74 6f 72 79 20 65 78 74  ingDirectory ext
5680: 65 6e 73 69 6f 6e 2e 76 73 69 78 6d 61 6e 69 66  ension.vsixmanif
5690: 65 73 74 5d 20 5c 0a 20 20 20 20 5b 66 69 6c 65  est] \.    [file
56a0: 20 6a 6f 69 6e 20 24 73 74 61 67 69 6e 67 44 69   join $stagingDi
56b0: 72 65 63 74 6f 72 79 20 53 44 4b 4d 61 6e 69 66  rectory SDKManif
56c0: 65 73 74 2e 78 6d 6c 5d 20 5c 0a 20 20 20 20 5b  est.xml] \.    [
56d0: 66 69 6c 65 20 6a 6f 69 6e 20 24 73 74 61 67 69  file join $stagi
56e0: 6e 67 44 69 72 65 63 74 6f 72 79 20 44 65 73 69  ngDirectory Desi
56f0: 67 6e 54 69 6d 65 20 3c 62 75 69 6c 64 3e 20 3c  gnTime <build> <
5700: 70 6c 61 74 66 6f 72 6d 3e 20 3c 6e 61 6d 65 3e  platform> <name>
5710: 2e 70 72 6f 70 73 5d 20 5c 0a 20 20 20 20 5b 66  .props] \.    [f
5720: 69 6c 65 20 6a 6f 69 6e 20 24 73 74 61 67 69 6e  ile join $stagin
5730: 67 44 69 72 65 63 74 6f 72 79 20 44 65 73 69 67  gDirectory Desig
5740: 6e 54 69 6d 65 20 3c 62 75 69 6c 64 3e 20 3c 70  nTime <build> <p
5750: 6c 61 74 66 6f 72 6d 3e 20 73 71 6c 69 74 65 33  latform> sqlite3
5760: 2e 68 5d 20 5c 0a 20 20 20 20 5b 66 69 6c 65 20  .h] \.    [file 
5770: 6a 6f 69 6e 20 24 73 74 61 67 69 6e 67 44 69 72  join $stagingDir
5780: 65 63 74 6f 72 79 20 44 65 73 69 67 6e 54 69 6d  ectory DesignTim
5790: 65 20 3c 62 75 69 6c 64 3e 20 3c 70 6c 61 74 66  e <build> <platf
57a0: 6f 72 6d 3e 20 73 71 6c 69 74 65 33 2e 6c 69 62  orm> sqlite3.lib
57b0: 5d 20 5c 0a 20 20 20 20 5b 66 69 6c 65 20 6a 6f  ] \.    [file jo
57c0: 69 6e 20 24 73 74 61 67 69 6e 67 44 69 72 65 63  in $stagingDirec
57d0: 74 6f 72 79 20 52 65 64 69 73 74 20 3c 62 75 69  tory Redist <bui
57e0: 6c 64 3e 20 3c 70 6c 61 74 66 6f 72 6d 3e 20 73  ld> <platform> s
57f0: 71 6c 69 74 65 33 2e 64 6c 6c 5d 5d 0a 0a 20 20  qlite3.dll]]..  
5800: 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
5810: 73 20 6e 6f 28 73 79 6d 62 6f 6c 73 29 5d 7d 20  s no(symbols)]} 
5820: 74 68 65 6e 20 7b 0a 20 20 20 20 6c 61 70 70 65  then {.    lappe
5830: 6e 64 20 66 69 6c 65 4e 61 6d 65 73 28 64 65 73  nd fileNames(des
5840: 74 69 6e 61 74 69 6f 6e 29 20 5c 0a 20 20 20 20  tination) \.    
5850: 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24      [file join $
5860: 73 74 61 67 69 6e 67 44 69 72 65 63 74 6f 72 79  stagingDirectory
5870: 20 52 65 64 69 73 74 20 3c 62 75 69 6c 64 3e 20   Redist <build> 
5880: 3c 70 6c 61 74 66 6f 72 6d 3e 20 73 71 6c 69 74  <platform> sqlit
5890: 65 33 2e 70 64 62 5d 0a 20 20 7d 0a 7d 0a 0a 69  e3.pdb].  }.}..i
58a0: 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
58b0: 20 66 69 6c 65 4e 61 6d 65 73 28 66 6c 61 67 73   fileNames(flags
58c0: 29 5d 7d 20 74 68 65 6e 20 7b 0a 20 20 73 65 74  )]} then {.  set
58d0: 20 66 69 6c 65 4e 61 6d 65 73 28 66 6c 61 67 73   fileNames(flags
58e0: 29 20 5b 6c 69 73 74 20 5c 0a 20 20 20 20 20 20  ) [list \.      
58f0: 5b 6c 69 73 74 20 62 75 69 6c 64 4e 65 75 74 72  [list buildNeutr
5900: 61 6c 20 70 6c 61 74 66 6f 72 6d 4e 65 75 74 72  al platformNeutr
5910: 61 6c 20 73 75 62 73 74 5d 20 5c 0a 20 20 20 20  al subst] \.    
5920: 20 20 5b 6c 69 73 74 20 62 75 69 6c 64 4e 65 75    [list buildNeu
5930: 74 72 61 6c 20 70 6c 61 74 66 6f 72 6d 4e 65 75  tral platformNeu
5940: 74 72 61 6c 20 73 75 62 73 74 5d 20 5c 0a 20 20  tral subst] \.  
5950: 20 20 20 20 5b 6c 69 73 74 20 62 75 69 6c 64 4e      [list buildN
5960: 65 75 74 72 61 6c 20 70 6c 61 74 66 6f 72 6d 4e  eutral platformN
5970: 65 75 74 72 61 6c 20 73 75 62 73 74 20 6d 6f 76  eutral subst mov
5980: 65 5d 20 5c 0a 20 20 20 20 20 20 5b 6c 69 73 74  e] \.      [list
5990: 20 62 75 69 6c 64 4e 65 75 74 72 61 6c 20 70 6c   buildNeutral pl
59a0: 61 74 66 6f 72 6d 4e 65 75 74 72 61 6c 5d 20 5c  atformNeutral] \
59b0: 0a 20 20 20 20 20 20 5b 6c 69 73 74 5d 20 5b 6c  .      [list] [l
59c0: 69 73 74 5d 20 5b 6c 69 73 74 20 6e 6f 52 65 74  ist] [list noRet
59d0: 61 69 6c 5d 5d 0a 0a 20 20 69 66 20 7b 21 5b 69  ail]]..  if {![i
59e0: 6e 66 6f 20 65 78 69 73 74 73 20 6e 6f 28 73 79  nfo exists no(sy
59f0: 6d 62 6f 6c 73 29 5d 7d 20 74 68 65 6e 20 7b 0a  mbols)]} then {.
5a00: 20 20 20 20 6c 61 70 70 65 6e 64 20 66 69 6c 65      lappend file
5a10: 4e 61 6d 65 73 28 66 6c 61 67 73 29 20 5b 6c 69  Names(flags) [li
5a20: 73 74 20 6e 6f 52 65 74 61 69 6c 5d 0a 20 20 7d  st noRetail].  }
5a30: 0a 7d 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23  .}..############
5a40: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5a50: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5a60: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5a70: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5a80: 23 23 23 0a 0a 23 0a 23 20 4e 4f 54 45 3a 20 53  ###..#.# NOTE: S
5a90: 65 74 75 70 20 74 68 65 20 6c 69 73 74 20 6f 66  etup the list of
5aa0: 20 62 75 69 6c 64 73 20 73 75 70 70 6f 72 74 65   builds supporte
5ab0: 64 20 62 79 20 74 68 69 73 20 73 63 72 69 70 74  d by this script
5ac0: 2e 20 20 54 68 65 73 65 20 6d 61 79 20 62 65 0a  .  These may be.
5ad0: 23 20 20 20 20 20 20 20 6f 76 65 72 72 69 64 64  #       overridd
5ae0: 65 6e 20 76 69 61 20 74 68 65 20 75 73 65 72 2d  en via the user-
5af0: 73 70 65 63 69 66 69 63 20 63 75 73 74 6f 6d 69  specific customi
5b00: 7a 61 74 69 6f 6e 73 20 66 69 6c 65 2e 0a 23 0a  zations file..#.
5b10: 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
5b20: 73 20 62 75 69 6c 64 4e 61 6d 65 73 5d 7d 20 74  s buildNames]} t
5b30: 68 65 6e 20 7b 0a 20 20 73 65 74 20 62 75 69 6c  hen {.  set buil
5b40: 64 4e 61 6d 65 73 20 5b 6c 69 73 74 20 44 65 62  dNames [list Deb
5b50: 75 67 20 52 65 74 61 69 6c 5d 0a 7d 0a 0a 23 23  ug Retail].}..##
5b60: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5b70: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5b80: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5b90: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5ba0: 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 0a 23  #############..#
5bb0: 0a 23 20 4e 4f 54 45 3a 20 53 65 74 75 70 20 74  .# NOTE: Setup t
5bc0: 68 65 20 6c 69 73 74 20 6f 66 20 70 6c 61 74 66  he list of platf
5bd0: 6f 72 6d 73 20 73 75 70 70 6f 72 74 65 64 20 62  orms supported b
5be0: 79 20 74 68 69 73 20 73 63 72 69 70 74 2e 20 20  y this script.  
5bf0: 54 68 65 73 65 20 6d 61 79 20 62 65 0a 23 20 20  These may be.#  
5c00: 20 20 20 20 20 6f 76 65 72 72 69 64 64 65 6e 20       overridden 
5c10: 76 69 61 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20  via the command 
5c20: 6c 69 6e 65 20 6f 72 20 74 68 65 20 75 73 65 72  line or the user
5c30: 2d 73 70 65 63 69 66 69 63 20 63 75 73 74 6f 6d  -specific custom
5c40: 69 7a 61 74 69 6f 6e 73 0a 23 20 20 20 20 20 20  izations.#      
5c50: 20 66 69 6c 65 2e 0a 23 0a 69 66 20 7b 21 5b 69   file..#.if {![i
5c60: 6e 66 6f 20 65 78 69 73 74 73 20 70 6c 61 74 66  nfo exists platf
5c70: 6f 72 6d 4e 61 6d 65 73 5d 20 7c 7c 20 5b 6c 6c  ormNames] || [ll
5c80: 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 4e  ength $platformN
5c90: 61 6d 65 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  ames] == 0} then
5ca0: 20 7b 0a 20 20 73 65 74 20 70 6c 61 74 66 6f 72   {.  set platfor
5cb0: 6d 4e 61 6d 65 73 20 5b 6c 69 73 74 20 78 38 36  mNames [list x86
5cc0: 20 78 36 34 20 41 52 4d 5d 0a 7d 0a 0a 23 23 23   x64 ARM].}..###
5cd0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5ce0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5cf0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5d00: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5d10: 23 23 23 23 23 23 23 23 23 23 23 23 0a 0a 23 0a  ############..#.
5d20: 23 20 4e 4f 54 45 3a 20 4d 61 6b 65 20 73 75 72  # NOTE: Make sur
5d30: 65 20 74 68 65 20 73 74 61 67 69 6e 67 20 64 69  e the staging di
5d40: 72 65 63 74 6f 72 79 20 65 78 69 73 74 73 2c 20  rectory exists, 
5d50: 63 72 65 61 74 69 6e 67 20 69 74 20 69 66 20 6e  creating it if n
5d60: 65 63 65 73 73 61 72 79 2e 0a 23 0a 66 69 6c 65  ecessary..#.file
5d70: 20 6d 6b 64 69 72 20 24 73 74 61 67 69 6e 67 44   mkdir $stagingD
5d80: 69 72 65 63 74 6f 72 79 0a 0a 23 0a 23 20 4e 4f  irectory..#.# NO
5d90: 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20 54 63  TE: Build the Tc
5da0: 6c 20 63 6f 6d 6d 61 6e 64 20 75 73 65 64 20 74  l command used t
5db0: 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 74 65  o extract the te
5dc0: 6d 70 6c 61 74 65 20 56 53 49 58 20 70 61 63 6b  mplate VSIX pack
5dd0: 61 67 65 20 74 6f 0a 23 20 20 20 20 20 20 20 74  age to.#       t
5de0: 68 65 20 73 74 61 67 69 6e 67 20 64 69 72 65 63  he staging direc
5df0: 74 6f 72 79 2e 0a 23 0a 73 65 74 20 65 78 74 72  tory..#.set extr
5e00: 61 63 74 43 6f 6d 6d 61 6e 64 20 5b 6c 69 73 74  actCommand [list
5e10: 20 65 78 65 63 20 2d 2d 20 24 75 6e 7a 69 70 20   exec -- $unzip 
5e20: 24 74 65 6d 70 6c 61 74 65 46 69 6c 65 20 2d 64  $templateFile -d
5e30: 20 24 73 74 61 67 69 6e 67 44 69 72 65 63 74 6f   $stagingDirecto
5e40: 72 79 5d 0a 0a 23 0a 23 20 4e 4f 54 45 3a 20 45  ry]..#.# NOTE: E
5e50: 78 74 72 61 63 74 20 74 68 65 20 74 65 6d 70 6c  xtract the templ
5e60: 61 74 65 20 56 53 49 58 20 70 61 63 6b 61 67 65  ate VSIX package
5e70: 20 74 6f 20 74 68 65 20 73 74 61 67 69 6e 67 20   to the staging 
5e80: 64 69 72 65 63 74 6f 72 79 2e 0a 23 0a 65 76 61  directory..#.eva
5e90: 6c 20 24 65 78 74 72 61 63 74 43 6f 6d 6d 61 6e  l $extractComman
5ea0: 64 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 23  d..#############
5eb0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5ec0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5ed0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5ee0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5ef0: 23 23 0a 0a 23 0a 23 20 4e 4f 54 45 3a 20 50 72  ##..#.# NOTE: Pr
5f00: 6f 63 65 73 73 20 65 61 63 68 20 66 69 6c 65 20  ocess each file 
5f10: 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20 66 69  in the master fi
5f20: 6c 65 20 6c 69 73 74 2e 20 20 54 68 65 72 65 20  le list.  There 
5f30: 61 72 65 20 61 63 74 75 61 6c 6c 79 20 74 68 72  are actually thr
5f40: 65 65 0a 23 20 20 20 20 20 20 20 70 61 72 61 6c  ee.#       paral
5f50: 6c 65 6c 20 6c 69 73 74 73 20 74 68 61 74 20 63  lel lists that c
5f60: 6f 6e 74 61 69 6e 20 74 68 65 20 73 6f 75 72 63  ontain the sourc
5f70: 65 20 66 69 6c 65 20 6e 61 6d 65 73 2c 20 74 68  e file names, th
5f80: 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 66 69  e destination fi
5f90: 6c 65 0a 23 20 20 20 20 20 20 20 6e 61 6d 65 73  le.#       names
5fa0: 2c 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 70  , and the file p
5fb0: 72 6f 63 65 73 73 69 6e 67 20 66 6c 61 67 73 2e  rocessing flags.
5fc0: 20 49 66 20 74 68 65 20 22 62 75 69 6c 64 4e 65   If the "buildNe
5fd0: 75 74 72 61 6c 22 20 66 6c 61 67 20 69 73 0a 23  utral" flag is.#
5fe0: 20 20 20 20 20 20 20 70 72 65 73 65 6e 74 2c 20         present, 
5ff0: 74 68 65 20 66 69 6c 65 20 6c 6f 63 61 74 69 6f  the file locatio
6000: 6e 20 61 6e 64 20 63 6f 6e 74 65 6e 74 20 64 6f  n and content do
6010: 20 6e 6f 74 20 64 65 70 65 6e 64 20 6f 6e 20 74   not depend on t
6020: 68 65 20 62 75 69 6c 64 0a 23 20 20 20 20 20 20  he build.#      
6030: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 61   configuration a
6040: 6e 64 20 22 43 6f 6d 6d 6f 6e 43 6f 6e 66 69 67  nd "CommonConfig
6050: 75 72 61 74 69 6f 6e 22 20 77 69 6c 6c 20 62 65  uration" will be
6060: 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20 6f   used in place o
6070: 66 20 74 68 65 0a 23 20 20 20 20 20 20 20 62 75  f the.#       bu
6080: 69 6c 64 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ild configuratio
6090: 6e 20 6e 61 6d 65 2e 20 20 49 66 20 74 68 65 20  n name.  If the 
60a0: 22 70 6c 61 74 66 6f 72 6d 4e 65 75 74 72 61 6c  "platformNeutral
60b0: 22 20 66 6c 61 67 20 69 73 20 70 72 65 73 65 6e  " flag is presen
60c0: 74 2c 0a 23 20 20 20 20 20 20 20 74 68 65 20 66  t,.#       the f
60d0: 69 6c 65 20 6c 6f 63 61 74 69 6f 6e 20 61 6e 64  ile location and
60e0: 20 63 6f 6e 74 65 6e 74 20 64 6f 20 6e 6f 74 20   content do not 
60f0: 64 65 70 65 6e 64 20 6f 6e 20 74 68 65 20 62 75  depend on the bu
6100: 69 6c 64 20 70 6c 61 74 66 6f 72 6d 20 61 6e 64  ild platform and
6110: 0a 23 20 20 20 20 20 20 20 22 6e 65 75 74 72 61  .#       "neutra
6120: 6c 22 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  l" will be used 
6130: 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 65 20  in place of the 
6140: 62 75 69 6c 64 20 70 6c 61 74 66 6f 72 6d 20 6e  build platform n
6150: 61 6d 65 2e 20 20 49 66 20 74 68 65 0a 23 20 20  ame.  If the.#  
6160: 20 20 20 20 20 22 73 75 62 73 74 22 20 66 6c 61       "subst" fla
6170: 67 20 69 73 20 70 72 65 73 65 6e 74 2c 20 74 68  g is present, th
6180: 65 20 66 69 6c 65 20 69 73 20 61 73 73 75 6d 65  e file is assume
6190: 64 20 74 6f 20 62 65 20 61 20 74 65 78 74 20 66  d to be a text f
61a0: 69 6c 65 20 74 68 61 74 20 6d 61 79 0a 23 20 20  ile that may.#  
61b0: 20 20 20 20 20 63 6f 6e 74 61 69 6e 20 54 63 6c       contain Tcl
61c0: 20 76 61 72 69 61 62 6c 65 2c 20 63 6f 6d 6d 61   variable, comma
61d0: 6e 64 2c 20 61 6e 64 20 62 61 63 6b 73 6c 61 73  nd, and backslas
61e0: 68 20 72 65 70 6c 61 63 65 6d 65 6e 74 73 2c 20  h replacements, 
61f0: 74 6f 20 62 65 0a 23 20 20 20 20 20 20 20 64 79  to be.#       dy
6200: 6e 61 6d 69 63 61 6c 6c 79 20 72 65 70 6c 61 63  namically replac
6210: 65 64 20 64 75 72 69 6e 67 20 70 72 6f 63 65 73  ed during proces
6220: 73 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20 54  sing using the T
6230: 63 6c 20 5b 73 75 62 73 74 5d 20 63 6f 6d 6d 61  cl [subst] comma
6240: 6e 64 2e 0a 23 20 20 20 20 20 20 20 49 66 20 74  nd..#       If t
6250: 68 65 20 22 6e 6f 44 65 62 75 67 22 20 66 6c 61  he "noDebug" fla
6260: 67 20 69 73 20 70 72 65 73 65 6e 74 2c 20 74 68  g is present, th
6270: 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 73  e file will be s
6280: 6b 69 70 70 65 64 20 77 68 65 6e 0a 23 20 20 20  kipped when.#   
6290: 20 20 20 20 70 72 6f 63 65 73 73 69 6e 67 20 66      processing f
62a0: 6f 72 20 74 68 65 20 64 65 62 75 67 20 62 75 69  or the debug bui
62b0: 6c 64 2e 20 20 49 66 20 74 68 65 20 22 6e 6f 52  ld.  If the "noR
62c0: 65 74 61 69 6c 22 20 66 6c 61 67 20 69 73 20 70  etail" flag is p
62d0: 72 65 73 65 6e 74 2c 20 74 68 65 0a 23 20 20 20  resent, the.#   
62e0: 20 20 20 20 66 69 6c 65 20 77 69 6c 6c 20 62 65      file will be
62f0: 20 73 6b 69 70 70 65 64 20 77 68 65 6e 20 70 72   skipped when pr
6300: 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 74 68 65  ocessing for the
6310: 20 72 65 74 61 69 6c 20 62 75 69 6c 64 2e 20 20   retail build.  
6320: 49 66 20 74 68 65 0a 23 20 20 20 20 20 20 20 22  If the.#       "
6330: 6d 6f 76 65 22 20 66 6c 61 67 20 69 73 20 70 72  move" flag is pr
6340: 65 73 65 6e 74 2c 20 74 68 65 20 73 6f 75 72 63  esent, the sourc
6350: 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 64  e file will be d
6360: 65 6c 65 74 65 64 20 61 66 74 65 72 20 69 74 20  eleted after it 
6370: 69 73 0a 23 20 20 20 20 20 20 20 63 6f 70 69 65  is.#       copie
6380: 64 20 74 6f 20 74 68 65 20 64 65 73 74 69 6e 61  d to the destina
6390: 74 69 6f 6e 20 66 69 6c 65 2e 20 20 49 66 20 74  tion file.  If t
63a0: 68 65 20 73 6f 75 72 63 65 20 66 69 6c 65 20 6e  he source file n
63b0: 61 6d 65 20 69 73 20 61 6e 20 65 6d 70 74 79 0a  ame is an empty.
63c0: 23 20 20 20 20 20 20 20 73 74 72 69 6e 67 2c 20  #       string, 
63d0: 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  the destination 
63e0: 66 69 6c 65 20 6e 61 6d 65 20 77 69 6c 6c 20 62  file name will b
63f0: 65 20 61 73 73 75 6d 65 64 20 74 6f 20 61 6c 72  e assumed to alr
6400: 65 61 64 79 20 65 78 69 73 74 20 69 6e 0a 23 20  eady exist in.# 
6410: 20 20 20 20 20 20 74 68 65 20 73 74 61 67 69 6e        the stagin
6420: 67 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20  g directory and 
6430: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 70 69  will not be copi
6440: 65 64 3b 20 68 6f 77 65 76 65 72 2c 20 54 63 6c  ed; however, Tcl
6450: 20 76 61 72 69 61 62 6c 65 2c 0a 23 20 20 20 20   variable,.#    
6460: 20 20 20 63 6f 6d 6d 61 6e 64 2c 20 61 6e 64 20     command, and 
6470: 62 61 63 6b 73 6c 61 73 68 20 72 65 70 6c 61 63  backslash replac
6480: 65 6d 65 6e 74 73 20 6d 61 79 20 73 74 69 6c 6c  ements may still
6490: 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e   be performed on
64a0: 20 74 68 65 0a 23 20 20 20 20 20 20 20 64 65 73   the.#       des
64b0: 74 69 6e 61 74 69 6f 6e 20 66 69 6c 65 20 70 72  tination file pr
64c0: 69 6f 72 20 74 6f 20 74 68 65 20 66 69 6e 61 6c  ior to the final
64d0: 20 56 53 49 58 20 70 61 63 6b 61 67 65 20 62 65   VSIX package be
64e0: 69 6e 67 20 62 75 69 6c 74 20 69 66 20 74 68 65  ing built if the
64f0: 0a 23 20 20 20 20 20 20 20 22 73 75 62 73 74 22  .#       "subst"
6500: 20 66 6c 61 67 20 69 73 20 70 72 65 73 65 6e 74   flag is present
6510: 2e 0a 23 0a 66 6f 72 65 61 63 68 20 73 6f 75 72  ..#.foreach sour
6520: 63 65 46 69 6c 65 4e 61 6d 65 20 20 20 20 20 20  ceFileName      
6530: 24 66 69 6c 65 4e 61 6d 65 73 28 73 6f 75 72 63  $fileNames(sourc
6540: 65 29 20 5c 0a 20 20 20 20 20 20 20 20 64 65 73  e) \.        des
6550: 74 69 6e 61 74 69 6f 6e 46 69 6c 65 4e 61 6d 65  tinationFileName
6560: 20 24 66 69 6c 65 4e 61 6d 65 73 28 64 65 73 74   $fileNames(dest
6570: 69 6e 61 74 69 6f 6e 29 20 5c 0a 20 20 20 20 20  ination) \.     
6580: 20 20 20 66 69 6c 65 46 6c 61 67 73 20 20 20 20     fileFlags    
6590: 20 20 20 20 20 20 20 24 66 69 6c 65 4e 61 6d 65         $fileName
65a0: 73 28 66 6c 61 67 73 29 20 7b 0a 20 20 23 0a 20  s(flags) {.  #. 
65b0: 20 23 20 4e 4f 54 45 3a 20 50 72 6f 63 65 73 73   # NOTE: Process
65c0: 20 74 68 65 20 66 69 6c 65 20 66 6c 61 67 73 20   the file flags 
65d0: 69 6e 74 6f 20 73 65 70 61 72 61 74 65 20 62 6f  into separate bo
65e0: 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65 73 20  olean variables 
65f0: 74 68 61 74 20 6d 61 79 20 62 65 0a 20 20 23 20  that may be.  # 
6600: 20 20 20 20 20 20 75 73 65 64 20 77 69 74 68 69        used withi
6610: 6e 20 74 68 65 20 6c 6f 6f 70 2e 0a 20 20 23 0a  n the loop..  #.
6620: 20 20 73 65 74 20 69 73 42 75 69 6c 64 4e 65 75    set isBuildNeu
6630: 74 72 61 6c 20 5b 65 78 70 72 20 7b 5b 6c 73 65  tral [expr {[lse
6640: 61 72 63 68 20 24 66 69 6c 65 46 6c 61 67 73 20  arch $fileFlags 
6650: 62 75 69 6c 64 4e 65 75 74 72 61 6c 5d 20 21 3d  buildNeutral] !=
6660: 20 2d 31 7d 5d 0a 20 20 73 65 74 20 69 73 50 6c   -1}].  set isPl
6670: 61 74 66 6f 72 6d 4e 65 75 74 72 61 6c 20 5b 65  atformNeutral [e
6680: 78 70 72 20 7b 5b 6c 73 65 61 72 63 68 20 24 66  xpr {[lsearch $f
6690: 69 6c 65 46 6c 61 67 73 20 70 6c 61 74 66 6f 72  ileFlags platfor
66a0: 6d 4e 65 75 74 72 61 6c 5d 20 21 3d 20 2d 31 7d  mNeutral] != -1}
66b0: 5d 0a 20 20 73 65 74 20 69 73 4d 6f 76 65 20 5b  ].  set isMove [
66c0: 65 78 70 72 20 7b 5b 6c 73 65 61 72 63 68 20 24  expr {[lsearch $
66d0: 66 69 6c 65 46 6c 61 67 73 20 6d 6f 76 65 5d 20  fileFlags move] 
66e0: 21 3d 20 2d 31 7d 5d 0a 20 20 73 65 74 20 75 73  != -1}].  set us
66f0: 65 53 75 62 73 74 20 5b 65 78 70 72 20 7b 5b 6c  eSubst [expr {[l
6700: 73 65 61 72 63 68 20 24 66 69 6c 65 46 6c 61 67  search $fileFlag
6710: 73 20 73 75 62 73 74 5d 20 21 3d 20 2d 31 7d 5d  s subst] != -1}]
6720: 0a 0a 20 20 23 0a 20 20 23 20 4e 4f 54 45 3a 20  ..  #.  # NOTE: 
6730: 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 66  If the current f
6740: 69 6c 65 20 69 73 20 62 75 69 6c 64 2d 6e 65 75  ile is build-neu
6750: 74 72 61 6c 2c 20 74 68 65 6e 20 6f 6e 6c 79 20  tral, then only 
6760: 6f 6e 65 20 62 75 69 6c 64 20 77 69 6c 6c 0a 20  one build will. 
6770: 20 23 20 20 20 20 20 20 20 62 65 20 70 72 6f 63   #       be proc
6780: 65 73 73 65 64 20 66 6f 72 20 69 74 2c 20 6e 61  essed for it, na
6790: 6d 65 6c 79 20 22 43 6f 6d 6d 6f 6e 43 6f 6e 66  mely "CommonConf
67a0: 69 67 75 72 61 74 69 6f 6e 22 3b 20 6f 74 68 65  iguration"; othe
67b0: 72 77 69 73 65 2c 20 65 61 63 68 0a 20 20 23 20  rwise, each.  # 
67c0: 20 20 20 20 20 20 73 75 70 70 6f 72 74 65 64 20        supported 
67d0: 62 75 69 6c 64 20 77 69 6c 6c 20 62 65 20 70 72  build will be pr
67e0: 6f 63 65 73 73 65 64 20 66 6f 72 20 69 74 20 69  ocessed for it i
67f0: 6e 64 69 76 69 64 75 61 6c 6c 79 2e 0a 20 20 23  ndividually..  #
6800: 0a 20 20 66 6f 72 65 61 63 68 20 62 75 69 6c 64  .  foreach build
6810: 4e 61 6d 65 20 5c 0a 20 20 20 20 20 20 5b 65 78  Name \.      [ex
6820: 70 72 20 7b 24 69 73 42 75 69 6c 64 4e 65 75 74  pr {$isBuildNeut
6830: 72 61 6c 20 3f 20 5b 6c 69 73 74 20 43 6f 6d 6d  ral ? [list Comm
6840: 6f 6e 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d  onConfiguration]
6850: 20 3a 20 24 62 75 69 6c 64 4e 61 6d 65 73 7d 5d   : $buildNames}]
6860: 20 7b 0a 20 20 20 20 23 0a 20 20 20 20 23 20 4e   {.    #.    # N
6870: 4f 54 45 3a 20 53 68 6f 75 6c 64 20 74 68 65 20  OTE: Should the 
6880: 63 75 72 72 65 6e 74 20 66 69 6c 65 20 62 65 20  current file be 
6890: 73 6b 69 70 70 65 64 20 66 6f 72 20 74 68 69 73  skipped for this
68a0: 20 62 75 69 6c 64 3f 0a 20 20 20 20 23 0a 20 20   build?.    #.  
68b0: 20 20 69 66 20 7b 5b 6c 73 65 61 72 63 68 20 24    if {[lsearch $
68c0: 66 69 6c 65 46 6c 61 67 73 20 6e 6f 24 7b 62 75  fileFlags no${bu
68d0: 69 6c 64 4e 61 6d 65 7d 5d 20 21 3d 20 2d 31 7d  ildName}] != -1}
68e0: 20 74 68 65 6e 20 7b 0a 20 20 20 20 20 20 63 6f   then {.      co
68f0: 6e 74 69 6e 75 65 0a 20 20 20 20 7d 0a 0a 20 20  ntinue.    }..  
6900: 20 20 23 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20    #.    # NOTE: 
6910: 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 66  If the current f
6920: 69 6c 65 20 69 73 20 70 6c 61 74 66 6f 72 6d 2d  ile is platform-
6930: 6e 65 75 74 72 61 6c 2c 20 74 68 65 6e 20 6f 6e  neutral, then on
6940: 6c 79 20 6f 6e 65 20 70 6c 61 74 66 6f 72 6d 0a  ly one platform.
6950: 20 20 20 20 23 20 20 20 20 20 20 20 77 69 6c 6c      #       will
6960: 20 62 65 20 70 72 6f 63 65 73 73 65 64 20 66 6f   be processed fo
6970: 72 20 69 74 2c 20 6e 61 6d 65 6c 79 20 22 6e 65  r it, namely "ne
6980: 75 74 72 61 6c 22 3b 20 6f 74 68 65 72 77 69 73  utral"; otherwis
6990: 65 2c 20 65 61 63 68 0a 20 20 20 20 23 20 20 20  e, each.    #   
69a0: 20 20 20 20 73 75 70 70 6f 72 74 65 64 20 70 6c      supported pl
69b0: 61 74 66 6f 72 6d 20 77 69 6c 6c 20 62 65 20 70  atform will be p
69c0: 72 6f 63 65 73 73 65 64 20 66 6f 72 20 69 74 20  rocessed for it 
69d0: 69 6e 64 69 76 69 64 75 61 6c 6c 79 2e 0a 20 20  individually..  
69e0: 20 20 23 0a 20 20 20 20 66 6f 72 65 61 63 68 20    #.    foreach 
69f0: 70 6c 61 74 66 6f 72 6d 4e 61 6d 65 20 5c 0a 20  platformName \. 
6a00: 20 20 20 20 20 20 20 5b 65 78 70 72 20 7b 24 69         [expr {$i
6a10: 73 50 6c 61 74 66 6f 72 6d 4e 65 75 74 72 61 6c  sPlatformNeutral
6a20: 20 3f 20 5b 6c 69 73 74 20 6e 65 75 74 72 61 6c   ? [list neutral
6a30: 5d 20 3a 20 24 70 6c 61 74 66 6f 72 6d 4e 61 6d  ] : $platformNam
6a40: 65 73 7d 5d 20 7b 0a 20 20 20 20 20 20 23 0a 20  es}] {.      #. 
6a50: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65       # NOTE: Use
6a60: 20 74 68 65 20 61 63 74 75 61 6c 20 70 6c 61 74   the actual plat
6a70: 66 6f 72 6d 20 6e 61 6d 65 20 69 6e 20 74 68 65  form name in the
6a80: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 66 69 6c   destination fil
6a90: 65 20 6e 61 6d 65 2e 0a 20 20 20 20 20 20 23 0a  e name..      #.
6aa0: 20 20 20 20 20 20 73 65 74 20 6e 65 77 44 65 73        set newDes
6ab0: 74 69 6e 61 74 69 6f 6e 46 69 6c 65 4e 61 6d 65  tinationFileName
6ac0: 20 5b 72 65 70 6c 61 63 65 46 69 6c 65 4e 61 6d   [replaceFileNam
6ad0: 65 54 6f 6b 65 6e 73 20 24 64 65 73 74 69 6e 61  eTokens $destina
6ae0: 74 69 6f 6e 46 69 6c 65 4e 61 6d 65 20 5c 0a 20  tionFileName \. 
6af0: 20 20 20 20 20 20 20 20 20 24 73 68 6f 72 74 4e           $shortN
6b00: 61 6d 65 20 24 62 75 69 6c 64 4e 61 6d 65 20 24  ame $buildName $
6b10: 70 6c 61 74 66 6f 72 6d 4e 61 6d 65 5d 0a 0a 20  platformName].. 
6b20: 20 20 20 20 20 23 0a 20 20 20 20 20 20 23 20 4e       #.      # N
6b30: 4f 54 45 3a 20 44 6f 65 73 20 74 68 65 20 73 6f  OTE: Does the so
6b40: 75 72 63 65 20 66 69 6c 65 20 6e 65 65 64 20 74  urce file need t
6b50: 6f 20 62 65 20 63 6f 70 69 65 64 20 74 6f 20 74  o be copied to t
6b60: 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 66  he destination f
6b70: 69 6c 65 3f 0a 20 20 20 20 20 20 23 0a 20 20 20  ile?.      #.   
6b80: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
6b90: 65 6e 67 74 68 20 24 73 6f 75 72 63 65 46 69 6c  ength $sourceFil
6ba0: 65 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e  eName] > 0} then
6bb0: 20 7b 0a 20 20 20 20 20 20 20 20 23 0a 20 20 20   {.        #.   
6bc0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 72       # NOTE: Fir
6bd0: 73 74 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  st, make sure th
6be0: 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 64 69  e destination di
6bf0: 72 65 63 74 6f 72 79 20 65 78 69 73 74 73 2e 0a  rectory exists..
6c00: 20 20 20 20 20 20 20 20 23 0a 20 20 20 20 20 20          #.      
6c10: 20 20 66 69 6c 65 20 6d 6b 64 69 72 20 5b 66 69    file mkdir [fi
6c20: 6c 65 20 64 69 72 6e 61 6d 65 20 24 6e 65 77 44  le dirname $newD
6c30: 65 73 74 69 6e 61 74 69 6f 6e 46 69 6c 65 4e 61  estinationFileNa
6c40: 6d 65 5d 0a 0a 20 20 20 20 20 20 20 20 23 0a 20  me]..        #. 
6c50: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54         # NOTE: T
6c60: 68 65 6e 2c 20 63 6f 70 79 20 74 68 65 20 73 6f  hen, copy the so
6c70: 75 72 63 65 20 66 69 6c 65 20 74 6f 20 74 68 65  urce file to the
6c80: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 66 69 6c   destination fil
6c90: 65 20 76 65 72 62 61 74 69 6d 2e 0a 20 20 20 20  e verbatim..    
6ca0: 20 20 20 20 23 0a 20 20 20 20 20 20 20 20 73 65      #.        se
6cb0: 74 20 6e 65 77 53 6f 75 72 63 65 46 69 6c 65 4e  t newSourceFileN
6cc0: 61 6d 65 20 5b 72 65 70 6c 61 63 65 46 69 6c 65  ame [replaceFile
6cd0: 4e 61 6d 65 54 6f 6b 65 6e 73 20 24 73 6f 75 72  NameTokens $sour
6ce0: 63 65 46 69 6c 65 4e 61 6d 65 20 5c 0a 20 20 20  ceFileName \.   
6cf0: 20 20 20 20 20 20 20 20 20 24 73 68 6f 72 74 4e           $shortN
6d00: 61 6d 65 20 24 62 75 69 6c 64 4e 61 6d 65 20 24  ame $buildName $
6d10: 70 6c 61 74 66 6f 72 6d 4e 61 6d 65 5d 0a 0a 20  platformName].. 
6d20: 20 20 20 20 20 20 20 66 69 6c 65 20 63 6f 70 79         file copy
6d30: 20 24 6e 65 77 53 6f 75 72 63 65 46 69 6c 65 4e   $newSourceFileN
6d40: 61 6d 65 20 24 6e 65 77 44 65 73 74 69 6e 61 74  ame $newDestinat
6d50: 69 6f 6e 46 69 6c 65 4e 61 6d 65 0a 0a 20 20 20  ionFileName..   
6d60: 20 20 20 20 20 23 0a 20 20 20 20 20 20 20 20 23       #.        #
6d70: 20 4e 4f 54 45 3a 20 49 66 20 74 68 69 73 20 69   NOTE: If this i
6d80: 73 20 61 20 6d 6f 76 65 20 69 6e 73 74 65 61 64  s a move instead
6d90: 20 6f 66 20 61 20 63 6f 70 79 2c 20 64 65 6c 65   of a copy, dele
6da0: 74 65 20 74 68 65 20 73 6f 75 72 63 65 20 66 69  te the source fi
6db0: 6c 65 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  le.        #    
6dc0: 20 20 20 6e 6f 77 2e 0a 20 20 20 20 20 20 20 20     now..        
6dd0: 23 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24 69  #.        if {$i
6de0: 73 4d 6f 76 65 7d 20 74 68 65 6e 20 7b 0a 20 20  sMove} then {.  
6df0: 20 20 20 20 20 20 20 20 66 69 6c 65 20 64 65 6c          file del
6e00: 65 74 65 20 24 6e 65 77 53 6f 75 72 63 65 46 69  ete $newSourceFi
6e10: 6c 65 4e 61 6d 65 0a 20 20 20 20 20 20 20 20 7d  leName.        }
6e20: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
6e30: 23 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  #.      # NOTE: 
6e40: 44 6f 65 73 20 74 68 65 20 64 65 73 74 69 6e 61  Does the destina
6e50: 74 69 6f 6e 20 66 69 6c 65 20 63 6f 6e 74 61 69  tion file contai
6e60: 6e 20 64 79 6e 61 6d 69 63 20 72 65 70 6c 61 63  n dynamic replac
6e70: 65 6d 65 6e 74 73 20 74 68 61 74 20 6d 75 73 74  ements that must
6e80: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62  .      #       b
6e90: 65 20 70 72 6f 63 65 73 73 65 64 20 6e 6f 77 3f  e processed now?
6ea0: 0a 20 20 20 20 20 20 23 0a 20 20 20 20 20 20 69  .      #.      i
6eb0: 66 20 7b 24 75 73 65 53 75 62 73 74 7d 20 74 68  f {$useSubst} th
6ec0: 65 6e 20 7b 0a 20 20 20 20 20 20 20 20 23 0a 20  en {.        #. 
6ed0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 50         # NOTE: P
6ee0: 65 72 66 6f 72 6d 20 61 6e 79 20 64 79 6e 61 6d  erform any dynam
6ef0: 69 63 20 72 65 70 6c 61 63 65 6d 65 6e 74 73 20  ic replacements 
6f00: 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
6f10: 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 20 20 20   destination.   
6f20: 20 20 20 20 20 23 20 20 20 20 20 20 20 66 69 6c       #       fil
6f30: 65 20 61 6e 64 20 74 68 65 6e 20 72 65 2d 77 72  e and then re-wr
6f40: 69 74 65 20 69 74 20 69 6e 2d 70 6c 61 63 65 2e  ite it in-place.
6f50: 0a 20 20 20 20 20 20 20 20 23 0a 20 20 20 20 20  .        #.     
6f60: 20 20 20 73 75 62 73 74 46 69 6c 65 20 24 6e 65     substFile $ne
6f70: 77 44 65 73 74 69 6e 61 74 69 6f 6e 46 69 6c 65  wDestinationFile
6f80: 4e 61 6d 65 0a 20 20 20 20 20 20 7d 0a 20 20 20  Name.      }.   
6f90: 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 23 23 23 23 23   }.  }.}..######
6fa0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6fb0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6fc0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6fd0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6fe0: 23 23 23 23 23 23 23 23 23 0a 0a 23 0a 23 20 4e  #########..#.# N
6ff0: 4f 54 45 3a 20 43 68 61 6e 67 65 20 74 68 65 20  OTE: Change the 
7000: 63 75 72 72 65 6e 74 20 64 69 72 65 63 74 6f 72  current director
7010: 79 20 74 6f 20 74 68 65 20 73 74 61 67 69 6e 67  y to the staging
7020: 20 64 69 72 65 63 74 6f 72 79 20 73 6f 20 74 68   directory so th
7030: 61 74 20 74 68 65 0a 23 20 20 20 20 20 20 20 65  at the.#       e
7040: 78 74 65 72 6e 61 6c 20 61 72 63 68 69 76 65 20  xternal archive 
7050: 62 75 69 6c 64 69 6e 67 20 74 6f 6f 6c 20 63 61  building tool ca
7060: 6e 20 70 69 63 6b 75 70 20 74 68 65 20 6e 65 63  n pickup the nec
7070: 65 73 73 61 72 79 20 66 69 6c 65 73 20 75 73 69  essary files usi
7080: 6e 67 0a 23 20 20 20 20 20 20 20 72 65 6c 61 74  ng.#       relat
7090: 69 76 65 20 70 61 74 68 73 2e 0a 23 0a 63 64 20  ive paths..#.cd 
70a0: 24 73 74 61 67 69 6e 67 44 69 72 65 63 74 6f 72  $stagingDirector
70b0: 79 0a 0a 23 0a 23 20 4e 4f 54 45 3a 20 42 75 69  y..#.# NOTE: Bui
70c0: 6c 64 20 74 68 65 20 54 63 6c 20 63 6f 6d 6d 61  ld the Tcl comma
70d0: 6e 64 20 75 73 65 64 20 74 6f 20 61 72 63 68 69  nd used to archi
70e0: 76 65 20 74 68 65 20 66 69 6e 61 6c 20 56 53 49  ve the final VSI
70f0: 58 20 70 61 63 6b 61 67 65 20 69 6e 20 74 68 65  X package in the
7100: 0a 23 20 20 20 20 20 20 20 6f 75 74 70 75 74 20  .#       output 
7110: 64 69 72 65 63 74 6f 72 79 2e 0a 23 0a 73 65 74  directory..#.set
7120: 20 61 72 63 68 69 76 65 43 6f 6d 6d 61 6e 64 20   archiveCommand 
7130: 5b 6c 69 73 74 20 65 78 65 63 20 2d 2d 20 24 7a  [list exec -- $z
7140: 69 70 20 2d 72 20 24 6f 75 74 70 75 74 46 69 6c  ip -r $outputFil
7150: 65 20 2a 5d 0a 0a 23 0a 23 20 4e 4f 54 45 3a 20  e *]..#.# NOTE: 
7160: 42 75 69 6c 64 20 74 68 65 20 66 69 6e 61 6c 20  Build the final 
7170: 56 53 49 58 20 70 61 63 6b 61 67 65 20 61 72 63  VSIX package arc
7180: 68 69 76 65 20 69 6e 20 74 68 65 20 6f 75 74 70  hive in the outp
7190: 75 74 20 64 69 72 65 63 74 6f 72 79 2e 0a 23 0a  ut directory..#.
71a0: 65 76 61 6c 20 24 61 72 63 68 69 76 65 43 6f 6d  eval $archiveCom
71b0: 6d 61 6e 64 0a 0a 23 0a 23 20 4e 4f 54 45 3a 20  mand..#.# NOTE: 
71c0: 43 68 61 6e 67 65 20 62 61 63 6b 20 74 6f 20 74  Change back to t
71d0: 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20 73 61  he previously sa
71e0: 76 65 64 20 63 75 72 72 65 6e 74 20 64 69 72 65  ved current dire
71f0: 63 74 6f 72 79 2e 0a 23 0a 63 64 20 24 63 75 72  ctory..#.cd $cur
7200: 72 65 6e 74 44 69 72 65 63 74 6f 72 79 0a 0a 23  rentDirectory..#
7210: 0a 23 20 4e 4f 54 45 3a 20 43 6c 65 61 6e 75 70  .# NOTE: Cleanup
7220: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 73   the temporary s
7230: 74 61 67 69 6e 67 20 64 69 72 65 63 74 6f 72 79  taging directory
7240: 2e 0a 23 0a 66 69 6c 65 20 64 65 6c 65 74 65 20  ..#.file delete 
7250: 2d 66 6f 72 63 65 20 24 73 74 61 67 69 6e 67 44  -force $stagingD
7260: 69 72 65 63 74 6f 72 79 0a 0a 23 23 23 23 23 23  irectory..######
7270: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7280: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7290: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
72a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
72b0: 23 23 23 23 23 23 23 23 23 0a 0a 23 0a 23 20 4e  #########..#.# N
72c0: 4f 54 45 3a 20 53 75 63 63 65 73 73 2c 20 65 6d  OTE: Success, em
72d0: 69 74 20 74 68 65 20 66 75 6c 6c 79 20 71 75 61  it the fully qua
72e0: 6c 69 66 69 65 64 20 70 61 74 68 20 6f 66 20 74  lified path of t
72f0: 68 65 20 67 65 6e 65 72 61 74 65 64 20 56 53 49  he generated VSI
7300: 58 20 66 69 6c 65 2e 0a 23 0a 70 75 74 73 20 73  X file..#.puts s
7310: 74 64 6f 75 74 20 24 6f 75 74 70 75 74 46 69 6c  tdout $outputFil
7320: 65 0a                                            e.