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

Artifact 52a4c613707ac34ae9c226e5ccc69cb948556105:


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 70 72 6f 63 20 67 65 74 4d 69 6e 56 73 56  ..proc getMinVsV
1be0: 65 72 73 69 6f 6e 58 6d 6c 43 68 75 6e 6b 20 7b  ersionXmlChunk {
1bf0: 20 76 73 56 65 72 73 69 6f 6e 20 7d 20 7b 0a 20   vsVersion } {. 
1c00: 20 73 77 69 74 63 68 20 2d 65 78 61 63 74 20 24   switch -exact $
1c10: 76 73 56 65 72 73 69 6f 6e 20 7b 0a 20 20 20 20  vsVersion {.    
1c20: 32 30 31 32 20 7b 0a 20 20 20 20 20 20 72 65 74  2012 {.      ret
1c30: 75 72 6e 20 5b 61 70 70 65 6e 64 41 72 67 73 20  urn [appendArgs 
1c40: 5c 0a 20 20 20 20 20 20 20 20 20 20 22 5c 72 5c  \.          "\r\
1c50: 6e 20 20 20 20 22 20 7b 4d 69 6e 56 53 56 65 72  n    " {MinVSVer
1c60: 73 69 6f 6e 3d 22 31 31 2e 30 22 7d 5d 0a 20 20  sion="11.0"}].  
1c70: 20 20 7d 0a 20 20 20 20 32 30 31 33 20 7b 0a 20    }.    2013 {. 
1c80: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 61 70 70       return [app
1c90: 65 6e 64 41 72 67 73 20 5c 0a 20 20 20 20 20 20  endArgs \.      
1ca0: 20 20 20 20 22 5c 72 5c 6e 20 20 20 20 22 20 7b      "\r\n    " {
1cb0: 4d 69 6e 56 53 56 65 72 73 69 6f 6e 3d 22 31 32  MinVSVersion="12
1cc0: 2e 30 22 7d 5d 0a 20 20 20 20 7d 0a 20 20 20 20  .0"}].    }.    
1cd0: 64 65 66 61 75 6c 74 20 7b 0a 20 20 20 20 20 20  default {.      
1ce0: 72 65 74 75 72 6e 20 22 22 0a 20 20 20 20 7d 0a  return "".    }.
1cf0: 20 20 7d 0a 7d 0a 0c 0a 70 72 6f 63 20 67 65 74    }.}...proc get
1d00: 4d 61 78 50 6c 61 74 66 6f 72 6d 56 65 72 73 69  MaxPlatformVersi
1d10: 6f 6e 58 6d 6c 43 68 75 6e 6b 20 7b 20 70 61 63  onXmlChunk { pac
1d20: 6b 61 67 65 46 6c 61 76 6f 72 20 76 73 56 65 72  kageFlavor vsVer
1d30: 73 69 6f 6e 20 7d 20 7b 0a 20 20 23 0a 20 20 23  sion } {.  #.  #
1d40: 20 4e 4f 54 45 3a 20 4f 6e 6c 79 20 56 69 73 75   NOTE: Only Visu
1d50: 61 6c 20 53 74 75 64 69 6f 20 32 30 31 33 20 73  al Studio 2013 s
1d60: 75 70 70 6f 72 74 73 20 74 68 69 73 20 53 44 4b  upports this SDK
1d70: 20 6d 61 6e 69 66 65 73 74 20 61 74 74 72 69 62   manifest attrib
1d80: 75 74 65 2e 0a 20 20 23 0a 20 20 69 66 20 7b 21  ute..  #.  if {!
1d90: 5b 73 74 72 69 6e 67 20 65 71 75 61 6c 20 24 76  [string equal $v
1da0: 73 56 65 72 73 69 6f 6e 20 32 30 31 33 5d 7d 20  sVersion 2013]} 
1db0: 74 68 65 6e 20 7b 0a 20 20 20 20 72 65 74 75 72  then {.    retur
1dc0: 6e 20 22 22 0a 20 20 7d 0a 0a 20 20 73 77 69 74  n "".  }..  swit
1dd0: 63 68 20 2d 65 78 61 63 74 20 24 70 61 63 6b 61  ch -exact $packa
1de0: 67 65 46 6c 61 76 6f 72 20 7b 0a 20 20 20 20 57  geFlavor {.    W
1df0: 69 6e 52 54 20 7b 0a 20 20 20 20 20 20 72 65 74  inRT {.      ret
1e00: 75 72 6e 20 5b 61 70 70 65 6e 64 41 72 67 73 20  urn [appendArgs 
1e10: 5c 0a 20 20 20 20 20 20 20 20 20 20 22 5c 72 5c  \.          "\r\
1e20: 6e 20 20 20 20 22 20 7b 4d 61 78 50 6c 61 74 66  n    " {MaxPlatf
1e30: 6f 72 6d 56 65 72 73 69 6f 6e 3d 22 38 2e 30 22  ormVersion="8.0"
1e40: 7d 5d 0a 20 20 20 20 7d 0a 20 20 20 20 57 69 6e  }].    }.    Win
1e50: 52 54 38 31 20 7b 0a 20 20 20 20 20 20 72 65 74  RT81 {.      ret
1e60: 75 72 6e 20 5b 61 70 70 65 6e 64 41 72 67 73 20  urn [appendArgs 
1e70: 5c 0a 20 20 20 20 20 20 20 20 20 20 22 5c 72 5c  \.          "\r\
1e80: 6e 20 20 20 20 22 20 7b 4d 61 78 50 6c 61 74 66  n    " {MaxPlatf
1e90: 6f 72 6d 56 65 72 73 69 6f 6e 3d 22 38 2e 31 22  ormVersion="8.1"
1ea0: 7d 5d 0a 20 20 20 20 7d 0a 20 20 20 20 57 50 38  }].    }.    WP8
1eb0: 30 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0 {.      return
1ec0: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0a 20   [appendArgs \. 
1ed0: 20 20 20 20 20 20 20 20 20 22 5c 72 5c 6e 20 20           "\r\n  
1ee0: 20 20 22 20 7b 4d 61 78 50 6c 61 74 66 6f 72 6d    " {MaxPlatform
1ef0: 56 65 72 73 69 6f 6e 3d 22 38 2e 30 22 7d 5d 0a  Version="8.0"}].
1f00: 20 20 20 20 7d 0a 20 20 20 20 57 50 38 31 20 7b      }.    WP81 {
1f10: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 61  .      return [a
1f20: 70 70 65 6e 64 41 72 67 73 20 5c 0a 20 20 20 20  ppendArgs \.    
1f30: 20 20 20 20 20 20 22 5c 72 5c 6e 20 20 20 20 22        "\r\n    "
1f40: 20 7b 4d 61 78 50 6c 61 74 66 6f 72 6d 56 65 72   {MaxPlatformVer
1f50: 73 69 6f 6e 3d 22 38 2e 31 22 7d 5d 0a 20 20 20  sion="8.1"}].   
1f60: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 20 7b   }.    default {
1f70: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 22  .      return ""
1f80: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0c 0a 70  .    }.  }.}...p
1f90: 72 6f 63 20 67 65 74 45 78 74 72 61 46 69 6c 65  roc getExtraFile
1fa0: 4c 69 73 74 58 6d 6c 43 68 75 6e 6b 20 7b 20 70  ListXmlChunk { p
1fb0: 61 63 6b 61 67 65 46 6c 61 76 6f 72 20 76 73 56  ackageFlavor vsV
1fc0: 65 72 73 69 6f 6e 20 7d 20 7b 0a 20 20 23 0a 20  ersion } {.  #. 
1fd0: 20 23 20 4e 4f 54 45 3a 20 57 69 6e 64 6f 77 73   # NOTE: Windows
1fe0: 20 50 68 6f 6e 65 20 38 2e 30 20 64 6f 65 73 20   Phone 8.0 does 
1ff0: 6e 6f 74 20 72 65 71 75 69 72 65 20 61 6e 79 20  not require any 
2000: 65 78 74 72 61 20 61 74 74 72 69 62 75 74 65 73  extra attributes
2010: 20 69 6e 20 69 74 73 20 56 53 49 58 0a 20 20 23   in its VSIX.  #
2020: 20 20 20 20 20 20 20 70 61 63 6b 61 67 65 20 53         package S
2030: 44 4b 20 6d 61 6e 69 66 65 73 74 73 3b 20 68 6f  DK manifests; ho
2040: 77 65 76 65 72 2c 20 69 74 20 61 70 70 65 61 72  wever, it appear
2050: 73 20 74 68 61 74 20 57 69 6e 64 6f 77 73 20 50  s that Windows P
2060: 68 6f 6e 65 20 38 2e 31 0a 20 20 23 20 20 20 20  hone 8.1.  #    
2070: 20 20 20 64 6f 65 73 2e 0a 20 20 23 0a 20 20 69     does..  #.  i
2080: 66 20 7b 5b 73 74 72 69 6e 67 20 65 71 75 61 6c  f {[string equal
2090: 20 24 70 61 63 6b 61 67 65 46 6c 61 76 6f 72 20   $packageFlavor 
20a0: 57 50 38 30 5d 7d 20 74 68 65 6e 20 7b 0a 20 20  WP80]} then {.  
20b0: 20 20 72 65 74 75 72 6e 20 22 22 0a 20 20 7d 0a    return "".  }.
20c0: 0a 20 20 73 65 74 20 61 70 70 6c 69 65 73 54 6f  .  set appliesTo
20d0: 20 5b 65 78 70 72 20 7b 5b 73 74 72 69 6e 67 20   [expr {[string 
20e0: 65 71 75 61 6c 20 24 70 61 63 6b 61 67 65 46 6c  equal $packageFl
20f0: 61 76 6f 72 20 57 69 6e 33 32 5d 20 3f 20 5c 0a  avor Win32] ? \.
2100: 20 20 20 20 20 20 22 56 69 73 75 61 6c 43 22 20        "VisualC" 
2110: 3a 20 22 57 69 6e 64 6f 77 73 41 70 70 43 6f 6e  : "WindowsAppCon
2120: 74 61 69 6e 65 72 22 7d 5d 0a 0a 20 20 73 77 69  tainer"}]..  swi
2130: 74 63 68 20 2d 65 78 61 63 74 20 24 76 73 56 65  tch -exact $vsVe
2140: 72 73 69 6f 6e 20 7b 0a 20 20 20 20 32 30 31 32  rsion {.    2012
2150: 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
2160: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0a 20 20  [appendArgs \.  
2170: 20 20 20 20 20 20 20 20 22 5c 72 5c 6e 20 20 20          "\r\n   
2180: 20 22 20 41 70 70 6c 69 65 73 54 6f 3d 5c 22 20   " AppliesTo=\" 
2190: 24 61 70 70 6c 69 65 73 54 6f 20 5c 22 20 5c 0a  $appliesTo \" \.
21a0: 20 20 20 20 20 20 20 20 20 20 22 5c 72 5c 6e 20            "\r\n 
21b0: 20 20 20 22 20 7b 44 65 70 65 6e 64 73 4f 6e 3d     " {DependsOn=
21c0: 22 4d 69 63 72 6f 73 6f 66 74 2e 56 43 4c 69 62  "Microsoft.VCLib
21d0: 73 2c 20 76 65 72 73 69 6f 6e 3d 31 31 2e 30 22  s, version=11.0"
21e0: 7d 5d 0a 20 20 20 20 7d 0a 20 20 20 20 32 30 31  }].    }.    201
21f0: 33 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  3 {.      return
2200: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0a 20   [appendArgs \. 
2210: 20 20 20 20 20 20 20 20 20 22 5c 72 5c 6e 20 20           "\r\n  
2220: 20 20 22 20 41 70 70 6c 69 65 73 54 6f 3d 5c 22    " AppliesTo=\"
2230: 20 24 61 70 70 6c 69 65 73 54 6f 20 5c 22 20 5c   $appliesTo \" \
2240: 0a 20 20 20 20 20 20 20 20 20 20 22 5c 72 5c 6e  .          "\r\n
2250: 20 20 20 20 22 20 7b 44 65 70 65 6e 64 73 4f 6e      " {DependsOn
2260: 3d 22 4d 69 63 72 6f 73 6f 66 74 2e 56 43 4c 69  ="Microsoft.VCLi
2270: 62 73 2c 20 76 65 72 73 69 6f 6e 3d 31 32 2e 30  bs, version=12.0
2280: 22 7d 5d 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  "}].    }.    de
2290: 66 61 75 6c 74 20 7b 0a 20 20 20 20 20 20 72 65  fault {.      re
22a0: 74 75 72 6e 20 22 22 0a 20 20 20 20 7d 0a 20 20  turn "".    }.  
22b0: 7d 0a 7d 0a 0c 0a 70 72 6f 63 20 72 65 70 6c 61  }.}...proc repla
22c0: 63 65 46 69 6c 65 4e 61 6d 65 54 6f 6b 65 6e 73  ceFileNameTokens
22d0: 20 7b 20 66 69 6c 65 4e 61 6d 65 20 6e 61 6d 65   { fileName name
22e0: 20 62 75 69 6c 64 4e 61 6d 65 20 70 6c 61 74 66   buildName platf
22f0: 6f 72 6d 4e 61 6d 65 20 7d 20 7b 0a 20 20 23 0a  ormName } {.  #.
2300: 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e    # NOTE: Return
2310: 73 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  s the specified 
2320: 66 69 6c 65 20 6e 61 6d 65 20 63 6f 6e 74 61 69  file name contai
2330: 6e 69 6e 67 20 74 68 65 20 70 6c 61 74 66 6f 72  ning the platfor
2340: 6d 20 6e 61 6d 65 20 69 6e 73 74 65 61 64 0a 20  m name instead. 
2350: 20 23 20 20 20 20 20 20 20 6f 66 20 70 6c 61 74   #       of plat
2360: 66 6f 72 6d 20 70 6c 61 63 65 68 6f 6c 64 65 72  form placeholder
2370: 20 74 6f 6b 65 6e 73 2e 0a 20 20 23 0a 20 20 72   tokens..  #.  r
2380: 65 74 75 72 6e 20 5b 73 74 72 69 6e 67 20 6d 61  eturn [string ma
2390: 70 20 5b 6c 69 73 74 20 3c 62 75 69 6c 64 3e 20  p [list <build> 
23a0: 24 62 75 69 6c 64 4e 61 6d 65 20 3c 70 6c 61 74  $buildName <plat
23b0: 66 6f 72 6d 3e 20 24 70 6c 61 74 66 6f 72 6d 4e  form> $platformN
23c0: 61 6d 65 20 5c 0a 20 20 20 20 20 20 3c 6e 61 6d  ame \.      <nam
23d0: 65 3e 20 24 6e 61 6d 65 5d 20 24 66 69 6c 65 4e  e> $name] $fileN
23e0: 61 6d 65 5d 0a 7d 0a 0c 0a 70 72 6f 63 20 73 75  ame].}...proc su
23f0: 62 73 74 46 69 6c 65 20 7b 20 66 69 6c 65 4e 61  bstFile { fileNa
2400: 6d 65 20 7d 20 7b 0a 20 20 23 0a 20 20 23 20 4e  me } {.  #.  # N
2410: 4f 54 45 3a 20 50 65 72 66 6f 72 6d 73 20 61 6c  OTE: Performs al
2420: 6c 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 2c 20 76  l Tcl command, v
2430: 61 72 69 61 62 6c 65 2c 20 61 6e 64 20 62 61 63  ariable, and bac
2440: 6b 73 6c 61 73 68 20 73 75 62 73 74 69 74 75 74  kslash substitut
2450: 69 6f 6e 73 20 69 6e 0a 20 20 23 20 20 20 20 20  ions in.  #     
2460: 20 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20    the specified 
2470: 66 69 6c 65 20 61 6e 64 20 74 68 65 6e 20 72 65  file and then re
2480: 77 72 69 74 65 73 20 74 68 65 20 63 6f 6e 74 65  writes the conte
2490: 6e 74 73 20 6f 66 20 74 68 61 74 20 73 61 6d 65  nts of that same
24a0: 20 66 69 6c 65 0a 20 20 23 20 20 20 20 20 20 20   file.  #       
24b0: 77 69 74 68 20 74 68 65 20 73 75 62 73 74 69 74  with the substit
24c0: 75 74 65 64 20 64 61 74 61 2e 0a 20 20 23 0a 20  uted data..  #. 
24d0: 20 72 65 74 75 72 6e 20 5b 77 72 69 74 65 46 69   return [writeFi
24e0: 6c 65 20 24 66 69 6c 65 4e 61 6d 65 20 5b 75 70  le $fileName [up
24f0: 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 73 75  level 1 [list su
2500: 62 73 74 20 5b 72 65 61 64 46 69 6c 65 20 24 66  bst [readFile $f
2510: 69 6c 65 4e 61 6d 65 5d 5d 5d 5d 0a 7d 0a 0c 0a  ileName]]]].}...
2520: 23 0a 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 69  #.# NOTE: This i
2530: 73 20 74 68 65 20 65 6e 74 72 79 20 70 6f 69 6e  s the entry poin
2540: 74 20 66 6f 72 20 74 68 69 73 20 73 63 72 69 70  t for this scrip
2550: 74 2e 0a 23 0a 73 65 74 20 73 63 72 69 70 74 20  t..#.set script 
2560: 5b 66 69 6c 65 20 6e 6f 72 6d 61 6c 69 7a 65 20  [file normalize 
2570: 5b 69 6e 66 6f 20 73 63 72 69 70 74 5d 5d 0a 0a  [info script]]..
2580: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
2590: 74 68 20 24 73 63 72 69 70 74 5d 20 3d 3d 20 30  th $script] == 0
25a0: 7d 20 74 68 65 6e 20 7b 0a 20 20 66 61 69 6c 20  } then {.  fail 
25b0: 22 73 63 72 69 70 74 20 66 69 6c 65 20 63 75 72  "script file cur
25c0: 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 65 76 61  rently being eva
25d0: 6c 75 61 74 65 64 20 69 73 20 75 6e 6b 6e 6f 77  luated is unknow
25e0: 6e 22 20 74 72 75 65 0a 7d 0a 0a 73 65 74 20 70  n" true.}..set p
25f0: 61 74 68 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d  ath [file dirnam
2600: 65 20 24 73 63 72 69 70 74 5d 0a 73 65 74 20 72  e $script].set r
2610: 6f 6f 74 4e 61 6d 65 20 5b 66 69 6c 65 20 72 6f  ootName [file ro
2620: 6f 74 6e 61 6d 65 20 5b 66 69 6c 65 20 74 61 69  otname [file tai
2630: 6c 20 24 73 63 72 69 70 74 5d 5d 0a 0a 23 23 23  l $script]]..###
2640: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2650: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2660: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2670: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2680: 23 23 23 23 23 23 23 23 23 23 23 23 0a 0a 23 0a  ############..#.
2690: 23 20 4e 4f 54 45 3a 20 50 72 6f 63 65 73 73 20  # NOTE: Process 
26a0: 61 6e 64 20 76 65 72 69 66 79 20 61 6c 6c 20 74  and verify all t
26b0: 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20  he command line 
26c0: 61 72 67 75 6d 65 6e 74 73 2e 0a 23 0a 73 65 74  arguments..#.set
26d0: 20 61 72 67 63 20 5b 6c 6c 65 6e 67 74 68 20 24   argc [llength $
26e0: 61 72 67 76 5d 0a 69 66 20 7b 24 61 72 67 63 20  argv].if {$argc 
26f0: 3c 20 31 20 7c 7c 20 24 61 72 67 63 20 3e 20 35  < 1 || $argc > 5
2700: 7d 20 74 68 65 6e 20 7b 66 61 69 6c 7d 0a 0a 73  } then {fail}..s
2710: 65 74 20 62 69 6e 61 72 79 44 69 72 65 63 74 6f  et binaryDirecto
2720: 72 79 20 5b 6c 69 6e 64 65 78 20 24 61 72 67 76  ry [lindex $argv
2730: 20 30 5d 0a 0a 69 66 20 7b 5b 73 74 72 69 6e 67   0]..if {[string
2740: 20 6c 65 6e 67 74 68 20 24 62 69 6e 61 72 79 44   length $binaryD
2750: 69 72 65 63 74 6f 72 79 5d 20 3d 3d 20 30 7d 20  irectory] == 0} 
2760: 74 68 65 6e 20 7b 0a 20 20 66 61 69 6c 20 22 69  then {.  fail "i
2770: 6e 76 61 6c 69 64 20 62 69 6e 61 72 79 20 64 69  nvalid binary di
2780: 72 65 63 74 6f 72 79 22 0a 7d 0a 0a 69 66 20 7b  rectory".}..if {
2790: 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 62  ![file exists $b
27a0: 69 6e 61 72 79 44 69 72 65 63 74 6f 72 79 5d 20  inaryDirectory] 
27b0: 7c 7c 20 5c 0a 20 20 20 20 21 5b 66 69 6c 65 20  || \.    ![file 
27c0: 69 73 64 69 72 65 63 74 6f 72 79 20 24 62 69 6e  isdirectory $bin
27d0: 61 72 79 44 69 72 65 63 74 6f 72 79 5d 7d 20 74  aryDirectory]} t
27e0: 68 65 6e 20 7b 0a 20 20 66 61 69 6c 20 22 62 69  hen {.  fail "bi
27f0: 6e 61 72 79 20 64 69 72 65 63 74 6f 72 79 20 64  nary directory d
2800: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 22 0a 7d  oes not exist".}
2810: 0a 0a 69 66 20 7b 24 61 72 67 63 20 3e 3d 20 32  ..if {$argc >= 2
2820: 7d 20 74 68 65 6e 20 7b 0a 20 20 73 65 74 20 73  } then {.  set s
2830: 6f 75 72 63 65 44 69 72 65 63 74 6f 72 79 20 5b  ourceDirectory [
2840: 6c 69 6e 64 65 78 20 24 61 72 67 76 20 31 5d 0a  lindex $argv 1].
2850: 7d 20 65 6c 73 65 20 7b 0a 20 20 23 0a 20 20 23  } else {.  #.  #
2860: 20 4e 4f 54 45 3a 20 41 73 73 75 6d 65 20 74 68   NOTE: Assume th
2870: 61 74 20 74 68 65 20 73 6f 75 72 63 65 20 64 69  at the source di
2880: 72 65 63 74 6f 72 79 20 69 73 20 74 68 65 20 70  rectory is the p
2890: 61 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79 20  arent directory 
28a0: 6f 66 20 74 68 65 20 6f 6e 65 0a 20 20 23 20 20  of the one.  #  
28b0: 20 20 20 20 20 74 68 61 74 20 63 6f 6e 74 61 69       that contai
28c0: 6e 73 20 74 68 69 73 20 73 63 72 69 70 74 20 66  ns this script f
28d0: 69 6c 65 2e 0a 20 20 23 0a 20 20 73 65 74 20 73  ile..  #.  set s
28e0: 6f 75 72 63 65 44 69 72 65 63 74 6f 72 79 20 5b  ourceDirectory [
28f0: 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 70 61  file dirname $pa
2900: 74 68 5d 0a 7d 0a 0a 69 66 20 7b 5b 73 74 72 69  th].}..if {[stri
2910: 6e 67 20 6c 65 6e 67 74 68 20 24 73 6f 75 72 63  ng length $sourc
2920: 65 44 69 72 65 63 74 6f 72 79 5d 20 3d 3d 20 30  eDirectory] == 0
2930: 7d 20 74 68 65 6e 20 7b 0a 20 20 66 61 69 6c 20  } then {.  fail 
2940: 22 69 6e 76 61 6c 69 64 20 73 6f 75 72 63 65 20  "invalid source 
2950: 64 69 72 65 63 74 6f 72 79 22 0a 7d 0a 0a 69 66  directory".}..if
2960: 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20   {![file exists 
2970: 24 73 6f 75 72 63 65 44 69 72 65 63 74 6f 72 79  $sourceDirectory
2980: 5d 20 7c 7c 20 5c 0a 20 20 20 20 21 5b 66 69 6c  ] || \.    ![fil
2990: 65 20 69 73 64 69 72 65 63 74 6f 72 79 20 24 73  e isdirectory $s
29a0: 6f 75 72 63 65 44 69 72 65 63 74 6f 72 79 5d 7d  ourceDirectory]}
29b0: 20 74 68 65 6e 20 7b 0a 20 20 66 61 69 6c 20 22   then {.  fail "
29c0: 73 6f 75 72 63 65 20 64 69 72 65 63 74 6f 72 79  source directory
29d0: 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 22   does not exist"
29e0: 0a 7d 0a 0a 69 66 20 7b 24 61 72 67 63 20 3e 3d  .}..if {$argc >=
29f0: 20 33 7d 20 74 68 65 6e 20 7b 0a 20 20 73 65 74   3} then {.  set
2a00: 20 70 61 63 6b 61 67 65 46 6c 61 76 6f 72 20 5b   packageFlavor [
2a10: 6c 69 6e 64 65 78 20 24 61 72 67 76 20 32 5d 0a  lindex $argv 2].
2a20: 7d 20 65 6c 73 65 20 7b 0a 20 20 23 0a 20 20 23  } else {.  #.  #
2a30: 20 4e 4f 54 45 3a 20 41 73 73 75 6d 65 20 74 68   NOTE: Assume th
2a40: 65 20 70 61 63 6b 61 67 65 20 66 6c 61 76 6f 72  e package flavor
2a50: 20 69 73 20 57 69 6e 52 54 2e 0a 20 20 23 0a 20   is WinRT..  #. 
2a60: 20 73 65 74 20 70 61 63 6b 61 67 65 46 6c 61 76   set packageFlav
2a70: 6f 72 20 57 69 6e 52 54 0a 7d 0a 0a 69 66 20 7b  or WinRT.}..if {
2a80: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
2a90: 70 61 63 6b 61 67 65 46 6c 61 76 6f 72 5d 20 3d  packageFlavor] =
2aa0: 3d 20 30 7d 20 74 68 65 6e 20 7b 0a 20 20 66 61  = 0} then {.  fa
2ab0: 69 6c 20 22 69 6e 76 61 6c 69 64 20 70 61 63 6b  il "invalid pack
2ac0: 61 67 65 20 66 6c 61 76 6f 72 22 0a 7d 0a 0a 69  age flavor".}..i
2ad0: 66 20 7b 24 61 72 67 63 20 3e 3d 20 34 7d 20 74  f {$argc >= 4} t
2ae0: 68 65 6e 20 7b 0a 20 20 73 65 74 20 70 6c 61 74  hen {.  set plat
2af0: 66 6f 72 6d 4e 61 6d 65 73 20 5b 6c 69 73 74 5d  formNames [list]
2b00: 0a 0a 20 20 66 6f 72 65 61 63 68 20 70 6c 61 74  ..  foreach plat
2b10: 66 6f 72 6d 4e 61 6d 65 20 5b 73 70 6c 69 74 20  formName [split 
2b20: 5b 6c 69 6e 64 65 78 20 24 61 72 67 76 20 33 5d  [lindex $argv 3]
2b30: 20 22 2c 20 22 5d 20 7b 0a 20 20 20 20 73 65 74   ", "] {.    set
2b40: 20 70 6c 61 74 66 6f 72 6d 4e 61 6d 65 20 5b 73   platformName [s
2b50: 74 72 69 6e 67 20 74 72 69 6d 20 24 70 6c 61 74  tring trim $plat
2b60: 66 6f 72 6d 4e 61 6d 65 5d 0a 0a 20 20 20 20 69  formName]..    i
2b70: 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
2b80: 68 20 24 70 6c 61 74 66 6f 72 6d 4e 61 6d 65 5d  h $platformName]
2b90: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0a 20 20 20   > 0} then {.   
2ba0: 20 20 20 6c 61 70 70 65 6e 64 20 70 6c 61 74 66     lappend platf
2bb0: 6f 72 6d 4e 61 6d 65 73 20 24 70 6c 61 74 66 6f  ormNames $platfo
2bc0: 72 6d 4e 61 6d 65 0a 20 20 20 20 7d 0a 20 20 7d  rmName.    }.  }
2bd0: 0a 7d 0a 0a 69 66 20 7b 24 61 72 67 63 20 3e 3d  .}..if {$argc >=
2be0: 20 35 7d 20 74 68 65 6e 20 7b 0a 20 20 73 65 74   5} then {.  set
2bf0: 20 76 73 56 65 72 73 69 6f 6e 20 5b 6c 69 6e 64   vsVersion [lind
2c00: 65 78 20 24 61 72 67 76 20 34 5d 0a 7d 20 65 6c  ex $argv 4].} el
2c10: 73 65 20 7b 0a 20 20 73 65 74 20 76 73 56 65 72  se {.  set vsVer
2c20: 73 69 6f 6e 20 32 30 31 32 0a 7d 0a 0a 69 66 20  sion 2012.}..if 
2c30: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
2c40: 24 76 73 56 65 72 73 69 6f 6e 5d 20 3d 3d 20 30  $vsVersion] == 0
2c50: 7d 20 74 68 65 6e 20 7b 0a 20 20 66 61 69 6c 20  } then {.  fail 
2c60: 22 69 6e 76 61 6c 69 64 20 56 69 73 75 61 6c 20  "invalid Visual 
2c70: 53 74 75 64 69 6f 20 76 65 72 73 69 6f 6e 22 0a  Studio version".
2c80: 7d 0a 0a 69 66 20 7b 21 5b 73 74 72 69 6e 67 20  }..if {![string 
2c90: 65 71 75 61 6c 20 24 76 73 56 65 72 73 69 6f 6e  equal $vsVersion
2ca0: 20 32 30 31 32 5d 20 26 26 20 21 5b 73 74 72 69   2012] && ![stri
2cb0: 6e 67 20 65 71 75 61 6c 20 24 76 73 56 65 72 73  ng equal $vsVers
2cc0: 69 6f 6e 20 32 30 31 33 5d 7d 20 74 68 65 6e 20  ion 2013]} then 
2cd0: 7b 0a 20 20 66 61 69 6c 20 5b 61 70 70 65 6e 64  {.  fail [append
2ce0: 41 72 67 73 20 5c 0a 20 20 20 20 20 20 22 75 6e  Args \.      "un
2cf0: 73 75 70 70 6f 72 74 65 64 20 56 69 73 75 61 6c  supported Visual
2d00: 20 53 74 75 64 69 6f 20 76 65 72 73 69 6f 6e 2c   Studio version,
2d10: 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 3a   must be one of:
2d20: 20 22 20 5c 0a 20 20 20 20 20 20 5b 6c 69 73 74   " \.      [list
2d30: 20 32 30 31 32 20 32 30 31 33 5d 5d 0a 7d 0a 0a   2012 2013]].}..
2d40: 73 65 74 20 73 68 6f 72 74 4e 61 6d 65 73 28 57  set shortNames(W
2d50: 69 6e 52 54 2c 32 30 31 32 29 20 53 51 4c 69 74  inRT,2012) SQLit
2d60: 65 2e 57 69 6e 52 54 0a 73 65 74 20 73 68 6f 72  e.WinRT.set shor
2d70: 74 4e 61 6d 65 73 28 57 69 6e 52 54 2c 32 30 31  tNames(WinRT,201
2d80: 33 29 20 53 51 4c 69 74 65 2e 57 69 6e 52 54 2e  3) SQLite.WinRT.
2d90: 32 30 31 33 0a 73 65 74 20 73 68 6f 72 74 4e 61  2013.set shortNa
2da0: 6d 65 73 28 57 69 6e 52 54 38 31 2c 32 30 31 33  mes(WinRT81,2013
2db0: 29 20 53 51 4c 69 74 65 2e 57 69 6e 52 54 38 31  ) SQLite.WinRT81
2dc0: 0a 73 65 74 20 73 68 6f 72 74 4e 61 6d 65 73 28  .set shortNames(
2dd0: 57 50 38 30 2c 32 30 31 32 29 20 53 51 4c 69 74  WP80,2012) SQLit
2de0: 65 2e 57 50 38 30 0a 73 65 74 20 73 68 6f 72 74  e.WP80.set short
2df0: 4e 61 6d 65 73 28 57 50 38 30 2c 32 30 31 33 29  Names(WP80,2013)
2e00: 20 53 51 4c 69 74 65 2e 57 50 38 30 2e 32 30 31   SQLite.WP80.201
2e10: 33 0a 73 65 74 20 73 68 6f 72 74 4e 61 6d 65 73  3.set shortNames
2e20: 28 57 50 38 31 2c 32 30 31 33 29 20 53 51 4c 69  (WP81,2013) SQLi
2e30: 74 65 2e 57 50 38 31 0a 73 65 74 20 73 68 6f 72  te.WP81.set shor
2e40: 74 4e 61 6d 65 73 28 57 69 6e 33 32 2c 32 30 31  tNames(Win32,201
2e50: 32 29 20 53 51 4c 69 74 65 2e 57 69 6e 33 32 0a  2) SQLite.Win32.
2e60: 73 65 74 20 73 68 6f 72 74 4e 61 6d 65 73 28 57  set shortNames(W
2e70: 69 6e 33 32 2c 32 30 31 33 29 20 53 51 4c 69 74  in32,2013) SQLit
2e80: 65 2e 57 69 6e 33 32 2e 32 30 31 33 0a 0a 73 65  e.Win32.2013..se
2e90: 74 20 64 69 73 70 6c 61 79 4e 61 6d 65 73 28 57  t displayNames(W
2ea0: 69 6e 52 54 2c 32 30 31 32 29 20 22 53 51 4c 69  inRT,2012) "SQLi
2eb0: 74 65 20 66 6f 72 20 57 69 6e 64 6f 77 73 20 52  te for Windows R
2ec0: 75 6e 74 69 6d 65 22 0a 73 65 74 20 64 69 73 70  untime".set disp
2ed0: 6c 61 79 4e 61 6d 65 73 28 57 69 6e 52 54 2c 32  layNames(WinRT,2
2ee0: 30 31 33 29 20 22 53 51 4c 69 74 65 20 66 6f 72  013) "SQLite for
2ef0: 20 57 69 6e 64 6f 77 73 20 52 75 6e 74 69 6d 65   Windows Runtime
2f00: 22 0a 73 65 74 20 64 69 73 70 6c 61 79 4e 61 6d  ".set displayNam
2f10: 65 73 28 57 69 6e 52 54 38 31 2c 32 30 31 33 29  es(WinRT81,2013)
2f20: 20 22 53 51 4c 69 74 65 20 66 6f 72 20 57 69 6e   "SQLite for Win
2f30: 64 6f 77 73 20 52 75 6e 74 69 6d 65 20 28 57 69  dows Runtime (Wi
2f40: 6e 64 6f 77 73 20 38 2e 31 29 22 0a 73 65 74 20  ndows 8.1)".set 
2f50: 64 69 73 70 6c 61 79 4e 61 6d 65 73 28 57 50 38  displayNames(WP8
2f60: 30 2c 32 30 31 32 29 20 22 53 51 4c 69 74 65 20  0,2012) "SQLite 
2f70: 66 6f 72 20 57 69 6e 64 6f 77 73 20 50 68 6f 6e  for Windows Phon
2f80: 65 22 0a 73 65 74 20 64 69 73 70 6c 61 79 4e 61  e".set displayNa
2f90: 6d 65 73 28 57 50 38 30 2c 32 30 31 33 29 20 22  mes(WP80,2013) "
2fa0: 53 51 4c 69 74 65 20 66 6f 72 20 57 69 6e 64 6f  SQLite for Windo
2fb0: 77 73 20 50 68 6f 6e 65 22 0a 73 65 74 20 64 69  ws Phone".set di
2fc0: 73 70 6c 61 79 4e 61 6d 65 73 28 57 50 38 31 2c  splayNames(WP81,
2fd0: 32 30 31 33 29 20 22 53 51 4c 69 74 65 20 66 6f  2013) "SQLite fo
2fe0: 72 20 57 69 6e 64 6f 77 73 20 50 68 6f 6e 65 20  r Windows Phone 
2ff0: 38 2e 31 22 0a 73 65 74 20 64 69 73 70 6c 61 79  8.1".set display
3000: 4e 61 6d 65 73 28 57 69 6e 33 32 2c 32 30 31 32  Names(Win32,2012
3010: 29 20 22 53 51 4c 69 74 65 20 66 6f 72 20 57 69  ) "SQLite for Wi
3020: 6e 64 6f 77 73 22 0a 73 65 74 20 64 69 73 70 6c  ndows".set displ
3030: 61 79 4e 61 6d 65 73 28 57 69 6e 33 32 2c 32 30  ayNames(Win32,20
3040: 31 33 29 20 22 53 51 4c 69 74 65 20 66 6f 72 20  13) "SQLite for 
3050: 57 69 6e 64 6f 77 73 22 0a 0a 69 66 20 7b 5b 73  Windows"..if {[s
3060: 74 72 69 6e 67 20 65 71 75 61 6c 20 24 70 61 63  tring equal $pac
3070: 6b 61 67 65 46 6c 61 76 6f 72 20 57 69 6e 52 54  kageFlavor WinRT
3080: 5d 7d 20 74 68 65 6e 20 7b 0a 20 20 73 65 74 20  ]} then {.  set 
3090: 73 68 6f 72 74 4e 61 6d 65 20 24 73 68 6f 72 74  shortName $short
30a0: 4e 61 6d 65 73 28 24 70 61 63 6b 61 67 65 46 6c  Names($packageFl
30b0: 61 76 6f 72 2c 24 76 73 56 65 72 73 69 6f 6e 29  avor,$vsVersion)
30c0: 0a 20 20 73 65 74 20 64 69 73 70 6c 61 79 4e 61  .  set displayNa
30d0: 6d 65 20 24 64 69 73 70 6c 61 79 4e 61 6d 65 73  me $displayNames
30e0: 28 24 70 61 63 6b 61 67 65 46 6c 61 76 6f 72 2c  ($packageFlavor,
30f0: 24 76 73 56 65 72 73 69 6f 6e 29 0a 20 20 73 65  $vsVersion).  se
3100: 74 20 74 61 72 67 65 74 50 6c 61 74 66 6f 72 6d  t targetPlatform
3110: 49 64 65 6e 74 69 66 69 65 72 20 57 69 6e 64 6f  Identifier Windo
3120: 77 73 0a 20 20 73 65 74 20 74 61 72 67 65 74 50  ws.  set targetP
3130: 6c 61 74 66 6f 72 6d 56 65 72 73 69 6f 6e 20 76  latformVersion v
3140: 38 2e 30 0a 20 20 73 65 74 20 6d 69 6e 56 73 56  8.0.  set minVsV
3150: 65 72 73 69 6f 6e 20 5b 67 65 74 4d 69 6e 56 73  ersion [getMinVs
3160: 56 65 72 73 69 6f 6e 58 6d 6c 43 68 75 6e 6b 20  VersionXmlChunk 
3170: 24 76 73 56 65 72 73 69 6f 6e 5d 0a 20 20 73 65  $vsVersion].  se
3180: 74 20 6d 61 78 50 6c 61 74 66 6f 72 6d 56 65 72  t maxPlatformVer
3190: 73 69 6f 6e 20 5c 0a 20 20 20 20 20 20 5b 67 65  sion \.      [ge
31a0: 74 4d 61 78 50 6c 61 74 66 6f 72 6d 56 65 72 73  tMaxPlatformVers
31b0: 69 6f 6e 58 6d 6c 43 68 75 6e 6b 20 24 70 61 63  ionXmlChunk $pac
31c0: 6b 61 67 65 46 6c 61 76 6f 72 20 24 76 73 56 65  kageFlavor $vsVe
31d0: 72 73 69 6f 6e 5d 0a 20 20 73 65 74 20 65 78 74  rsion].  set ext
31e0: 72 61 53 64 6b 50 61 74 68 20 22 22 0a 20 20 73  raSdkPath "".  s
31f0: 65 74 20 65 78 74 72 61 46 69 6c 65 4c 69 73 74  et extraFileList
3200: 41 74 74 72 69 62 75 74 65 73 20 5c 0a 20 20 20  Attributes \.   
3210: 20 20 20 5b 67 65 74 45 78 74 72 61 46 69 6c 65     [getExtraFile
3220: 4c 69 73 74 58 6d 6c 43 68 75 6e 6b 20 24 70 61  ListXmlChunk $pa
3230: 63 6b 61 67 65 46 6c 61 76 6f 72 20 24 76 73 56  ckageFlavor $vsV
3240: 65 72 73 69 6f 6e 5d 0a 7d 20 65 6c 73 65 69 66  ersion].} elseif
3250: 20 7b 5b 73 74 72 69 6e 67 20 65 71 75 61 6c 20   {[string equal 
3260: 24 70 61 63 6b 61 67 65 46 6c 61 76 6f 72 20 57  $packageFlavor W
3270: 69 6e 52 54 38 31 5d 7d 20 74 68 65 6e 20 7b 0a  inRT81]} then {.
3280: 20 20 69 66 20 7b 24 76 73 56 65 72 73 69 6f 6e    if {$vsVersion
3290: 20 6e 65 20 22 32 30 31 33 22 7d 20 74 68 65 6e   ne "2013"} then
32a0: 20 7b 0a 20 20 20 20 66 61 69 6c 20 5b 61 70 70   {.    fail [app
32b0: 65 6e 64 41 72 67 73 20 5c 0a 20 20 20 20 20 20  endArgs \.      
32c0: 20 20 22 75 6e 73 75 70 70 6f 72 74 65 64 20 63    "unsupported c
32d0: 6f 6d 62 69 6e 61 74 69 6f 6e 2c 20 70 61 63 6b  ombination, pack
32e0: 61 67 65 20 66 6c 61 76 6f 72 20 22 20 24 70 61  age flavor " $pa
32f0: 63 6b 61 67 65 46 6c 61 76 6f 72 20 5c 0a 20 20  ckageFlavor \.  
3300: 20 20 20 20 20 20 22 20 69 73 20 6f 6e 6c 79 20        " is only 
3310: 73 75 70 70 6f 72 74 65 64 20 77 69 74 68 20 56  supported with V
3320: 69 73 75 61 6c 20 53 74 75 64 69 6f 20 32 30 31  isual Studio 201
3330: 33 22 5d 0a 20 20 7d 0a 20 20 73 65 74 20 73 68  3"].  }.  set sh
3340: 6f 72 74 4e 61 6d 65 20 24 73 68 6f 72 74 4e 61  ortName $shortNa
3350: 6d 65 73 28 24 70 61 63 6b 61 67 65 46 6c 61 76  mes($packageFlav
3360: 6f 72 2c 24 76 73 56 65 72 73 69 6f 6e 29 0a 20  or,$vsVersion). 
3370: 20 73 65 74 20 64 69 73 70 6c 61 79 4e 61 6d 65   set displayName
3380: 20 24 64 69 73 70 6c 61 79 4e 61 6d 65 73 28 24   $displayNames($
3390: 70 61 63 6b 61 67 65 46 6c 61 76 6f 72 2c 24 76  packageFlavor,$v
33a0: 73 56 65 72 73 69 6f 6e 29 0a 20 20 73 65 74 20  sVersion).  set 
33b0: 74 61 72 67 65 74 50 6c 61 74 66 6f 72 6d 49 64  targetPlatformId
33c0: 65 6e 74 69 66 69 65 72 20 57 69 6e 64 6f 77 73  entifier Windows
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 56 65 72 73 69 6f 6e 20 76 38 2e  tformVersion v8.
33f0: 31 0a 20 20 73 65 74 20 6d 69 6e 56 73 56 65 72  1.  set minVsVer
3400: 73 69 6f 6e 20 5b 67 65 74 4d 69 6e 56 73 56 65  sion [getMinVsVe
3410: 72 73 69 6f 6e 58 6d 6c 43 68 75 6e 6b 20 24 76  rsionXmlChunk $v
3420: 73 56 65 72 73 69 6f 6e 5d 0a 20 20 73 65 74 20  sVersion].  set 
3430: 6d 61 78 50 6c 61 74 66 6f 72 6d 56 65 72 73 69  maxPlatformVersi
3440: 6f 6e 20 5c 0a 20 20 20 20 20 20 5b 67 65 74 4d  on \.      [getM
3450: 61 78 50 6c 61 74 66 6f 72 6d 56 65 72 73 69 6f  axPlatformVersio
3460: 6e 58 6d 6c 43 68 75 6e 6b 20 24 70 61 63 6b 61  nXmlChunk $packa
3470: 67 65 46 6c 61 76 6f 72 20 24 76 73 56 65 72 73  geFlavor $vsVers
3480: 69 6f 6e 5d 0a 20 20 73 65 74 20 65 78 74 72 61  ion].  set extra
3490: 53 64 6b 50 61 74 68 20 22 22 0a 20 20 73 65 74  SdkPath "".  set
34a0: 20 65 78 74 72 61 46 69 6c 65 4c 69 73 74 41 74   extraFileListAt
34b0: 74 72 69 62 75 74 65 73 20 5c 0a 20 20 20 20 20  tributes \.     
34c0: 20 5b 67 65 74 45 78 74 72 61 46 69 6c 65 4c 69   [getExtraFileLi
34d0: 73 74 58 6d 6c 43 68 75 6e 6b 20 24 70 61 63 6b  stXmlChunk $pack
34e0: 61 67 65 46 6c 61 76 6f 72 20 24 76 73 56 65 72  ageFlavor $vsVer
34f0: 73 69 6f 6e 5d 0a 7d 20 65 6c 73 65 69 66 20 7b  sion].} elseif {
3500: 5b 73 74 72 69 6e 67 20 65 71 75 61 6c 20 24 70  [string equal $p
3510: 61 63 6b 61 67 65 46 6c 61 76 6f 72 20 57 50 38  ackageFlavor WP8
3520: 30 5d 7d 20 74 68 65 6e 20 7b 0a 20 20 73 65 74  0]} then {.  set
3530: 20 73 68 6f 72 74 4e 61 6d 65 20 24 73 68 6f 72   shortName $shor
3540: 74 4e 61 6d 65 73 28 24 70 61 63 6b 61 67 65 46  tNames($packageF
3550: 6c 61 76 6f 72 2c 24 76 73 56 65 72 73 69 6f 6e  lavor,$vsVersion
3560: 29 0a 20 20 73 65 74 20 64 69 73 70 6c 61 79 4e  ).  set displayN
3570: 61 6d 65 20 24 64 69 73 70 6c 61 79 4e 61 6d 65  ame $displayName
3580: 73 28 24 70 61 63 6b 61 67 65 46 6c 61 76 6f 72  s($packageFlavor
3590: 2c 24 76 73 56 65 72 73 69 6f 6e 29 0a 20 20 73  ,$vsVersion).  s
35a0: 65 74 20 74 61 72 67 65 74 50 6c 61 74 66 6f 72  et targetPlatfor
35b0: 6d 49 64 65 6e 74 69 66 69 65 72 20 22 57 69 6e  mIdentifier "Win
35c0: 64 6f 77 73 20 50 68 6f 6e 65 22 0a 20 20 73 65  dows Phone".  se
35d0: 74 20 74 61 72 67 65 74 50 6c 61 74 66 6f 72 6d  t targetPlatform
35e0: 56 65 72 73 69 6f 6e 20 76 38 2e 30 0a 20 20 73  Version v8.0.  s
35f0: 65 74 20 6d 69 6e 56 73 56 65 72 73 69 6f 6e 20  et minVsVersion 
3600: 5b 67 65 74 4d 69 6e 56 73 56 65 72 73 69 6f 6e  [getMinVsVersion
3610: 58 6d 6c 43 68 75 6e 6b 20 24 76 73 56 65 72 73  XmlChunk $vsVers
3620: 69 6f 6e 5d 0a 20 20 73 65 74 20 6d 61 78 50 6c  ion].  set maxPl
3630: 61 74 66 6f 72 6d 56 65 72 73 69 6f 6e 20 5c 0a  atformVersion \.
3640: 20 20 20 20 20 20 5b 67 65 74 4d 61 78 50 6c 61        [getMaxPla
3650: 74 66 6f 72 6d 56 65 72 73 69 6f 6e 58 6d 6c 43  tformVersionXmlC
3660: 68 75 6e 6b 20 24 70 61 63 6b 61 67 65 46 6c 61  hunk $packageFla
3670: 76 6f 72 20 24 76 73 56 65 72 73 69 6f 6e 5d 0a  vor $vsVersion].
3680: 20 20 73 65 74 20 65 78 74 72 61 53 64 6b 50 61    set extraSdkPa
3690: 74 68 20 22 5c 5c 2e 2e 5c 5c 24 74 61 72 67 65  th "\\..\\$targe
36a0: 74 50 6c 61 74 66 6f 72 6d 49 64 65 6e 74 69 66  tPlatformIdentif
36b0: 69 65 72 22 0a 20 20 73 65 74 20 65 78 74 72 61  ier".  set extra
36c0: 46 69 6c 65 4c 69 73 74 41 74 74 72 69 62 75 74  FileListAttribut
36d0: 65 73 20 5c 0a 20 20 20 20 20 20 5b 67 65 74 45  es \.      [getE
36e0: 78 74 72 61 46 69 6c 65 4c 69 73 74 58 6d 6c 43  xtraFileListXmlC
36f0: 68 75 6e 6b 20 24 70 61 63 6b 61 67 65 46 6c 61  hunk $packageFla
3700: 76 6f 72 20 24 76 73 56 65 72 73 69 6f 6e 5d 0a  vor $vsVersion].
3710: 7d 20 65 6c 73 65 69 66 20 7b 5b 73 74 72 69 6e  } elseif {[strin
3720: 67 20 65 71 75 61 6c 20 24 70 61 63 6b 61 67 65  g equal $package
3730: 46 6c 61 76 6f 72 20 57 50 38 31 5d 7d 20 74 68  Flavor WP81]} th
3740: 65 6e 20 7b 0a 20 20 69 66 20 7b 24 76 73 56 65  en {.  if {$vsVe
3750: 72 73 69 6f 6e 20 6e 65 20 22 32 30 31 33 22 7d  rsion ne "2013"}
3760: 20 74 68 65 6e 20 7b 0a 20 20 20 20 66 61 69 6c   then {.    fail
3770: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0a 20   [appendArgs \. 
3780: 20 20 20 20 20 20 20 22 75 6e 73 75 70 70 6f 72         "unsuppor
3790: 74 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 2c  ted combination,
37a0: 20 70 61 63 6b 61 67 65 20 66 6c 61 76 6f 72 20   package flavor 
37b0: 22 20 24 70 61 63 6b 61 67 65 46 6c 61 76 6f 72  " $packageFlavor
37c0: 20 5c 0a 20 20 20 20 20 20 20 20 22 20 69 73 20   \.        " is 
37d0: 6f 6e 6c 79 20 73 75 70 70 6f 72 74 65 64 20 77  only supported w
37e0: 69 74 68 20 56 69 73 75 61 6c 20 53 74 75 64 69  ith Visual Studi
37f0: 6f 20 32 30 31 33 22 5d 0a 20 20 7d 0a 20 20 73  o 2013"].  }.  s
3800: 65 74 20 73 68 6f 72 74 4e 61 6d 65 20 24 73 68  et shortName $sh
3810: 6f 72 74 4e 61 6d 65 73 28 24 70 61 63 6b 61 67  ortNames($packag
3820: 65 46 6c 61 76 6f 72 2c 24 76 73 56 65 72 73 69  eFlavor,$vsVersi
3830: 6f 6e 29 0a 20 20 73 65 74 20 64 69 73 70 6c 61  on).  set displa
3840: 79 4e 61 6d 65 20 24 64 69 73 70 6c 61 79 4e 61  yName $displayNa
3850: 6d 65 73 28 24 70 61 63 6b 61 67 65 46 6c 61 76  mes($packageFlav
3860: 6f 72 2c 24 76 73 56 65 72 73 69 6f 6e 29 0a 20  or,$vsVersion). 
3870: 20 73 65 74 20 74 61 72 67 65 74 50 6c 61 74 66   set targetPlatf
3880: 6f 72 6d 49 64 65 6e 74 69 66 69 65 72 20 57 69  ormIdentifier Wi
3890: 6e 64 6f 77 73 50 68 6f 6e 65 41 70 70 0a 20 20  ndowsPhoneApp.  
38a0: 73 65 74 20 74 61 72 67 65 74 50 6c 61 74 66 6f  set targetPlatfo
38b0: 72 6d 56 65 72 73 69 6f 6e 20 76 38 2e 31 0a 20  rmVersion v8.1. 
38c0: 20 73 65 74 20 6d 69 6e 56 73 56 65 72 73 69 6f   set minVsVersio
38d0: 6e 20 5b 67 65 74 4d 69 6e 56 73 56 65 72 73 69  n [getMinVsVersi
38e0: 6f 6e 58 6d 6c 43 68 75 6e 6b 20 24 76 73 56 65  onXmlChunk $vsVe
38f0: 72 73 69 6f 6e 5d 0a 20 20 73 65 74 20 6d 61 78  rsion].  set max
3900: 50 6c 61 74 66 6f 72 6d 56 65 72 73 69 6f 6e 20  PlatformVersion 
3910: 5c 0a 20 20 20 20 20 20 5b 67 65 74 4d 61 78 50  \.      [getMaxP
3920: 6c 61 74 66 6f 72 6d 56 65 72 73 69 6f 6e 58 6d  latformVersionXm
3930: 6c 43 68 75 6e 6b 20 24 70 61 63 6b 61 67 65 46  lChunk $packageF
3940: 6c 61 76 6f 72 20 24 76 73 56 65 72 73 69 6f 6e  lavor $vsVersion
3950: 5d 0a 20 20 73 65 74 20 65 78 74 72 61 53 64 6b  ].  set extraSdk
3960: 50 61 74 68 20 22 5c 5c 2e 2e 5c 5c 24 74 61 72  Path "\\..\\$tar
3970: 67 65 74 50 6c 61 74 66 6f 72 6d 49 64 65 6e 74  getPlatformIdent
3980: 69 66 69 65 72 22 0a 20 20 73 65 74 20 65 78 74  ifier".  set ext
3990: 72 61 46 69 6c 65 4c 69 73 74 41 74 74 72 69 62  raFileListAttrib
39a0: 75 74 65 73 20 5c 0a 20 20 20 20 20 20 5b 67 65  utes \.      [ge
39b0: 74 45 78 74 72 61 46 69 6c 65 4c 69 73 74 58 6d  tExtraFileListXm
39c0: 6c 43 68 75 6e 6b 20 24 70 61 63 6b 61 67 65 46  lChunk $packageF
39d0: 6c 61 76 6f 72 20 24 76 73 56 65 72 73 69 6f 6e  lavor $vsVersion
39e0: 5d 0a 7d 20 65 6c 73 65 69 66 20 7b 5b 73 74 72  ].} elseif {[str
39f0: 69 6e 67 20 65 71 75 61 6c 20 24 70 61 63 6b 61  ing equal $packa
3a00: 67 65 46 6c 61 76 6f 72 20 57 69 6e 33 32 5d 7d  geFlavor Win32]}
3a10: 20 74 68 65 6e 20 7b 0a 20 20 73 65 74 20 73 68   then {.  set sh
3a20: 6f 72 74 4e 61 6d 65 20 24 73 68 6f 72 74 4e 61  ortName $shortNa
3a30: 6d 65 73 28 24 70 61 63 6b 61 67 65 46 6c 61 76  mes($packageFlav
3a40: 6f 72 2c 24 76 73 56 65 72 73 69 6f 6e 29 0a 20  or,$vsVersion). 
3a50: 20 73 65 74 20 64 69 73 70 6c 61 79 4e 61 6d 65   set displayName
3a60: 20 24 64 69 73 70 6c 61 79 4e 61 6d 65 73 28 24   $displayNames($
3a70: 70 61 63 6b 61 67 65 46 6c 61 76 6f 72 2c 24 76  packageFlavor,$v
3a80: 73 56 65 72 73 69 6f 6e 29 0a 20 20 73 65 74 20  sVersion).  set 
3a90: 74 61 72 67 65 74 50 6c 61 74 66 6f 72 6d 49 64  targetPlatformId
3aa0: 65 6e 74 69 66 69 65 72 20 57 69 6e 64 6f 77 73  entifier Windows
3ab0: 0a 20 20 73 65 74 20 74 61 72 67 65 74 50 6c 61  .  set targetPla
3ac0: 74 66 6f 72 6d 56 65 72 73 69 6f 6e 20 76 38 2e  tformVersion v8.
3ad0: 30 0a 20 20 73 65 74 20 6d 69 6e 56 73 56 65 72  0.  set minVsVer
3ae0: 73 69 6f 6e 20 5b 67 65 74 4d 69 6e 56 73 56 65  sion [getMinVsVe
3af0: 72 73 69 6f 6e 58 6d 6c 43 68 75 6e 6b 20 24 76  rsionXmlChunk $v
3b00: 73 56 65 72 73 69 6f 6e 5d 0a 20 20 73 65 74 20  sVersion].  set 
3b10: 6d 61 78 50 6c 61 74 66 6f 72 6d 56 65 72 73 69  maxPlatformVersi
3b20: 6f 6e 20 5c 0a 20 20 20 20 20 20 5b 67 65 74 4d  on \.      [getM
3b30: 61 78 50 6c 61 74 66 6f 72 6d 56 65 72 73 69 6f  axPlatformVersio
3b40: 6e 58 6d 6c 43 68 75 6e 6b 20 24 70 61 63 6b 61  nXmlChunk $packa
3b50: 67 65 46 6c 61 76 6f 72 20 24 76 73 56 65 72 73  geFlavor $vsVers
3b60: 69 6f 6e 5d 0a 20 20 73 65 74 20 65 78 74 72 61  ion].  set extra
3b70: 53 64 6b 50 61 74 68 20 22 22 0a 20 20 73 65 74  SdkPath "".  set
3b80: 20 65 78 74 72 61 46 69 6c 65 4c 69 73 74 41 74   extraFileListAt
3b90: 74 72 69 62 75 74 65 73 20 5c 0a 20 20 20 20 20  tributes \.     
3ba0: 20 5b 67 65 74 45 78 74 72 61 46 69 6c 65 4c 69   [getExtraFileLi
3bb0: 73 74 58 6d 6c 43 68 75 6e 6b 20 24 70 61 63 6b  stXmlChunk $pack
3bc0: 61 67 65 46 6c 61 76 6f 72 20 24 76 73 56 65 72  ageFlavor $vsVer
3bd0: 73 69 6f 6e 5d 0a 7d 20 65 6c 73 65 20 7b 0a 20  sion].} else {. 
3be0: 20 66 61 69 6c 20 5b 61 70 70 65 6e 64 41 72 67   fail [appendArg
3bf0: 73 20 5c 0a 20 20 20 20 20 20 22 75 6e 73 75 70  s \.      "unsup
3c00: 70 6f 72 74 65 64 20 70 61 63 6b 61 67 65 20 66  ported package f
3c10: 6c 61 76 6f 72 2c 20 6d 75 73 74 20 62 65 20 6f  lavor, must be o
3c20: 6e 65 20 6f 66 3a 20 22 20 5c 0a 20 20 20 20 20  ne of: " \.     
3c30: 20 5b 6c 69 73 74 20 57 69 6e 52 54 20 57 69 6e   [list WinRT Win
3c40: 52 54 38 31 20 57 50 38 30 20 57 50 38 31 20 57  RT81 WP80 WP81 W
3c50: 69 6e 33 32 5d 5d 0a 7d 0a 0a 23 23 23 23 23 23  in32]].}..######
3c60: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3c70: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3c80: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3c90: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3ca0: 23 23 23 23 23 23 23 23 23 0a 0a 23 0a 23 20 4e  #########..#.# N
3cb0: 4f 54 45 3a 20 45 76 61 6c 75 61 74 65 20 74 68  OTE: Evaluate th
3cc0: 65 20 75 73 65 72 2d 73 70 65 63 69 66 69 63 20  e user-specific 
3cd0: 63 75 73 74 6f 6d 69 7a 61 74 69 6f 6e 73 20 66  customizations f
3ce0: 69 6c 65 2c 20 69 66 20 69 74 20 65 78 69 73 74  ile, if it exist
3cf0: 73 2e 0a 23 0a 73 65 74 20 75 73 65 72 46 69 6c  s..#.set userFil
3d00: 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 70 61  e [file join $pa
3d10: 74 68 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  th [appendArgs \
3d20: 0a 20 20 20 20 24 72 6f 6f 74 4e 61 6d 65 20 2e  .    $rootName .
3d30: 20 24 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 75   $tcl_platform(u
3d40: 73 65 72 29 20 2e 74 63 6c 5d 5d 0a 0a 69 66 20  ser) .tcl]]..if 
3d50: 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 75  {[file exists $u
3d60: 73 65 72 46 69 6c 65 5d 20 26 26 20 5c 0a 20 20  serFile] && \.  
3d70: 20 20 5b 66 69 6c 65 20 69 73 66 69 6c 65 20 24    [file isfile $
3d80: 75 73 65 72 46 69 6c 65 5d 7d 20 74 68 65 6e 20  userFile]} then 
3d90: 7b 0a 20 20 73 6f 75 72 63 65 20 24 75 73 65 72  {.  source $user
3da0: 46 69 6c 65 0a 7d 0a 0a 23 23 23 23 23 23 23 23  File.}..########
3db0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3dc0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3dd0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3de0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3df0: 23 23 23 23 23 23 23 0a 0a 73 65 74 20 74 65 6d  #######..set tem
3e00: 70 6c 61 74 65 46 69 6c 65 20 5b 66 69 6c 65 20  plateFile [file 
3e10: 6a 6f 69 6e 20 24 70 61 74 68 20 77 69 6e 20 73  join $path win s
3e20: 71 6c 69 74 65 2e 76 73 69 78 5d 0a 0a 69 66 20  qlite.vsix]..if 
3e30: 7b 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24  {![file exists $
3e40: 74 65 6d 70 6c 61 74 65 46 69 6c 65 5d 20 7c 7c  templateFile] ||
3e50: 20 5c 0a 20 20 20 20 21 5b 66 69 6c 65 20 69 73   \.    ![file is
3e60: 66 69 6c 65 20 24 74 65 6d 70 6c 61 74 65 46 69  file $templateFi
3e70: 6c 65 5d 7d 20 74 68 65 6e 20 7b 0a 20 20 66 61  le]} then {.  fa
3e80: 69 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22  il [appendArgs "
3e90: 74 65 6d 70 6c 61 74 65 20 66 69 6c 65 20 5c 22  template file \"
3ea0: 22 20 24 74 65 6d 70 6c 61 74 65 46 69 6c 65 20  " $templateFile 
3eb0: 22 5c 22 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  "\" does not exi
3ec0: 73 74 22 5d 0a 7d 0a 0a 73 65 74 20 63 75 72 72  st"].}..set curr
3ed0: 65 6e 74 44 69 72 65 63 74 6f 72 79 20 5b 70 77  entDirectory [pw
3ee0: 64 5d 0a 73 65 74 20 6f 75 74 70 75 74 46 69 6c  d].set outputFil
3ef0: 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 63 75  e [file join $cu
3f00: 72 72 65 6e 74 44 69 72 65 63 74 6f 72 79 20 5b  rrentDirectory [
3f10: 61 70 70 65 6e 64 41 72 67 73 20 73 71 6c 69 74  appendArgs sqlit
3f20: 65 2d 20 5c 0a 20 20 20 20 24 70 61 63 6b 61 67  e- \.    $packag
3f30: 65 46 6c 61 76 6f 72 20 2d 6f 75 74 70 75 74 2e  eFlavor -output.
3f40: 76 73 69 78 5d 5d 0a 0a 69 66 20 7b 5b 66 69 6c  vsix]]..if {[fil
3f50: 65 20 65 78 69 73 74 73 20 24 6f 75 74 70 75 74  e exists $output
3f60: 46 69 6c 65 5d 7d 20 74 68 65 6e 20 7b 0a 20 20  File]} then {.  
3f70: 66 61 69 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  fail [appendArgs
3f80: 20 22 6f 75 74 70 75 74 20 66 69 6c 65 20 5c 22   "output file \"
3f90: 22 20 24 6f 75 74 70 75 74 46 69 6c 65 20 22 5c  " $outputFile "\
3fa0: 22 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  " already exists
3fb0: 22 5d 0a 7d 0a 0a 23 23 23 23 23 23 23 23 23 23  "].}..##########
3fc0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3fd0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3fe0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3ff0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4000: 23 23 23 23 23 0a 0a 23 0a 23 20 4e 4f 54 45 3a  #####..#.# NOTE:
4010: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   Make sure that 
4020: 61 20 76 61 6c 69 64 20 74 65 6d 70 6f 72 61 72  a valid temporar
4030: 79 20 64 69 72 65 63 74 6f 72 79 20 65 78 69 73  y directory exis
4040: 74 73 2e 0a 23 0a 73 65 74 20 74 65 6d 70 6f 72  ts..#.set tempor
4050: 61 72 79 44 69 72 65 63 74 6f 72 79 20 5b 67 65  aryDirectory [ge
4060: 74 54 65 6d 70 6f 72 61 72 79 50 61 74 68 5d 0a  tTemporaryPath].
4070: 0a 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e  .if {[string len
4080: 67 74 68 20 24 74 65 6d 70 6f 72 61 72 79 44 69  gth $temporaryDi
4090: 72 65 63 74 6f 72 79 5d 20 3d 3d 20 30 20 7c 7c  rectory] == 0 ||
40a0: 20 5c 0a 20 20 20 20 21 5b 66 69 6c 65 20 65 78   \.    ![file ex
40b0: 69 73 74 73 20 24 74 65 6d 70 6f 72 61 72 79 44  ists $temporaryD
40c0: 69 72 65 63 74 6f 72 79 5d 20 7c 7c 20 5c 0a 20  irectory] || \. 
40d0: 20 20 20 21 5b 66 69 6c 65 20 69 73 64 69 72 65     ![file isdire
40e0: 63 74 6f 72 79 20 24 74 65 6d 70 6f 72 61 72 79  ctory $temporary
40f0: 44 69 72 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e  Directory]} then
4100: 20 7b 0a 20 20 66 61 69 6c 20 22 63 61 6e 6e 6f   {.  fail "canno
4110: 74 20 6c 6f 63 61 74 65 20 61 20 75 73 61 62 6c  t locate a usabl
4120: 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65  e temporary dire
4130: 63 74 6f 72 79 22 0a 7d 0a 0a 23 0a 23 20 4e 4f  ctory".}..#.# NO
4140: 54 45 3a 20 53 65 74 75 70 20 74 68 65 20 73 74  TE: Setup the st
4150: 61 67 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20  aging directory 
4160: 74 6f 20 68 61 76 65 20 61 20 75 6e 69 71 75 65  to have a unique
4170: 20 6e 61 6d 65 20 69 6e 73 69 64 65 20 6f 66 20   name inside of 
4180: 74 68 65 0a 23 20 20 20 20 20 20 20 63 6f 6e 66  the.#       conf
4190: 69 67 75 72 65 64 20 74 65 6d 70 6f 72 61 72 79  igured temporary
41a0: 20 64 69 72 65 63 74 6f 72 79 2e 0a 23 0a 73 65   directory..#.se
41b0: 74 20 73 74 61 67 69 6e 67 44 69 72 65 63 74 6f  t stagingDirecto
41c0: 72 79 20 5b 66 69 6c 65 20 6e 6f 72 6d 61 6c 69  ry [file normali
41d0: 7a 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 74  ze [file join $t
41e0: 65 6d 70 6f 72 61 72 79 44 69 72 65 63 74 6f 72  emporaryDirector
41f0: 79 20 5c 0a 20 20 20 20 5b 61 70 70 65 6e 64 41  y \.    [appendA
4200: 72 67 73 20 24 72 6f 6f 74 4e 61 6d 65 20 2e 20  rgs $rootName . 
4210: 5b 70 69 64 5d 5d 5d 5d 0a 0a 23 23 23 23 23 23  [pid]]]]..######
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 23  ################
4260: 23 23 23 23 23 23 23 23 23 0a 0a 23 0a 23 20 4e  #########..#.# N
4270: 4f 54 45 3a 20 43 6f 6e 66 69 67 75 72 65 20 74  OTE: Configure t
4280: 68 65 20 65 78 74 65 72 6e 61 6c 20 7a 69 70 70  he external zipp
4290: 69 6e 67 20 74 6f 6f 6c 2e 20 20 46 69 72 73 74  ing tool.  First
42a0: 2c 20 73 65 65 20 69 66 20 69 74 20 68 61 73 20  , see if it has 
42b0: 61 6c 72 65 61 64 79 0a 23 20 20 20 20 20 20 20  already.#       
42c0: 62 65 65 6e 20 70 72 65 2d 63 6f 6e 66 69 67 75  been pre-configu
42d0: 72 65 64 2e 20 20 49 66 20 6e 6f 74 2c 20 74 72  red.  If not, tr
42e0: 79 20 74 6f 20 71 75 65 72 79 20 69 74 20 66 72  y to query it fr
42f0: 6f 6d 20 74 68 65 20 65 6e 76 69 72 6f 6e 6d 65  om the environme
4300: 6e 74 2e 0a 23 20 20 20 20 20 20 20 46 69 6e 61  nt..#       Fina
4310: 6c 6c 79 2c 20 66 61 6c 6c 62 61 63 6b 20 6f 6e  lly, fallback on
4320: 20 74 68 65 20 64 65 66 61 75 6c 74 20 6f 66 20   the default of 
4330: 73 69 6d 70 6c 79 20 22 7a 69 70 22 2c 20 77 68  simply "zip", wh
4340: 69 63 68 20 77 69 6c 6c 20 74 68 65 6e 0a 23 20  ich will then.# 
4350: 20 20 20 20 20 20 62 65 20 61 73 73 75 6d 65 64        be assumed
4360: 20 74 6f 20 65 78 69 73 74 20 73 6f 6d 65 77 68   to exist somewh
4370: 65 72 65 20 61 6c 6f 6e 67 20 74 68 65 20 50 41  ere along the PA
4380: 54 48 2e 0a 23 0a 69 66 20 7b 21 5b 69 6e 66 6f  TH..#.if {![info
4390: 20 65 78 69 73 74 73 20 7a 69 70 5d 7d 20 74 68   exists zip]} th
43a0: 65 6e 20 7b 0a 20 20 69 66 20 7b 5b 69 6e 66 6f  en {.  if {[info
43b0: 20 65 78 69 73 74 73 20 65 6e 76 28 5a 69 70 54   exists env(ZipT
43c0: 6f 6f 6c 29 5d 7d 20 74 68 65 6e 20 7b 0a 20 20  ool)]} then {.  
43d0: 20 20 73 65 74 20 7a 69 70 20 24 65 6e 76 28 5a    set zip $env(Z
43e0: 69 70 54 6f 6f 6c 29 0a 20 20 7d 0a 20 20 69 66  ipTool).  }.  if
43f0: 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
4400: 7a 69 70 5d 20 7c 7c 20 21 5b 66 69 6c 65 20 65  zip] || ![file e
4410: 78 69 73 74 73 20 24 7a 69 70 5d 7d 20 74 68 65  xists $zip]} the
4420: 6e 20 7b 0a 20 20 20 20 73 65 74 20 7a 69 70 20  n {.    set zip 
4430: 7a 69 70 0a 20 20 7d 0a 7d 0a 0a 23 0a 23 20 4e  zip.  }.}..#.# N
4440: 4f 54 45 3a 20 43 6f 6e 66 69 67 75 72 65 20 74  OTE: Configure t
4450: 68 65 20 65 78 74 65 72 6e 61 6c 20 75 6e 7a 69  he external unzi
4460: 70 70 69 6e 67 20 74 6f 6f 6c 2e 20 20 46 69 72  pping tool.  Fir
4470: 73 74 2c 20 73 65 65 20 69 66 20 69 74 20 68 61  st, see if it ha
4480: 73 20 61 6c 72 65 61 64 79 0a 23 20 20 20 20 20  s already.#     
4490: 20 20 62 65 65 6e 20 70 72 65 2d 63 6f 6e 66 69    been pre-confi
44a0: 67 75 72 65 64 2e 20 20 49 66 20 6e 6f 74 2c 20  gured.  If not, 
44b0: 74 72 79 20 74 6f 20 71 75 65 72 79 20 69 74 20  try to query it 
44c0: 66 72 6f 6d 20 74 68 65 20 65 6e 76 69 72 6f 6e  from the environ
44d0: 6d 65 6e 74 2e 0a 23 20 20 20 20 20 20 20 46 69  ment..#       Fi
44e0: 6e 61 6c 6c 79 2c 20 66 61 6c 6c 62 61 63 6b 20  nally, fallback 
44f0: 6f 6e 20 74 68 65 20 64 65 66 61 75 6c 74 20 6f  on the default o
4500: 66 20 73 69 6d 70 6c 79 20 22 75 6e 7a 69 70 22  f simply "unzip"
4510: 2c 20 77 68 69 63 68 20 77 69 6c 6c 20 74 68 65  , which will the
4520: 6e 0a 23 20 20 20 20 20 20 20 62 65 20 61 73 73  n.#       be ass
4530: 75 6d 65 64 20 74 6f 20 65 78 69 73 74 20 73 6f  umed to exist so
4540: 6d 65 77 68 65 72 65 20 61 6c 6f 6e 67 20 74 68  mewhere along th
4550: 65 20 50 41 54 48 2e 0a 23 0a 69 66 20 7b 21 5b  e PATH..#.if {![
4560: 69 6e 66 6f 20 65 78 69 73 74 73 20 75 6e 7a 69  info exists unzi
4570: 70 5d 7d 20 74 68 65 6e 20 7b 0a 20 20 69 66 20  p]} then {.  if 
4580: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 65 6e  {[info exists en
4590: 76 28 55 6e 5a 69 70 54 6f 6f 6c 29 5d 7d 20 74  v(UnZipTool)]} t
45a0: 68 65 6e 20 7b 0a 20 20 20 20 73 65 74 20 75 6e  hen {.    set un
45b0: 7a 69 70 20 24 65 6e 76 28 55 6e 5a 69 70 54 6f  zip $env(UnZipTo
45c0: 6f 6c 29 0a 20 20 7d 0a 20 20 69 66 20 7b 21 5b  ol).  }.  if {![
45d0: 69 6e 66 6f 20 65 78 69 73 74 73 20 75 6e 7a 69  info exists unzi
45e0: 70 5d 20 7c 7c 20 21 5b 66 69 6c 65 20 65 78 69  p] || ![file exi
45f0: 73 74 73 20 24 75 6e 7a 69 70 5d 7d 20 74 68 65  sts $unzip]} the
4600: 6e 20 7b 0a 20 20 20 20 73 65 74 20 75 6e 7a 69  n {.    set unzi
4610: 70 20 75 6e 7a 69 70 0a 20 20 7d 0a 7d 0a 0a 23  p unzip.  }.}..#
4620: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4630: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4640: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4650: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4660: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 0a  ##############..
4670: 23 0a 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70  #.# NOTE: Attemp
4680: 74 20 74 6f 20 65 78 74 72 61 63 74 20 74 68 65  t to extract the
4690: 20 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 20   SQLite version 
46a0: 66 72 6f 6d 20 74 68 65 20 22 73 71 6c 69 74 65  from the "sqlite
46b0: 33 2e 68 22 20 68 65 61 64 65 72 20 66 69 6c 65  3.h" header file
46c0: 0a 23 20 20 20 20 20 20 20 69 6e 20 74 68 65 20  .#       in the 
46d0: 73 6f 75 72 63 65 20 64 69 72 65 63 74 6f 72 79  source directory
46e0: 2e 20 20 54 68 69 73 20 73 63 72 69 70 74 20 61  .  This script a
46f0: 73 73 75 6d 65 73 20 74 68 61 74 20 74 68 65 20  ssumes that the 
4700: 68 65 61 64 65 72 20 66 69 6c 65 20 68 61 73 0a  header file has.
4710: 23 20 20 20 20 20 20 20 61 6c 72 65 61 64 79 20  #       already 
4720: 62 65 65 6e 20 67 65 6e 65 72 61 74 65 64 20 62  been generated b
4730: 79 20 74 68 65 20 62 75 69 6c 64 20 70 72 6f 63  y the build proc
4740: 65 73 73 2e 0a 23 0a 73 65 74 20 70 61 74 74 65  ess..#.set patte
4750: 72 6e 20 7b 5e 23 64 65 66 69 6e 65 5c 73 2b 53  rn {^#define\s+S
4760: 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5c 73 2b  QLITE_VERSION\s+
4770: 22 28 2e 2a 29 22 24 7d 0a 73 65 74 20 64 61 74  "(.*)"$}.set dat
4780: 61 20 5b 72 65 61 64 46 69 6c 65 20 5b 66 69 6c  a [readFile [fil
4790: 65 20 6a 6f 69 6e 20 24 73 6f 75 72 63 65 44 69  e join $sourceDi
47a0: 72 65 63 74 6f 72 79 20 73 71 6c 69 74 65 33 2e  rectory sqlite3.
47b0: 68 5d 5d 0a 0a 69 66 20 7b 21 5b 72 65 67 65 78  h]]..if {![regex
47c0: 70 20 2d 6c 69 6e 65 20 2d 2d 20 24 70 61 74 74  p -line -- $patt
47d0: 65 72 6e 20 24 64 61 74 61 20 64 75 6d 6d 79 20  ern $data dummy 
47e0: 76 65 72 73 69 6f 6e 5d 7d 20 74 68 65 6e 20 7b  version]} then {
47f0: 0a 20 20 66 61 69 6c 20 5b 61 70 70 65 6e 64 41  .  fail [appendA
4800: 72 67 73 20 22 63 61 6e 6e 6f 74 20 6c 6f 63 61  rgs "cannot loca
4810: 74 65 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f  te SQLITE_VERSIO
4820: 4e 20 76 61 6c 75 65 20 69 6e 20 5c 22 22 20 5c  N value in \"" \
4830: 0a 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69  .      [file joi
4840: 6e 20 24 73 6f 75 72 63 65 44 69 72 65 63 74 6f  n $sourceDirecto
4850: 72 79 20 73 71 6c 69 74 65 33 2e 68 5d 20 5c 22  ry sqlite3.h] \"
4860: 5d 0a 7d 0a 0a 23 23 23 23 23 23 23 23 23 23 23  ].}..###########
4870: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4880: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4890: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
48a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
48b0: 23 23 23 23 0a 0a 23 0a 23 20 4e 4f 54 45 3a 20  ####..#.# NOTE: 
48c0: 53 65 74 75 70 20 61 6c 6c 20 74 68 65 20 6d 61  Setup all the ma
48d0: 73 74 65 72 20 66 69 6c 65 20 6c 69 73 74 20 64  ster file list d
48e0: 61 74 61 2e 20 20 54 68 69 73 20 69 6e 63 6c 75  ata.  This inclu
48f0: 64 65 73 20 74 68 65 20 73 6f 75 72 63 65 20 66  des the source f
4900: 69 6c 65 0a 23 20 20 20 20 20 20 20 6e 61 6d 65  ile.#       name
4910: 73 2c 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  s, the destinati
4920: 6f 6e 20 66 69 6c 65 20 6e 61 6d 65 73 2c 20 61  on file names, a
4930: 6e 64 20 74 68 65 20 66 69 6c 65 20 70 72 6f 63  nd the file proc
4940: 65 73 73 69 6e 67 20 66 6c 61 67 73 2e 20 20 54  essing flags.  T
4950: 68 65 0a 23 20 20 20 20 20 20 20 70 6f 73 73 69  he.#       possi
4960: 62 6c 65 20 66 69 6c 65 20 70 72 6f 63 65 73 73  ble file process
4970: 69 6e 67 20 66 6c 61 67 73 20 61 72 65 3a 0a 23  ing flags are:.#
4980: 0a 23 20 20 20 20 20 20 20 22 62 75 69 6c 64 4e  .#       "buildN
4990: 65 75 74 72 61 6c 22 20 2d 2d 20 54 68 69 73 20  eutral" -- This 
49a0: 66 6c 61 67 20 69 6e 64 69 63 61 74 65 73 20 74  flag indicates t
49b0: 68 65 20 66 69 6c 65 20 6c 6f 63 61 74 69 6f 6e  he file location
49c0: 20 61 6e 64 20 63 6f 6e 74 65 6e 74 20 64 6f 0a   and content do.
49d0: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
49e0: 20 20 20 20 20 20 20 20 20 20 6e 6f 74 20 64 65            not de
49f0: 70 65 6e 64 20 6f 6e 20 74 68 65 20 62 75 69 6c  pend on the buil
4a00: 64 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e  d configuration.
4a10: 0a 23 0a 23 20 20 20 20 20 20 20 22 70 6c 61 74  .#.#       "plat
4a20: 66 6f 72 6d 4e 65 75 74 72 61 6c 22 20 2d 2d 20  formNeutral" -- 
4a30: 54 68 69 73 20 66 6c 61 67 20 69 6e 64 69 63 61  This flag indica
4a40: 74 65 73 20 74 68 65 20 66 69 6c 65 20 6c 6f 63  tes the file loc
4a50: 61 74 69 6f 6e 20 61 6e 64 20 63 6f 6e 74 65 6e  ation and conten
4a60: 74 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  t.#             
4a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
4a80: 6f 20 6e 6f 74 20 64 65 70 65 6e 64 20 6f 6e 20  o not depend on 
4a90: 74 68 65 20 62 75 69 6c 64 20 70 6c 61 74 66 6f  the build platfo
4aa0: 72 6d 2e 0a 23 0a 23 20 20 20 20 20 20 20 22 73  rm..#.#       "s
4ab0: 75 62 73 74 22 20 2d 2d 20 54 68 69 73 20 66 6c  ubst" -- This fl
4ac0: 61 67 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  ag indicates tha
4ad0: 74 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61  t the file conta
4ae0: 69 6e 73 20 64 79 6e 61 6d 69 63 20 74 65 78 74  ins dynamic text
4af0: 75 61 6c 0a 23 20 20 20 20 20 20 20 20 20 20 20  ual.#           
4b00: 20 20 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 74         content t
4b10: 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20  hat needs to be 
4b20: 70 72 6f 63 65 73 73 65 64 20 75 73 69 6e 67 20  processed using 
4b30: 5b 73 75 62 73 74 5d 20 70 72 69 6f 72 20 74 6f  [subst] prior to
4b40: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
4b50: 20 20 20 20 70 61 63 6b 61 67 69 6e 67 20 74 68      packaging th
4b60: 65 20 66 69 6c 65 20 69 6e 74 6f 20 74 68 65 20  e file into the 
4b70: 66 69 6e 61 6c 20 56 53 49 58 20 70 61 63 6b 61  final VSIX packa
4b80: 67 65 2e 20 20 54 68 65 20 70 72 69 6d 61 72 79  ge.  The primary
4b90: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
4ba0: 20 20 20 20 75 73 65 20 6f 66 20 74 68 69 73 20      use of this 
4bb0: 66 6c 61 67 20 69 73 20 74 6f 20 69 6e 73 65 72  flag is to inser
4bc0: 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  t the name of th
4bd0: 65 20 56 53 49 58 20 70 61 63 6b 61 67 65 2c 0a  e VSIX package,.
4be0: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
4bf0: 20 20 20 73 6f 6d 65 20 70 61 63 6b 61 67 65 20     some package 
4c00: 66 6c 61 76 6f 72 2d 73 70 65 63 69 66 69 63 20  flavor-specific 
4c10: 76 61 6c 75 65 2c 20 6f 72 20 74 68 65 20 53 51  value, or the SQ
4c20: 4c 69 74 65 20 76 65 72 73 69 6f 6e 0a 23 20 20  Lite version.#  
4c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c40: 69 6e 74 6f 20 61 20 66 69 6c 65 2e 0a 23 0a 23  into a file..#.#
4c50: 20 20 20 20 20 20 20 22 6e 6f 44 65 62 75 67 22         "noDebug"
4c60: 20 2d 2d 20 54 68 69 73 20 66 6c 61 67 20 69 6e   -- This flag in
4c70: 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65  dicates that the
4c80: 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20   file should be 
4c90: 73 6b 69 70 70 65 64 20 77 68 65 6e 0a 23 20 20  skipped when.#  
4ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cb0: 20 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68 65    processing the
4cc0: 20 64 65 62 75 67 20 62 75 69 6c 64 2e 0a 23 0a   debug build..#.
4cd0: 23 20 20 20 20 20 20 20 22 6e 6f 52 65 74 61 69  #       "noRetai
4ce0: 6c 22 20 2d 2d 20 54 68 69 73 20 66 6c 61 67 20  l" -- This flag 
4cf0: 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74  indicates that t
4d00: 68 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62  he file should b
4d10: 65 20 73 6b 69 70 70 65 64 20 77 68 65 6e 0a 23  e skipped when.#
4d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d30: 20 20 20 20 20 70 72 6f 63 65 73 73 69 6e 67 20       processing 
4d40: 74 68 65 20 72 65 74 61 69 6c 20 62 75 69 6c 64  the retail build
4d50: 2e 0a 23 0a 23 20 20 20 20 20 20 20 22 6d 6f 76  ..#.#       "mov
4d60: 65 22 20 2d 2d 20 54 68 69 73 20 66 6c 61 67 20  e" -- This flag 
4d70: 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74  indicates that t
4d80: 68 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62  he file should b
4d90: 65 20 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  e moved from the
4da0: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
4db0: 20 20 20 73 6f 75 72 63 65 20 74 6f 20 74 68 65     source to the
4dc0: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 6e 73   destination ins
4dd0: 74 65 61 64 20 6f 66 20 62 65 69 6e 67 20 63 6f  tead of being co
4de0: 70 69 65 64 2e 0a 23 0a 23 20 20 20 20 20 20 20  pied..#.#       
4df0: 54 68 69 73 20 66 69 6c 65 20 6d 65 74 61 64 61  This file metada
4e00: 74 61 20 6d 61 79 20 62 65 20 6f 76 65 72 72 69  ta may be overri
4e10: 64 64 65 6e 2c 20 65 69 74 68 65 72 20 69 6e 20  dden, either in 
4e20: 77 68 6f 6c 65 20 6f 72 20 69 6e 20 70 61 72 74  whole or in part
4e30: 2c 20 76 69 61 0a 23 20 20 20 20 20 20 20 74 68  , via.#       th
4e40: 65 20 75 73 65 72 2d 73 70 65 63 69 66 69 63 20  e user-specific 
4e50: 63 75 73 74 6f 6d 69 7a 61 74 69 6f 6e 73 20 66  customizations f
4e60: 69 6c 65 2e 0a 23 0a 69 66 20 7b 21 5b 69 6e 66  ile..#.if {![inf
4e70: 6f 20 65 78 69 73 74 73 20 66 69 6c 65 4e 61 6d  o exists fileNam
4e80: 65 73 28 73 6f 75 72 63 65 29 5d 7d 20 74 68 65  es(source)]} the
4e90: 6e 20 7b 0a 20 20 73 65 74 20 66 69 6c 65 4e 61  n {.  set fileNa
4ea0: 6d 65 73 28 73 6f 75 72 63 65 29 20 5b 6c 69 73  mes(source) [lis
4eb0: 74 20 22 22 20 22 22 20 5c 0a 20 20 20 20 5b 66  t "" "" \.    [f
4ec0: 69 6c 65 20 6a 6f 69 6e 20 24 73 74 61 67 69 6e  ile join $stagin
4ed0: 67 44 69 72 65 63 74 6f 72 79 20 44 65 73 69 67  gDirectory Desig
4ee0: 6e 54 69 6d 65 20 3c 62 75 69 6c 64 3e 20 3c 70  nTime <build> <p
4ef0: 6c 61 74 66 6f 72 6d 3e 20 73 71 6c 69 74 65 33  latform> sqlite3
4f00: 2e 70 72 6f 70 73 5d 20 5c 0a 20 20 20 20 5b 66  .props] \.    [f
4f10: 69 6c 65 20 6a 6f 69 6e 20 24 73 6f 75 72 63 65  ile join $source
4f20: 44 69 72 65 63 74 6f 72 79 20 73 71 6c 69 74 65  Directory sqlite
4f30: 33 2e 68 5d 20 5c 0a 20 20 20 20 5b 66 69 6c 65  3.h] \.    [file
4f40: 20 6a 6f 69 6e 20 24 62 69 6e 61 72 79 44 69 72   join $binaryDir
4f50: 65 63 74 6f 72 79 20 3c 62 75 69 6c 64 3e 20 3c  ectory <build> <
4f60: 70 6c 61 74 66 6f 72 6d 3e 20 73 71 6c 69 74 65  platform> sqlite
4f70: 33 2e 6c 69 62 5d 20 5c 0a 20 20 20 20 5b 66 69  3.lib] \.    [fi
4f80: 6c 65 20 6a 6f 69 6e 20 24 62 69 6e 61 72 79 44  le join $binaryD
4f90: 69 72 65 63 74 6f 72 79 20 3c 62 75 69 6c 64 3e  irectory <build>
4fa0: 20 3c 70 6c 61 74 66 6f 72 6d 3e 20 73 71 6c 69   <platform> sqli
4fb0: 74 65 33 2e 64 6c 6c 5d 5d 0a 0a 20 20 69 66 20  te3.dll]]..  if 
4fc0: 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 6e  {![info exists n
4fd0: 6f 28 73 79 6d 62 6f 6c 73 29 5d 7d 20 74 68 65  o(symbols)]} the
4fe0: 6e 20 7b 0a 20 20 20 20 6c 61 70 70 65 6e 64 20  n {.    lappend 
4ff0: 66 69 6c 65 4e 61 6d 65 73 28 73 6f 75 72 63 65  fileNames(source
5000: 29 20 5c 0a 20 20 20 20 20 20 20 20 5b 66 69 6c  ) \.        [fil
5010: 65 20 6a 6f 69 6e 20 24 62 69 6e 61 72 79 44 69  e join $binaryDi
5020: 72 65 63 74 6f 72 79 20 3c 62 75 69 6c 64 3e 20  rectory <build> 
5030: 3c 70 6c 61 74 66 6f 72 6d 3e 20 73 71 6c 69 74  <platform> sqlit
5040: 65 33 2e 70 64 62 5d 0a 20 20 7d 0a 7d 0a 0a 69  e3.pdb].  }.}..i
5050: 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
5060: 20 66 69 6c 65 4e 61 6d 65 73 28 64 65 73 74 69   fileNames(desti
5070: 6e 61 74 69 6f 6e 29 5d 7d 20 74 68 65 6e 20 7b  nation)]} then {
5080: 0a 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 73  .  set fileNames
5090: 28 64 65 73 74 69 6e 61 74 69 6f 6e 29 20 5b 6c  (destination) [l
50a0: 69 73 74 20 5c 0a 20 20 20 20 5b 66 69 6c 65 20  ist \.    [file 
50b0: 6a 6f 69 6e 20 24 73 74 61 67 69 6e 67 44 69 72  join $stagingDir
50c0: 65 63 74 6f 72 79 20 65 78 74 65 6e 73 69 6f 6e  ectory extension
50d0: 2e 76 73 69 78 6d 61 6e 69 66 65 73 74 5d 20 5c  .vsixmanifest] \
50e0: 0a 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  .    [file join 
50f0: 24 73 74 61 67 69 6e 67 44 69 72 65 63 74 6f 72  $stagingDirector
5100: 79 20 53 44 4b 4d 61 6e 69 66 65 73 74 2e 78 6d  y SDKManifest.xm
5110: 6c 5d 20 5c 0a 20 20 20 20 5b 66 69 6c 65 20 6a  l] \.    [file j
5120: 6f 69 6e 20 24 73 74 61 67 69 6e 67 44 69 72 65  oin $stagingDire
5130: 63 74 6f 72 79 20 44 65 73 69 67 6e 54 69 6d 65  ctory DesignTime
5140: 20 3c 62 75 69 6c 64 3e 20 3c 70 6c 61 74 66 6f   <build> <platfo
5150: 72 6d 3e 20 3c 6e 61 6d 65 3e 2e 70 72 6f 70 73  rm> <name>.props
5160: 5d 20 5c 0a 20 20 20 20 5b 66 69 6c 65 20 6a 6f  ] \.    [file jo
5170: 69 6e 20 24 73 74 61 67 69 6e 67 44 69 72 65 63  in $stagingDirec
5180: 74 6f 72 79 20 44 65 73 69 67 6e 54 69 6d 65 20  tory DesignTime 
5190: 3c 62 75 69 6c 64 3e 20 3c 70 6c 61 74 66 6f 72  <build> <platfor
51a0: 6d 3e 20 73 71 6c 69 74 65 33 2e 68 5d 20 5c 0a  m> sqlite3.h] \.
51b0: 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24      [file join $
51c0: 73 74 61 67 69 6e 67 44 69 72 65 63 74 6f 72 79  stagingDirectory
51d0: 20 44 65 73 69 67 6e 54 69 6d 65 20 3c 62 75 69   DesignTime <bui
51e0: 6c 64 3e 20 3c 70 6c 61 74 66 6f 72 6d 3e 20 73  ld> <platform> s
51f0: 71 6c 69 74 65 33 2e 6c 69 62 5d 20 5c 0a 20 20  qlite3.lib] \.  
5200: 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 73 74    [file join $st
5210: 61 67 69 6e 67 44 69 72 65 63 74 6f 72 79 20 52  agingDirectory R
5220: 65 64 69 73 74 20 3c 62 75 69 6c 64 3e 20 3c 70  edist <build> <p
5230: 6c 61 74 66 6f 72 6d 3e 20 73 71 6c 69 74 65 33  latform> sqlite3
5240: 2e 64 6c 6c 5d 5d 0a 0a 20 20 69 66 20 7b 21 5b  .dll]]..  if {![
5250: 69 6e 66 6f 20 65 78 69 73 74 73 20 6e 6f 28 73  info exists no(s
5260: 79 6d 62 6f 6c 73 29 5d 7d 20 74 68 65 6e 20 7b  ymbols)]} then {
5270: 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 66 69 6c  .    lappend fil
5280: 65 4e 61 6d 65 73 28 64 65 73 74 69 6e 61 74 69  eNames(destinati
5290: 6f 6e 29 20 5c 0a 20 20 20 20 20 20 20 20 5b 66  on) \.        [f
52a0: 69 6c 65 20 6a 6f 69 6e 20 24 73 74 61 67 69 6e  ile join $stagin
52b0: 67 44 69 72 65 63 74 6f 72 79 20 52 65 64 69 73  gDirectory Redis
52c0: 74 20 3c 62 75 69 6c 64 3e 20 3c 70 6c 61 74 66  t <build> <platf
52d0: 6f 72 6d 3e 20 73 71 6c 69 74 65 33 2e 70 64 62  orm> sqlite3.pdb
52e0: 5d 0a 20 20 7d 0a 7d 0a 0a 69 66 20 7b 21 5b 69  ].  }.}..if {![i
52f0: 6e 66 6f 20 65 78 69 73 74 73 20 66 69 6c 65 4e  nfo exists fileN
5300: 61 6d 65 73 28 66 6c 61 67 73 29 5d 7d 20 74 68  ames(flags)]} th
5310: 65 6e 20 7b 0a 20 20 73 65 74 20 66 69 6c 65 4e  en {.  set fileN
5320: 61 6d 65 73 28 66 6c 61 67 73 29 20 5b 6c 69 73  ames(flags) [lis
5330: 74 20 5c 0a 20 20 20 20 20 20 5b 6c 69 73 74 20  t \.      [list 
5340: 62 75 69 6c 64 4e 65 75 74 72 61 6c 20 70 6c 61  buildNeutral pla
5350: 74 66 6f 72 6d 4e 65 75 74 72 61 6c 20 73 75 62  tformNeutral sub
5360: 73 74 5d 20 5c 0a 20 20 20 20 20 20 5b 6c 69 73  st] \.      [lis
5370: 74 20 62 75 69 6c 64 4e 65 75 74 72 61 6c 20 70  t buildNeutral p
5380: 6c 61 74 66 6f 72 6d 4e 65 75 74 72 61 6c 20 73  latformNeutral s
5390: 75 62 73 74 5d 20 5c 0a 20 20 20 20 20 20 5b 6c  ubst] \.      [l
53a0: 69 73 74 20 62 75 69 6c 64 4e 65 75 74 72 61 6c  ist buildNeutral
53b0: 20 70 6c 61 74 66 6f 72 6d 4e 65 75 74 72 61 6c   platformNeutral
53c0: 20 73 75 62 73 74 20 6d 6f 76 65 5d 20 5c 0a 20   subst move] \. 
53d0: 20 20 20 20 20 5b 6c 69 73 74 20 62 75 69 6c 64       [list build
53e0: 4e 65 75 74 72 61 6c 20 70 6c 61 74 66 6f 72 6d  Neutral platform
53f0: 4e 65 75 74 72 61 6c 5d 20 5c 0a 20 20 20 20 20  Neutral] \.     
5400: 20 5b 6c 69 73 74 5d 20 5b 6c 69 73 74 5d 20 5b   [list] [list] [
5410: 6c 69 73 74 20 6e 6f 52 65 74 61 69 6c 5d 5d 0a  list noRetail]].
5420: 0a 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78  .  if {![info ex
5430: 69 73 74 73 20 6e 6f 28 73 79 6d 62 6f 6c 73 29  ists no(symbols)
5440: 5d 7d 20 74 68 65 6e 20 7b 0a 20 20 20 20 6c 61  ]} then {.    la
5450: 70 70 65 6e 64 20 66 69 6c 65 4e 61 6d 65 73 28  ppend fileNames(
5460: 66 6c 61 67 73 29 20 5b 6c 69 73 74 20 6e 6f 52  flags) [list noR
5470: 65 74 61 69 6c 5d 0a 20 20 7d 0a 7d 0a 0a 23 23  etail].  }.}..##
5480: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5490: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
54a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
54b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
54c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 0a 23  #############..#
54d0: 0a 23 20 4e 4f 54 45 3a 20 53 65 74 75 70 20 74  .# NOTE: Setup t
54e0: 68 65 20 6c 69 73 74 20 6f 66 20 62 75 69 6c 64  he list of build
54f0: 73 20 73 75 70 70 6f 72 74 65 64 20 62 79 20 74  s supported by t
5500: 68 69 73 20 73 63 72 69 70 74 2e 20 20 54 68 65  his script.  The
5510: 73 65 20 6d 61 79 20 62 65 0a 23 20 20 20 20 20  se may be.#     
5520: 20 20 6f 76 65 72 72 69 64 64 65 6e 20 76 69 61    overridden via
5530: 20 74 68 65 20 75 73 65 72 2d 73 70 65 63 69 66   the user-specif
5540: 69 63 20 63 75 73 74 6f 6d 69 7a 61 74 69 6f 6e  ic customization
5550: 73 20 66 69 6c 65 2e 0a 23 0a 69 66 20 7b 21 5b  s file..#.if {![
5560: 69 6e 66 6f 20 65 78 69 73 74 73 20 62 75 69 6c  info exists buil
5570: 64 4e 61 6d 65 73 5d 7d 20 74 68 65 6e 20 7b 0a  dNames]} then {.
5580: 20 20 73 65 74 20 62 75 69 6c 64 4e 61 6d 65 73    set buildNames
5590: 20 5b 6c 69 73 74 20 44 65 62 75 67 20 52 65 74   [list Debug Ret
55a0: 61 69 6c 5d 0a 7d 0a 0a 23 23 23 23 23 23 23 23  ail].}..########
55b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
55c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
55d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
55e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
55f0: 23 23 23 23 23 23 23 0a 0a 23 0a 23 20 4e 4f 54  #######..#.# NOT
5600: 45 3a 20 53 65 74 75 70 20 74 68 65 20 6c 69 73  E: Setup the lis
5610: 74 20 6f 66 20 70 6c 61 74 66 6f 72 6d 73 20 73  t of platforms s
5620: 75 70 70 6f 72 74 65 64 20 62 79 20 74 68 69 73  upported by this
5630: 20 73 63 72 69 70 74 2e 20 20 54 68 65 73 65 20   script.  These 
5640: 6d 61 79 20 62 65 0a 23 20 20 20 20 20 20 20 6f  may be.#       o
5650: 76 65 72 72 69 64 64 65 6e 20 76 69 61 20 74 68  verridden via th
5660: 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 6f  e command line o
5670: 72 20 74 68 65 20 75 73 65 72 2d 73 70 65 63 69  r the user-speci
5680: 66 69 63 20 63 75 73 74 6f 6d 69 7a 61 74 69 6f  fic customizatio
5690: 6e 73 0a 23 20 20 20 20 20 20 20 66 69 6c 65 2e  ns.#       file.
56a0: 0a 23 0a 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78  .#.if {![info ex
56b0: 69 73 74 73 20 70 6c 61 74 66 6f 72 6d 4e 61 6d  ists platformNam
56c0: 65 73 5d 20 7c 7c 20 5b 6c 6c 65 6e 67 74 68 20  es] || [llength 
56d0: 24 70 6c 61 74 66 6f 72 6d 4e 61 6d 65 73 5d 20  $platformNames] 
56e0: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0a 20 20 73  == 0} then {.  s
56f0: 65 74 20 70 6c 61 74 66 6f 72 6d 4e 61 6d 65 73  et platformNames
5700: 20 5b 6c 69 73 74 20 78 38 36 20 78 36 34 20 41   [list x86 x64 A
5710: 52 4d 5d 0a 7d 0a 0a 23 23 23 23 23 23 23 23 23  RM].}..#########
5720: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5730: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5740: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5750: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5760: 23 23 23 23 23 23 0a 0a 23 0a 23 20 4e 4f 54 45  ######..#.# NOTE
5770: 3a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  : Make sure the 
5780: 73 74 61 67 69 6e 67 20 64 69 72 65 63 74 6f 72  staging director
5790: 79 20 65 78 69 73 74 73 2c 20 63 72 65 61 74 69  y exists, creati
57a0: 6e 67 20 69 74 20 69 66 20 6e 65 63 65 73 73 61  ng it if necessa
57b0: 72 79 2e 0a 23 0a 66 69 6c 65 20 6d 6b 64 69 72  ry..#.file mkdir
57c0: 20 24 73 74 61 67 69 6e 67 44 69 72 65 63 74 6f   $stagingDirecto
57d0: 72 79 0a 0a 23 0a 23 20 4e 4f 54 45 3a 20 42 75  ry..#.# NOTE: Bu
57e0: 69 6c 64 20 74 68 65 20 54 63 6c 20 63 6f 6d 6d  ild the Tcl comm
57f0: 61 6e 64 20 75 73 65 64 20 74 6f 20 65 78 74 72  and used to extr
5800: 61 63 74 20 74 68 65 20 74 65 6d 70 6c 61 74 65  act the template
5810: 20 56 53 49 58 20 70 61 63 6b 61 67 65 20 74 6f   VSIX package to
5820: 0a 23 20 20 20 20 20 20 20 74 68 65 20 73 74 61  .#       the sta
5830: 67 69 6e 67 20 64 69 72 65 63 74 6f 72 79 2e 0a  ging directory..
5840: 23 0a 73 65 74 20 65 78 74 72 61 63 74 43 6f 6d  #.set extractCom
5850: 6d 61 6e 64 20 5b 6c 69 73 74 20 65 78 65 63 20  mand [list exec 
5860: 2d 2d 20 24 75 6e 7a 69 70 20 24 74 65 6d 70 6c  -- $unzip $templ
5870: 61 74 65 46 69 6c 65 20 2d 64 20 24 73 74 61 67  ateFile -d $stag
5880: 69 6e 67 44 69 72 65 63 74 6f 72 79 5d 0a 0a 23  ingDirectory]..#
5890: 0a 23 20 4e 4f 54 45 3a 20 45 78 74 72 61 63 74  .# NOTE: Extract
58a0: 20 74 68 65 20 74 65 6d 70 6c 61 74 65 20 56 53   the template VS
58b0: 49 58 20 70 61 63 6b 61 67 65 20 74 6f 20 74 68  IX package to th
58c0: 65 20 73 74 61 67 69 6e 67 20 64 69 72 65 63 74  e staging direct
58d0: 6f 72 79 2e 0a 23 0a 65 76 61 6c 20 24 65 78 74  ory..#.eval $ext
58e0: 72 61 63 74 43 6f 6d 6d 61 6e 64 0a 0a 23 23 23  ractCommand..###
58f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5900: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5910: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5920: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5930: 23 23 23 23 23 23 23 23 23 23 23 23 0a 0a 23 0a  ############..#.
5940: 23 20 4e 4f 54 45 3a 20 50 72 6f 63 65 73 73 20  # NOTE: Process 
5950: 65 61 63 68 20 66 69 6c 65 20 69 6e 20 74 68 65  each file in the
5960: 20 6d 61 73 74 65 72 20 66 69 6c 65 20 6c 69 73   master file lis
5970: 74 2e 20 20 54 68 65 72 65 20 61 72 65 20 61 63  t.  There are ac
5980: 74 75 61 6c 6c 79 20 74 68 72 65 65 0a 23 20 20  tually three.#  
5990: 20 20 20 20 20 70 61 72 61 6c 6c 65 6c 20 6c 69       parallel li
59a0: 73 74 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  sts that contain
59b0: 20 74 68 65 20 73 6f 75 72 63 65 20 66 69 6c 65   the source file
59c0: 20 6e 61 6d 65 73 2c 20 74 68 65 20 64 65 73 74   names, the dest
59d0: 69 6e 61 74 69 6f 6e 20 66 69 6c 65 0a 23 20 20  ination file.#  
59e0: 20 20 20 20 20 6e 61 6d 65 73 2c 20 61 6e 64 20       names, and 
59f0: 74 68 65 20 66 69 6c 65 20 70 72 6f 63 65 73 73  the file process
5a00: 69 6e 67 20 66 6c 61 67 73 2e 20 49 66 20 74 68  ing flags. If th
5a10: 65 20 22 62 75 69 6c 64 4e 65 75 74 72 61 6c 22  e "buildNeutral"
5a20: 20 66 6c 61 67 20 69 73 0a 23 20 20 20 20 20 20   flag is.#      
5a30: 20 70 72 65 73 65 6e 74 2c 20 74 68 65 20 66 69   present, the fi
5a40: 6c 65 20 6c 6f 63 61 74 69 6f 6e 20 61 6e 64 20  le location and 
5a50: 63 6f 6e 74 65 6e 74 20 64 6f 20 6e 6f 74 20 64  content do not d
5a60: 65 70 65 6e 64 20 6f 6e 20 74 68 65 20 62 75 69  epend on the bui
5a70: 6c 64 0a 23 20 20 20 20 20 20 20 63 6f 6e 66 69  ld.#       confi
5a80: 67 75 72 61 74 69 6f 6e 20 61 6e 64 20 22 43 6f  guration and "Co
5a90: 6d 6d 6f 6e 43 6f 6e 66 69 67 75 72 61 74 69 6f  mmonConfiguratio
5aa0: 6e 22 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  n" will be used 
5ab0: 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 65 0a  in place of the.
5ac0: 23 20 20 20 20 20 20 20 62 75 69 6c 64 20 63 6f  #       build co
5ad0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 6e 61 6d 65  nfiguration name
5ae0: 2e 20 20 49 66 20 74 68 65 20 22 70 6c 61 74 66  .  If the "platf
5af0: 6f 72 6d 4e 65 75 74 72 61 6c 22 20 66 6c 61 67  ormNeutral" flag
5b00: 20 69 73 20 70 72 65 73 65 6e 74 2c 0a 23 20 20   is present,.#  
5b10: 20 20 20 20 20 74 68 65 20 66 69 6c 65 20 6c 6f       the file lo
5b20: 63 61 74 69 6f 6e 20 61 6e 64 20 63 6f 6e 74 65  cation and conte
5b30: 6e 74 20 64 6f 20 6e 6f 74 20 64 65 70 65 6e 64  nt do not depend
5b40: 20 6f 6e 20 74 68 65 20 62 75 69 6c 64 20 70 6c   on the build pl
5b50: 61 74 66 6f 72 6d 20 61 6e 64 0a 23 20 20 20 20  atform and.#    
5b60: 20 20 20 22 6e 65 75 74 72 61 6c 22 20 77 69 6c     "neutral" wil
5b70: 6c 20 62 65 20 75 73 65 64 20 69 6e 20 70 6c 61  l be used in pla
5b80: 63 65 20 6f 66 20 74 68 65 20 62 75 69 6c 64 20  ce of the build 
5b90: 70 6c 61 74 66 6f 72 6d 20 6e 61 6d 65 2e 20 20  platform name.  
5ba0: 49 66 20 74 68 65 0a 23 20 20 20 20 20 20 20 22  If the.#       "
5bb0: 73 75 62 73 74 22 20 66 6c 61 67 20 69 73 20 70  subst" flag is p
5bc0: 72 65 73 65 6e 74 2c 20 74 68 65 20 66 69 6c 65  resent, the file
5bd0: 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 62   is assumed to b
5be0: 65 20 61 20 74 65 78 74 20 66 69 6c 65 20 74 68  e a text file th
5bf0: 61 74 20 6d 61 79 0a 23 20 20 20 20 20 20 20 63  at may.#       c
5c00: 6f 6e 74 61 69 6e 20 54 63 6c 20 76 61 72 69 61  ontain Tcl varia
5c10: 62 6c 65 2c 20 63 6f 6d 6d 61 6e 64 2c 20 61 6e  ble, command, an
5c20: 64 20 62 61 63 6b 73 6c 61 73 68 20 72 65 70 6c  d backslash repl
5c30: 61 63 65 6d 65 6e 74 73 2c 20 74 6f 20 62 65 0a  acements, to be.
5c40: 23 20 20 20 20 20 20 20 64 79 6e 61 6d 69 63 61  #       dynamica
5c50: 6c 6c 79 20 72 65 70 6c 61 63 65 64 20 64 75 72  lly replaced dur
5c60: 69 6e 67 20 70 72 6f 63 65 73 73 69 6e 67 20 75  ing processing u
5c70: 73 69 6e 67 20 74 68 65 20 54 63 6c 20 5b 73 75  sing the Tcl [su
5c80: 62 73 74 5d 20 63 6f 6d 6d 61 6e 64 2e 0a 23 20  bst] command..# 
5c90: 20 20 20 20 20 20 49 66 20 74 68 65 20 22 6e 6f        If the "no
5ca0: 44 65 62 75 67 22 20 66 6c 61 67 20 69 73 20 70  Debug" flag is p
5cb0: 72 65 73 65 6e 74 2c 20 74 68 65 20 66 69 6c 65  resent, the file
5cc0: 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64   will be skipped
5cd0: 20 77 68 65 6e 0a 23 20 20 20 20 20 20 20 70 72   when.#       pr
5ce0: 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 74 68 65  ocessing for the
5cf0: 20 64 65 62 75 67 20 62 75 69 6c 64 2e 20 20 49   debug build.  I
5d00: 66 20 74 68 65 20 22 6e 6f 52 65 74 61 69 6c 22  f the "noRetail"
5d10: 20 66 6c 61 67 20 69 73 20 70 72 65 73 65 6e 74   flag is present
5d20: 2c 20 74 68 65 0a 23 20 20 20 20 20 20 20 66 69  , the.#       fi
5d30: 6c 65 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70  le will be skipp
5d40: 65 64 20 77 68 65 6e 20 70 72 6f 63 65 73 73 69  ed when processi
5d50: 6e 67 20 66 6f 72 20 74 68 65 20 72 65 74 61 69  ng for the retai
5d60: 6c 20 62 75 69 6c 64 2e 20 20 49 66 20 74 68 65  l build.  If the
5d70: 0a 23 20 20 20 20 20 20 20 22 6d 6f 76 65 22 20  .#       "move" 
5d80: 66 6c 61 67 20 69 73 20 70 72 65 73 65 6e 74 2c  flag is present,
5d90: 20 74 68 65 20 73 6f 75 72 63 65 20 66 69 6c 65   the source file
5da0: 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64   will be deleted
5db0: 20 61 66 74 65 72 20 69 74 20 69 73 0a 23 20 20   after it is.#  
5dc0: 20 20 20 20 20 63 6f 70 69 65 64 20 74 6f 20 74       copied to t
5dd0: 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 66  he destination f
5de0: 69 6c 65 2e 20 20 49 66 20 74 68 65 20 73 6f 75  ile.  If the sou
5df0: 72 63 65 20 66 69 6c 65 20 6e 61 6d 65 20 69 73  rce file name is
5e00: 20 61 6e 20 65 6d 70 74 79 0a 23 20 20 20 20 20   an empty.#     
5e10: 20 20 73 74 72 69 6e 67 2c 20 74 68 65 20 64 65    string, the de
5e20: 73 74 69 6e 61 74 69 6f 6e 20 66 69 6c 65 20 6e  stination file n
5e30: 61 6d 65 20 77 69 6c 6c 20 62 65 20 61 73 73 75  ame will be assu
5e40: 6d 65 64 20 74 6f 20 61 6c 72 65 61 64 79 20 65  med to already e
5e50: 78 69 73 74 20 69 6e 0a 23 20 20 20 20 20 20 20  xist in.#       
5e60: 74 68 65 20 73 74 61 67 69 6e 67 20 64 69 72 65  the staging dire
5e70: 63 74 6f 72 79 20 61 6e 64 20 77 69 6c 6c 20 6e  ctory and will n
5e80: 6f 74 20 62 65 20 63 6f 70 69 65 64 3b 20 68 6f  ot be copied; ho
5e90: 77 65 76 65 72 2c 20 54 63 6c 20 76 61 72 69 61  wever, Tcl varia
5ea0: 62 6c 65 2c 0a 23 20 20 20 20 20 20 20 63 6f 6d  ble,.#       com
5eb0: 6d 61 6e 64 2c 20 61 6e 64 20 62 61 63 6b 73 6c  mand, and backsl
5ec0: 61 73 68 20 72 65 70 6c 61 63 65 6d 65 6e 74 73  ash replacements
5ed0: 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 70 65   may still be pe
5ee0: 72 66 6f 72 6d 65 64 20 6f 6e 20 74 68 65 0a 23  rformed on the.#
5ef0: 20 20 20 20 20 20 20 64 65 73 74 69 6e 61 74 69         destinati
5f00: 6f 6e 20 66 69 6c 65 20 70 72 69 6f 72 20 74 6f  on file prior to
5f10: 20 74 68 65 20 66 69 6e 61 6c 20 56 53 49 58 20   the final VSIX 
5f20: 70 61 63 6b 61 67 65 20 62 65 69 6e 67 20 62 75  package being bu
5f30: 69 6c 74 20 69 66 20 74 68 65 0a 23 20 20 20 20  ilt if the.#    
5f40: 20 20 20 22 73 75 62 73 74 22 20 66 6c 61 67 20     "subst" flag 
5f50: 69 73 20 70 72 65 73 65 6e 74 2e 0a 23 0a 66 6f  is present..#.fo
5f60: 72 65 61 63 68 20 73 6f 75 72 63 65 46 69 6c 65  reach sourceFile
5f70: 4e 61 6d 65 20 20 20 20 20 20 24 66 69 6c 65 4e  Name      $fileN
5f80: 61 6d 65 73 28 73 6f 75 72 63 65 29 20 5c 0a 20  ames(source) \. 
5f90: 20 20 20 20 20 20 20 64 65 73 74 69 6e 61 74 69         destinati
5fa0: 6f 6e 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65  onFileName $file
5fb0: 4e 61 6d 65 73 28 64 65 73 74 69 6e 61 74 69 6f  Names(destinatio
5fc0: 6e 29 20 5c 0a 20 20 20 20 20 20 20 20 66 69 6c  n) \.        fil
5fd0: 65 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20  eFlags          
5fe0: 20 24 66 69 6c 65 4e 61 6d 65 73 28 66 6c 61 67   $fileNames(flag
5ff0: 73 29 20 7b 0a 20 20 23 0a 20 20 23 20 4e 4f 54  s) {.  #.  # NOT
6000: 45 3a 20 50 72 6f 63 65 73 73 20 74 68 65 20 66  E: Process the f
6010: 69 6c 65 20 66 6c 61 67 73 20 69 6e 74 6f 20 73  ile flags into s
6020: 65 70 61 72 61 74 65 20 62 6f 6f 6c 65 61 6e 20  eparate boolean 
6030: 76 61 72 69 61 62 6c 65 73 20 74 68 61 74 20 6d  variables that m
6040: 61 79 20 62 65 0a 20 20 23 20 20 20 20 20 20 20  ay be.  #       
6050: 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  used within the 
6060: 6c 6f 6f 70 2e 0a 20 20 23 0a 20 20 73 65 74 20  loop..  #.  set 
6070: 69 73 42 75 69 6c 64 4e 65 75 74 72 61 6c 20 5b  isBuildNeutral [
6080: 65 78 70 72 20 7b 5b 6c 73 65 61 72 63 68 20 24  expr {[lsearch $
6090: 66 69 6c 65 46 6c 61 67 73 20 62 75 69 6c 64 4e  fileFlags buildN
60a0: 65 75 74 72 61 6c 5d 20 21 3d 20 2d 31 7d 5d 0a  eutral] != -1}].
60b0: 20 20 73 65 74 20 69 73 50 6c 61 74 66 6f 72 6d    set isPlatform
60c0: 4e 65 75 74 72 61 6c 20 5b 65 78 70 72 20 7b 5b  Neutral [expr {[
60d0: 6c 73 65 61 72 63 68 20 24 66 69 6c 65 46 6c 61  lsearch $fileFla
60e0: 67 73 20 70 6c 61 74 66 6f 72 6d 4e 65 75 74 72  gs platformNeutr
60f0: 61 6c 5d 20 21 3d 20 2d 31 7d 5d 0a 20 20 73 65  al] != -1}].  se
6100: 74 20 69 73 4d 6f 76 65 20 5b 65 78 70 72 20 7b  t isMove [expr {
6110: 5b 6c 73 65 61 72 63 68 20 24 66 69 6c 65 46 6c  [lsearch $fileFl
6120: 61 67 73 20 6d 6f 76 65 5d 20 21 3d 20 2d 31 7d  ags move] != -1}
6130: 5d 0a 20 20 73 65 74 20 75 73 65 53 75 62 73 74  ].  set useSubst
6140: 20 5b 65 78 70 72 20 7b 5b 6c 73 65 61 72 63 68   [expr {[lsearch
6150: 20 24 66 69 6c 65 46 6c 61 67 73 20 73 75 62 73   $fileFlags subs
6160: 74 5d 20 21 3d 20 2d 31 7d 5d 0a 0a 20 20 23 0a  t] != -1}]..  #.
6170: 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65    # NOTE: If the
6180: 20 63 75 72 72 65 6e 74 20 66 69 6c 65 20 69 73   current file is
6190: 20 62 75 69 6c 64 2d 6e 65 75 74 72 61 6c 2c 20   build-neutral, 
61a0: 74 68 65 6e 20 6f 6e 6c 79 20 6f 6e 65 20 62 75  then only one bu
61b0: 69 6c 64 20 77 69 6c 6c 0a 20 20 23 20 20 20 20  ild will.  #    
61c0: 20 20 20 62 65 20 70 72 6f 63 65 73 73 65 64 20     be processed 
61d0: 66 6f 72 20 69 74 2c 20 6e 61 6d 65 6c 79 20 22  for it, namely "
61e0: 43 6f 6d 6d 6f 6e 43 6f 6e 66 69 67 75 72 61 74  CommonConfigurat
61f0: 69 6f 6e 22 3b 20 6f 74 68 65 72 77 69 73 65 2c  ion"; otherwise,
6200: 20 65 61 63 68 0a 20 20 23 20 20 20 20 20 20 20   each.  #       
6210: 73 75 70 70 6f 72 74 65 64 20 62 75 69 6c 64 20  supported build 
6220: 77 69 6c 6c 20 62 65 20 70 72 6f 63 65 73 73 65  will be processe
6230: 64 20 66 6f 72 20 69 74 20 69 6e 64 69 76 69 64  d for it individ
6240: 75 61 6c 6c 79 2e 0a 20 20 23 0a 20 20 66 6f 72  ually..  #.  for
6250: 65 61 63 68 20 62 75 69 6c 64 4e 61 6d 65 20 5c  each buildName \
6260: 0a 20 20 20 20 20 20 5b 65 78 70 72 20 7b 24 69  .      [expr {$i
6270: 73 42 75 69 6c 64 4e 65 75 74 72 61 6c 20 3f 20  sBuildNeutral ? 
6280: 5b 6c 69 73 74 20 43 6f 6d 6d 6f 6e 43 6f 6e 66  [list CommonConf
6290: 69 67 75 72 61 74 69 6f 6e 5d 20 3a 20 24 62 75  iguration] : $bu
62a0: 69 6c 64 4e 61 6d 65 73 7d 5d 20 7b 0a 20 20 20  ildNames}] {.   
62b0: 20 23 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 53   #.    # NOTE: S
62c0: 68 6f 75 6c 64 20 74 68 65 20 63 75 72 72 65 6e  hould the curren
62d0: 74 20 66 69 6c 65 20 62 65 20 73 6b 69 70 70 65  t file be skippe
62e0: 64 20 66 6f 72 20 74 68 69 73 20 62 75 69 6c 64  d for this build
62f0: 3f 0a 20 20 20 20 23 0a 20 20 20 20 69 66 20 7b  ?.    #.    if {
6300: 5b 6c 73 65 61 72 63 68 20 24 66 69 6c 65 46 6c  [lsearch $fileFl
6310: 61 67 73 20 6e 6f 24 7b 62 75 69 6c 64 4e 61 6d  ags no${buildNam
6320: 65 7d 5d 20 21 3d 20 2d 31 7d 20 74 68 65 6e 20  e}] != -1} then 
6330: 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  {.      continue
6340: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 0a 20 20  .    }..    #.  
6350: 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65    # NOTE: If the
6360: 20 63 75 72 72 65 6e 74 20 66 69 6c 65 20 69 73   current file is
6370: 20 70 6c 61 74 66 6f 72 6d 2d 6e 65 75 74 72 61   platform-neutra
6380: 6c 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 6f 6e 65  l, then only one
6390: 20 70 6c 61 74 66 6f 72 6d 0a 20 20 20 20 23 20   platform.    # 
63a0: 20 20 20 20 20 20 77 69 6c 6c 20 62 65 20 70 72        will be pr
63b0: 6f 63 65 73 73 65 64 20 66 6f 72 20 69 74 2c 20  ocessed for it, 
63c0: 6e 61 6d 65 6c 79 20 22 6e 65 75 74 72 61 6c 22  namely "neutral"
63d0: 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 65 61 63  ; otherwise, eac
63e0: 68 0a 20 20 20 20 23 20 20 20 20 20 20 20 73 75  h.    #       su
63f0: 70 70 6f 72 74 65 64 20 70 6c 61 74 66 6f 72 6d  pported platform
6400: 20 77 69 6c 6c 20 62 65 20 70 72 6f 63 65 73 73   will be process
6410: 65 64 20 66 6f 72 20 69 74 20 69 6e 64 69 76 69  ed for it indivi
6420: 64 75 61 6c 6c 79 2e 0a 20 20 20 20 23 0a 20 20  dually..    #.  
6430: 20 20 66 6f 72 65 61 63 68 20 70 6c 61 74 66 6f    foreach platfo
6440: 72 6d 4e 61 6d 65 20 5c 0a 20 20 20 20 20 20 20  rmName \.       
6450: 20 5b 65 78 70 72 20 7b 24 69 73 50 6c 61 74 66   [expr {$isPlatf
6460: 6f 72 6d 4e 65 75 74 72 61 6c 20 3f 20 5b 6c 69  ormNeutral ? [li
6470: 73 74 20 6e 65 75 74 72 61 6c 5d 20 3a 20 24 70  st neutral] : $p
6480: 6c 61 74 66 6f 72 6d 4e 61 6d 65 73 7d 5d 20 7b  latformNames}] {
6490: 0a 20 20 20 20 20 20 23 0a 20 20 20 20 20 20 23  .      #.      #
64a0: 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 61   NOTE: Use the a
64b0: 63 74 75 61 6c 20 70 6c 61 74 66 6f 72 6d 20 6e  ctual platform n
64c0: 61 6d 65 20 69 6e 20 74 68 65 20 64 65 73 74 69  ame in the desti
64d0: 6e 61 74 69 6f 6e 20 66 69 6c 65 20 6e 61 6d 65  nation file name
64e0: 2e 0a 20 20 20 20 20 20 23 0a 20 20 20 20 20 20  ..      #.      
64f0: 73 65 74 20 6e 65 77 44 65 73 74 69 6e 61 74 69  set newDestinati
6500: 6f 6e 46 69 6c 65 4e 61 6d 65 20 5b 72 65 70 6c  onFileName [repl
6510: 61 63 65 46 69 6c 65 4e 61 6d 65 54 6f 6b 65 6e  aceFileNameToken
6520: 73 20 24 64 65 73 74 69 6e 61 74 69 6f 6e 46 69  s $destinationFi
6530: 6c 65 4e 61 6d 65 20 5c 0a 20 20 20 20 20 20 20  leName \.       
6540: 20 20 20 24 73 68 6f 72 74 4e 61 6d 65 20 24 62     $shortName $b
6550: 75 69 6c 64 4e 61 6d 65 20 24 70 6c 61 74 66 6f  uildName $platfo
6560: 72 6d 4e 61 6d 65 5d 0a 0a 20 20 20 20 20 20 23  rmName]..      #
6570: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44  .      # NOTE: D
6580: 6f 65 73 20 74 68 65 20 73 6f 75 72 63 65 20 66  oes the source f
6590: 69 6c 65 20 6e 65 65 64 20 74 6f 20 62 65 20 63  ile need to be c
65a0: 6f 70 69 65 64 20 74 6f 20 74 68 65 20 64 65 73  opied to the des
65b0: 74 69 6e 61 74 69 6f 6e 20 66 69 6c 65 3f 0a 20  tination file?. 
65c0: 20 20 20 20 20 23 0a 20 20 20 20 20 20 69 66 20       #.      if 
65d0: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
65e0: 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 5d  $sourceFileName]
65f0: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0a 20 20 20   > 0} then {.   
6600: 20 20 20 20 20 23 0a 20 20 20 20 20 20 20 20 23       #.        #
6610: 20 4e 4f 54 45 3a 20 46 69 72 73 74 2c 20 6d 61   NOTE: First, ma
6620: 6b 65 20 73 75 72 65 20 74 68 65 20 64 65 73 74  ke sure the dest
6630: 69 6e 61 74 69 6f 6e 20 64 69 72 65 63 74 6f 72  ination director
6640: 79 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20 20  y exists..      
6650: 20 20 23 0a 20 20 20 20 20 20 20 20 66 69 6c 65    #.        file
6660: 20 6d 6b 64 69 72 20 5b 66 69 6c 65 20 64 69 72   mkdir [file dir
6670: 6e 61 6d 65 20 24 6e 65 77 44 65 73 74 69 6e 61  name $newDestina
6680: 74 69 6f 6e 46 69 6c 65 4e 61 6d 65 5d 0a 0a 20  tionFileName].. 
6690: 20 20 20 20 20 20 20 23 0a 20 20 20 20 20 20 20         #.       
66a0: 20 23 20 4e 4f 54 45 3a 20 54 68 65 6e 2c 20 63   # NOTE: Then, c
66b0: 6f 70 79 20 74 68 65 20 73 6f 75 72 63 65 20 66  opy the source f
66c0: 69 6c 65 20 74 6f 20 74 68 65 20 64 65 73 74 69  ile to the desti
66d0: 6e 61 74 69 6f 6e 20 66 69 6c 65 20 76 65 72 62  nation file verb
66e0: 61 74 69 6d 2e 0a 20 20 20 20 20 20 20 20 23 0a  atim..        #.
66f0: 20 20 20 20 20 20 20 20 73 65 74 20 6e 65 77 53          set newS
6700: 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5b 72  ourceFileName [r
6710: 65 70 6c 61 63 65 46 69 6c 65 4e 61 6d 65 54 6f  eplaceFileNameTo
6720: 6b 65 6e 73 20 24 73 6f 75 72 63 65 46 69 6c 65  kens $sourceFile
6730: 4e 61 6d 65 20 5c 0a 20 20 20 20 20 20 20 20 20  Name \.         
6740: 20 20 20 24 73 68 6f 72 74 4e 61 6d 65 20 24 62     $shortName $b
6750: 75 69 6c 64 4e 61 6d 65 20 24 70 6c 61 74 66 6f  uildName $platfo
6760: 72 6d 4e 61 6d 65 5d 0a 0a 20 20 20 20 20 20 20  rmName]..       
6770: 20 66 69 6c 65 20 63 6f 70 79 20 24 6e 65 77 53   file copy $newS
6780: 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 24 6e  ourceFileName $n
6790: 65 77 44 65 73 74 69 6e 61 74 69 6f 6e 46 69 6c  ewDestinationFil
67a0: 65 4e 61 6d 65 0a 0a 20 20 20 20 20 20 20 20 23  eName..        #
67b0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
67c0: 20 49 66 20 74 68 69 73 20 69 73 20 61 20 6d 6f   If this is a mo
67d0: 76 65 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20  ve instead of a 
67e0: 63 6f 70 79 2c 20 64 65 6c 65 74 65 20 74 68 65  copy, delete the
67f0: 20 73 6f 75 72 63 65 20 66 69 6c 65 0a 20 20 20   source file.   
6800: 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 6f 77       #       now
6810: 2e 0a 20 20 20 20 20 20 20 20 23 0a 20 20 20 20  ..        #.    
6820: 20 20 20 20 69 66 20 7b 24 69 73 4d 6f 76 65 7d      if {$isMove}
6830: 20 74 68 65 6e 20 7b 0a 20 20 20 20 20 20 20 20   then {.        
6840: 20 20 66 69 6c 65 20 64 65 6c 65 74 65 20 24 6e    file delete $n
6850: 65 77 53 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65  ewSourceFileName
6860: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6870: 20 7d 0a 0a 20 20 20 20 20 20 23 0a 20 20 20 20   }..      #.    
6880: 20 20 23 20 4e 4f 54 45 3a 20 44 6f 65 73 20 74    # NOTE: Does t
6890: 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 66  he destination f
68a0: 69 6c 65 20 63 6f 6e 74 61 69 6e 20 64 79 6e 61  ile contain dyna
68b0: 6d 69 63 20 72 65 70 6c 61 63 65 6d 65 6e 74 73  mic replacements
68c0: 20 74 68 61 74 20 6d 75 73 74 0a 20 20 20 20 20   that must.     
68d0: 20 23 20 20 20 20 20 20 20 62 65 20 70 72 6f 63   #       be proc
68e0: 65 73 73 65 64 20 6e 6f 77 3f 0a 20 20 20 20 20  essed now?.     
68f0: 20 23 0a 20 20 20 20 20 20 69 66 20 7b 24 75 73   #.      if {$us
6900: 65 53 75 62 73 74 7d 20 74 68 65 6e 20 7b 0a 20  eSubst} then {. 
6910: 20 20 20 20 20 20 20 23 0a 20 20 20 20 20 20 20         #.       
6920: 20 23 20 4e 4f 54 45 3a 20 50 65 72 66 6f 72 6d   # NOTE: Perform
6930: 20 61 6e 79 20 64 79 6e 61 6d 69 63 20 72 65 70   any dynamic rep
6940: 6c 61 63 65 6d 65 6e 74 73 20 63 6f 6e 74 61 69  lacements contai
6950: 6e 65 64 20 69 6e 20 74 68 65 20 64 65 73 74 69  ned in the desti
6960: 6e 61 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 23  nation.        #
6970: 20 20 20 20 20 20 20 66 69 6c 65 20 61 6e 64 20         file and 
6980: 74 68 65 6e 20 72 65 2d 77 72 69 74 65 20 69 74  then re-write it
6990: 20 69 6e 2d 70 6c 61 63 65 2e 0a 20 20 20 20 20   in-place..     
69a0: 20 20 20 23 0a 20 20 20 20 20 20 20 20 73 75 62     #.        sub
69b0: 73 74 46 69 6c 65 20 24 6e 65 77 44 65 73 74 69  stFile $newDesti
69c0: 6e 61 74 69 6f 6e 46 69 6c 65 4e 61 6d 65 0a 20  nationFileName. 
69d0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
69e0: 0a 7d 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23  .}..############
69f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6a00: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6a10: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6a20: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6a30: 23 23 23 0a 0a 23 0a 23 20 4e 4f 54 45 3a 20 43  ###..#.# NOTE: C
6a40: 68 61 6e 67 65 20 74 68 65 20 63 75 72 72 65 6e  hange the curren
6a50: 74 20 64 69 72 65 63 74 6f 72 79 20 74 6f 20 74  t directory to t
6a60: 68 65 20 73 74 61 67 69 6e 67 20 64 69 72 65 63  he staging direc
6a70: 74 6f 72 79 20 73 6f 20 74 68 61 74 20 74 68 65  tory so that the
6a80: 0a 23 20 20 20 20 20 20 20 65 78 74 65 72 6e 61  .#       externa
6a90: 6c 20 61 72 63 68 69 76 65 20 62 75 69 6c 64 69  l archive buildi
6aa0: 6e 67 20 74 6f 6f 6c 20 63 61 6e 20 70 69 63 6b  ng tool can pick
6ab0: 75 70 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  up the necessary
6ac0: 20 66 69 6c 65 73 20 75 73 69 6e 67 0a 23 20 20   files using.#  
6ad0: 20 20 20 20 20 72 65 6c 61 74 69 76 65 20 70 61       relative pa
6ae0: 74 68 73 2e 0a 23 0a 63 64 20 24 73 74 61 67 69  ths..#.cd $stagi
6af0: 6e 67 44 69 72 65 63 74 6f 72 79 0a 0a 23 0a 23  ngDirectory..#.#
6b00: 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65   NOTE: Build the
6b10: 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 75 73 65   Tcl command use
6b20: 64 20 74 6f 20 61 72 63 68 69 76 65 20 74 68 65  d to archive the
6b30: 20 66 69 6e 61 6c 20 56 53 49 58 20 70 61 63 6b   final VSIX pack
6b40: 61 67 65 20 69 6e 20 74 68 65 0a 23 20 20 20 20  age in the.#    
6b50: 20 20 20 6f 75 74 70 75 74 20 64 69 72 65 63 74     output direct
6b60: 6f 72 79 2e 0a 23 0a 73 65 74 20 61 72 63 68 69  ory..#.set archi
6b70: 76 65 43 6f 6d 6d 61 6e 64 20 5b 6c 69 73 74 20  veCommand [list 
6b80: 65 78 65 63 20 2d 2d 20 24 7a 69 70 20 2d 72 20  exec -- $zip -r 
6b90: 24 6f 75 74 70 75 74 46 69 6c 65 20 2a 5d 0a 0a  $outputFile *]..
6ba0: 23 0a 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20  #.# NOTE: Build 
6bb0: 74 68 65 20 66 69 6e 61 6c 20 56 53 49 58 20 70  the final VSIX p
6bc0: 61 63 6b 61 67 65 20 61 72 63 68 69 76 65 20 69  ackage archive i
6bd0: 6e 20 74 68 65 20 6f 75 74 70 75 74 20 64 69 72  n the output dir
6be0: 65 63 74 6f 72 79 2e 0a 23 0a 65 76 61 6c 20 24  ectory..#.eval $
6bf0: 61 72 63 68 69 76 65 43 6f 6d 6d 61 6e 64 0a 0a  archiveCommand..
6c00: 23 0a 23 20 4e 4f 54 45 3a 20 43 68 61 6e 67 65  #.# NOTE: Change
6c10: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 70 72 65   back to the pre
6c20: 76 69 6f 75 73 6c 79 20 73 61 76 65 64 20 63 75  viously saved cu
6c30: 72 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79 2e  rrent directory.
6c40: 0a 23 0a 63 64 20 24 63 75 72 72 65 6e 74 44 69  .#.cd $currentDi
6c50: 72 65 63 74 6f 72 79 0a 0a 23 0a 23 20 4e 4f 54  rectory..#.# NOT
6c60: 45 3a 20 43 6c 65 61 6e 75 70 20 74 68 65 20 74  E: Cleanup the t
6c70: 65 6d 70 6f 72 61 72 79 20 73 74 61 67 69 6e 67  emporary staging
6c80: 20 64 69 72 65 63 74 6f 72 79 2e 0a 23 0a 66 69   directory..#.fi
6c90: 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f 72 63 65  le delete -force
6ca0: 20 24 73 74 61 67 69 6e 67 44 69 72 65 63 74 6f   $stagingDirecto
6cb0: 72 79 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23  ry..############
6cc0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6cd0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6ce0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6cf0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6d00: 23 23 23 0a 0a 23 0a 23 20 4e 4f 54 45 3a 20 53  ###..#.# NOTE: S
6d10: 75 63 63 65 73 73 2c 20 65 6d 69 74 20 74 68 65  uccess, emit the
6d20: 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
6d30: 20 70 61 74 68 20 6f 66 20 74 68 65 20 67 65 6e   path of the gen
6d40: 65 72 61 74 65 64 20 56 53 49 58 20 66 69 6c 65  erated VSIX file
6d50: 2e 0a 23 0a 70 75 74 73 20 73 74 64 6f 75 74 20  ..#.puts stdout 
6d60: 24 6f 75 74 70 75 74 46 69 6c 65 0a              $outputFile.