/ Hex Artifact Content
Login

Artifact c5e0d52592fb07a17626cd54e5f71295fb4d1b55:


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 79 70 69 63   USAGE.#.# Typic
0c10: 61 6c 6c 79 2c 20 77 68 65 6e 20 6f 6e 20 57 69  ally, when on Wi
0c20: 6e 64 6f 77 73 2c 20 74 68 69 73 20 73 63 72 69  ndows, this scri
0c30: 70 74 20 69 73 20 65 78 65 63 75 74 65 64 20 75  pt is executed u
0c40: 73 69 6e 67 20 63 6f 6d 6d 61 6e 64 73 20 73 69  sing commands si
0c50: 6d 69 6c 61 72 20 74 6f 0a 23 20 74 68 65 20 66  milar to.# the f
0c60: 6f 6c 6c 6f 77 69 6e 67 20 28 66 72 6f 6d 20 61  ollowing (from a
0c70: 20 6e 6f 72 6d 61 6c 20 57 69 6e 64 6f 77 73 20   normal Windows 
0c80: 63 6f 6d 6d 61 6e 64 20 70 72 6f 6d 70 74 20 77  command prompt w
0c90: 69 6e 64 6f 77 29 3a 0a 23 0a 23 20 20 20 20 20  indow):.#.#     
0ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0cb0: 20 20 20 20 43 44 20 2f 44 20 43 3a 5c 64 65 76      CD /D C:\dev
0cc0: 5c 73 71 6c 69 74 65 5c 63 6f 72 65 0a 23 20 20  \sqlite\core.#  
0cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ce0: 20 20 20 20 20 20 20 74 63 6c 73 68 38 35 20 74         tclsh85 t
0cf0: 6f 6f 6c 5c 6d 6b 76 73 69 78 2e 74 63 6c 20 43  ool\mkvsix.tcl C
0d00: 3a 5c 54 65 6d 70 0a 23 0a 23 20 49 6e 20 74 68  :\Temp.#.# In th
0d10: 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 2c  e example above,
0d20: 20 22 43 3a 5c 64 65 76 5c 73 71 6c 69 74 65 5c   "C:\dev\sqlite\
0d30: 63 6f 72 65 22 20 72 65 70 72 65 73 65 6e 74 73  core" represents
0d40: 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65   the root of the
0d50: 20 73 6f 75 72 63 65 0a 23 20 74 72 65 65 20 66   source.# tree f
0d60: 6f 72 20 53 51 4c 69 74 65 20 61 6e 64 20 22 43  or SQLite and "C
0d70: 3a 5c 54 65 6d 70 22 20 72 65 70 72 65 73 65 6e  :\Temp" represen
0d80: 74 73 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c  ts the top-level
0d90: 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61   directory conta
0da0: 69 6e 69 6e 67 0a 23 20 74 68 65 20 65 78 65 63  ining.# the exec
0db0: 75 74 61 62 6c 65 20 61 6e 64 20 6f 74 68 65 72  utable and other
0dc0: 20 63 6f 6d 70 69 6c 65 64 20 62 69 6e 61 72 79   compiled binary
0dd0: 20 66 69 6c 65 73 2c 20 6f 72 67 61 6e 69 7a 65   files, organize
0de0: 64 20 69 6e 74 6f 20 61 20 64 69 72 65 63 74 6f  d into a directo
0df0: 72 79 0a 23 20 74 72 65 65 20 61 73 20 64 65 73  ry.# tree as des
0e00: 63 72 69 62 65 64 20 69 6e 20 69 74 65 6d 20 36  cribed in item 6
0e10: 20 6f 66 20 74 68 65 20 50 52 45 52 45 51 55 49   of the PREREQUI
0e20: 53 49 54 45 53 20 73 65 63 74 69 6f 6e 2c 20 61  SITES section, a
0e30: 62 6f 76 65 2e 0a 23 0a 23 20 54 68 69 73 20 73  bove..#.# This s
0e40: 63 72 69 70 74 20 73 68 6f 75 6c 64 20 77 6f 72  cript should wor
0e50: 6b 20 6f 6e 20 6e 6f 6e 2d 57 69 6e 64 6f 77 73  k on non-Windows
0e60: 20 70 6c 61 74 66 6f 72 6d 73 20 61 73 20 77 65   platforms as we
0e70: 6c 6c 2c 20 70 72 6f 76 69 64 65 64 20 74 68 61  ll, provided tha
0e80: 74 20 61 6c 6c 0a 23 20 74 68 65 20 72 65 71 75  t all.# the requ
0e90: 69 72 65 6d 65 6e 74 73 20 6c 69 73 74 65 64 20  irements listed 
0ea0: 69 6e 20 74 68 65 20 50 52 45 52 45 51 55 49 53  in the PREREQUIS
0eb0: 49 54 45 53 20 73 65 63 74 69 6f 6e 20 61 72 65  ITES section are
0ec0: 20 6d 65 74 2e 0a 23 0a 23 20 4e 4f 54 45 53 0a   met..#.# NOTES.
0ed0: 23 0a 23 20 54 68 65 20 74 65 6d 70 6f 72 61 72  #.# The temporar
0ee0: 79 20 64 69 72 65 63 74 6f 72 79 20 69 73 20 75  y directory is u
0ef0: 73 65 64 20 61 73 20 61 20 73 74 61 67 69 6e 67  sed as a staging
0f00: 20 61 72 65 61 20 66 6f 72 20 74 68 65 20 66 69   area for the fi
0f10: 6e 61 6c 20 56 53 49 58 20 66 69 6c 65 2e 0a 23  nal VSIX file..#
0f20: 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20 56 53   The template VS
0f30: 49 58 20 66 69 6c 65 20 69 73 20 65 78 74 72 61  IX file is extra
0f40: 63 74 65 64 2c 20 69 74 73 20 63 6f 6e 74 65 6e  cted, its conten
0f50: 74 73 20 70 72 6f 63 65 73 73 65 64 2c 20 61 6e  ts processed, an
0f60: 64 20 74 68 65 6e 20 74 68 65 0a 23 20 72 65 73  d then the.# res
0f70: 75 6c 74 69 6e 67 20 66 69 6c 65 73 20 61 72 65  ulting files are
0f80: 20 70 61 63 6b 61 67 65 64 20 69 6e 74 6f 20 74   packaged into t
0f90: 68 65 20 66 69 6e 61 6c 20 56 53 49 58 20 66 69  he final VSIX fi
0fa0: 6c 65 2e 0a 23 0a 70 61 63 6b 61 67 65 20 72 65  le..#.package re
0fb0: 71 75 69 72 65 20 54 63 6c 20 38 2e 34 0a 0c 0a  quire Tcl 8.4...
0fc0: 70 72 6f 63 20 66 61 69 6c 20 7b 20 7b 65 72 72  proc fail { {err
0fd0: 6f 72 20 22 22 7d 20 7b 75 73 61 67 65 20 66 61  or ""} {usage fa
0fe0: 6c 73 65 7d 20 7d 20 7b 0a 20 20 69 66 20 7b 5b  lse} } {.  if {[
0ff0: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 65  string length $e
1000: 72 72 6f 72 5d 20 3e 20 30 7d 20 74 68 65 6e 20  rror] > 0} then 
1010: 7b 0a 20 20 20 20 70 75 74 73 20 73 74 64 6f 75  {.    puts stdou
1020: 74 20 24 65 72 72 6f 72 0a 20 20 20 20 69 66 20  t $error.    if 
1030: 7b 21 24 75 73 61 67 65 7d 20 74 68 65 6e 20 7b  {!$usage} then {
1040: 65 78 69 74 20 31 7d 0a 20 20 7d 0a 0a 20 20 70  exit 1}.  }..  p
1050: 75 74 73 20 73 74 64 6f 75 74 20 22 75 73 61 67  uts stdout "usag
1060: 65 3a 5c 0a 5b 66 69 6c 65 20 74 61 69 6c 20 5b  e:\.[file tail [
1070: 69 6e 66 6f 20 6e 61 6d 65 6f 66 65 78 65 63 75  info nameofexecu
1080: 74 61 62 6c 65 5d 5d 5c 0a 5b 66 69 6c 65 20 74  table]]\.[file t
1090: 61 69 6c 20 5b 69 6e 66 6f 20 73 63 72 69 70 74  ail [info script
10a0: 5d 5d 20 3c 62 69 6e 61 72 79 44 69 72 65 63 74  ]] <binaryDirect
10b0: 6f 72 79 3e 20 5c 5b 73 6f 75 72 63 65 44 69 72  ory> \[sourceDir
10c0: 65 63 74 6f 72 79 5c 5d 22 0a 0a 20 20 65 78 69  ectory\]"..  exi
10d0: 74 20 31 0a 7d 0a 0c 0a 70 72 6f 63 20 67 65 74  t 1.}...proc get
10e0: 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61  EnvironmentVaria
10f0: 62 6c 65 20 7b 20 6e 61 6d 65 20 7d 20 7b 0a 20  ble { name } {. 
1100: 20 23 0a 20 20 23 20 4e 4f 54 45 3a 20 52 65 74   #.  # NOTE: Ret
1110: 75 72 6e 73 20 74 68 65 20 76 61 6c 75 65 20 6f  urns the value o
1120: 66 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  f the specified 
1130: 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69  environment vari
1140: 61 62 6c 65 20 6f 72 20 61 6e 20 65 6d 70 74 79  able or an empty
1150: 0a 20 20 23 20 20 20 20 20 20 20 73 74 72 69 6e  .  #       strin
1160: 67 20 66 6f 72 20 65 6e 76 69 72 6f 6e 6d 65 6e  g for environmen
1170: 74 20 76 61 72 69 61 62 6c 65 73 20 74 68 61 74  t variables that
1180: 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 69 6e   do not exist in
1190: 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 23   the current.  #
11a0: 20 20 20 20 20 20 20 70 72 6f 63 65 73 73 20 65         process e
11b0: 6e 76 69 72 6f 6e 6d 65 6e 74 2e 0a 20 20 23 0a  nvironment..  #.
11c0: 20 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b    return [expr {
11d0: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 65  [info exists ::e
11e0: 6e 76 28 24 6e 61 6d 65 29 5d 20 3f 20 24 3a 3a  nv($name)] ? $::
11f0: 65 6e 76 28 24 6e 61 6d 65 29 20 3a 20 22 22 7d  env($name) : ""}
1200: 5d 0a 7d 0a 0c 0a 70 72 6f 63 20 67 65 74 54 65  ].}...proc getTe
1210: 6d 70 6f 72 61 72 79 50 61 74 68 20 7b 7d 20 7b  mporaryPath {} {
1220: 0a 20 20 23 0a 20 20 23 20 4e 4f 54 45 3a 20 52  .  #.  # NOTE: R
1230: 65 74 75 72 6e 73 20 74 68 65 20 6e 6f 72 6d 61  eturns the norma
1240: 6c 69 7a 65 64 20 70 61 74 68 20 74 6f 20 74 68  lized path to th
1250: 65 20 66 69 72 73 74 20 74 65 6d 70 6f 72 61 72  e first temporar
1260: 79 20 64 69 72 65 63 74 6f 72 79 20 66 6f 75 6e  y directory foun
1270: 64 0a 20 20 23 20 20 20 20 20 20 20 69 6e 20 74  d.  #       in t
1280: 68 65 20 74 79 70 69 63 61 6c 20 73 65 74 20 6f  he typical set o
1290: 66 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61  f environment va
12a0: 72 69 61 62 6c 65 73 20 75 73 65 64 20 66 6f 72  riables used for
12b0: 20 74 68 61 74 20 70 75 72 70 6f 73 65 0a 20 20   that purpose.  
12c0: 23 20 20 20 20 20 20 20 6f 72 20 61 6e 20 65 6d  #       or an em
12d0: 70 74 79 20 73 74 72 69 6e 67 20 74 6f 20 73 69  pty string to si
12e0: 67 6e 61 6c 20 61 20 66 61 69 6c 75 72 65 20 74  gnal a failure t
12f0: 6f 20 6c 6f 63 61 74 65 20 73 75 63 68 20 61 20  o locate such a 
1300: 64 69 72 65 63 74 6f 72 79 2e 0a 20 20 23 0a 20  directory..  #. 
1310: 20 73 65 74 20 6e 61 6d 65 73 20 5b 6c 69 73 74   set names [list
1320: 5d 0a 0a 20 20 66 6f 72 65 61 63 68 20 6e 61 6d  ]..  foreach nam
1330: 65 20 5b 6c 69 73 74 20 54 45 4d 50 20 54 4d 50  e [list TEMP TMP
1340: 5d 20 7b 0a 20 20 20 20 6c 61 70 70 65 6e 64 20  ] {.    lappend 
1350: 6e 61 6d 65 73 20 5b 73 74 72 69 6e 67 20 74 6f  names [string to
1360: 75 70 70 65 72 20 24 6e 61 6d 65 5d 20 5b 73 74  upper $name] [st
1370: 72 69 6e 67 20 74 6f 6c 6f 77 65 72 20 24 6e 61  ring tolower $na
1380: 6d 65 5d 20 5c 0a 20 20 20 20 20 20 20 20 5b 73  me] \.        [s
1390: 74 72 69 6e 67 20 74 6f 74 69 74 6c 65 20 24 6e  tring totitle $n
13a0: 61 6d 65 5d 0a 20 20 7d 0a 0a 20 20 66 6f 72 65  ame].  }..  fore
13b0: 61 63 68 20 6e 61 6d 65 20 24 6e 61 6d 65 73 20  ach name $names 
13c0: 7b 0a 20 20 20 20 73 65 74 20 76 61 6c 75 65 20  {.    set value 
13d0: 5b 67 65 74 45 6e 76 69 72 6f 6e 6d 65 6e 74 56  [getEnvironmentV
13e0: 61 72 69 61 62 6c 65 20 24 6e 61 6d 65 5d 0a 0a  ariable $name]..
13f0: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
1400: 6c 65 6e 67 74 68 20 24 76 61 6c 75 65 5d 20 3e  length $value] >
1410: 20 30 7d 20 74 68 65 6e 20 7b 0a 20 20 20 20 20   0} then {.     
1420: 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6e 6f   return [file no
1430: 72 6d 61 6c 69 7a 65 20 24 76 61 6c 75 65 5d 0a  rmalize $value].
1440: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
1450: 75 72 6e 20 22 22 0a 7d 0a 0c 0a 70 72 6f 63 20  urn "".}...proc 
1460: 61 70 70 65 6e 64 41 72 67 73 20 7b 20 61 72 67  appendArgs { arg
1470: 73 20 7d 20 7b 0a 20 20 23 0a 20 20 23 20 4e 4f  s } {.  #.  # NO
1480: 54 45 3a 20 52 65 74 75 72 6e 73 20 61 6c 6c 20  TE: Returns all 
1490: 70 61 73 73 65 64 20 61 72 67 75 6d 65 6e 74 73  passed arguments
14a0: 20 6a 6f 69 6e 65 64 20 74 6f 67 65 74 68 65 72   joined together
14b0: 20 61 73 20 61 20 73 69 6e 67 6c 65 20 73 74 72   as a single str
14c0: 69 6e 67 20 77 69 74 68 0a 20 20 23 20 20 20 20  ing with.  #    
14d0: 20 20 20 6e 6f 20 69 6e 74 65 72 76 65 6e 69 6e     no intervenin
14e0: 67 20 73 70 61 63 65 73 20 62 65 74 77 65 65 6e  g spaces between
14f0: 20 61 72 67 75 6d 65 6e 74 73 2e 0a 20 20 23 0a   arguments..  #.
1500: 20 20 65 76 61 6c 20 61 70 70 65 6e 64 20 72 65    eval append re
1510: 73 75 6c 74 20 24 61 72 67 73 0a 7d 0a 0c 0a 70  sult $args.}...p
1520: 72 6f 63 20 72 65 61 64 46 69 6c 65 20 7b 20 66  roc readFile { f
1530: 69 6c 65 4e 61 6d 65 20 7d 20 7b 0a 20 20 23 0a  ileName } {.  #.
1540: 20 20 23 20 4e 4f 54 45 3a 20 52 65 61 64 73 20    # NOTE: Reads 
1550: 61 6e 64 20 72 65 74 75 72 6e 73 20 74 68 65 20  and returns the 
1560: 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20  entire contents 
1570: 6f 66 20 74 68 65 20 73 70 65 63 69 66 69 65 64  of the specified
1580: 20 66 69 6c 65 2c 20 77 68 69 63 68 0a 20 20 23   file, which.  #
1590: 20 20 20 20 20 20 20 6d 61 79 20 63 6f 6e 74 61         may conta
15a0: 69 6e 20 62 69 6e 61 72 79 20 64 61 74 61 2e 0a  in binary data..
15b0: 20 20 23 0a 20 20 73 65 74 20 66 69 6c 65 5f 69    #.  set file_i
15c0: 64 20 5b 6f 70 65 6e 20 24 66 69 6c 65 4e 61 6d  d [open $fileNam
15d0: 65 20 52 44 4f 4e 4c 59 5d 0a 20 20 66 63 6f 6e  e RDONLY].  fcon
15e0: 66 69 67 75 72 65 20 24 66 69 6c 65 5f 69 64 20  figure $file_id 
15f0: 2d 65 6e 63 6f 64 69 6e 67 20 62 69 6e 61 72 79  -encoding binary
1600: 20 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 20 62 69   -translation bi
1610: 6e 61 72 79 0a 20 20 73 65 74 20 72 65 73 75 6c  nary.  set resul
1620: 74 20 5b 72 65 61 64 20 24 66 69 6c 65 5f 69 64  t [read $file_id
1630: 5d 0a 20 20 63 6c 6f 73 65 20 24 66 69 6c 65 5f  ].  close $file_
1640: 69 64 0a 20 20 72 65 74 75 72 6e 20 24 72 65 73  id.  return $res
1650: 75 6c 74 0a 7d 0a 0c 0a 70 72 6f 63 20 77 72 69  ult.}...proc wri
1660: 74 65 46 69 6c 65 20 7b 20 66 69 6c 65 4e 61 6d  teFile { fileNam
1670: 65 20 64 61 74 61 20 7d 20 7b 0a 20 20 23 0a 20  e data } {.  #. 
1680: 20 23 20 4e 4f 54 45 3a 20 57 72 69 74 65 73 20   # NOTE: Writes 
1690: 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65  the entire conte
16a0: 6e 74 73 20 6f 66 20 74 68 65 20 73 70 65 63 69  nts of the speci
16b0: 66 69 65 64 20 66 69 6c 65 2c 20 77 68 69 63 68  fied file, which
16c0: 20 6d 61 79 20 63 6f 6e 74 61 69 6e 0a 20 20 23   may contain.  #
16d0: 20 20 20 20 20 20 20 62 69 6e 61 72 79 20 64 61         binary da
16e0: 74 61 2e 0a 20 20 23 0a 20 20 73 65 74 20 66 69  ta..  #.  set fi
16f0: 6c 65 5f 69 64 20 5b 6f 70 65 6e 20 24 66 69 6c  le_id [open $fil
1700: 65 4e 61 6d 65 20 7b 57 52 4f 4e 4c 59 20 43 52  eName {WRONLY CR
1710: 45 41 54 20 54 52 55 4e 43 7d 5d 0a 20 20 66 63  EAT TRUNC}].  fc
1720: 6f 6e 66 69 67 75 72 65 20 24 66 69 6c 65 5f 69  onfigure $file_i
1730: 64 20 2d 65 6e 63 6f 64 69 6e 67 20 62 69 6e 61  d -encoding bina
1740: 72 79 20 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 20  ry -translation 
1750: 62 69 6e 61 72 79 0a 20 20 70 75 74 73 20 2d 6e  binary.  puts -n
1760: 6f 6e 65 77 6c 69 6e 65 20 24 66 69 6c 65 5f 69  onewline $file_i
1770: 64 20 24 64 61 74 61 0a 20 20 63 6c 6f 73 65 20  d $data.  close 
1780: 24 66 69 6c 65 5f 69 64 0a 20 20 72 65 74 75 72  $file_id.  retur
1790: 6e 20 22 22 0a 7d 0a 0c 0a 70 72 6f 63 20 73 75  n "".}...proc su
17a0: 62 73 74 46 69 6c 65 20 7b 20 66 69 6c 65 4e 61  bstFile { fileNa
17b0: 6d 65 20 7d 20 7b 0a 20 20 23 0a 20 20 23 20 4e  me } {.  #.  # N
17c0: 4f 54 45 3a 20 50 65 72 66 6f 72 6d 73 20 61 6c  OTE: Performs al
17d0: 6c 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 2c 20 76  l Tcl command, v
17e0: 61 72 69 61 62 6c 65 2c 20 61 6e 64 20 62 61 63  ariable, and bac
17f0: 6b 73 6c 61 73 68 20 73 75 62 73 74 69 74 75 74  kslash substitut
1800: 69 6f 6e 73 20 69 6e 0a 20 20 23 20 20 20 20 20  ions in.  #     
1810: 20 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20    the specified 
1820: 66 69 6c 65 20 61 6e 64 20 74 68 65 6e 20 72 65  file and then re
1830: 2d 77 72 69 74 65 73 20 74 68 65 20 63 6f 6e 74  -writes the cont
1840: 65 6e 74 73 20 6f 66 20 74 68 61 74 20 73 61 6d  ents of that sam
1850: 65 20 66 69 6c 65 0a 20 20 23 20 20 20 20 20 20  e file.  #      
1860: 20 77 69 74 68 20 74 68 65 20 73 75 62 73 74 69   with the substi
1870: 74 75 74 65 64 20 64 61 74 61 2e 0a 20 20 23 0a  tuted data..  #.
1880: 20 20 72 65 74 75 72 6e 20 5b 77 72 69 74 65 46    return [writeF
1890: 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 20 5b 75  ile $fileName [u
18a0: 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 73  plevel 1 [list s
18b0: 75 62 73 74 20 5b 72 65 61 64 46 69 6c 65 20 24  ubst [readFile $
18c0: 66 69 6c 65 4e 61 6d 65 5d 5d 5d 5d 0a 7d 0a 0c  fileName]]]].}..
18d0: 0a 70 72 6f 63 20 72 65 70 6c 61 63 65 42 75 69  .proc replaceBui
18e0: 6c 64 41 6e 64 50 6c 61 74 66 6f 72 6d 20 7b 20  ldAndPlatform { 
18f0: 66 69 6c 65 4e 61 6d 65 20 62 75 69 6c 64 4e 61  fileName buildNa
1900: 6d 65 20 70 6c 61 74 66 6f 72 6d 4e 61 6d 65 20  me platformName 
1910: 7d 20 7b 0a 20 20 23 0a 20 20 23 20 4e 4f 54 45  } {.  #.  # NOTE
1920: 3a 20 52 65 74 75 72 6e 73 20 74 68 65 20 73 70  : Returns the sp
1930: 65 63 69 66 69 65 64 20 66 69 6c 65 20 6e 61 6d  ecified file nam
1940: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
1950: 20 70 6c 61 74 66 6f 72 6d 20 6e 61 6d 65 20 69   platform name i
1960: 6e 73 74 65 61 64 0a 20 20 23 20 20 20 20 20 20  nstead.  #      
1970: 20 6f 66 20 70 6c 61 74 66 6f 72 6d 20 70 6c 61   of platform pla
1980: 63 65 68 6f 6c 64 65 72 20 74 6f 6b 65 6e 73 2e  ceholder tokens.
1990: 0a 20 20 23 0a 20 20 72 65 74 75 72 6e 20 5b 73  .  #.  return [s
19a0: 74 72 69 6e 67 20 6d 61 70 20 5b 6c 69 73 74 20  tring map [list 
19b0: 3c 62 75 69 6c 64 3e 20 24 62 75 69 6c 64 4e 61  <build> $buildNa
19c0: 6d 65 20 3c 70 6c 61 74 66 6f 72 6d 3e 20 24 70  me <platform> $p
19d0: 6c 61 74 66 6f 72 6d 4e 61 6d 65 5d 20 5c 0a 20  latformName] \. 
19e0: 20 20 20 20 20 24 66 69 6c 65 4e 61 6d 65 5d 0a       $fileName].
19f0: 7d 0a 0c 0a 73 65 74 20 73 63 72 69 70 74 20 5b  }...set script [
1a00: 66 69 6c 65 20 6e 6f 72 6d 61 6c 69 7a 65 20 5b  file normalize [
1a10: 69 6e 66 6f 20 73 63 72 69 70 74 5d 5d 0a 0a 69  info script]]..i
1a20: 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
1a30: 68 20 24 73 63 72 69 70 74 5d 20 3d 3d 20 30 7d  h $script] == 0}
1a40: 20 74 68 65 6e 20 7b 0a 20 20 66 61 69 6c 20 22   then {.  fail "
1a50: 73 63 72 69 70 74 20 66 69 6c 65 20 63 75 72 72  script file curr
1a60: 65 6e 74 6c 79 20 62 65 69 6e 67 20 65 76 61 6c  ently being eval
1a70: 75 61 74 65 64 20 69 73 20 75 6e 6b 6e 6f 77 6e  uated is unknown
1a80: 22 20 74 72 75 65 0a 7d 0a 0a 73 65 74 20 70 61  " true.}..set pa
1a90: 74 68 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65  th [file dirname
1aa0: 20 24 73 63 72 69 70 74 5d 0a 73 65 74 20 72 6f   $script].set ro
1ab0: 6f 74 4e 61 6d 65 20 5b 66 69 6c 65 20 72 6f 6f  otName [file roo
1ac0: 74 6e 61 6d 65 20 5b 66 69 6c 65 20 74 61 69 6c  tname [file tail
1ad0: 20 24 73 63 72 69 70 74 5d 5d 0a 0a 23 23 23 23   $script]]..####
1ae0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1af0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b00: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b10: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b20: 23 23 23 23 23 23 23 23 23 23 23 0a 0a 23 0a 23  ###########..#.#
1b30: 20 4e 4f 54 45 3a 20 50 72 6f 63 65 73 73 20 61   NOTE: Process a
1b40: 6e 64 20 76 65 72 69 66 79 20 61 6c 6c 20 74 68  nd verify all th
1b50: 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 61  e command line a
1b60: 72 67 75 6d 65 6e 74 73 2e 0a 23 0a 73 65 74 20  rguments..#.set 
1b70: 61 72 67 63 20 5b 6c 6c 65 6e 67 74 68 20 24 61  argc [llength $a
1b80: 72 67 76 5d 0a 69 66 20 7b 24 61 72 67 63 20 21  rgv].if {$argc !
1b90: 3d 20 31 20 26 26 20 24 61 72 67 63 20 21 3d 20  = 1 && $argc != 
1ba0: 32 7d 20 74 68 65 6e 20 7b 66 61 69 6c 7d 0a 0a  2} then {fail}..
1bb0: 73 65 74 20 62 69 6e 61 72 79 44 69 72 65 63 74  set binaryDirect
1bc0: 6f 72 79 20 5b 6c 69 6e 64 65 78 20 24 61 72 67  ory [lindex $arg
1bd0: 76 20 30 5d 0a 0a 69 66 20 7b 5b 73 74 72 69 6e  v 0]..if {[strin
1be0: 67 20 6c 65 6e 67 74 68 20 24 62 69 6e 61 72 79  g length $binary
1bf0: 44 69 72 65 63 74 6f 72 79 5d 20 3d 3d 20 30 7d  Directory] == 0}
1c00: 20 74 68 65 6e 20 7b 0a 20 20 66 61 69 6c 20 22   then {.  fail "
1c10: 69 6e 76 61 6c 69 64 20 62 69 6e 61 72 79 20 64  invalid binary d
1c20: 69 72 65 63 74 6f 72 79 22 0a 7d 0a 0a 69 66 20  irectory".}..if 
1c30: 7b 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24  {![file exists $
1c40: 62 69 6e 61 72 79 44 69 72 65 63 74 6f 72 79 5d  binaryDirectory]
1c50: 20 7c 7c 20 5c 0a 20 20 20 20 21 5b 66 69 6c 65   || \.    ![file
1c60: 20 69 73 64 69 72 65 63 74 6f 72 79 20 24 62 69   isdirectory $bi
1c70: 6e 61 72 79 44 69 72 65 63 74 6f 72 79 5d 7d 20  naryDirectory]} 
1c80: 74 68 65 6e 20 7b 0a 20 20 66 61 69 6c 20 22 62  then {.  fail "b
1c90: 69 6e 61 72 79 20 64 69 72 65 63 74 6f 72 79 20  inary directory 
1ca0: 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 22 0a  does not exist".
1cb0: 7d 0a 0a 69 66 20 7b 24 61 72 67 63 20 3d 3d 20  }..if {$argc == 
1cc0: 32 7d 20 74 68 65 6e 20 7b 0a 20 20 73 65 74 20  2} then {.  set 
1cd0: 73 6f 75 72 63 65 44 69 72 65 63 74 6f 72 79 20  sourceDirectory 
1ce0: 5b 6c 69 6e 64 65 78 20 24 61 72 67 76 20 31 5d  [lindex $argv 1]
1cf0: 0a 7d 20 65 6c 73 65 20 7b 0a 20 20 23 0a 20 20  .} else {.  #.  
1d00: 23 20 4e 4f 54 45 3a 20 41 73 73 75 6d 65 20 74  # NOTE: Assume t
1d10: 68 61 74 20 74 68 65 20 73 6f 75 72 63 65 20 64  hat the source d
1d20: 69 72 65 63 74 6f 72 79 20 69 73 20 74 68 65 20  irectory is the 
1d30: 70 61 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79  parent directory
1d40: 20 6f 66 20 74 68 65 20 6f 6e 65 0a 20 20 23 20   of the one.  # 
1d50: 20 20 20 20 20 20 74 68 61 74 20 63 6f 6e 74 61        that conta
1d60: 69 6e 73 20 74 68 69 73 20 73 63 72 69 70 74 20  ins this script 
1d70: 66 69 6c 65 2e 0a 20 20 23 0a 20 20 73 65 74 20  file..  #.  set 
1d80: 73 6f 75 72 63 65 44 69 72 65 63 74 6f 72 79 20  sourceDirectory 
1d90: 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 70  [file dirname $p
1da0: 61 74 68 5d 0a 7d 0a 0a 69 66 20 7b 5b 73 74 72  ath].}..if {[str
1db0: 69 6e 67 20 6c 65 6e 67 74 68 20 24 73 6f 75 72  ing length $sour
1dc0: 63 65 44 69 72 65 63 74 6f 72 79 5d 20 3d 3d 20  ceDirectory] == 
1dd0: 30 7d 20 74 68 65 6e 20 7b 0a 20 20 66 61 69 6c  0} then {.  fail
1de0: 20 22 69 6e 76 61 6c 69 64 20 73 6f 75 72 63 65   "invalid source
1df0: 20 64 69 72 65 63 74 6f 72 79 22 0a 7d 0a 0a 69   directory".}..i
1e00: 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74 73  f {![file exists
1e10: 20 24 73 6f 75 72 63 65 44 69 72 65 63 74 6f 72   $sourceDirector
1e20: 79 5d 20 7c 7c 20 5c 0a 20 20 20 20 21 5b 66 69  y] || \.    ![fi
1e30: 6c 65 20 69 73 64 69 72 65 63 74 6f 72 79 20 24  le isdirectory $
1e40: 73 6f 75 72 63 65 44 69 72 65 63 74 6f 72 79 5d  sourceDirectory]
1e50: 7d 20 74 68 65 6e 20 7b 0a 20 20 66 61 69 6c 20  } then {.  fail 
1e60: 22 73 6f 75 72 63 65 20 64 69 72 65 63 74 6f 72  "source director
1e70: 79 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  y does not exist
1e80: 22 0a 7d 0a 0a 23 23 23 23 23 23 23 23 23 23 23  ".}..###########
1e90: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1ea0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1eb0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1ec0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1ed0: 23 23 23 23 0a 0a 23 0a 23 20 4e 4f 54 45 3a 20  ####..#.# NOTE: 
1ee0: 45 76 61 6c 75 61 74 65 20 74 68 65 20 75 73 65  Evaluate the use
1ef0: 72 2d 73 70 65 63 69 66 69 63 20 63 75 73 74 6f  r-specific custo
1f00: 6d 69 7a 61 74 69 6f 6e 73 20 66 69 6c 65 2c 20  mizations file, 
1f10: 69 66 20 69 74 20 65 78 69 73 74 73 2e 0a 23 0a  if it exists..#.
1f20: 73 65 74 20 75 73 65 72 46 69 6c 65 20 5b 66 69  set userFile [fi
1f30: 6c 65 20 6a 6f 69 6e 20 24 70 61 74 68 20 5b 61  le join $path [a
1f40: 70 70 65 6e 64 41 72 67 73 20 5c 0a 20 20 20 20  ppendArgs \.    
1f50: 24 72 6f 6f 74 4e 61 6d 65 20 2e 20 24 74 63 6c  $rootName . $tcl
1f60: 5f 70 6c 61 74 66 6f 72 6d 28 75 73 65 72 29 20  _platform(user) 
1f70: 2e 74 63 6c 5d 5d 0a 0a 69 66 20 7b 5b 66 69 6c  .tcl]]..if {[fil
1f80: 65 20 65 78 69 73 74 73 20 24 75 73 65 72 46 69  e exists $userFi
1f90: 6c 65 5d 20 26 26 20 5c 0a 20 20 20 20 5b 66 69  le] && \.    [fi
1fa0: 6c 65 20 69 73 66 69 6c 65 20 24 75 73 65 72 46  le isfile $userF
1fb0: 69 6c 65 5d 7d 20 74 68 65 6e 20 7b 0a 20 20 73  ile]} then {.  s
1fc0: 6f 75 72 63 65 20 24 75 73 65 72 46 69 6c 65 0a  ource $userFile.
1fd0: 7d 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 23  }..#############
1fe0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1ff0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2000: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2010: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2020: 23 23 0a 0a 73 65 74 20 74 65 6d 70 6c 61 74 65  ##..set template
2030: 46 69 6c 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  File [file join 
2040: 24 70 61 74 68 20 77 69 6e 20 73 71 6c 69 74 65  $path win sqlite
2050: 2e 76 73 69 78 5d 0a 0a 69 66 20 7b 21 5b 66 69  .vsix]..if {![fi
2060: 6c 65 20 65 78 69 73 74 73 20 24 74 65 6d 70 6c  le exists $templ
2070: 61 74 65 46 69 6c 65 5d 20 7c 7c 20 5c 0a 20 20  ateFile] || \.  
2080: 20 20 21 5b 66 69 6c 65 20 69 73 66 69 6c 65 20    ![file isfile 
2090: 24 74 65 6d 70 6c 61 74 65 46 69 6c 65 5d 7d 20  $templateFile]} 
20a0: 74 68 65 6e 20 7b 0a 20 20 66 61 69 6c 20 5b 61  then {.  fail [a
20b0: 70 70 65 6e 64 41 72 67 73 20 22 74 65 6d 70 6c  ppendArgs "templ
20c0: 61 74 65 20 66 69 6c 65 20 5c 22 22 20 24 74 65  ate file \"" $te
20d0: 6d 70 6c 61 74 65 46 69 6c 65 20 22 5c 22 20 64  mplateFile "\" d
20e0: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 22 5d 0a  oes not exist"].
20f0: 7d 0a 0a 73 65 74 20 63 75 72 72 65 6e 74 44 69  }..set currentDi
2100: 72 65 63 74 6f 72 79 20 5b 70 77 64 5d 0a 73 65  rectory [pwd].se
2110: 74 20 6f 75 74 70 75 74 46 69 6c 65 20 5b 66 69  t outputFile [fi
2120: 6c 65 20 6a 6f 69 6e 20 24 63 75 72 72 65 6e 74  le join $current
2130: 44 69 72 65 63 74 6f 72 79 20 73 71 6c 69 74 65  Directory sqlite
2140: 2d 6f 75 74 70 75 74 2e 76 73 69 78 5d 0a 0a 69  -output.vsix]..i
2150: 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20  f {[file exists 
2160: 24 6f 75 74 70 75 74 46 69 6c 65 5d 7d 20 74 68  $outputFile]} th
2170: 65 6e 20 7b 0a 20 20 66 61 69 6c 20 5b 61 70 70  en {.  fail [app
2180: 65 6e 64 41 72 67 73 20 22 6f 75 74 70 75 74 20  endArgs "output 
2190: 66 69 6c 65 20 5c 22 22 20 24 6f 75 74 70 75 74  file \"" $output
21a0: 46 69 6c 65 20 22 5c 22 20 61 6c 72 65 61 64 79  File "\" already
21b0: 20 65 78 69 73 74 73 22 5d 0a 7d 0a 0a 23 23 23   exists"].}..###
21c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
21d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
21e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
21f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2200: 23 23 23 23 23 23 23 23 23 23 23 23 0a 0a 23 0a  ############..#.
2210: 23 20 4e 4f 54 45 3a 20 4d 61 6b 65 20 73 75 72  # NOTE: Make sur
2220: 65 20 74 68 61 74 20 61 20 76 61 6c 69 64 20 74  e that a valid t
2230: 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f  emporary directo
2240: 72 79 20 65 78 69 73 74 73 2e 0a 23 0a 73 65 74  ry exists..#.set
2250: 20 74 65 6d 70 6f 72 61 72 79 44 69 72 65 63 74   temporaryDirect
2260: 6f 72 79 20 5b 67 65 74 54 65 6d 70 6f 72 61 72  ory [getTemporar
2270: 79 50 61 74 68 5d 0a 0a 69 66 20 7b 5b 73 74 72  yPath]..if {[str
2280: 69 6e 67 20 6c 65 6e 67 74 68 20 24 74 65 6d 70  ing length $temp
2290: 6f 72 61 72 79 44 69 72 65 63 74 6f 72 79 5d 20  oraryDirectory] 
22a0: 3d 3d 20 30 20 7c 7c 20 5c 0a 20 20 20 20 21 5b  == 0 || \.    ![
22b0: 66 69 6c 65 20 65 78 69 73 74 73 20 24 74 65 6d  file exists $tem
22c0: 70 6f 72 61 72 79 44 69 72 65 63 74 6f 72 79 5d  poraryDirectory]
22d0: 20 7c 7c 20 5c 0a 20 20 20 20 21 5b 66 69 6c 65   || \.    ![file
22e0: 20 69 73 64 69 72 65 63 74 6f 72 79 20 24 74 65   isdirectory $te
22f0: 6d 70 6f 72 61 72 79 44 69 72 65 63 74 6f 72 79  mporaryDirectory
2300: 5d 7d 20 74 68 65 6e 20 7b 0a 20 20 66 61 69 6c  ]} then {.  fail
2310: 20 22 63 61 6e 6e 6f 74 20 6c 6f 63 61 74 65 20   "cannot locate 
2320: 61 20 75 73 61 62 6c 65 20 74 65 6d 70 6f 72 61  a usable tempora
2330: 72 79 20 64 69 72 65 63 74 6f 72 79 22 0a 7d 0a  ry directory".}.
2340: 0a 23 0a 23 20 4e 4f 54 45 3a 20 53 65 74 75 70  .#.# NOTE: Setup
2350: 20 74 68 65 20 73 74 61 67 69 6e 67 20 64 69 72   the staging dir
2360: 65 63 74 6f 72 79 20 74 6f 20 68 61 76 65 20 61  ectory to have a
2370: 20 75 6e 69 71 75 65 20 6e 61 6d 65 20 69 6e 73   unique name ins
2380: 69 64 65 20 6f 66 20 74 68 65 0a 23 20 20 20 20  ide of the.#    
2390: 20 20 20 63 6f 6e 66 69 67 75 72 65 64 20 74 65     configured te
23a0: 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72  mporary director
23b0: 79 2e 0a 23 0a 73 65 74 20 73 74 61 67 69 6e 67  y..#.set staging
23c0: 44 69 72 65 63 74 6f 72 79 20 5b 66 69 6c 65 20  Directory [file 
23d0: 6e 6f 72 6d 61 6c 69 7a 65 20 5b 66 69 6c 65 20  normalize [file 
23e0: 6a 6f 69 6e 20 24 74 65 6d 70 6f 72 61 72 79 44  join $temporaryD
23f0: 69 72 65 63 74 6f 72 79 20 5c 0a 20 20 20 20 5b  irectory \.    [
2400: 61 70 70 65 6e 64 41 72 67 73 20 24 72 6f 6f 74  appendArgs $root
2410: 4e 61 6d 65 20 2e 20 5b 70 69 64 5d 5d 5d 5d 0a  Name . [pid]]]].
2420: 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  .###############
2430: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2440: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2450: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2460: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2470: 0a 0a 23 0a 23 20 4e 4f 54 45 3a 20 43 6f 6e 66  ..#.# NOTE: Conf
2480: 69 67 75 72 65 20 74 68 65 20 65 78 74 65 72 6e  igure the extern
2490: 61 6c 20 7a 69 70 70 69 6e 67 20 74 6f 6f 6c 2e  al zipping tool.
24a0: 20 20 46 69 72 73 74 2c 20 73 65 65 20 69 66 20    First, see if 
24b0: 69 74 20 68 61 73 20 61 6c 72 65 61 64 79 0a 23  it has already.#
24c0: 20 20 20 20 20 20 20 62 65 65 6e 20 70 72 65 2d         been pre-
24d0: 63 6f 6e 66 69 67 75 72 65 64 2e 20 20 49 66 20  configured.  If 
24e0: 6e 6f 74 2c 20 74 72 79 20 74 6f 20 71 75 65 72  not, try to quer
24f0: 79 20 69 74 20 66 72 6f 6d 20 74 68 65 20 65 6e  y it from the en
2500: 76 69 72 6f 6e 6d 65 6e 74 2e 0a 23 20 20 20 20  vironment..#    
2510: 20 20 20 46 69 6e 61 6c 6c 79 2c 20 66 61 6c 6c     Finally, fall
2520: 62 61 63 6b 20 6f 6e 20 74 68 65 20 64 65 66 61  back on the defa
2530: 75 6c 74 20 6f 66 20 73 69 6d 70 6c 79 20 22 7a  ult of simply "z
2540: 69 70 22 2c 20 77 68 69 63 68 20 77 69 6c 6c 20  ip", which will 
2550: 74 68 65 6e 0a 23 20 20 20 20 20 20 20 62 65 20  then.#       be 
2560: 61 73 73 75 6d 65 64 20 74 6f 20 65 78 69 73 74  assumed to exist
2570: 20 73 6f 6d 65 77 68 65 72 65 20 61 6c 6f 6e 67   somewhere along
2580: 20 74 68 65 20 50 41 54 48 2e 0a 23 0a 69 66 20   the PATH..#.if 
2590: 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 7a  {![info exists z
25a0: 69 70 5d 7d 20 74 68 65 6e 20 7b 0a 20 20 69 66  ip]} then {.  if
25b0: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 65   {[info exists e
25c0: 6e 76 28 5a 69 70 54 6f 6f 6c 29 5d 7d 20 74 68  nv(ZipTool)]} th
25d0: 65 6e 20 7b 0a 20 20 20 20 73 65 74 20 7a 69 70  en {.    set zip
25e0: 20 24 65 6e 76 28 5a 69 70 54 6f 6f 6c 29 0a 20   $env(ZipTool). 
25f0: 20 7d 0a 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20   }.  if {![info 
2600: 65 78 69 73 74 73 20 7a 69 70 5d 20 7c 7c 20 21  exists zip] || !
2610: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 7a 69  [file exists $zi
2620: 70 5d 7d 20 74 68 65 6e 20 7b 0a 20 20 20 20 73  p]} then {.    s
2630: 65 74 20 7a 69 70 20 7a 69 70 0a 20 20 7d 0a 7d  et zip zip.  }.}
2640: 0a 0a 23 0a 23 20 4e 4f 54 45 3a 20 43 6f 6e 66  ..#.# NOTE: Conf
2650: 69 67 75 72 65 20 74 68 65 20 65 78 74 65 72 6e  igure the extern
2660: 61 6c 20 75 6e 7a 69 70 70 69 6e 67 20 74 6f 6f  al unzipping too
2670: 6c 2e 20 20 46 69 72 73 74 2c 20 73 65 65 20 69  l.  First, see i
2680: 66 20 69 74 20 68 61 73 20 61 6c 72 65 61 64 79  f it has already
2690: 0a 23 20 20 20 20 20 20 20 62 65 65 6e 20 70 72  .#       been pr
26a0: 65 2d 63 6f 6e 66 69 67 75 72 65 64 2e 20 20 49  e-configured.  I
26b0: 66 20 6e 6f 74 2c 20 74 72 79 20 74 6f 20 71 75  f not, try to qu
26c0: 65 72 79 20 69 74 20 66 72 6f 6d 20 74 68 65 20  ery it from the 
26d0: 65 6e 76 69 72 6f 6e 6d 65 6e 74 2e 0a 23 20 20  environment..#  
26e0: 20 20 20 20 20 46 69 6e 61 6c 6c 79 2c 20 66 61       Finally, fa
26f0: 6c 6c 62 61 63 6b 20 6f 6e 20 74 68 65 20 64 65  llback on the de
2700: 66 61 75 6c 74 20 6f 66 20 73 69 6d 70 6c 79 20  fault of simply 
2710: 22 75 6e 7a 69 70 22 2c 20 77 68 69 63 68 20 77  "unzip", which w
2720: 69 6c 6c 20 74 68 65 6e 0a 23 20 20 20 20 20 20  ill then.#      
2730: 20 62 65 20 61 73 73 75 6d 65 64 20 74 6f 20 65   be assumed to e
2740: 78 69 73 74 20 73 6f 6d 65 77 68 65 72 65 20 61  xist somewhere a
2750: 6c 6f 6e 67 20 74 68 65 20 50 41 54 48 2e 0a 23  long the PATH..#
2760: 0a 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73  .if {![info exis
2770: 74 73 20 75 6e 7a 69 70 5d 7d 20 74 68 65 6e 20  ts unzip]} then 
2780: 7b 0a 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78  {.  if {[info ex
2790: 69 73 74 73 20 65 6e 76 28 55 6e 5a 69 70 54 6f  ists env(UnZipTo
27a0: 6f 6c 29 5d 7d 20 74 68 65 6e 20 7b 0a 20 20 20  ol)]} then {.   
27b0: 20 73 65 74 20 75 6e 7a 69 70 20 24 65 6e 76 28   set unzip $env(
27c0: 55 6e 5a 69 70 54 6f 6f 6c 29 0a 20 20 7d 0a 20  UnZipTool).  }. 
27d0: 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
27e0: 74 73 20 75 6e 7a 69 70 5d 20 7c 7c 20 21 5b 66  ts unzip] || ![f
27f0: 69 6c 65 20 65 78 69 73 74 73 20 24 75 6e 7a 69  ile exists $unzi
2800: 70 5d 7d 20 74 68 65 6e 20 7b 0a 20 20 20 20 73  p]} then {.    s
2810: 65 74 20 75 6e 7a 69 70 20 75 6e 7a 69 70 0a 20  et unzip unzip. 
2820: 20 7d 0a 7d 0a 0a 23 23 23 23 23 23 23 23 23 23   }.}..##########
2830: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2840: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2850: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2860: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2870: 23 23 23 23 23 0a 0a 23 0a 23 20 4e 4f 54 45 3a  #####..#.# NOTE:
2880: 20 41 74 74 65 6d 70 74 20 74 6f 20 65 78 74 72   Attempt to extr
2890: 61 63 74 20 74 68 65 20 53 51 4c 69 74 65 20 76  act the SQLite v
28a0: 65 72 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  ersion from the 
28b0: 22 73 71 6c 69 74 65 33 2e 68 22 20 68 65 61 64  "sqlite3.h" head
28c0: 65 72 20 66 69 6c 65 0a 23 20 20 20 20 20 20 20  er file.#       
28d0: 69 6e 20 74 68 65 20 73 6f 75 72 63 65 20 64 69  in the source di
28e0: 72 65 63 74 6f 72 79 2e 20 20 54 68 69 73 20 73  rectory.  This s
28f0: 63 72 69 70 74 20 61 73 73 75 6d 65 73 20 74 68  cript assumes th
2900: 61 74 20 74 68 65 20 68 65 61 64 65 72 20 66 69  at the header fi
2910: 6c 65 20 68 61 73 0a 23 20 20 20 20 20 20 20 61  le has.#       a
2920: 6c 72 65 61 64 79 20 62 65 65 6e 20 67 65 6e 65  lready been gene
2930: 72 61 74 65 64 20 62 79 20 74 68 65 20 62 75 69  rated by the bui
2940: 6c 64 20 70 72 6f 63 65 73 73 2e 0a 23 0a 73 65  ld process..#.se
2950: 74 20 70 61 74 74 65 72 6e 20 7b 5e 23 64 65 66  t pattern {^#def
2960: 69 6e 65 5c 73 2b 53 51 4c 49 54 45 5f 56 45 52  ine\s+SQLITE_VER
2970: 53 49 4f 4e 5c 73 2b 22 28 2e 2a 29 22 24 7d 0a  SION\s+"(.*)"$}.
2980: 73 65 74 20 64 61 74 61 20 5b 72 65 61 64 46 69  set data [readFi
2990: 6c 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 73  le [file join $s
29a0: 6f 75 72 63 65 44 69 72 65 63 74 6f 72 79 20 73  ourceDirectory s
29b0: 71 6c 69 74 65 33 2e 68 5d 5d 0a 0a 69 66 20 7b  qlite3.h]]..if {
29c0: 21 5b 72 65 67 65 78 70 20 2d 6c 69 6e 65 20 2d  ![regexp -line -
29d0: 2d 20 24 70 61 74 74 65 72 6e 20 24 64 61 74 61  - $pattern $data
29e0: 20 64 75 6d 6d 79 20 76 65 72 73 69 6f 6e 5d 7d   dummy version]}
29f0: 20 74 68 65 6e 20 7b 0a 20 20 66 61 69 6c 20 5b   then {.  fail [
2a00: 61 70 70 65 6e 64 41 72 67 73 20 22 63 61 6e 6e  appendArgs "cann
2a10: 6f 74 20 6c 6f 63 61 74 65 20 53 51 4c 49 54 45  ot locate SQLITE
2a20: 5f 56 45 52 53 49 4f 4e 20 76 61 6c 75 65 20 69  _VERSION value i
2a30: 6e 20 5c 22 22 20 5c 0a 20 20 20 20 20 20 5b 66  n \"" \.      [f
2a40: 69 6c 65 20 6a 6f 69 6e 20 24 73 6f 75 72 63 65  ile join $source
2a50: 44 69 72 65 63 74 6f 72 79 20 73 71 6c 69 74 65  Directory sqlite
2a60: 33 2e 68 5d 20 5c 22 5d 0a 7d 0a 0a 23 23 23 23  3.h] \"].}..####
2a70: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2a80: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2a90: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2aa0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2ab0: 23 23 23 23 23 23 23 23 23 23 23 0a 0a 23 0a 23  ###########..#.#
2ac0: 20 4e 4f 54 45 3a 20 53 65 74 75 70 20 61 6c 6c   NOTE: Setup all
2ad0: 20 74 68 65 20 6d 61 73 74 65 72 20 66 69 6c 65   the master file
2ae0: 20 6c 69 73 74 20 64 61 74 61 2e 20 20 54 68 69   list data.  Thi
2af0: 73 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 73  s includes the s
2b00: 6f 75 72 63 65 20 61 6e 64 0a 23 20 20 20 20 20  ource and.#     
2b10: 20 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 66 69    destination fi
2b20: 6c 65 20 6e 61 6d 65 73 2c 20 62 75 69 6c 64 2d  le names, build-
2b30: 6e 65 75 74 72 61 6c 20 62 6f 6f 6c 65 61 6e 20  neutral boolean 
2b40: 66 6c 61 67 73 2c 20 70 6c 61 74 66 6f 72 6d 2d  flags, platform-
2b50: 6e 65 75 74 72 61 6c 0a 23 20 20 20 20 20 20 20  neutral.#       
2b60: 62 6f 6f 6c 65 61 6e 20 66 6c 61 67 73 2c 20 61  boolean flags, a
2b70: 6e 64 20 74 68 65 20 64 79 6e 61 6d 69 63 20 63  nd the dynamic c
2b80: 6f 6e 74 65 6e 74 20 28 73 75 62 73 74 29 20 62  ontent (subst) b
2b90: 6f 6f 6c 65 61 6e 20 66 6c 61 67 73 2e 20 20 54  oolean flags.  T
2ba0: 68 65 72 65 0a 23 20 20 20 20 20 20 20 69 73 20  here.#       is 
2bb0: 61 6c 73 6f 20 6f 6e 65 20 73 65 74 20 6f 66 20  also one set of 
2bc0: 62 6f 6f 6c 65 61 6e 20 66 6c 61 67 73 20 70 65  boolean flags pe
2bd0: 72 20 62 75 69 6c 64 20 63 6f 6e 66 69 67 75 72  r build configur
2be0: 61 74 69 6f 6e 2c 20 63 75 72 72 65 6e 74 6c 79  ation, currently
2bf0: 0a 23 20 20 20 20 20 20 20 22 44 65 62 75 67 22  .#       "Debug"
2c00: 20 61 6e 64 20 22 52 65 74 61 69 6c 22 2c 20 74   and "Retail", t
2c10: 68 61 74 20 63 6f 6e 74 72 6f 6c 20 77 68 69 63  hat control whic
2c20: 68 20 66 69 6c 65 73 20 61 72 65 20 73 6b 69 70  h files are skip
2c30: 70 65 64 20 66 6f 72 20 69 74 2e 0a 23 0a 69 66  ped for it..#.if
2c40: 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
2c50: 66 69 6c 65 4e 61 6d 65 73 28 73 6f 75 72 63 65  fileNames(source
2c60: 29 5d 7d 20 74 68 65 6e 20 7b 0a 20 20 73 65 74  )]} then {.  set
2c70: 20 66 69 6c 65 4e 61 6d 65 73 28 73 6f 75 72 63   fileNames(sourc
2c80: 65 29 20 5b 6c 69 73 74 20 22 22 20 22 22 20 22  e) [list "" "" "
2c90: 22 20 5c 0a 20 20 20 20 20 20 5b 66 69 6c 65 20  " \.      [file 
2ca0: 6a 6f 69 6e 20 24 73 6f 75 72 63 65 44 69 72 65  join $sourceDire
2cb0: 63 74 6f 72 79 20 73 71 6c 69 74 65 33 2e 68 5d  ctory sqlite3.h]
2cc0: 20 5c 0a 20 20 20 20 20 20 5b 66 69 6c 65 20 6a   \.      [file j
2cd0: 6f 69 6e 20 24 62 69 6e 61 72 79 44 69 72 65 63  oin $binaryDirec
2ce0: 74 6f 72 79 20 3c 62 75 69 6c 64 3e 20 3c 70 6c  tory <build> <pl
2cf0: 61 74 66 6f 72 6d 3e 20 73 71 6c 69 74 65 33 2e  atform> sqlite3.
2d00: 6c 69 62 5d 20 5c 0a 20 20 20 20 20 20 5b 66 69  lib] \.      [fi
2d10: 6c 65 20 6a 6f 69 6e 20 24 62 69 6e 61 72 79 44  le join $binaryD
2d20: 69 72 65 63 74 6f 72 79 20 3c 62 75 69 6c 64 3e  irectory <build>
2d30: 20 3c 70 6c 61 74 66 6f 72 6d 3e 20 73 71 6c 69   <platform> sqli
2d40: 74 65 33 2e 64 6c 6c 5d 5d 0a 0a 20 20 69 66 20  te3.dll]]..  if 
2d50: 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 6e  {![info exists n
2d60: 6f 28 73 79 6d 62 6f 6c 73 29 5d 7d 20 74 68 65  o(symbols)]} the
2d70: 6e 20 7b 0a 20 20 20 20 6c 61 70 70 65 6e 64 20  n {.    lappend 
2d80: 66 69 6c 65 4e 61 6d 65 73 28 73 6f 75 72 63 65  fileNames(source
2d90: 29 20 5c 0a 20 20 20 20 20 20 20 20 5b 66 69 6c  ) \.        [fil
2da0: 65 20 6a 6f 69 6e 20 24 62 69 6e 61 72 79 44 69  e join $binaryDi
2db0: 72 65 63 74 6f 72 79 20 3c 62 75 69 6c 64 3e 20  rectory <build> 
2dc0: 3c 70 6c 61 74 66 6f 72 6d 3e 20 73 71 6c 69 74  <platform> sqlit
2dd0: 65 33 2e 70 64 62 5d 0a 20 20 7d 0a 7d 0a 0a 69  e3.pdb].  }.}..i
2de0: 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
2df0: 20 66 69 6c 65 4e 61 6d 65 73 28 64 65 73 74 69   fileNames(desti
2e00: 6e 61 74 69 6f 6e 29 5d 7d 20 74 68 65 6e 20 7b  nation)]} then {
2e10: 0a 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 73  .  set fileNames
2e20: 28 64 65 73 74 69 6e 61 74 69 6f 6e 29 20 5b 6c  (destination) [l
2e30: 69 73 74 20 5c 0a 20 20 20 20 20 20 5b 66 69 6c  ist \.      [fil
2e40: 65 20 6a 6f 69 6e 20 24 73 74 61 67 69 6e 67 44  e join $stagingD
2e50: 69 72 65 63 74 6f 72 79 20 65 78 74 65 6e 73 69  irectory extensi
2e60: 6f 6e 2e 76 73 69 78 6d 61 6e 69 66 65 73 74 5d  on.vsixmanifest]
2e70: 20 5c 0a 20 20 20 20 20 20 5b 66 69 6c 65 20 6a   \.      [file j
2e80: 6f 69 6e 20 24 73 74 61 67 69 6e 67 44 69 72 65  oin $stagingDire
2e90: 63 74 6f 72 79 20 53 44 4b 4d 61 6e 69 66 65 73  ctory SDKManifes
2ea0: 74 2e 78 6d 6c 5d 20 5c 0a 20 20 20 20 20 20 5b  t.xml] \.      [
2eb0: 66 69 6c 65 20 6a 6f 69 6e 20 24 73 74 61 67 69  file join $stagi
2ec0: 6e 67 44 69 72 65 63 74 6f 72 79 20 44 65 73 69  ngDirectory Desi
2ed0: 67 6e 54 69 6d 65 20 3c 62 75 69 6c 64 3e 20 3c  gnTime <build> <
2ee0: 70 6c 61 74 66 6f 72 6d 3e 20 5c 0a 20 20 20 20  platform> \.    
2ef0: 20 20 20 20 20 20 53 51 4c 69 74 65 2e 57 69 6e        SQLite.Win
2f00: 52 54 2e 70 72 6f 70 73 5d 20 5c 0a 20 20 20 20  RT.props] \.    
2f10: 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 73 74    [file join $st
2f20: 61 67 69 6e 67 44 69 72 65 63 74 6f 72 79 20 44  agingDirectory D
2f30: 65 73 69 67 6e 54 69 6d 65 20 3c 62 75 69 6c 64  esignTime <build
2f40: 3e 20 3c 70 6c 61 74 66 6f 72 6d 3e 20 73 71 6c  > <platform> sql
2f50: 69 74 65 33 2e 68 5d 20 5c 0a 20 20 20 20 20 20  ite3.h] \.      
2f60: 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 73 74 61 67  [file join $stag
2f70: 69 6e 67 44 69 72 65 63 74 6f 72 79 20 44 65 73  ingDirectory Des
2f80: 69 67 6e 54 69 6d 65 20 3c 62 75 69 6c 64 3e 20  ignTime <build> 
2f90: 3c 70 6c 61 74 66 6f 72 6d 3e 20 73 71 6c 69 74  <platform> sqlit
2fa0: 65 33 2e 6c 69 62 5d 20 5c 0a 20 20 20 20 20 20  e3.lib] \.      
2fb0: 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 73 74 61 67  [file join $stag
2fc0: 69 6e 67 44 69 72 65 63 74 6f 72 79 20 52 65 64  ingDirectory Red
2fd0: 69 73 74 20 3c 62 75 69 6c 64 3e 20 3c 70 6c 61  ist <build> <pla
2fe0: 74 66 6f 72 6d 3e 20 73 71 6c 69 74 65 33 2e 64  tform> sqlite3.d
2ff0: 6c 6c 5d 5d 0a 0a 20 20 69 66 20 7b 21 5b 69 6e  ll]]..  if {![in
3000: 66 6f 20 65 78 69 73 74 73 20 6e 6f 28 73 79 6d  fo exists no(sym
3010: 62 6f 6c 73 29 5d 7d 20 74 68 65 6e 20 7b 0a 20  bols)]} then {. 
3020: 20 20 20 6c 61 70 70 65 6e 64 20 66 69 6c 65 4e     lappend fileN
3030: 61 6d 65 73 28 64 65 73 74 69 6e 61 74 69 6f 6e  ames(destination
3040: 29 20 5c 0a 20 20 20 20 20 20 20 20 5b 66 69 6c  ) \.        [fil
3050: 65 20 6a 6f 69 6e 20 24 73 74 61 67 69 6e 67 44  e join $stagingD
3060: 69 72 65 63 74 6f 72 79 20 52 65 64 69 73 74 20  irectory Redist 
3070: 3c 62 75 69 6c 64 3e 20 3c 70 6c 61 74 66 6f 72  <build> <platfor
3080: 6d 3e 20 73 71 6c 69 74 65 33 2e 70 64 62 5d 0a  m> sqlite3.pdb].
3090: 20 20 7d 0a 7d 0a 0a 69 66 20 7b 21 5b 69 6e 66    }.}..if {![inf
30a0: 6f 20 65 78 69 73 74 73 20 66 69 6c 65 4e 61 6d  o exists fileNam
30b0: 65 73 28 62 75 69 6c 64 4e 65 75 74 72 61 6c 29  es(buildNeutral)
30c0: 5d 7d 20 74 68 65 6e 20 7b 0a 20 20 73 65 74 20  ]} then {.  set 
30d0: 66 69 6c 65 4e 61 6d 65 73 28 62 75 69 6c 64 4e  fileNames(buildN
30e0: 65 75 74 72 61 6c 29 20 5b 6c 69 73 74 20 31 20  eutral) [list 1 
30f0: 31 20 31 20 31 20 30 20 30 5d 0a 0a 20 20 69 66  1 1 1 0 0]..  if
3100: 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
3110: 6e 6f 28 73 79 6d 62 6f 6c 73 29 5d 7d 20 74 68  no(symbols)]} th
3120: 65 6e 20 7b 0a 20 20 20 20 6c 61 70 70 65 6e 64  en {.    lappend
3130: 20 66 69 6c 65 4e 61 6d 65 73 28 62 75 69 6c 64   fileNames(build
3140: 4e 65 75 74 72 61 6c 29 20 30 0a 20 20 7d 0a 7d  Neutral) 0.  }.}
3150: 0a 0a 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69  ..if {![info exi
3160: 73 74 73 20 66 69 6c 65 4e 61 6d 65 73 28 70 6c  sts fileNames(pl
3170: 61 74 66 6f 72 6d 4e 65 75 74 72 61 6c 29 5d 7d  atformNeutral)]}
3180: 20 74 68 65 6e 20 7b 0a 20 20 73 65 74 20 66 69   then {.  set fi
3190: 6c 65 4e 61 6d 65 73 28 70 6c 61 74 66 6f 72 6d  leNames(platform
31a0: 4e 65 75 74 72 61 6c 29 20 5b 6c 69 73 74 20 31  Neutral) [list 1
31b0: 20 31 20 31 20 31 20 30 20 30 5d 0a 0a 20 20 69   1 1 1 0 0]..  i
31c0: 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
31d0: 20 6e 6f 28 73 79 6d 62 6f 6c 73 29 5d 7d 20 74   no(symbols)]} t
31e0: 68 65 6e 20 7b 0a 20 20 20 20 6c 61 70 70 65 6e  hen {.    lappen
31f0: 64 20 66 69 6c 65 4e 61 6d 65 73 28 70 6c 61 74  d fileNames(plat
3200: 66 6f 72 6d 4e 65 75 74 72 61 6c 29 20 30 0a 20  formNeutral) 0. 
3210: 20 7d 0a 7d 0a 0a 69 66 20 7b 21 5b 69 6e 66 6f   }.}..if {![info
3220: 20 65 78 69 73 74 73 20 66 69 6c 65 4e 61 6d 65   exists fileName
3230: 73 28 73 75 62 73 74 29 5d 7d 20 74 68 65 6e 20  s(subst)]} then 
3240: 7b 0a 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65  {.  set fileName
3250: 73 28 73 75 62 73 74 29 20 5b 6c 69 73 74 20 31  s(subst) [list 1
3260: 20 31 20 31 20 30 20 30 20 30 5d 0a 0a 20 20 69   1 1 0 0 0]..  i
3270: 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
3280: 20 6e 6f 28 73 79 6d 62 6f 6c 73 29 5d 7d 20 74   no(symbols)]} t
3290: 68 65 6e 20 7b 0a 20 20 20 20 6c 61 70 70 65 6e  hen {.    lappen
32a0: 64 20 66 69 6c 65 4e 61 6d 65 73 28 73 75 62 73  d fileNames(subs
32b0: 74 29 20 30 0a 20 20 7d 0a 7d 0a 0a 69 66 20 7b  t) 0.  }.}..if {
32c0: 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 66 69  ![info exists fi
32d0: 6c 65 4e 61 6d 65 73 28 6e 6f 44 65 62 75 67 29  leNames(noDebug)
32e0: 5d 7d 20 74 68 65 6e 20 7b 0a 20 20 73 65 74 20  ]} then {.  set 
32f0: 66 69 6c 65 4e 61 6d 65 73 28 6e 6f 44 65 62 75  fileNames(noDebu
3300: 67 29 20 5b 6c 69 73 74 20 30 20 30 20 30 20 30  g) [list 0 0 0 0
3310: 20 30 20 30 5d 0a 0a 20 20 69 66 20 7b 21 5b 69   0 0]..  if {![i
3320: 6e 66 6f 20 65 78 69 73 74 73 20 6e 6f 28 73 79  nfo exists no(sy
3330: 6d 62 6f 6c 73 29 5d 7d 20 74 68 65 6e 20 7b 0a  mbols)]} then {.
3340: 20 20 20 20 6c 61 70 70 65 6e 64 20 66 69 6c 65      lappend file
3350: 4e 61 6d 65 73 28 6e 6f 44 65 62 75 67 29 20 30  Names(noDebug) 0
3360: 0a 20 20 7d 0a 7d 0a 0a 69 66 20 7b 21 5b 69 6e  .  }.}..if {![in
3370: 66 6f 20 65 78 69 73 74 73 20 66 69 6c 65 4e 61  fo exists fileNa
3380: 6d 65 73 28 6e 6f 52 65 74 61 69 6c 29 5d 7d 20  mes(noRetail)]} 
3390: 74 68 65 6e 20 7b 0a 20 20 73 65 74 20 66 69 6c  then {.  set fil
33a0: 65 4e 61 6d 65 73 28 6e 6f 52 65 74 61 69 6c 29  eNames(noRetail)
33b0: 20 5b 6c 69 73 74 20 30 20 30 20 30 20 30 20 30   [list 0 0 0 0 0
33c0: 20 30 5d 0a 0a 20 20 69 66 20 7b 21 5b 69 6e 66   0]..  if {![inf
33d0: 6f 20 65 78 69 73 74 73 20 6e 6f 28 73 79 6d 62  o exists no(symb
33e0: 6f 6c 73 29 5d 7d 20 74 68 65 6e 20 7b 0a 20 20  ols)]} then {.  
33f0: 20 20 6c 61 70 70 65 6e 64 20 66 69 6c 65 4e 61    lappend fileNa
3400: 6d 65 73 28 6e 6f 52 65 74 61 69 6c 29 20 31 0a  mes(noRetail) 1.
3410: 20 20 7d 0a 7d 0a 0a 23 23 23 23 23 23 23 23 23    }.}..#########
3420: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3430: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3440: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3450: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3460: 23 23 23 23 23 23 0a 0a 23 0a 23 20 4e 4f 54 45  ######..#.# NOTE
3470: 3a 20 53 65 74 75 70 20 74 68 65 20 6c 69 73 74  : Setup the list
3480: 20 6f 66 20 62 75 69 6c 64 73 20 73 75 70 70 6f   of builds suppo
3490: 72 74 65 64 20 62 79 20 74 68 69 73 20 73 63 72  rted by this scr
34a0: 69 70 74 2e 0a 23 0a 69 66 20 7b 21 5b 69 6e 66  ipt..#.if {![inf
34b0: 6f 20 65 78 69 73 74 73 20 62 75 69 6c 64 4e 61  o exists buildNa
34c0: 6d 65 73 5d 7d 20 74 68 65 6e 20 7b 0a 20 20 73  mes]} then {.  s
34d0: 65 74 20 62 75 69 6c 64 4e 61 6d 65 73 20 5b 6c  et buildNames [l
34e0: 69 73 74 20 44 65 62 75 67 20 52 65 74 61 69 6c  ist Debug Retail
34f0: 5d 0a 7d 0a 0a 23 23 23 23 23 23 23 23 23 23 23  ].}..###########
3500: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3510: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3520: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3530: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3540: 23 23 23 23 0a 0a 23 0a 23 20 4e 4f 54 45 3a 20  ####..#.# NOTE: 
3550: 53 65 74 75 70 20 74 68 65 20 6c 69 73 74 20 6f  Setup the list o
3560: 66 20 70 6c 61 74 66 6f 72 6d 73 20 73 75 70 70  f platforms supp
3570: 6f 72 74 65 64 20 62 79 20 74 68 69 73 20 73 63  orted by this sc
3580: 72 69 70 74 2e 0a 23 0a 69 66 20 7b 21 5b 69 6e  ript..#.if {![in
3590: 66 6f 20 65 78 69 73 74 73 20 70 6c 61 74 66 6f  fo exists platfo
35a0: 72 6d 4e 61 6d 65 73 5d 7d 20 74 68 65 6e 20 7b  rmNames]} then {
35b0: 0a 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 4e  .  set platformN
35c0: 61 6d 65 73 20 5b 6c 69 73 74 20 78 38 36 20 78  ames [list x86 x
35d0: 36 34 20 41 52 4d 5d 0a 7d 0a 0a 23 23 23 23 23  64 ARM].}..#####
35e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
35f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3600: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3610: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3620: 23 23 23 23 23 23 23 23 23 23 0a 0a 23 0a 23 20  ##########..#.# 
3630: 4e 4f 54 45 3a 20 4d 61 6b 65 20 73 75 72 65 20  NOTE: Make sure 
3640: 74 68 65 20 73 74 61 67 69 6e 67 20 64 69 72 65  the staging dire
3650: 63 74 6f 72 79 20 65 78 69 73 74 73 2c 20 63 72  ctory exists, cr
3660: 65 61 74 69 6e 67 20 69 74 20 69 66 20 6e 65 63  eating it if nec
3670: 65 73 73 61 72 79 2e 0a 23 0a 66 69 6c 65 20 6d  essary..#.file m
3680: 6b 64 69 72 20 24 73 74 61 67 69 6e 67 44 69 72  kdir $stagingDir
3690: 65 63 74 6f 72 79 0a 0a 23 0a 23 20 4e 4f 54 45  ectory..#.# NOTE
36a0: 3a 20 42 75 69 6c 64 20 74 68 65 20 54 63 6c 20  : Build the Tcl 
36b0: 63 6f 6d 6d 61 6e 64 20 75 73 65 64 20 74 6f 20  command used to 
36c0: 65 78 74 72 61 63 74 20 74 68 65 20 74 65 6d 70  extract the temp
36d0: 6c 61 74 65 20 70 61 63 6b 61 67 65 20 74 6f 20  late package to 
36e0: 74 68 65 0a 23 20 20 20 20 20 20 20 73 74 61 67  the.#       stag
36f0: 69 6e 67 20 64 69 72 65 63 74 6f 72 79 2e 0a 23  ing directory..#
3700: 0a 73 65 74 20 65 78 74 72 61 63 74 43 6f 6d 6d  .set extractComm
3710: 61 6e 64 20 5b 6c 69 73 74 20 65 78 65 63 20 2d  and [list exec -
3720: 2d 20 24 75 6e 7a 69 70 20 24 74 65 6d 70 6c 61  - $unzip $templa
3730: 74 65 46 69 6c 65 20 2d 64 20 24 73 74 61 67 69  teFile -d $stagi
3740: 6e 67 44 69 72 65 63 74 6f 72 79 5d 0a 0a 23 0a  ngDirectory]..#.
3750: 23 20 4e 4f 54 45 3a 20 45 78 74 72 61 63 74 20  # NOTE: Extract 
3760: 74 68 65 20 74 65 6d 70 6c 61 74 65 20 70 61 63  the template pac
3770: 6b 61 67 65 20 74 6f 20 74 68 65 20 73 74 61 67  kage to the stag
3780: 69 6e 67 20 64 69 72 65 63 74 6f 72 79 2e 0a 23  ing directory..#
3790: 0a 65 76 61 6c 20 24 65 78 74 72 61 63 74 43 6f  .eval $extractCo
37a0: 6d 6d 61 6e 64 0a 0a 23 23 23 23 23 23 23 23 23  mmand..#########
37b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
37c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
37d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
37e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
37f0: 23 23 23 23 23 23 0a 0a 23 0a 23 20 4e 4f 54 45  ######..#.# NOTE
3800: 3a 20 50 72 6f 63 65 73 73 20 65 61 63 68 20 66  : Process each f
3810: 69 6c 65 20 69 6e 20 74 68 65 20 6d 61 73 74 65  ile in the maste
3820: 72 20 66 69 6c 65 20 6c 69 73 74 2e 20 20 54 68  r file list.  Th
3830: 65 72 65 20 61 72 65 20 61 63 74 75 61 6c 6c 79  ere are actually
3840: 20 73 65 76 65 6e 0a 23 20 20 20 20 20 20 20 70   seven.#       p
3850: 61 72 61 6c 6c 65 6c 20 6c 69 73 74 73 20 74 68  arallel lists th
3860: 61 74 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 73  at contain the s
3870: 6f 75 72 63 65 20 66 69 6c 65 20 6e 61 6d 65 73  ource file names
3880: 2c 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f  , the destinatio
3890: 6e 20 66 69 6c 65 0a 23 20 20 20 20 20 20 20 6e  n file.#       n
38a0: 61 6d 65 73 2c 20 74 68 65 20 62 75 69 6c 64 2d  ames, the build-
38b0: 6e 65 75 74 72 61 6c 20 66 6c 61 67 73 2c 20 74  neutral flags, t
38c0: 68 65 20 70 6c 61 74 66 6f 72 6d 2d 6e 65 75 74  he platform-neut
38d0: 72 61 6c 20 66 6c 61 67 73 2c 20 74 68 65 0a 23  ral flags, the.#
38e0: 20 20 20 20 20 20 20 75 73 65 2d 73 75 62 73 74         use-subst
38f0: 20 66 6c 61 67 73 2c 20 74 68 65 20 6e 6f 2d 64   flags, the no-d
3900: 65 62 75 67 20 66 6c 61 67 73 2c 20 61 6e 64 20  ebug flags, and 
3910: 74 68 65 20 6e 6f 2d 72 65 74 61 69 6c 20 66 6c  the no-retail fl
3920: 61 67 73 2e 20 20 49 66 20 74 68 65 0a 23 20 20  ags.  If the.#  
3930: 20 20 20 20 20 70 6c 61 74 66 6f 72 6d 2d 6e 65       platform-ne
3940: 75 74 72 61 6c 20 66 6c 61 67 20 69 73 20 6e 6f  utral flag is no
3950: 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 66 69 6c 65  n-zero, the file
3960: 20 69 73 20 6e 6f 74 20 70 6c 61 74 66 6f 72 6d   is not platform
3970: 2d 73 70 65 63 69 66 69 63 2e 0a 23 20 20 20 20  -specific..#    
3980: 20 20 20 49 66 20 74 68 65 20 62 75 69 6c 64 2d     If the build-
3990: 6e 65 75 74 72 61 6c 20 66 6c 61 67 20 69 73 20  neutral flag is 
39a0: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 66 69  non-zero, the fi
39b0: 6c 65 20 69 73 20 6e 6f 74 20 62 75 69 6c 64 2d  le is not build-
39c0: 73 70 65 63 69 66 69 63 2e 0a 23 20 20 20 20 20  specific..#     
39d0: 20 20 49 66 20 74 68 65 20 75 73 65 2d 73 75 62    If the use-sub
39e0: 73 74 20 66 6c 61 67 20 69 73 20 6e 6f 6e 2d 7a  st flag is non-z
39f0: 65 72 6f 2c 20 74 68 65 20 66 69 6c 65 20 69 73  ero, the file is
3a00: 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62   considered to b
3a10: 65 20 61 20 74 65 78 74 0a 23 20 20 20 20 20 20  e a text.#      
3a20: 20 66 69 6c 65 20 74 68 61 74 20 6d 61 79 20 63   file that may c
3a30: 6f 6e 74 61 69 6e 20 54 63 6c 20 76 61 72 69 61  ontain Tcl varia
3a40: 62 6c 65 20 61 6e 64 2f 6f 72 20 63 6f 6d 6d 61  ble and/or comma
3a50: 6e 64 20 72 65 70 6c 61 63 65 6d 65 6e 74 73 2c  nd replacements,
3a60: 20 74 6f 20 62 65 0a 23 20 20 20 20 20 20 20 64   to be.#       d
3a70: 79 6e 61 6d 69 63 61 6c 6c 79 20 72 65 70 6c 61  ynamically repla
3a80: 63 65 64 20 64 75 72 69 6e 67 20 70 72 6f 63 65  ced during proce
3a90: 73 73 69 6e 67 2e 20 20 49 66 20 74 68 65 20 6e  ssing.  If the n
3aa0: 6f 2d 64 65 62 75 67 20 66 6c 61 67 20 69 73 0a  o-debug flag is.
3ab0: 23 20 20 20 20 20 20 20 6e 6f 6e 2d 7a 65 72 6f  #       non-zero
3ac0: 2c 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c 20  , the file will 
3ad0: 62 65 20 73 6b 69 70 70 65 64 20 77 68 65 6e 20  be skipped when 
3ae0: 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 74  processing for t
3af0: 68 65 20 64 65 62 75 67 20 62 75 69 6c 64 2e 0a  he debug build..
3b00: 23 20 20 20 20 20 20 20 49 66 20 74 68 65 20 6e  #       If the n
3b10: 6f 2d 72 65 74 61 69 6c 20 66 6c 61 67 20 69 73  o-retail flag is
3b20: 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 66   non-zero, the f
3b30: 69 6c 65 20 77 69 6c 6c 20 62 65 20 73 6b 69 70  ile will be skip
3b40: 70 65 64 20 77 68 65 6e 0a 23 20 20 20 20 20 20  ped when.#      
3b50: 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20   processing for 
3b60: 74 68 65 20 72 65 74 61 69 6c 20 62 75 69 6c 64  the retail build
3b70: 2e 20 20 49 66 20 74 68 65 20 73 6f 75 72 63 65  .  If the source
3b80: 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 61 6e   file name is an
3b90: 20 65 6d 70 74 79 0a 23 20 20 20 20 20 20 20 73   empty.#       s
3ba0: 74 72 69 6e 67 2c 20 74 68 65 6e 20 74 68 65 20  tring, then the 
3bb0: 64 65 73 74 69 6e 61 74 69 6f 6e 20 66 69 6c 65  destination file
3bc0: 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65 20 61 73   name will be as
3bd0: 73 75 6d 65 64 20 74 6f 20 61 6c 72 65 61 64 79  sumed to already
3be0: 20 65 78 69 73 74 0a 23 20 20 20 20 20 20 20 69   exist.#       i
3bf0: 6e 20 74 68 65 20 73 74 61 67 69 6e 67 20 64 69  n the staging di
3c00: 72 65 63 74 6f 72 79 20 61 6e 64 20 77 69 6c 6c  rectory and will
3c10: 20 6e 6f 74 20 62 65 20 63 6f 70 69 65 64 3b 20   not be copied; 
3c20: 68 6f 77 65 76 65 72 2c 20 64 79 6e 61 6d 69 63  however, dynamic
3c30: 0a 23 20 20 20 20 20 20 20 72 65 70 6c 61 63 65  .#       replace
3c40: 6d 65 6e 74 73 20 6d 61 79 20 73 74 69 6c 6c 20  ments may still 
3c50: 62 65 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e 20  be performed on 
3c60: 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  the destination 
3c70: 66 69 6c 65 20 70 72 69 6f 72 20 74 6f 0a 23 20  file prior to.# 
3c80: 20 20 20 20 20 20 74 68 65 20 70 61 63 6b 61 67        the packag
3c90: 65 20 62 65 69 6e 67 20 72 65 2d 7a 69 70 70 65  e being re-zippe
3ca0: 64 2e 0a 23 0a 66 6f 72 65 61 63 68 20 73 6f 75  d..#.foreach sou
3cb0: 72 63 65 46 69 6c 65 4e 61 6d 65 20 20 20 20 20  rceFileName     
3cc0: 20 24 66 69 6c 65 4e 61 6d 65 73 28 73 6f 75 72   $fileNames(sour
3cd0: 63 65 29 20 5c 0a 20 20 20 20 20 20 20 20 64 65  ce) \.        de
3ce0: 73 74 69 6e 61 74 69 6f 6e 46 69 6c 65 4e 61 6d  stinationFileNam
3cf0: 65 20 24 66 69 6c 65 4e 61 6d 65 73 28 64 65 73  e $fileNames(des
3d00: 74 69 6e 61 74 69 6f 6e 29 20 5c 0a 20 20 20 20  tination) \.    
3d10: 20 20 20 20 62 75 69 6c 64 4e 65 75 74 72 61 6c      buildNeutral
3d20: 20 20 20 20 20 20 20 20 24 66 69 6c 65 4e 61 6d          $fileNam
3d30: 65 73 28 62 75 69 6c 64 4e 65 75 74 72 61 6c 29  es(buildNeutral)
3d40: 20 5c 0a 20 20 20 20 20 20 20 20 70 6c 61 74 66   \.        platf
3d50: 6f 72 6d 4e 65 75 74 72 61 6c 20 20 20 20 20 24  ormNeutral     $
3d60: 66 69 6c 65 4e 61 6d 65 73 28 70 6c 61 74 66 6f  fileNames(platfo
3d70: 72 6d 4e 65 75 74 72 61 6c 29 20 5c 0a 20 20 20  rmNeutral) \.   
3d80: 20 20 20 20 20 75 73 65 53 75 62 73 74 20 20 20       useSubst   
3d90: 20 20 20 20 20 20 20 20 20 24 66 69 6c 65 4e 61           $fileNa
3da0: 6d 65 73 28 73 75 62 73 74 29 20 5c 0a 20 20 20  mes(subst) \.   
3db0: 20 20 20 20 20 6e 6f 44 65 62 75 67 20 20 20 20       noDebug    
3dc0: 20 20 20 20 20 20 20 20 20 24 66 69 6c 65 4e 61           $fileNa
3dd0: 6d 65 73 28 6e 6f 44 65 62 75 67 29 20 5c 0a 20  mes(noDebug) \. 
3de0: 20 20 20 20 20 20 20 6e 6f 52 65 74 61 69 6c 20         noRetail 
3df0: 20 20 20 20 20 20 20 20 20 20 20 24 66 69 6c 65             $file
3e00: 4e 61 6d 65 73 28 6e 6f 52 65 74 61 69 6c 29 20  Names(noRetail) 
3e10: 7b 0a 20 20 23 0a 20 20 23 20 4e 4f 54 45 3a 20  {.  #.  # NOTE: 
3e20: 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 66  If the current f
3e30: 69 6c 65 20 69 73 20 62 75 69 6c 64 2d 6e 65 75  ile is build-neu
3e40: 74 72 61 6c 2c 20 74 68 65 6e 20 6f 6e 6c 79 20  tral, then only 
3e50: 6f 6e 65 20 62 75 69 6c 64 20 77 69 6c 6c 0a 20  one build will. 
3e60: 20 23 20 20 20 20 20 20 20 62 65 20 70 72 6f 63   #       be proc
3e70: 65 73 73 65 64 20 66 6f 72 20 69 74 2c 20 6e 61  essed for it, na
3e80: 6d 65 6c 79 20 22 43 6f 6d 6d 6f 6e 43 6f 6e 66  mely "CommonConf
3e90: 69 67 75 72 61 74 69 6f 6e 22 3b 20 6f 74 68 65  iguration"; othe
3ea0: 72 77 69 73 65 2c 20 65 61 63 68 0a 20 20 23 20  rwise, each.  # 
3eb0: 20 20 20 20 20 20 73 75 70 70 6f 72 74 65 64 20        supported 
3ec0: 62 75 69 6c 64 20 77 69 6c 6c 20 62 65 20 70 72  build will be pr
3ed0: 6f 63 65 73 73 65 64 20 66 6f 72 20 69 74 20 69  ocessed for it i
3ee0: 6e 64 69 76 69 64 75 61 6c 6c 79 2e 0a 20 20 23  ndividually..  #
3ef0: 0a 20 20 66 6f 72 65 61 63 68 20 62 75 69 6c 64  .  foreach build
3f00: 4e 61 6d 65 20 5c 0a 20 20 20 20 20 20 5b 65 78  Name \.      [ex
3f10: 70 72 20 7b 24 62 75 69 6c 64 4e 65 75 74 72 61  pr {$buildNeutra
3f20: 6c 20 3f 20 5b 6c 69 73 74 20 43 6f 6d 6d 6f 6e  l ? [list Common
3f30: 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d 20 3a  Configuration] :
3f40: 20 24 62 75 69 6c 64 4e 61 6d 65 73 7d 5d 20 7b   $buildNames}] {
3f50: 0a 20 20 20 20 23 0a 20 20 20 20 23 20 4e 4f 54  .    #.    # NOT
3f60: 45 3a 20 53 68 6f 75 6c 64 20 74 68 65 20 63 75  E: Should the cu
3f70: 72 72 65 6e 74 20 66 69 6c 65 20 62 65 20 73 6b  rrent file be sk
3f80: 69 70 70 65 64 20 66 6f 72 20 74 68 69 73 20 62  ipped for this b
3f90: 75 69 6c 64 3f 0a 20 20 20 20 23 0a 20 20 20 20  uild?.    #.    
3fa0: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
3fb0: 20 6e 6f 24 7b 62 75 69 6c 64 4e 61 6d 65 7d 5d   no${buildName}]
3fc0: 20 26 26 20 5b 73 65 74 20 6e 6f 24 7b 62 75 69   && [set no${bui
3fd0: 6c 64 4e 61 6d 65 7d 5d 7d 20 74 68 65 6e 20 7b  ldName}]} then {
3fe0: 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 0a  .      continue.
3ff0: 20 20 20 20 7d 0a 0a 20 20 20 20 23 0a 20 20 20      }..    #.   
4000: 20 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20   # NOTE: If the 
4010: 63 75 72 72 65 6e 74 20 66 69 6c 65 20 69 73 20  current file is 
4020: 70 6c 61 74 66 6f 72 6d 2d 6e 65 75 74 72 61 6c  platform-neutral
4030: 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 6f 6e 65 20  , then only one 
4040: 70 6c 61 74 66 6f 72 6d 0a 20 20 20 20 23 20 20  platform.    #  
4050: 20 20 20 20 20 77 69 6c 6c 20 62 65 20 70 72 6f       will be pro
4060: 63 65 73 73 65 64 20 66 6f 72 20 69 74 2c 20 6e  cessed for it, n
4070: 61 6d 65 6c 79 20 22 6e 65 75 74 72 61 6c 22 3b  amely "neutral";
4080: 20 6f 74 68 65 72 77 69 73 65 2c 20 65 61 63 68   otherwise, each
4090: 0a 20 20 20 20 23 20 20 20 20 20 20 20 73 75 70  .    #       sup
40a0: 70 6f 72 74 65 64 20 70 6c 61 74 66 6f 72 6d 20  ported platform 
40b0: 77 69 6c 6c 20 62 65 20 70 72 6f 63 65 73 73 65  will be processe
40c0: 64 20 66 6f 72 20 69 74 20 69 6e 64 69 76 69 64  d for it individ
40d0: 75 61 6c 6c 79 2e 0a 20 20 20 20 23 0a 20 20 20  ually..    #.   
40e0: 20 66 6f 72 65 61 63 68 20 70 6c 61 74 66 6f 72   foreach platfor
40f0: 6d 4e 61 6d 65 20 5c 0a 20 20 20 20 20 20 20 20  mName \.        
4100: 5b 65 78 70 72 20 7b 24 70 6c 61 74 66 6f 72 6d  [expr {$platform
4110: 4e 65 75 74 72 61 6c 20 3f 20 5b 6c 69 73 74 20  Neutral ? [list 
4120: 6e 65 75 74 72 61 6c 5d 20 3a 20 24 70 6c 61 74  neutral] : $plat
4130: 66 6f 72 6d 4e 61 6d 65 73 7d 5d 20 7b 0a 20 20  formNames}] {.  
4140: 20 20 20 20 23 0a 20 20 20 20 20 20 23 20 4e 4f      #.      # NO
4150: 54 45 3a 20 55 73 65 20 74 68 65 20 61 63 74 75  TE: Use the actu
4160: 61 6c 20 70 6c 61 74 66 6f 72 6d 20 6e 61 6d 65  al platform name
4170: 20 69 6e 20 74 68 65 20 64 65 73 74 69 6e 61 74   in the destinat
4180: 69 6f 6e 20 66 69 6c 65 20 6e 61 6d 65 2e 0a 20  ion file name.. 
4190: 20 20 20 20 20 23 0a 20 20 20 20 20 20 73 65 74       #.      set
41a0: 20 6e 65 77 44 65 73 74 69 6e 61 74 69 6f 6e 46   newDestinationF
41b0: 69 6c 65 4e 61 6d 65 20 5b 72 65 70 6c 61 63 65  ileName [replace
41c0: 42 75 69 6c 64 41 6e 64 50 6c 61 74 66 6f 72 6d  BuildAndPlatform
41d0: 20 5c 0a 20 20 20 20 20 20 20 20 20 20 24 64 65   \.          $de
41e0: 73 74 69 6e 61 74 69 6f 6e 46 69 6c 65 4e 61 6d  stinationFileNam
41f0: 65 20 24 62 75 69 6c 64 4e 61 6d 65 20 24 70 6c  e $buildName $pl
4200: 61 74 66 6f 72 6d 4e 61 6d 65 5d 0a 0a 20 20 20  atformName]..   
4210: 20 20 20 23 0a 20 20 20 20 20 20 23 20 4e 4f 54     #.      # NOT
4220: 45 3a 20 44 6f 65 73 20 74 68 65 20 73 6f 75 72  E: Does the sour
4230: 63 65 20 66 69 6c 65 20 6e 65 65 64 20 74 6f 20  ce file need to 
4240: 62 65 20 63 6f 70 69 65 64 20 74 6f 20 74 68 65  be copied to the
4250: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 66 69 6c   destination fil
4260: 65 3f 0a 20 20 20 20 20 20 23 0a 20 20 20 20 20  e?.      #.     
4270: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
4280: 67 74 68 20 24 73 6f 75 72 63 65 46 69 6c 65 4e  gth $sourceFileN
4290: 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ame] > 0} then {
42a0: 0a 20 20 20 20 20 20 20 20 23 0a 20 20 20 20 20  .        #.     
42b0: 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 72 73 74     # NOTE: First
42c0: 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  , make sure the 
42d0: 64 65 73 74 69 6e 61 74 69 6f 6e 20 64 69 72 65  destination dire
42e0: 63 74 6f 72 79 20 65 78 69 73 74 73 2e 0a 20 20  ctory exists..  
42f0: 20 20 20 20 20 20 23 0a 20 20 20 20 20 20 20 20        #.        
4300: 66 69 6c 65 20 6d 6b 64 69 72 20 5b 66 69 6c 65  file mkdir [file
4310: 20 64 69 72 6e 61 6d 65 20 24 6e 65 77 44 65 73   dirname $newDes
4320: 74 69 6e 61 74 69 6f 6e 46 69 6c 65 4e 61 6d 65  tinationFileName
4330: 5d 0a 0a 20 20 20 20 20 20 20 20 23 0a 20 20 20  ]..        #.   
4340: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65       # NOTE: The
4350: 6e 2c 20 63 6f 70 79 20 74 68 65 20 73 6f 75 72  n, copy the sour
4360: 63 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20 64  ce file to the d
4370: 65 73 74 69 6e 61 74 69 6f 6e 20 66 69 6c 65 20  estination file 
4380: 76 65 72 62 61 74 69 6d 2e 0a 20 20 20 20 20 20  verbatim..      
4390: 20 20 23 0a 20 20 20 20 20 20 20 20 66 69 6c 65    #.        file
43a0: 20 63 6f 70 79 20 5b 72 65 70 6c 61 63 65 42 75   copy [replaceBu
43b0: 69 6c 64 41 6e 64 50 6c 61 74 66 6f 72 6d 20 24  ildAndPlatform $
43c0: 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 24  sourceFileName $
43d0: 62 75 69 6c 64 4e 61 6d 65 20 5c 0a 20 20 20 20  buildName \.    
43e0: 20 20 20 20 20 20 20 20 24 70 6c 61 74 66 6f 72          $platfor
43f0: 6d 4e 61 6d 65 5d 20 24 6e 65 77 44 65 73 74 69  mName] $newDesti
4400: 6e 61 74 69 6f 6e 46 69 6c 65 4e 61 6d 65 0a 20  nationFileName. 
4410: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 23 0a       }..      #.
4420: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 6f        # NOTE: Do
4430: 65 73 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  es the destinati
4440: 6f 6e 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 20  on file contain 
4450: 64 79 6e 61 6d 69 63 20 72 65 70 6c 61 63 65 6d  dynamic replacem
4460: 65 6e 74 73 20 74 68 61 74 20 6d 75 73 74 0a 20  ents that must. 
4470: 20 20 20 20 20 23 20 20 20 20 20 20 20 62 65 20       #       be 
4480: 70 72 6f 63 65 73 73 65 64 20 6e 6f 77 3f 0a 20  processed now?. 
4490: 20 20 20 20 20 23 0a 20 20 20 20 20 20 69 66 20       #.      if 
44a0: 7b 24 75 73 65 53 75 62 73 74 7d 20 74 68 65 6e  {$useSubst} then
44b0: 20 7b 0a 20 20 20 20 20 20 20 20 23 0a 20 20 20   {.        #.   
44c0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 50 65 72       # NOTE: Per
44d0: 66 6f 72 6d 20 61 6e 79 20 64 79 6e 61 6d 69 63  form any dynamic
44e0: 20 72 65 70 6c 61 63 65 6d 65 6e 74 73 20 63 6f   replacements co
44f0: 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 64  ntained in the d
4500: 65 73 74 69 6e 61 74 69 6f 6e 0a 20 20 20 20 20  estination.     
4510: 20 20 20 23 20 20 20 20 20 20 20 66 69 6c 65 20     #       file 
4520: 61 6e 64 20 74 68 65 6e 20 72 65 2d 77 72 69 74  and then re-writ
4530: 65 20 69 74 20 69 6e 2d 70 6c 61 63 65 2e 0a 20  e it in-place.. 
4540: 20 20 20 20 20 20 20 23 0a 20 20 20 20 20 20 20         #.       
4550: 20 73 75 62 73 74 46 69 6c 65 20 24 6e 65 77 44   substFile $newD
4560: 65 73 74 69 6e 61 74 69 6f 6e 46 69 6c 65 4e 61  estinationFileNa
4570: 6d 65 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  me.      }.    }
4580: 0a 20 20 7d 0a 7d 0a 0a 23 23 23 23 23 23 23 23  .  }.}..########
4590: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
45a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
45b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
45c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
45d0: 23 23 23 23 23 23 23 0a 0a 23 0a 23 20 4e 4f 54  #######..#.# NOT
45e0: 45 3a 20 43 68 61 6e 67 65 20 74 68 65 20 63 75  E: Change the cu
45f0: 72 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79 20  rrent directory 
4600: 74 6f 20 74 68 65 20 73 74 61 67 69 6e 67 20 64  to the staging d
4610: 69 72 65 63 74 6f 72 79 20 73 6f 20 74 68 61 74  irectory so that
4620: 20 74 68 65 0a 23 20 20 20 20 20 20 20 65 78 74   the.#       ext
4630: 65 72 6e 61 6c 20 61 72 63 68 69 76 65 20 62 75  ernal archive bu
4640: 69 6c 64 69 6e 67 20 74 6f 6f 6c 20 63 61 6e 20  ilding tool can 
4650: 70 69 63 6b 75 70 20 74 68 65 20 6e 65 63 65 73  pickup the neces
4660: 73 61 72 79 20 66 69 6c 65 73 20 75 73 69 6e 67  sary files using
4670: 0a 23 20 20 20 20 20 20 20 72 65 6c 61 74 69 76  .#       relativ
4680: 65 20 70 61 74 68 73 2e 0a 23 0a 63 64 20 24 73  e paths..#.cd $s
4690: 74 61 67 69 6e 67 44 69 72 65 63 74 6f 72 79 0a  tagingDirectory.
46a0: 0a 23 0a 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64  .#.# NOTE: Build
46b0: 20 74 68 65 20 54 63 6c 20 63 6f 6d 6d 61 6e 64   the Tcl command
46c0: 20 75 73 65 64 20 74 6f 20 61 72 63 68 69 76 65   used to archive
46d0: 20 74 68 65 20 66 69 6e 61 6c 20 70 61 63 6b 61   the final packa
46e0: 67 65 20 69 6e 20 74 68 65 0a 23 20 20 20 20 20  ge in the.#     
46f0: 20 20 6f 75 74 70 75 74 20 64 69 72 65 63 74 6f    output directo
4700: 72 79 2e 0a 23 0a 73 65 74 20 61 72 63 68 69 76  ry..#.set archiv
4710: 65 43 6f 6d 6d 61 6e 64 20 5b 6c 69 73 74 20 65  eCommand [list e
4720: 78 65 63 20 2d 2d 20 24 7a 69 70 20 2d 72 20 24  xec -- $zip -r $
4730: 6f 75 74 70 75 74 46 69 6c 65 20 2a 5d 0a 0a 23  outputFile *]..#
4740: 0a 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74  .# NOTE: Build t
4750: 68 65 20 66 69 6e 61 6c 20 70 61 63 6b 61 67 65  he final package
4760: 20 61 72 63 68 69 76 65 20 69 6e 20 74 68 65 20   archive in the 
4770: 6f 75 74 70 75 74 20 64 69 72 65 63 74 6f 72 79  output directory
4780: 2e 0a 23 0a 65 76 61 6c 20 24 61 72 63 68 69 76  ..#.eval $archiv
4790: 65 43 6f 6d 6d 61 6e 64 0a 0a 23 0a 23 20 4e 4f  eCommand..#.# NO
47a0: 54 45 3a 20 43 68 61 6e 67 65 20 62 61 63 6b 20  TE: Change back 
47b0: 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c  to the previousl
47c0: 79 20 73 61 76 65 64 20 63 75 72 72 65 6e 74 20  y saved current 
47d0: 64 69 72 65 63 74 6f 72 79 2e 0a 23 0a 63 64 20  directory..#.cd 
47e0: 24 63 75 72 72 65 6e 74 44 69 72 65 63 74 6f 72  $currentDirector
47f0: 79 0a 0a 23 0a 23 20 4e 4f 54 45 3a 20 43 6c 65  y..#.# NOTE: Cle
4800: 61 6e 75 70 20 74 68 65 20 74 65 6d 70 6f 72 61  anup the tempora
4810: 72 79 20 73 74 61 67 69 6e 67 20 64 69 72 65 63  ry staging direc
4820: 74 6f 72 79 2e 0a 23 0a 66 69 6c 65 20 64 65 6c  tory..#.file del
4830: 65 74 65 20 2d 66 6f 72 63 65 20 24 73 74 61 67  ete -force $stag
4840: 69 6e 67 44 69 72 65 63 74 6f 72 79 0a 0a 23 23  ingDirectory..##
4850: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4860: 23 23 23 23 23 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 0a 0a 23  #############..#
48a0: 0a 23 20 4e 4f 54 45 3a 20 53 75 63 63 65 73 73  .# NOTE: Success
48b0: 2c 20 65 6d 69 74 20 74 68 65 20 66 75 6c 6c 79  , emit the fully
48c0: 20 71 75 61 6c 69 66 69 65 64 20 70 61 74 68 20   qualified path 
48d0: 6f 66 20 74 68 65 20 67 65 6e 65 72 61 74 65 64  of the generated
48e0: 20 56 53 49 58 20 66 69 6c 65 2e 0a 23 0a 70 75   VSIX file..#.pu
48f0: 74 73 20 73 74 64 6f 75 74 20 24 6f 75 74 70 75  ts stdout $outpu
4900: 74 46 69 6c 65 0a                                tFile.