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

Artifact adc17f82e3812787fdb015098d006e31804d6aa5:


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 0a 70 72 6f 63 20 66 61 69 6c 20 7b 20 7b 65  ..proc fail { {e
0090: 72 72 6f 72 20 22 22 7d 20 7b 75 73 61 67 65 20  rror ""} {usage 
00a0: 66 61 6c 73 65 7d 20 7d 20 7b 0a 20 20 69 66 20  false} } {.  if 
00b0: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
00c0: 24 65 72 72 6f 72 5d 20 3e 20 30 7d 20 74 68 65  $error] > 0} the
00d0: 6e 20 7b 0a 20 20 20 20 70 75 74 73 20 73 74 64  n {.    puts std
00e0: 6f 75 74 20 24 65 72 72 6f 72 0a 20 20 20 20 69  out $error.    i
00f0: 66 20 7b 21 24 75 73 61 67 65 7d 20 74 68 65 6e  f {!$usage} then
0100: 20 7b 65 78 69 74 20 31 7d 0a 20 20 7d 0a 0a 20   {exit 1}.  }.. 
0110: 20 70 75 74 73 20 73 74 64 6f 75 74 20 22 75 73   puts stdout "us
0120: 61 67 65 3a 5c 0a 5b 66 69 6c 65 20 74 61 69 6c  age:\.[file tail
0130: 20 5b 69 6e 66 6f 20 6e 61 6d 65 6f 66 65 78 65   [info nameofexe
0140: 63 75 74 61 62 6c 65 5d 5d 5c 0a 5b 66 69 6c 65  cutable]]\.[file
0150: 20 74 61 69 6c 20 5b 69 6e 66 6f 20 73 63 72 69   tail [info scri
0160: 70 74 5d 5d 20 3c 62 69 6e 61 72 79 44 69 72 65  pt]] <binaryDire
0170: 63 74 6f 72 79 3e 20 5c 5b 73 6f 75 72 63 65 44  ctory> \[sourceD
0180: 69 72 65 63 74 6f 72 79 5c 5d 22 0a 0a 20 20 65  irectory\]"..  e
0190: 78 69 74 20 31 0a 7d 0a 0c 0a 70 72 6f 63 20 67  xit 1.}...proc g
01a0: 65 74 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61 72  etEnvironmentVar
01b0: 69 61 62 6c 65 20 7b 20 6e 61 6d 65 20 7d 20 7b  iable { name } {
01c0: 0a 20 20 23 0a 20 20 23 20 4e 4f 54 45 3a 20 52  .  #.  # NOTE: R
01d0: 65 74 75 72 6e 73 20 74 68 65 20 76 61 6c 75 65  eturns the value
01e0: 20 6f 66 20 74 68 65 20 73 70 65 63 69 66 69 65   of the specifie
01f0: 64 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61  d environment va
0200: 72 69 61 62 6c 65 20 6f 72 20 61 6e 20 65 6d 70  riable or an emp
0210: 74 79 0a 20 20 23 20 20 20 20 20 20 20 73 74 72  ty.  #       str
0220: 69 6e 67 20 66 6f 72 20 65 6e 76 69 72 6f 6e 6d  ing for environm
0230: 65 6e 74 20 76 61 72 69 61 62 6c 65 73 20 74 68  ent variables th
0240: 61 74 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20  at do not exist 
0250: 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20  in the current. 
0260: 20 23 20 20 20 20 20 20 20 70 72 6f 63 65 73 73   #       process
0270: 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 2e 0a 20 20   environment..  
0280: 23 0a 20 20 72 65 74 75 72 6e 20 5b 65 78 70 72  #.  return [expr
0290: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
02a0: 3a 65 6e 76 28 24 6e 61 6d 65 29 5d 20 3f 20 24  :env($name)] ? $
02b0: 3a 3a 65 6e 76 28 24 6e 61 6d 65 29 20 3a 20 22  ::env($name) : "
02c0: 22 7d 5d 0a 7d 0a 0c 0a 70 72 6f 63 20 67 65 74  "}].}...proc get
02d0: 54 65 6d 70 6f 72 61 72 79 50 61 74 68 20 7b 7d  TemporaryPath {}
02e0: 20 7b 0a 20 20 23 0a 20 20 23 20 4e 4f 54 45 3a   {.  #.  # NOTE:
02f0: 20 52 65 74 75 72 6e 73 20 74 68 65 20 6e 6f 72   Returns the nor
0300: 6d 61 6c 69 7a 65 64 20 70 61 74 68 20 74 6f 20  malized path to 
0310: 74 68 65 20 66 69 72 73 74 20 74 65 6d 70 6f 72  the first tempor
0320: 61 72 79 20 64 69 72 65 63 74 6f 72 79 20 66 6f  ary directory fo
0330: 75 6e 64 0a 20 20 23 20 20 20 20 20 20 20 69 6e  und.  #       in
0340: 20 74 68 65 20 74 79 70 69 63 61 6c 20 73 65 74   the typical set
0350: 20 6f 66 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20   of environment 
0360: 76 61 72 69 61 62 6c 65 73 20 75 73 65 64 20 66  variables used f
0370: 6f 72 20 74 68 61 74 20 70 75 72 70 6f 73 65 0a  or that purpose.
0380: 20 20 23 20 20 20 20 20 20 20 6f 72 20 61 6e 20    #       or an 
0390: 65 6d 70 74 79 20 73 74 72 69 6e 67 20 74 6f 20  empty string to 
03a0: 73 69 67 6e 61 6c 20 61 20 66 61 69 6c 75 72 65  signal a failure
03b0: 20 74 6f 20 6c 6f 63 61 74 65 20 73 75 63 68 20   to locate such 
03c0: 61 20 64 69 72 65 63 74 6f 72 79 2e 0a 20 20 23  a directory..  #
03d0: 0a 20 20 73 65 74 20 6e 61 6d 65 73 20 5b 6c 69  .  set names [li
03e0: 73 74 5d 0a 0a 20 20 66 6f 72 65 61 63 68 20 6e  st]..  foreach n
03f0: 61 6d 65 20 5b 6c 69 73 74 20 54 45 4d 50 20 54  ame [list TEMP T
0400: 4d 50 5d 20 7b 0a 20 20 20 20 6c 61 70 70 65 6e  MP] {.    lappen
0410: 64 20 6e 61 6d 65 73 20 5b 73 74 72 69 6e 67 20  d names [string 
0420: 74 6f 75 70 70 65 72 20 24 6e 61 6d 65 5d 20 5b  toupper $name] [
0430: 73 74 72 69 6e 67 20 74 6f 6c 6f 77 65 72 20 24  string tolower $
0440: 6e 61 6d 65 5d 20 5c 0a 20 20 20 20 20 20 20 20  name] \.        
0450: 5b 73 74 72 69 6e 67 20 74 6f 74 69 74 6c 65 20  [string totitle 
0460: 24 6e 61 6d 65 5d 0a 20 20 7d 0a 0a 20 20 66 6f  $name].  }..  fo
0470: 72 65 61 63 68 20 6e 61 6d 65 20 24 6e 61 6d 65  reach name $name
0480: 73 20 7b 0a 20 20 20 20 73 65 74 20 76 61 6c 75  s {.    set valu
0490: 65 20 5b 67 65 74 45 6e 76 69 72 6f 6e 6d 65 6e  e [getEnvironmen
04a0: 74 56 61 72 69 61 62 6c 65 20 24 6e 61 6d 65 5d  tVariable $name]
04b0: 0a 0a 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e  ..    if {[strin
04c0: 67 20 6c 65 6e 67 74 68 20 24 76 61 6c 75 65 5d  g length $value]
04d0: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0a 20 20 20   > 0} then {.   
04e0: 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20     return [file 
04f0: 6e 6f 72 6d 61 6c 69 7a 65 20 24 76 61 6c 75 65  normalize $value
0500: 5d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ].    }.  }..  r
0510: 65 74 75 72 6e 20 22 22 0a 7d 0a 0c 0a 70 72 6f  eturn "".}...pro
0520: 63 20 61 70 70 65 6e 64 41 72 67 73 20 7b 20 61  c appendArgs { a
0530: 72 67 73 20 7d 20 7b 0a 20 20 23 0a 20 20 23 20  rgs } {.  #.  # 
0540: 4e 4f 54 45 3a 20 52 65 74 75 72 6e 73 20 61 6c  NOTE: Returns al
0550: 6c 20 70 61 73 73 65 64 20 61 72 67 75 6d 65 6e  l passed argumen
0560: 74 73 20 6a 6f 69 6e 65 64 20 74 6f 67 65 74 68  ts joined togeth
0570: 65 72 20 61 73 20 61 20 73 69 6e 67 6c 65 20 73  er as a single s
0580: 74 72 69 6e 67 20 77 69 74 68 0a 20 20 23 20 20  tring with.  #  
0590: 20 20 20 20 20 6e 6f 20 69 6e 74 65 72 76 65 6e       no interven
05a0: 69 6e 67 20 73 70 61 63 65 73 20 62 65 74 77 65  ing spaces betwe
05b0: 65 6e 20 61 72 67 75 6d 65 6e 74 73 2e 0a 20 20  en arguments..  
05c0: 23 0a 20 20 65 76 61 6c 20 61 70 70 65 6e 64 20  #.  eval append 
05d0: 72 65 73 75 6c 74 20 24 61 72 67 73 0a 7d 0a 0c  result $args.}..
05e0: 0a 70 72 6f 63 20 72 65 61 64 46 69 6c 65 20 7b  .proc readFile {
05f0: 20 66 69 6c 65 4e 61 6d 65 20 7d 20 7b 0a 20 20   fileName } {.  
0600: 23 0a 20 20 23 20 4e 4f 54 45 3a 20 52 65 61 64  #.  # NOTE: Read
0610: 73 20 61 6e 64 20 72 65 74 75 72 6e 73 20 74 68  s and returns th
0620: 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74  e entire content
0630: 73 20 6f 66 20 74 68 65 20 73 70 65 63 69 66 69  s of the specifi
0640: 65 64 20 66 69 6c 65 2c 20 77 68 69 63 68 0a 20  ed file, which. 
0650: 20 23 20 20 20 20 20 20 20 6d 61 79 20 63 6f 6e   #       may con
0660: 74 61 69 6e 20 62 69 6e 61 72 79 20 64 61 74 61  tain binary data
0670: 2e 0a 20 20 23 0a 20 20 73 65 74 20 66 69 6c 65  ..  #.  set file
0680: 5f 69 64 20 5b 6f 70 65 6e 20 24 66 69 6c 65 4e  _id [open $fileN
0690: 61 6d 65 20 52 44 4f 4e 4c 59 5d 0a 20 20 66 63  ame RDONLY].  fc
06a0: 6f 6e 66 69 67 75 72 65 20 24 66 69 6c 65 5f 69  onfigure $file_i
06b0: 64 20 2d 65 6e 63 6f 64 69 6e 67 20 62 69 6e 61  d -encoding bina
06c0: 72 79 20 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 20  ry -translation 
06d0: 62 69 6e 61 72 79 0a 20 20 73 65 74 20 72 65 73  binary.  set res
06e0: 75 6c 74 20 5b 72 65 61 64 20 24 66 69 6c 65 5f  ult [read $file_
06f0: 69 64 5d 0a 20 20 63 6c 6f 73 65 20 24 66 69 6c  id].  close $fil
0700: 65 5f 69 64 0a 20 20 72 65 74 75 72 6e 20 24 72  e_id.  return $r
0710: 65 73 75 6c 74 0a 7d 0a 0c 0a 70 72 6f 63 20 77  esult.}...proc w
0720: 72 69 74 65 46 69 6c 65 20 7b 20 66 69 6c 65 4e  riteFile { fileN
0730: 61 6d 65 20 64 61 74 61 20 7d 20 7b 0a 20 20 23  ame data } {.  #
0740: 0a 20 20 23 20 4e 4f 54 45 3a 20 57 72 69 74 65  .  # NOTE: Write
0750: 73 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e  s the entire con
0760: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 73 70 65  tents of the spe
0770: 63 69 66 69 65 64 20 66 69 6c 65 2c 20 77 68 69  cified file, whi
0780: 63 68 20 6d 61 79 20 63 6f 6e 74 61 69 6e 0a 20  ch may contain. 
0790: 20 23 20 20 20 20 20 20 20 62 69 6e 61 72 79 20   #       binary 
07a0: 64 61 74 61 2e 0a 20 20 23 0a 20 20 73 65 74 20  data..  #.  set 
07b0: 66 69 6c 65 5f 69 64 20 5b 6f 70 65 6e 20 24 66  file_id [open $f
07c0: 69 6c 65 4e 61 6d 65 20 7b 57 52 4f 4e 4c 59 20  ileName {WRONLY 
07d0: 43 52 45 41 54 20 54 52 55 4e 43 7d 5d 0a 20 20  CREAT TRUNC}].  
07e0: 66 63 6f 6e 66 69 67 75 72 65 20 24 66 69 6c 65  fconfigure $file
07f0: 5f 69 64 20 2d 65 6e 63 6f 64 69 6e 67 20 62 69  _id -encoding bi
0800: 6e 61 72 79 20 2d 74 72 61 6e 73 6c 61 74 69 6f  nary -translatio
0810: 6e 20 62 69 6e 61 72 79 0a 20 20 70 75 74 73 20  n binary.  puts 
0820: 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24 66 69 6c 65  -nonewline $file
0830: 5f 69 64 20 24 64 61 74 61 0a 20 20 63 6c 6f 73  _id $data.  clos
0840: 65 20 24 66 69 6c 65 5f 69 64 0a 20 20 72 65 74  e $file_id.  ret
0850: 75 72 6e 20 22 22 0a 7d 0a 0c 0a 70 72 6f 63 20  urn "".}...proc 
0860: 73 75 62 73 74 46 69 6c 65 20 7b 20 66 69 6c 65  substFile { file
0870: 4e 61 6d 65 20 7d 20 7b 0a 20 20 23 0a 20 20 23  Name } {.  #.  #
0880: 20 4e 4f 54 45 3a 20 50 65 72 66 6f 72 6d 73 20   NOTE: Performs 
0890: 61 6c 6c 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 2c  all Tcl command,
08a0: 20 76 61 72 69 61 62 6c 65 2c 20 61 6e 64 20 62   variable, and b
08b0: 61 63 6b 73 6c 61 73 68 20 73 75 62 73 74 69 74  ackslash substit
08c0: 75 74 69 6f 6e 73 20 69 6e 0a 20 20 23 20 20 20  utions in.  #   
08d0: 20 20 20 20 74 68 65 20 73 70 65 63 69 66 69 65      the specifie
08e0: 64 20 66 69 6c 65 20 61 6e 64 20 74 68 65 6e 20  d file and then 
08f0: 72 65 2d 77 72 69 74 65 73 20 74 68 65 20 63 6f  re-writes the co
0900: 6e 74 65 6e 74 73 20 6f 66 20 74 68 61 74 20 73  ntents of that s
0910: 61 6d 65 20 66 69 6c 65 0a 20 20 23 20 20 20 20  ame file.  #    
0920: 20 20 20 77 69 74 68 20 74 68 65 20 73 75 62 73     with the subs
0930: 74 69 74 75 74 65 64 20 64 61 74 61 2e 0a 20 20  tituted data..  
0940: 23 0a 20 20 72 65 74 75 72 6e 20 5b 77 72 69 74  #.  return [writ
0950: 65 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 20  eFile $fileName 
0960: 5b 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74  [uplevel 1 [list
0970: 20 73 75 62 73 74 20 5b 72 65 61 64 46 69 6c 65   subst [readFile
0980: 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 5d 5d 0a 7d   $fileName]]]].}
0990: 0a 0c 0a 70 72 6f 63 20 72 65 70 6c 61 63 65 42  ...proc replaceB
09a0: 75 69 6c 64 41 6e 64 50 6c 61 74 66 6f 72 6d 20  uildAndPlatform 
09b0: 7b 20 66 69 6c 65 4e 61 6d 65 20 62 75 69 6c 64  { fileName build
09c0: 4e 61 6d 65 20 70 6c 61 74 66 6f 72 6d 4e 61 6d  Name platformNam
09d0: 65 20 7d 20 7b 0a 20 20 23 0a 20 20 23 20 4e 4f  e } {.  #.  # NO
09e0: 54 45 3a 20 52 65 74 75 72 6e 73 20 74 68 65 20  TE: Returns the 
09f0: 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 20 6e  specified file n
0a00: 61 6d 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ame containing t
0a10: 68 65 20 70 6c 61 74 66 6f 72 6d 20 6e 61 6d 65  he platform name
0a20: 20 69 6e 73 74 65 61 64 0a 20 20 23 20 20 20 20   instead.  #    
0a30: 20 20 20 6f 66 20 70 6c 61 74 66 6f 72 6d 20 70     of platform p
0a40: 6c 61 63 65 68 6f 6c 64 65 72 20 74 6f 6b 65 6e  laceholder token
0a50: 73 2e 0a 20 20 23 0a 20 20 72 65 74 75 72 6e 20  s..  #.  return 
0a60: 5b 73 74 72 69 6e 67 20 6d 61 70 20 5b 6c 69 73  [string map [lis
0a70: 74 20 3c 62 75 69 6c 64 3e 20 24 62 75 69 6c 64  t <build> $build
0a80: 4e 61 6d 65 20 3c 70 6c 61 74 66 6f 72 6d 3e 20  Name <platform> 
0a90: 24 70 6c 61 74 66 6f 72 6d 4e 61 6d 65 5d 20 5c  $platformName] \
0aa0: 0a 20 20 20 20 20 20 24 66 69 6c 65 4e 61 6d 65  .      $fileName
0ab0: 5d 0a 7d 0a 0c 0a 73 65 74 20 73 63 72 69 70 74  ].}...set script
0ac0: 20 5b 66 69 6c 65 20 6e 6f 72 6d 61 6c 69 7a 65   [file normalize
0ad0: 20 5b 69 6e 66 6f 20 73 63 72 69 70 74 5d 5d 0a   [info script]].
0ae0: 0a 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e  .if {[string len
0af0: 67 74 68 20 24 73 63 72 69 70 74 5d 20 3d 3d 20  gth $script] == 
0b00: 30 7d 20 74 68 65 6e 20 7b 0a 20 20 66 61 69 6c  0} then {.  fail
0b10: 20 22 73 63 72 69 70 74 20 66 69 6c 65 20 63 75   "script file cu
0b20: 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 65 76  rrently being ev
0b30: 61 6c 75 61 74 65 64 20 69 73 20 75 6e 6b 6e 6f  aluated is unkno
0b40: 77 6e 22 20 74 72 75 65 0a 7d 0a 0a 73 65 74 20  wn" true.}..set 
0b50: 70 61 74 68 20 5b 66 69 6c 65 20 64 69 72 6e 61  path [file dirna
0b60: 6d 65 20 24 73 63 72 69 70 74 5d 0a 73 65 74 20  me $script].set 
0b70: 72 6f 6f 74 4e 61 6d 65 20 5b 66 69 6c 65 20 72  rootName [file r
0b80: 6f 6f 74 6e 61 6d 65 20 5b 66 69 6c 65 20 74 61  ootname [file ta
0b90: 69 6c 20 24 73 63 72 69 70 74 5d 5d 0a 0a 23 23  il $script]]..##
0ba0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0bb0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0bc0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0bd0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0be0: 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 0a 23  #############..#
0bf0: 0a 23 20 4e 4f 54 45 3a 20 50 72 6f 63 65 73 73  .# NOTE: Process
0c00: 20 61 6e 64 20 76 65 72 69 66 79 20 61 6c 6c 20   and verify all 
0c10: 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  the command line
0c20: 20 61 72 67 75 6d 65 6e 74 73 2e 0a 23 0a 73 65   arguments..#.se
0c30: 74 20 61 72 67 63 20 5b 6c 6c 65 6e 67 74 68 20  t argc [llength 
0c40: 24 61 72 67 76 5d 0a 69 66 20 7b 24 61 72 67 63  $argv].if {$argc
0c50: 20 21 3d 20 31 20 26 26 20 24 61 72 67 63 20 21   != 1 && $argc !
0c60: 3d 20 32 7d 20 74 68 65 6e 20 7b 66 61 69 6c 7d  = 2} then {fail}
0c70: 0a 0a 73 65 74 20 62 69 6e 61 72 79 44 69 72 65  ..set binaryDire
0c80: 63 74 6f 72 79 20 5b 6c 69 6e 64 65 78 20 24 61  ctory [lindex $a
0c90: 72 67 76 20 30 5d 0a 0a 69 66 20 7b 5b 73 74 72  rgv 0]..if {[str
0ca0: 69 6e 67 20 6c 65 6e 67 74 68 20 24 62 69 6e 61  ing length $bina
0cb0: 72 79 44 69 72 65 63 74 6f 72 79 5d 20 3d 3d 20  ryDirectory] == 
0cc0: 30 7d 20 74 68 65 6e 20 7b 0a 20 20 66 61 69 6c  0} then {.  fail
0cd0: 20 22 69 6e 76 61 6c 69 64 20 62 69 6e 61 72 79   "invalid binary
0ce0: 20 64 69 72 65 63 74 6f 72 79 22 0a 7d 0a 0a 69   directory".}..i
0cf0: 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74 73  f {![file exists
0d00: 20 24 62 69 6e 61 72 79 44 69 72 65 63 74 6f 72   $binaryDirector
0d10: 79 5d 20 7c 7c 20 5c 0a 20 20 20 20 21 5b 66 69  y] || \.    ![fi
0d20: 6c 65 20 69 73 64 69 72 65 63 74 6f 72 79 20 24  le isdirectory $
0d30: 62 69 6e 61 72 79 44 69 72 65 63 74 6f 72 79 5d  binaryDirectory]
0d40: 7d 20 74 68 65 6e 20 7b 0a 20 20 66 61 69 6c 20  } then {.  fail 
0d50: 22 62 69 6e 61 72 79 20 64 69 72 65 63 74 6f 72  "binary director
0d60: 79 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  y does not exist
0d70: 22 0a 7d 0a 0a 69 66 20 7b 24 61 72 67 63 20 3d  ".}..if {$argc =
0d80: 3d 20 32 7d 20 74 68 65 6e 20 7b 0a 20 20 73 65  = 2} then {.  se
0d90: 74 20 73 6f 75 72 63 65 44 69 72 65 63 74 6f 72  t sourceDirector
0da0: 79 20 5b 6c 69 6e 64 65 78 20 24 61 72 67 76 20  y [lindex $argv 
0db0: 31 5d 0a 7d 20 65 6c 73 65 20 7b 0a 20 20 23 0a  1].} else {.  #.
0dc0: 20 20 23 20 4e 4f 54 45 3a 20 41 73 73 75 6d 65    # NOTE: Assume
0dd0: 20 74 68 61 74 20 74 68 65 20 73 6f 75 72 63 65   that the source
0de0: 20 64 69 72 65 63 74 6f 72 79 20 69 73 20 74 68   directory is th
0df0: 65 20 70 61 72 65 6e 74 20 64 69 72 65 63 74 6f  e parent directo
0e00: 72 79 20 6f 66 20 74 68 65 20 6f 6e 65 0a 20 20  ry of the one.  
0e10: 23 20 20 20 20 20 20 20 74 68 61 74 20 63 6f 6e  #       that con
0e20: 74 61 69 6e 73 20 74 68 69 73 20 73 63 72 69 70  tains this scrip
0e30: 74 20 66 69 6c 65 2e 0a 20 20 23 0a 20 20 73 65  t file..  #.  se
0e40: 74 20 73 6f 75 72 63 65 44 69 72 65 63 74 6f 72  t sourceDirector
0e50: 79 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20  y [file dirname 
0e60: 24 70 61 74 68 5d 0a 7d 0a 0a 69 66 20 7b 5b 73  $path].}..if {[s
0e70: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 73 6f  tring length $so
0e80: 75 72 63 65 44 69 72 65 63 74 6f 72 79 5d 20 3d  urceDirectory] =
0e90: 3d 20 30 7d 20 74 68 65 6e 20 7b 0a 20 20 66 61  = 0} then {.  fa
0ea0: 69 6c 20 22 69 6e 76 61 6c 69 64 20 73 6f 75 72  il "invalid sour
0eb0: 63 65 20 64 69 72 65 63 74 6f 72 79 22 0a 7d 0a  ce directory".}.
0ec0: 0a 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73  .if {![file exis
0ed0: 74 73 20 24 73 6f 75 72 63 65 44 69 72 65 63 74  ts $sourceDirect
0ee0: 6f 72 79 5d 20 7c 7c 20 5c 0a 20 20 20 20 21 5b  ory] || \.    ![
0ef0: 66 69 6c 65 20 69 73 64 69 72 65 63 74 6f 72 79  file isdirectory
0f00: 20 24 73 6f 75 72 63 65 44 69 72 65 63 74 6f 72   $sourceDirector
0f10: 79 5d 7d 20 74 68 65 6e 20 7b 0a 20 20 66 61 69  y]} then {.  fai
0f20: 6c 20 22 73 6f 75 72 63 65 20 64 69 72 65 63 74  l "source direct
0f30: 6f 72 79 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ory does not exi
0f40: 73 74 22 0a 7d 0a 0a 23 23 23 23 23 23 23 23 23  st".}..#########
0f50: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0f60: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0f70: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0f80: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0f90: 23 23 23 23 23 23 0a 0a 23 0a 23 20 4e 4f 54 45  ######..#.# NOTE
0fa0: 3a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 75  : Evaluate the u
0fb0: 73 65 72 2d 73 70 65 63 69 66 69 63 20 63 75 73  ser-specific cus
0fc0: 74 6f 6d 69 7a 61 74 69 6f 6e 73 20 66 69 6c 65  tomizations file
0fd0: 2c 20 69 66 20 69 74 20 65 78 69 73 74 73 2e 0a  , if it exists..
0fe0: 23 0a 73 65 74 20 75 73 65 72 46 69 6c 65 20 5b  #.set userFile [
0ff0: 66 69 6c 65 20 6a 6f 69 6e 20 24 70 61 74 68 20  file join $path 
1000: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0a 20 20  [appendArgs \.  
1010: 20 20 24 72 6f 6f 74 4e 61 6d 65 20 2e 20 24 74    $rootName . $t
1020: 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 75 73 65 72  cl_platform(user
1030: 29 20 2e 74 63 6c 5d 5d 0a 0a 69 66 20 7b 5b 66  ) .tcl]]..if {[f
1040: 69 6c 65 20 65 78 69 73 74 73 20 24 75 73 65 72  ile exists $user
1050: 46 69 6c 65 5d 20 26 26 20 5c 0a 20 20 20 20 5b  File] && \.    [
1060: 66 69 6c 65 20 69 73 66 69 6c 65 20 24 75 73 65  file isfile $use
1070: 72 46 69 6c 65 5d 7d 20 74 68 65 6e 20 7b 0a 20  rFile]} then {. 
1080: 20 73 6f 75 72 63 65 20 24 75 73 65 72 46 69 6c   source $userFil
1090: 65 0a 7d 0a 0a 23 23 23 23 23 23 23 23 23 23 23  e.}..###########
10a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
10b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
10c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
10d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
10e0: 23 23 23 23 0a 0a 73 65 74 20 74 65 6d 70 6c 61  ####..set templa
10f0: 74 65 46 69 6c 65 20 5b 66 69 6c 65 20 6a 6f 69  teFile [file joi
1100: 6e 20 24 70 61 74 68 20 77 69 6e 20 73 71 6c 69  n $path win sqli
1110: 74 65 2e 76 73 69 78 5d 0a 0a 69 66 20 7b 21 5b  te.vsix]..if {![
1120: 66 69 6c 65 20 65 78 69 73 74 73 20 24 74 65 6d  file exists $tem
1130: 70 6c 61 74 65 46 69 6c 65 5d 20 7c 7c 20 5c 0a  plateFile] || \.
1140: 20 20 20 20 21 5b 66 69 6c 65 20 69 73 66 69 6c      ![file isfil
1150: 65 20 24 74 65 6d 70 6c 61 74 65 46 69 6c 65 5d  e $templateFile]
1160: 7d 20 74 68 65 6e 20 7b 0a 20 20 66 61 69 6c 20  } then {.  fail 
1170: 5b 61 70 70 65 6e 64 41 72 67 73 20 22 74 65 6d  [appendArgs "tem
1180: 70 6c 61 74 65 20 66 69 6c 65 20 5c 22 22 20 24  plate file \"" $
1190: 74 65 6d 70 6c 61 74 65 46 69 6c 65 20 22 5c 22  templateFile "\"
11a0: 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 22   does not exist"
11b0: 5d 0a 7d 0a 0a 73 65 74 20 63 75 72 72 65 6e 74  ].}..set current
11c0: 44 69 72 65 63 74 6f 72 79 20 5b 70 77 64 5d 0a  Directory [pwd].
11d0: 73 65 74 20 6f 75 74 70 75 74 46 69 6c 65 20 5b  set outputFile [
11e0: 66 69 6c 65 20 6a 6f 69 6e 20 24 63 75 72 72 65  file join $curre
11f0: 6e 74 44 69 72 65 63 74 6f 72 79 20 73 71 6c 69  ntDirectory sqli
1200: 74 65 2d 6f 75 74 70 75 74 2e 76 73 69 78 5d 0a  te-output.vsix].
1210: 0a 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74  .if {[file exist
1220: 73 20 24 6f 75 74 70 75 74 46 69 6c 65 5d 7d 20  s $outputFile]} 
1230: 74 68 65 6e 20 7b 0a 20 20 66 61 69 6c 20 5b 61  then {.  fail [a
1240: 70 70 65 6e 64 41 72 67 73 20 22 6f 75 74 70 75  ppendArgs "outpu
1250: 74 20 66 69 6c 65 20 5c 22 22 20 24 6f 75 74 70  t file \"" $outp
1260: 75 74 46 69 6c 65 20 22 5c 22 20 61 6c 72 65 61  utFile "\" alrea
1270: 64 79 20 65 78 69 73 74 73 22 5d 0a 7d 0a 0a 23  dy exists"].}..#
1280: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1290: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
12a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
12b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
12c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 0a  ##############..
12d0: 23 0a 23 20 4e 4f 54 45 3a 20 4d 61 6b 65 20 73  #.# NOTE: Make s
12e0: 75 72 65 20 74 68 61 74 20 61 20 76 61 6c 69 64  ure that a valid
12f0: 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63   temporary direc
1300: 74 6f 72 79 20 65 78 69 73 74 73 2e 0a 23 0a 73  tory exists..#.s
1310: 65 74 20 74 65 6d 70 6f 72 61 72 79 44 69 72 65  et temporaryDire
1320: 63 74 6f 72 79 20 5b 67 65 74 54 65 6d 70 6f 72  ctory [getTempor
1330: 61 72 79 50 61 74 68 5d 0a 0a 69 66 20 7b 5b 73  aryPath]..if {[s
1340: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 74 65  tring length $te
1350: 6d 70 6f 72 61 72 79 44 69 72 65 63 74 6f 72 79  mporaryDirectory
1360: 5d 20 3d 3d 20 30 20 7c 7c 20 5c 0a 20 20 20 20  ] == 0 || \.    
1370: 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 74  ![file exists $t
1380: 65 6d 70 6f 72 61 72 79 44 69 72 65 63 74 6f 72  emporaryDirector
1390: 79 5d 20 7c 7c 20 5c 0a 20 20 20 20 21 5b 66 69  y] || \.    ![fi
13a0: 6c 65 20 69 73 64 69 72 65 63 74 6f 72 79 20 24  le isdirectory $
13b0: 74 65 6d 70 6f 72 61 72 79 44 69 72 65 63 74 6f  temporaryDirecto
13c0: 72 79 5d 7d 20 74 68 65 6e 20 7b 0a 20 20 66 61  ry]} then {.  fa
13d0: 69 6c 20 22 63 61 6e 6e 6f 74 20 6c 6f 63 61 74  il "cannot locat
13e0: 65 20 61 20 75 73 61 62 6c 65 20 74 65 6d 70 6f  e a usable tempo
13f0: 72 61 72 79 20 64 69 72 65 63 74 6f 72 79 22 0a  rary directory".
1400: 7d 0a 0a 23 0a 23 20 4e 4f 54 45 3a 20 53 65 74  }..#.# NOTE: Set
1410: 75 70 20 74 68 65 20 73 74 61 67 69 6e 67 20 64  up the staging d
1420: 69 72 65 63 74 6f 72 79 20 74 6f 20 68 61 76 65  irectory to have
1430: 20 61 20 75 6e 69 71 75 65 20 6e 61 6d 65 20 69   a unique name i
1440: 6e 73 69 64 65 20 6f 66 20 74 68 65 0a 23 20 20  nside of the.#  
1450: 20 20 20 20 20 63 6f 6e 66 69 67 75 72 65 64 20       configured 
1460: 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74  temporary direct
1470: 6f 72 79 2e 0a 23 0a 73 65 74 20 73 74 61 67 69  ory..#.set stagi
1480: 6e 67 44 69 72 65 63 74 6f 72 79 20 5b 66 69 6c  ngDirectory [fil
1490: 65 20 6e 6f 72 6d 61 6c 69 7a 65 20 5b 66 69 6c  e normalize [fil
14a0: 65 20 6a 6f 69 6e 20 24 74 65 6d 70 6f 72 61 72  e join $temporar
14b0: 79 44 69 72 65 63 74 6f 72 79 20 5c 0a 20 20 20  yDirectory \.   
14c0: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 72 6f   [appendArgs $ro
14d0: 6f 74 4e 61 6d 65 20 2e 20 5b 70 69 64 5d 5d 5d  otName . [pid]]]
14e0: 5d 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 23  ]..#############
14f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1500: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1510: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1520: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1530: 23 23 0a 0a 23 0a 23 20 4e 4f 54 45 3a 20 43 6f  ##..#.# NOTE: Co
1540: 6e 66 69 67 75 72 65 20 74 68 65 20 65 78 74 65  nfigure the exte
1550: 72 6e 61 6c 20 7a 69 70 70 69 6e 67 20 74 6f 6f  rnal zipping too
1560: 6c 2e 20 20 46 69 72 73 74 2c 20 73 65 65 20 69  l.  First, see i
1570: 66 20 69 74 20 68 61 73 20 61 6c 72 65 61 64 79  f it has already
1580: 0a 23 20 20 20 20 20 20 20 62 65 65 6e 20 70 72  .#       been pr
1590: 65 2d 63 6f 6e 66 69 67 75 72 65 64 2e 20 20 49  e-configured.  I
15a0: 66 20 6e 6f 74 2c 20 74 72 79 20 74 6f 20 71 75  f not, try to qu
15b0: 65 72 79 20 69 74 20 66 72 6f 6d 20 74 68 65 20  ery it from the 
15c0: 65 6e 76 69 72 6f 6e 6d 65 6e 74 2e 0a 23 20 20  environment..#  
15d0: 20 20 20 20 20 46 69 6e 61 6c 6c 79 2c 20 66 61       Finally, fa
15e0: 6c 6c 62 61 63 6b 20 6f 6e 20 74 68 65 20 64 65  llback on the de
15f0: 66 61 75 6c 74 20 6f 66 20 73 69 6d 70 6c 79 20  fault of simply 
1600: 22 7a 69 70 22 2c 20 77 68 69 63 68 20 77 69 6c  "zip", which wil
1610: 6c 20 74 68 65 6e 0a 23 20 20 20 20 20 20 20 62  l then.#       b
1620: 65 20 61 73 73 75 6d 65 64 20 74 6f 20 65 78 69  e assumed to exi
1630: 73 74 20 73 6f 6d 65 77 68 65 72 65 20 61 6c 6f  st somewhere alo
1640: 6e 67 20 74 68 65 20 50 41 54 48 2e 0a 23 0a 69  ng the PATH..#.i
1650: 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
1660: 20 7a 69 70 5d 7d 20 74 68 65 6e 20 7b 0a 20 20   zip]} then {.  
1670: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
1680: 20 65 6e 76 28 5a 69 70 54 6f 6f 6c 29 5d 7d 20   env(ZipTool)]} 
1690: 74 68 65 6e 20 7b 0a 20 20 20 20 73 65 74 20 7a  then {.    set z
16a0: 69 70 20 24 65 6e 76 28 5a 69 70 54 6f 6f 6c 29  ip $env(ZipTool)
16b0: 0a 20 20 7d 0a 20 20 69 66 20 7b 21 5b 69 6e 66  .  }.  if {![inf
16c0: 6f 20 65 78 69 73 74 73 20 7a 69 70 5d 20 7c 7c  o exists zip] ||
16d0: 20 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24   ![file exists $
16e0: 7a 69 70 5d 7d 20 74 68 65 6e 20 7b 0a 20 20 20  zip]} then {.   
16f0: 20 73 65 74 20 7a 69 70 20 7a 69 70 0a 20 20 7d   set zip zip.  }
1700: 0a 7d 0a 0a 23 0a 23 20 4e 4f 54 45 3a 20 43 6f  .}..#.# NOTE: Co
1710: 6e 66 69 67 75 72 65 20 74 68 65 20 65 78 74 65  nfigure the exte
1720: 72 6e 61 6c 20 75 6e 7a 69 70 70 69 6e 67 20 74  rnal unzipping t
1730: 6f 6f 6c 2e 20 20 46 69 72 73 74 2c 20 73 65 65  ool.  First, see
1740: 20 69 66 20 69 74 20 68 61 73 20 61 6c 72 65 61   if it has alrea
1750: 64 79 0a 23 20 20 20 20 20 20 20 62 65 65 6e 20  dy.#       been 
1760: 70 72 65 2d 63 6f 6e 66 69 67 75 72 65 64 2e 20  pre-configured. 
1770: 20 49 66 20 6e 6f 74 2c 20 74 72 79 20 74 6f 20   If not, try to 
1780: 71 75 65 72 79 20 69 74 20 66 72 6f 6d 20 74 68  query it from th
1790: 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 2e 0a 23  e environment..#
17a0: 20 20 20 20 20 20 20 46 69 6e 61 6c 6c 79 2c 20         Finally, 
17b0: 66 61 6c 6c 62 61 63 6b 20 6f 6e 20 74 68 65 20  fallback on the 
17c0: 64 65 66 61 75 6c 74 20 6f 66 20 73 69 6d 70 6c  default of simpl
17d0: 79 20 22 75 6e 7a 69 70 22 2c 20 77 68 69 63 68  y "unzip", which
17e0: 20 77 69 6c 6c 20 74 68 65 6e 0a 23 20 20 20 20   will then.#    
17f0: 20 20 20 62 65 20 61 73 73 75 6d 65 64 20 74 6f     be assumed to
1800: 20 65 78 69 73 74 20 73 6f 6d 65 77 68 65 72 65   exist somewhere
1810: 20 61 6c 6f 6e 67 20 74 68 65 20 50 41 54 48 2e   along the PATH.
1820: 0a 23 0a 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78  .#.if {![info ex
1830: 69 73 74 73 20 75 6e 7a 69 70 5d 7d 20 74 68 65  ists unzip]} the
1840: 6e 20 7b 0a 20 20 69 66 20 7b 5b 69 6e 66 6f 20  n {.  if {[info 
1850: 65 78 69 73 74 73 20 65 6e 76 28 55 6e 5a 69 70  exists env(UnZip
1860: 54 6f 6f 6c 29 5d 7d 20 74 68 65 6e 20 7b 0a 20  Tool)]} then {. 
1870: 20 20 20 73 65 74 20 75 6e 7a 69 70 20 24 65 6e     set unzip $en
1880: 76 28 55 6e 5a 69 70 54 6f 6f 6c 29 0a 20 20 7d  v(UnZipTool).  }
1890: 0a 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78  .  if {![info ex
18a0: 69 73 74 73 20 75 6e 7a 69 70 5d 20 7c 7c 20 21  ists unzip] || !
18b0: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 75 6e  [file exists $un
18c0: 7a 69 70 5d 7d 20 74 68 65 6e 20 7b 0a 20 20 20  zip]} then {.   
18d0: 20 73 65 74 20 75 6e 7a 69 70 20 75 6e 7a 69 70   set unzip unzip
18e0: 0a 20 20 7d 0a 7d 0a 0a 23 23 23 23 23 23 23 23  .  }.}..########
18f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1900: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1910: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1920: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1930: 23 23 23 23 23 23 23 0a 0a 23 0a 23 20 4e 4f 54  #######..#.# NOT
1940: 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 65 78  E: Attempt to ex
1950: 74 72 61 63 74 20 74 68 65 20 53 51 4c 69 74 65  tract the SQLite
1960: 20 76 65 72 73 69 6f 6e 20 66 72 6f 6d 20 74 68   version from th
1970: 65 20 22 73 71 6c 69 74 65 33 2e 68 22 20 68 65  e "sqlite3.h" he
1980: 61 64 65 72 20 66 69 6c 65 0a 23 20 20 20 20 20  ader file.#     
1990: 20 20 69 6e 20 74 68 65 20 73 6f 75 72 63 65 20    in the source 
19a0: 64 69 72 65 63 74 6f 72 79 2e 20 20 54 68 69 73  directory.  This
19b0: 20 73 63 72 69 70 74 20 61 73 73 75 6d 65 73 20   script assumes 
19c0: 74 68 61 74 20 74 68 65 20 68 65 61 64 65 72 20  that the header 
19d0: 66 69 6c 65 20 68 61 73 0a 23 20 20 20 20 20 20  file has.#      
19e0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 67 65   already been ge
19f0: 6e 65 72 61 74 65 64 20 62 79 20 74 68 65 20 62  nerated by the b
1a00: 75 69 6c 64 20 70 72 6f 63 65 73 73 2e 0a 23 0a  uild process..#.
1a10: 73 65 74 20 70 61 74 74 65 72 6e 20 7b 5e 23 64  set pattern {^#d
1a20: 65 66 69 6e 65 5c 73 2b 53 51 4c 49 54 45 5f 56  efine\s+SQLITE_V
1a30: 45 52 53 49 4f 4e 5c 73 2b 22 28 2e 2a 29 22 24  ERSION\s+"(.*)"$
1a40: 7d 0a 73 65 74 20 64 61 74 61 20 5b 72 65 61 64  }.set data [read
1a50: 46 69 6c 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  File [file join 
1a60: 24 73 6f 75 72 63 65 44 69 72 65 63 74 6f 72 79  $sourceDirectory
1a70: 20 73 71 6c 69 74 65 33 2e 68 5d 5d 0a 0a 69 66   sqlite3.h]]..if
1a80: 20 7b 21 5b 72 65 67 65 78 70 20 2d 6c 69 6e 65   {![regexp -line
1a90: 20 2d 2d 20 24 70 61 74 74 65 72 6e 20 24 64 61   -- $pattern $da
1aa0: 74 61 20 64 75 6d 6d 79 20 76 65 72 73 69 6f 6e  ta dummy version
1ab0: 5d 7d 20 74 68 65 6e 20 7b 0a 20 20 66 61 69 6c  ]} then {.  fail
1ac0: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 63 61   [appendArgs "ca
1ad0: 6e 6e 6f 74 20 6c 6f 63 61 74 65 20 53 51 4c 49  nnot locate SQLI
1ae0: 54 45 5f 56 45 52 53 49 4f 4e 20 76 61 6c 75 65  TE_VERSION value
1af0: 20 69 6e 20 5c 22 22 20 5c 0a 20 20 20 20 20 20   in \"" \.      
1b00: 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 73 6f 75 72  [file join $sour
1b10: 63 65 44 69 72 65 63 74 6f 72 79 20 73 71 6c 69  ceDirectory sqli
1b20: 74 65 33 2e 68 5d 20 5c 22 5d 0a 7d 0a 0a 23 23  te3.h] \"].}..##
1b30: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b40: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b50: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b60: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b70: 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 0a 23  #############..#
1b80: 0a 23 20 4e 4f 54 45 3a 20 53 65 74 75 70 20 74  .# NOTE: Setup t
1b90: 68 65 20 6d 61 73 74 65 72 20 66 69 6c 65 20 6c  he master file l
1ba0: 69 73 74 20 64 61 74 61 2c 20 69 6e 63 6c 75 64  ist data, includ
1bb0: 69 6e 67 20 74 68 65 20 6e 65 63 65 73 73 61 72  ing the necessar
1bc0: 79 20 66 6c 61 67 73 2e 0a 23 0a 69 66 20 7b 21  y flags..#.if {!
1bd0: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 66 69 6c  [info exists fil
1be0: 65 4e 61 6d 65 73 28 73 6f 75 72 63 65 29 5d 7d  eNames(source)]}
1bf0: 20 74 68 65 6e 20 7b 0a 20 20 73 65 74 20 66 69   then {.  set fi
1c00: 6c 65 4e 61 6d 65 73 28 73 6f 75 72 63 65 29 20  leNames(source) 
1c10: 5b 6c 69 73 74 20 22 22 20 22 22 20 22 22 20 5c  [list "" "" "" \
1c20: 0a 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69  .      [file joi
1c30: 6e 20 24 73 6f 75 72 63 65 44 69 72 65 63 74 6f  n $sourceDirecto
1c40: 72 79 20 73 71 6c 69 74 65 33 2e 68 5d 20 5c 0a  ry sqlite3.h] \.
1c50: 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e        [file join
1c60: 20 24 62 69 6e 61 72 79 44 69 72 65 63 74 6f 72   $binaryDirector
1c70: 79 20 3c 62 75 69 6c 64 3e 20 3c 70 6c 61 74 66  y <build> <platf
1c80: 6f 72 6d 3e 20 73 71 6c 69 74 65 33 2e 6c 69 62  orm> sqlite3.lib
1c90: 5d 20 5c 0a 20 20 20 20 20 20 5b 66 69 6c 65 20  ] \.      [file 
1ca0: 6a 6f 69 6e 20 24 62 69 6e 61 72 79 44 69 72 65  join $binaryDire
1cb0: 63 74 6f 72 79 20 3c 62 75 69 6c 64 3e 20 3c 70  ctory <build> <p
1cc0: 6c 61 74 66 6f 72 6d 3e 20 73 71 6c 69 74 65 33  latform> sqlite3
1cd0: 2e 64 6c 6c 5d 5d 0a 0a 20 20 69 66 20 7b 21 5b  .dll]]..  if {![
1ce0: 69 6e 66 6f 20 65 78 69 73 74 73 20 6e 6f 28 73  info exists no(s
1cf0: 79 6d 62 6f 6c 73 29 5d 7d 20 74 68 65 6e 20 7b  ymbols)]} then {
1d00: 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 66 69 6c  .    lappend fil
1d10: 65 4e 61 6d 65 73 28 73 6f 75 72 63 65 29 20 5c  eNames(source) \
1d20: 0a 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a  .        [file j
1d30: 6f 69 6e 20 24 62 69 6e 61 72 79 44 69 72 65 63  oin $binaryDirec
1d40: 74 6f 72 79 20 3c 62 75 69 6c 64 3e 20 3c 70 6c  tory <build> <pl
1d50: 61 74 66 6f 72 6d 3e 20 73 71 6c 69 74 65 33 2e  atform> sqlite3.
1d60: 70 64 62 5d 0a 20 20 7d 0a 7d 0a 0a 69 66 20 7b  pdb].  }.}..if {
1d70: 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 66 69  ![info exists fi
1d80: 6c 65 4e 61 6d 65 73 28 64 65 73 74 69 6e 61 74  leNames(destinat
1d90: 69 6f 6e 29 5d 7d 20 74 68 65 6e 20 7b 0a 20 20  ion)]} then {.  
1da0: 73 65 74 20 66 69 6c 65 4e 61 6d 65 73 28 64 65  set fileNames(de
1db0: 73 74 69 6e 61 74 69 6f 6e 29 20 5b 6c 69 73 74  stination) [list
1dc0: 20 5c 0a 20 20 20 20 20 20 5b 66 69 6c 65 20 6a   \.      [file j
1dd0: 6f 69 6e 20 24 73 74 61 67 69 6e 67 44 69 72 65  oin $stagingDire
1de0: 63 74 6f 72 79 20 65 78 74 65 6e 73 69 6f 6e 2e  ctory extension.
1df0: 76 73 69 78 6d 61 6e 69 66 65 73 74 5d 20 5c 0a  vsixmanifest] \.
1e00: 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e        [file join
1e10: 20 24 73 74 61 67 69 6e 67 44 69 72 65 63 74 6f   $stagingDirecto
1e20: 72 79 20 53 44 4b 4d 61 6e 69 66 65 73 74 2e 78  ry SDKManifest.x
1e30: 6d 6c 5d 20 5c 0a 20 20 20 20 20 20 5b 66 69 6c  ml] \.      [fil
1e40: 65 20 6a 6f 69 6e 20 24 73 74 61 67 69 6e 67 44  e join $stagingD
1e50: 69 72 65 63 74 6f 72 79 20 44 65 73 69 67 6e 54  irectory DesignT
1e60: 69 6d 65 20 3c 62 75 69 6c 64 3e 20 3c 70 6c 61  ime <build> <pla
1e70: 74 66 6f 72 6d 3e 20 5c 0a 20 20 20 20 20 20 20  tform> \.       
1e80: 20 20 20 53 51 4c 69 74 65 2e 57 69 6e 52 54 2e     SQLite.WinRT.
1e90: 70 72 6f 70 73 5d 20 5c 0a 20 20 20 20 20 20 5b  props] \.      [
1ea0: 66 69 6c 65 20 6a 6f 69 6e 20 24 73 74 61 67 69  file join $stagi
1eb0: 6e 67 44 69 72 65 63 74 6f 72 79 20 44 65 73 69  ngDirectory Desi
1ec0: 67 6e 54 69 6d 65 20 3c 62 75 69 6c 64 3e 20 3c  gnTime <build> <
1ed0: 70 6c 61 74 66 6f 72 6d 3e 20 73 71 6c 69 74 65  platform> sqlite
1ee0: 33 2e 68 5d 20 5c 0a 20 20 20 20 20 20 5b 66 69  3.h] \.      [fi
1ef0: 6c 65 20 6a 6f 69 6e 20 24 73 74 61 67 69 6e 67  le join $staging
1f00: 44 69 72 65 63 74 6f 72 79 20 44 65 73 69 67 6e  Directory Design
1f10: 54 69 6d 65 20 3c 62 75 69 6c 64 3e 20 3c 70 6c  Time <build> <pl
1f20: 61 74 66 6f 72 6d 3e 20 73 71 6c 69 74 65 33 2e  atform> sqlite3.
1f30: 6c 69 62 5d 20 5c 0a 20 20 20 20 20 20 5b 66 69  lib] \.      [fi
1f40: 6c 65 20 6a 6f 69 6e 20 24 73 74 61 67 69 6e 67  le join $staging
1f50: 44 69 72 65 63 74 6f 72 79 20 52 65 64 69 73 74  Directory Redist
1f60: 20 3c 62 75 69 6c 64 3e 20 3c 70 6c 61 74 66 6f   <build> <platfo
1f70: 72 6d 3e 20 73 71 6c 69 74 65 33 2e 64 6c 6c 5d  rm> sqlite3.dll]
1f80: 5d 0a 0a 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20  ]..  if {![info 
1f90: 65 78 69 73 74 73 20 6e 6f 28 73 79 6d 62 6f 6c  exists no(symbol
1fa0: 73 29 5d 7d 20 74 68 65 6e 20 7b 0a 20 20 20 20  s)]} then {.    
1fb0: 6c 61 70 70 65 6e 64 20 66 69 6c 65 4e 61 6d 65  lappend fileName
1fc0: 73 28 64 65 73 74 69 6e 61 74 69 6f 6e 29 20 5c  s(destination) \
1fd0: 0a 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a  .        [file j
1fe0: 6f 69 6e 20 24 73 74 61 67 69 6e 67 44 69 72 65  oin $stagingDire
1ff0: 63 74 6f 72 79 20 52 65 64 69 73 74 20 3c 62 75  ctory Redist <bu
2000: 69 6c 64 3e 20 3c 70 6c 61 74 66 6f 72 6d 3e 20  ild> <platform> 
2010: 73 71 6c 69 74 65 33 2e 70 64 62 5d 0a 20 20 7d  sqlite3.pdb].  }
2020: 0a 7d 0a 0a 69 66 20 7b 21 5b 69 6e 66 6f 20 65  .}..if {![info e
2030: 78 69 73 74 73 20 66 69 6c 65 4e 61 6d 65 73 28  xists fileNames(
2040: 62 75 69 6c 64 4e 65 75 74 72 61 6c 29 5d 7d 20  buildNeutral)]} 
2050: 74 68 65 6e 20 7b 0a 20 20 73 65 74 20 66 69 6c  then {.  set fil
2060: 65 4e 61 6d 65 73 28 62 75 69 6c 64 4e 65 75 74  eNames(buildNeut
2070: 72 61 6c 29 20 5b 6c 69 73 74 20 31 20 31 20 31  ral) [list 1 1 1
2080: 20 31 20 30 20 30 5d 0a 0a 20 20 69 66 20 7b 21   1 0 0]..  if {!
2090: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 6e 6f 28  [info exists no(
20a0: 73 79 6d 62 6f 6c 73 29 5d 7d 20 74 68 65 6e 20  symbols)]} then 
20b0: 7b 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 66 69  {.    lappend fi
20c0: 6c 65 4e 61 6d 65 73 28 62 75 69 6c 64 4e 65 75  leNames(buildNeu
20d0: 74 72 61 6c 29 20 30 0a 20 20 7d 0a 7d 0a 0a 69  tral) 0.  }.}..i
20e0: 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
20f0: 20 66 69 6c 65 4e 61 6d 65 73 28 70 6c 61 74 66   fileNames(platf
2100: 6f 72 6d 4e 65 75 74 72 61 6c 29 5d 7d 20 74 68  ormNeutral)]} th
2110: 65 6e 20 7b 0a 20 20 73 65 74 20 66 69 6c 65 4e  en {.  set fileN
2120: 61 6d 65 73 28 70 6c 61 74 66 6f 72 6d 4e 65 75  ames(platformNeu
2130: 74 72 61 6c 29 20 5b 6c 69 73 74 20 31 20 31 20  tral) [list 1 1 
2140: 31 20 31 20 30 20 30 5d 0a 0a 20 20 69 66 20 7b  1 1 0 0]..  if {
2150: 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 6e 6f  ![info exists no
2160: 28 73 79 6d 62 6f 6c 73 29 5d 7d 20 74 68 65 6e  (symbols)]} then
2170: 20 7b 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 66   {.    lappend f
2180: 69 6c 65 4e 61 6d 65 73 28 70 6c 61 74 66 6f 72  ileNames(platfor
2190: 6d 4e 65 75 74 72 61 6c 29 20 30 0a 20 20 7d 0a  mNeutral) 0.  }.
21a0: 7d 0a 0a 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78  }..if {![info ex
21b0: 69 73 74 73 20 66 69 6c 65 4e 61 6d 65 73 28 73  ists fileNames(s
21c0: 75 62 73 74 29 5d 7d 20 74 68 65 6e 20 7b 0a 20  ubst)]} then {. 
21d0: 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 73 28 73   set fileNames(s
21e0: 75 62 73 74 29 20 5b 6c 69 73 74 20 31 20 31 20  ubst) [list 1 1 
21f0: 31 20 30 20 30 20 30 5d 0a 0a 20 20 69 66 20 7b  1 0 0 0]..  if {
2200: 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 6e 6f  ![info exists no
2210: 28 73 79 6d 62 6f 6c 73 29 5d 7d 20 74 68 65 6e  (symbols)]} then
2220: 20 7b 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 66   {.    lappend f
2230: 69 6c 65 4e 61 6d 65 73 28 73 75 62 73 74 29 20  ileNames(subst) 
2240: 30 0a 20 20 7d 0a 7d 0a 0a 69 66 20 7b 21 5b 69  0.  }.}..if {![i
2250: 6e 66 6f 20 65 78 69 73 74 73 20 66 69 6c 65 4e  nfo exists fileN
2260: 61 6d 65 73 28 6e 6f 44 65 62 75 67 29 5d 7d 20  ames(noDebug)]} 
2270: 74 68 65 6e 20 7b 0a 20 20 73 65 74 20 66 69 6c  then {.  set fil
2280: 65 4e 61 6d 65 73 28 6e 6f 44 65 62 75 67 29 20  eNames(noDebug) 
2290: 5b 6c 69 73 74 20 30 20 30 20 30 20 30 20 30 20  [list 0 0 0 0 0 
22a0: 30 5d 0a 0a 20 20 69 66 20 7b 21 5b 69 6e 66 6f  0]..  if {![info
22b0: 20 65 78 69 73 74 73 20 6e 6f 28 73 79 6d 62 6f   exists no(symbo
22c0: 6c 73 29 5d 7d 20 74 68 65 6e 20 7b 0a 20 20 20  ls)]} then {.   
22d0: 20 6c 61 70 70 65 6e 64 20 66 69 6c 65 4e 61 6d   lappend fileNam
22e0: 65 73 28 6e 6f 44 65 62 75 67 29 20 30 0a 20 20  es(noDebug) 0.  
22f0: 7d 0a 7d 0a 0a 69 66 20 7b 21 5b 69 6e 66 6f 20  }.}..if {![info 
2300: 65 78 69 73 74 73 20 66 69 6c 65 4e 61 6d 65 73  exists fileNames
2310: 28 6e 6f 52 65 74 61 69 6c 29 5d 7d 20 74 68 65  (noRetail)]} the
2320: 6e 20 7b 0a 20 20 73 65 74 20 66 69 6c 65 4e 61  n {.  set fileNa
2330: 6d 65 73 28 6e 6f 52 65 74 61 69 6c 29 20 5b 6c  mes(noRetail) [l
2340: 69 73 74 20 30 20 30 20 30 20 30 20 30 20 30 5d  ist 0 0 0 0 0 0]
2350: 0a 0a 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65  ..  if {![info e
2360: 78 69 73 74 73 20 6e 6f 28 73 79 6d 62 6f 6c 73  xists no(symbols
2370: 29 5d 7d 20 74 68 65 6e 20 7b 0a 20 20 20 20 6c  )]} then {.    l
2380: 61 70 70 65 6e 64 20 66 69 6c 65 4e 61 6d 65 73  append fileNames
2390: 28 6e 6f 52 65 74 61 69 6c 29 20 31 0a 20 20 7d  (noRetail) 1.  }
23a0: 0a 7d 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23  .}..############
23b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
23c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
23d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
23e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
23f0: 23 23 23 0a 0a 23 0a 23 20 4e 4f 54 45 3a 20 53  ###..#.# NOTE: S
2400: 65 74 75 70 20 74 68 65 20 6c 69 73 74 20 6f 66  etup the list of
2410: 20 62 75 69 6c 64 73 20 73 75 70 70 6f 72 74 65   builds supporte
2420: 64 20 62 79 20 74 68 69 73 20 73 63 72 69 70 74  d by this script
2430: 2e 0a 23 0a 69 66 20 7b 21 5b 69 6e 66 6f 20 65  ..#.if {![info e
2440: 78 69 73 74 73 20 62 75 69 6c 64 4e 61 6d 65 73  xists buildNames
2450: 5d 7d 20 74 68 65 6e 20 7b 0a 20 20 73 65 74 20  ]} then {.  set 
2460: 62 75 69 6c 64 4e 61 6d 65 73 20 5b 6c 69 73 74  buildNames [list
2470: 20 44 65 62 75 67 20 52 65 74 61 69 6c 5d 0a 7d   Debug Retail].}
2480: 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ..##############
2490: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
24a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
24b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
24c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
24d0: 23 0a 0a 23 0a 23 20 4e 4f 54 45 3a 20 53 65 74  #..#.# NOTE: Set
24e0: 75 70 20 74 68 65 20 6c 69 73 74 20 6f 66 20 70  up the list of p
24f0: 6c 61 74 66 6f 72 6d 73 20 73 75 70 70 6f 72 74  latforms support
2500: 65 64 20 62 79 20 74 68 69 73 20 73 63 72 69 70  ed by this scrip
2510: 74 2e 0a 23 0a 69 66 20 7b 21 5b 69 6e 66 6f 20  t..#.if {![info 
2520: 65 78 69 73 74 73 20 70 6c 61 74 66 6f 72 6d 4e  exists platformN
2530: 61 6d 65 73 5d 7d 20 74 68 65 6e 20 7b 0a 20 20  ames]} then {.  
2540: 73 65 74 20 70 6c 61 74 66 6f 72 6d 4e 61 6d 65  set platformName
2550: 73 20 5b 6c 69 73 74 20 78 38 36 20 78 36 34 20  s [list x86 x64 
2560: 41 52 4d 5d 0a 7d 0a 0a 23 23 23 23 23 23 23 23  ARM].}..########
2570: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2580: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2590: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
25a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
25b0: 23 23 23 23 23 23 23 0a 0a 23 0a 23 20 4e 4f 54  #######..#.# NOT
25c0: 45 3a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  E: Make sure the
25d0: 20 73 74 61 67 69 6e 67 20 64 69 72 65 63 74 6f   staging directo
25e0: 72 79 20 65 78 69 73 74 73 2c 20 63 72 65 61 74  ry exists, creat
25f0: 69 6e 67 20 69 74 20 69 66 20 6e 65 63 65 73 73  ing it if necess
2600: 61 72 79 2e 0a 23 0a 66 69 6c 65 20 6d 6b 64 69  ary..#.file mkdi
2610: 72 20 24 73 74 61 67 69 6e 67 44 69 72 65 63 74  r $stagingDirect
2620: 6f 72 79 0a 0a 23 0a 23 20 4e 4f 54 45 3a 20 42  ory..#.# NOTE: B
2630: 75 69 6c 64 20 74 68 65 20 54 63 6c 20 63 6f 6d  uild the Tcl com
2640: 6d 61 6e 64 20 75 73 65 64 20 74 6f 20 65 78 74  mand used to ext
2650: 72 61 63 74 20 74 68 65 20 74 65 6d 70 6c 61 74  ract the templat
2660: 65 20 70 61 63 6b 61 67 65 20 74 6f 20 74 68 65  e package to the
2670: 0a 23 20 20 20 20 20 20 20 73 74 61 67 69 6e 67  .#       staging
2680: 20 64 69 72 65 63 74 6f 72 79 2e 0a 23 0a 73 65   directory..#.se
2690: 74 20 65 78 74 72 61 63 74 43 6f 6d 6d 61 6e 64  t extractCommand
26a0: 20 5b 6c 69 73 74 20 65 78 65 63 20 2d 2d 20 24   [list exec -- $
26b0: 75 6e 7a 69 70 20 24 74 65 6d 70 6c 61 74 65 46  unzip $templateF
26c0: 69 6c 65 20 2d 64 20 24 73 74 61 67 69 6e 67 44  ile -d $stagingD
26d0: 69 72 65 63 74 6f 72 79 5d 0a 0a 23 0a 23 20 4e  irectory]..#.# N
26e0: 4f 54 45 3a 20 45 78 74 72 61 63 74 20 74 68 65  OTE: Extract the
26f0: 20 74 65 6d 70 6c 61 74 65 20 70 61 63 6b 61 67   template packag
2700: 65 20 74 6f 20 74 68 65 20 73 74 61 67 69 6e 67  e to the staging
2710: 20 64 69 72 65 63 74 6f 72 79 2e 0a 23 0a 65 76   directory..#.ev
2720: 61 6c 20 24 65 78 74 72 61 63 74 43 6f 6d 6d 61  al $extractComma
2730: 6e 64 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23  nd..############
2740: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2750: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2760: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2770: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2780: 23 23 23 0a 0a 23 0a 23 20 4e 4f 54 45 3a 20 50  ###..#.# NOTE: P
2790: 72 6f 63 65 73 73 20 65 61 63 68 20 66 69 6c 65  rocess each file
27a0: 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20 66   in the master f
27b0: 69 6c 65 20 6c 69 73 74 2e 20 20 54 68 65 72 65  ile list.  There
27c0: 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20 73 65   are actually se
27d0: 76 65 6e 0a 23 20 20 20 20 20 20 20 70 61 72 61  ven.#       para
27e0: 6c 6c 65 6c 20 6c 69 73 74 73 20 74 68 61 74 20  llel lists that 
27f0: 63 6f 6e 74 61 69 6e 20 74 68 65 20 73 6f 75 72  contain the sour
2800: 63 65 20 66 69 6c 65 20 6e 61 6d 65 73 2c 20 74  ce file names, t
2810: 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 66  he destination f
2820: 69 6c 65 0a 23 20 20 20 20 20 20 20 6e 61 6d 65  ile.#       name
2830: 73 2c 20 74 68 65 20 62 75 69 6c 64 2d 6e 65 75  s, the build-neu
2840: 74 72 61 6c 20 66 6c 61 67 73 2c 20 74 68 65 20  tral flags, the 
2850: 70 6c 61 74 66 6f 72 6d 2d 6e 65 75 74 72 61 6c  platform-neutral
2860: 20 66 6c 61 67 73 2c 20 74 68 65 0a 23 20 20 20   flags, the.#   
2870: 20 20 20 20 75 73 65 2d 73 75 62 73 74 20 66 6c      use-subst fl
2880: 61 67 73 2c 20 74 68 65 20 6e 6f 2d 64 65 62 75  ags, the no-debu
2890: 67 20 66 6c 61 67 73 2c 20 61 6e 64 20 74 68 65  g flags, and the
28a0: 20 6e 6f 2d 72 65 74 61 69 6c 20 66 6c 61 67 73   no-retail flags
28b0: 2e 20 20 49 66 20 74 68 65 0a 23 20 20 20 20 20  .  If the.#     
28c0: 20 20 70 6c 61 74 66 6f 72 6d 2d 6e 65 75 74 72    platform-neutr
28d0: 61 6c 20 66 6c 61 67 20 69 73 20 6e 6f 6e 2d 7a  al flag is non-z
28e0: 65 72 6f 2c 20 74 68 65 20 66 69 6c 65 20 69 73  ero, the file is
28f0: 20 6e 6f 74 20 70 6c 61 74 66 6f 72 6d 2d 73 70   not platform-sp
2900: 65 63 69 66 69 63 2e 0a 23 20 20 20 20 20 20 20  ecific..#       
2910: 49 66 20 74 68 65 20 62 75 69 6c 64 2d 6e 65 75  If the build-neu
2920: 74 72 61 6c 20 66 6c 61 67 20 69 73 20 6e 6f 6e  tral flag is non
2930: 2d 7a 65 72 6f 2c 20 74 68 65 20 66 69 6c 65 20  -zero, the file 
2940: 69 73 20 6e 6f 74 20 62 75 69 6c 64 2d 73 70 65  is not build-spe
2950: 63 69 66 69 63 2e 0a 23 20 20 20 20 20 20 20 49  cific..#       I
2960: 66 20 74 68 65 20 75 73 65 2d 73 75 62 73 74 20  f the use-subst 
2970: 66 6c 61 67 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  flag is non-zero
2980: 2c 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 6f  , the file is co
2990: 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 61  nsidered to be a
29a0: 20 74 65 78 74 0a 23 20 20 20 20 20 20 20 66 69   text.#       fi
29b0: 6c 65 20 74 68 61 74 20 6d 61 79 20 63 6f 6e 74  le that may cont
29c0: 61 69 6e 20 54 63 6c 20 76 61 72 69 61 62 6c 65  ain Tcl variable
29d0: 20 61 6e 64 2f 6f 72 20 63 6f 6d 6d 61 6e 64 20   and/or command 
29e0: 72 65 70 6c 61 63 65 6d 65 6e 74 73 2c 20 74 6f  replacements, to
29f0: 20 62 65 0a 23 20 20 20 20 20 20 20 64 79 6e 61   be.#       dyna
2a00: 6d 69 63 61 6c 6c 79 20 72 65 70 6c 61 63 65 64  mically replaced
2a10: 20 64 75 72 69 6e 67 20 70 72 6f 63 65 73 73 69   during processi
2a20: 6e 67 2e 20 20 49 66 20 74 68 65 20 6e 6f 2d 64  ng.  If the no-d
2a30: 65 62 75 67 20 66 6c 61 67 20 69 73 0a 23 20 20  ebug flag is.#  
2a40: 20 20 20 20 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74       non-zero, t
2a50: 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  he file will be 
2a60: 73 6b 69 70 70 65 64 20 77 68 65 6e 20 70 72 6f  skipped when pro
2a70: 63 65 73 73 69 6e 67 20 66 6f 72 20 74 68 65 20  cessing for the 
2a80: 64 65 62 75 67 20 62 75 69 6c 64 2e 0a 23 20 20  debug build..#  
2a90: 20 20 20 20 20 49 66 20 74 68 65 20 6e 6f 2d 72       If the no-r
2aa0: 65 74 61 69 6c 20 66 6c 61 67 20 69 73 20 6e 6f  etail flag is no
2ab0: 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 66 69 6c 65  n-zero, the file
2ac0: 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64   will be skipped
2ad0: 20 77 68 65 6e 0a 23 20 20 20 20 20 20 20 70 72   when.#       pr
2ae0: 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 74 68 65  ocessing for the
2af0: 20 72 65 74 61 69 6c 20 62 75 69 6c 64 2e 20 20   retail build.  
2b00: 49 66 20 74 68 65 20 73 6f 75 72 63 65 20 66 69  If the source fi
2b10: 6c 65 20 6e 61 6d 65 20 69 73 20 61 6e 20 65 6d  le name is an em
2b20: 70 74 79 0a 23 20 20 20 20 20 20 20 73 74 72 69  pty.#       stri
2b30: 6e 67 2c 20 74 68 65 6e 20 74 68 65 20 64 65 73  ng, then the des
2b40: 74 69 6e 61 74 69 6f 6e 20 66 69 6c 65 20 6e 61  tination file na
2b50: 6d 65 20 77 69 6c 6c 20 62 65 20 61 73 73 75 6d  me will be assum
2b60: 65 64 20 74 6f 20 61 6c 72 65 61 64 79 20 65 78  ed to already ex
2b70: 69 73 74 0a 23 20 20 20 20 20 20 20 69 6e 20 74  ist.#       in t
2b80: 68 65 20 73 74 61 67 69 6e 67 20 64 69 72 65 63  he staging direc
2b90: 74 6f 72 79 20 61 6e 64 20 77 69 6c 6c 20 6e 6f  tory and will no
2ba0: 74 20 62 65 20 63 6f 70 69 65 64 3b 20 68 6f 77  t be copied; how
2bb0: 65 76 65 72 2c 20 64 79 6e 61 6d 69 63 0a 23 20  ever, dynamic.# 
2bc0: 20 20 20 20 20 20 72 65 70 6c 61 63 65 6d 65 6e        replacemen
2bd0: 74 73 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20  ts may still be 
2be0: 70 65 72 66 6f 72 6d 65 64 20 6f 6e 20 74 68 65  performed on the
2bf0: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 66 69 6c   destination fil
2c00: 65 20 70 72 69 6f 72 20 74 6f 0a 23 20 20 20 20  e prior to.#    
2c10: 20 20 20 74 68 65 20 70 61 63 6b 61 67 65 20 62     the package b
2c20: 65 69 6e 67 20 72 65 2d 7a 69 70 70 65 64 2e 0a  eing re-zipped..
2c30: 23 0a 66 6f 72 65 61 63 68 20 73 6f 75 72 63 65  #.foreach source
2c40: 46 69 6c 65 4e 61 6d 65 20 20 20 20 20 20 24 66  FileName      $f
2c50: 69 6c 65 4e 61 6d 65 73 28 73 6f 75 72 63 65 29  ileNames(source)
2c60: 20 5c 0a 20 20 20 20 20 20 20 20 64 65 73 74 69   \.        desti
2c70: 6e 61 74 69 6f 6e 46 69 6c 65 4e 61 6d 65 20 24  nationFileName $
2c80: 66 69 6c 65 4e 61 6d 65 73 28 64 65 73 74 69 6e  fileNames(destin
2c90: 61 74 69 6f 6e 29 20 5c 0a 20 20 20 20 20 20 20  ation) \.       
2ca0: 20 62 75 69 6c 64 4e 65 75 74 72 61 6c 20 20 20   buildNeutral   
2cb0: 20 20 20 20 20 24 66 69 6c 65 4e 61 6d 65 73 28       $fileNames(
2cc0: 62 75 69 6c 64 4e 65 75 74 72 61 6c 29 20 5c 0a  buildNeutral) \.
2cd0: 20 20 20 20 20 20 20 20 70 6c 61 74 66 6f 72 6d          platform
2ce0: 4e 65 75 74 72 61 6c 20 20 20 20 20 24 66 69 6c  Neutral     $fil
2cf0: 65 4e 61 6d 65 73 28 70 6c 61 74 66 6f 72 6d 4e  eNames(platformN
2d00: 65 75 74 72 61 6c 29 20 5c 0a 20 20 20 20 20 20  eutral) \.      
2d10: 20 20 75 73 65 53 75 62 73 74 20 20 20 20 20 20    useSubst      
2d20: 20 20 20 20 20 20 24 66 69 6c 65 4e 61 6d 65 73        $fileNames
2d30: 28 73 75 62 73 74 29 20 5c 0a 20 20 20 20 20 20  (subst) \.      
2d40: 20 20 6e 6f 44 65 62 75 67 20 20 20 20 20 20 20    noDebug       
2d50: 20 20 20 20 20 20 24 66 69 6c 65 4e 61 6d 65 73        $fileNames
2d60: 28 6e 6f 44 65 62 75 67 29 20 5c 0a 20 20 20 20  (noDebug) \.    
2d70: 20 20 20 20 6e 6f 52 65 74 61 69 6c 20 20 20 20      noRetail    
2d80: 20 20 20 20 20 20 20 20 24 66 69 6c 65 4e 61 6d          $fileNam
2d90: 65 73 28 6e 6f 52 65 74 61 69 6c 29 20 7b 0a 20  es(noRetail) {. 
2da0: 20 23 0a 20 20 23 20 4e 4f 54 45 3a 20 49 66 20   #.  # NOTE: If 
2db0: 74 68 65 20 63 75 72 72 65 6e 74 20 66 69 6c 65  the current file
2dc0: 20 69 73 20 62 75 69 6c 64 2d 6e 65 75 74 72 61   is build-neutra
2dd0: 6c 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 6f 6e 65  l, then only one
2de0: 20 62 75 69 6c 64 20 77 69 6c 6c 0a 20 20 23 20   build will.  # 
2df0: 20 20 20 20 20 20 62 65 20 70 72 6f 63 65 73 73        be process
2e00: 65 64 20 66 6f 72 20 69 74 2c 20 6e 61 6d 65 6c  ed for it, namel
2e10: 79 20 22 43 6f 6d 6d 6f 6e 43 6f 6e 66 69 67 75  y "CommonConfigu
2e20: 72 61 74 69 6f 6e 22 3b 20 6f 74 68 65 72 77 69  ration"; otherwi
2e30: 73 65 2c 20 65 61 63 68 0a 20 20 23 20 20 20 20  se, each.  #    
2e40: 20 20 20 73 75 70 70 6f 72 74 65 64 20 62 75 69     supported bui
2e50: 6c 64 20 77 69 6c 6c 20 62 65 20 70 72 6f 63 65  ld will be proce
2e60: 73 73 65 64 20 66 6f 72 20 69 74 20 69 6e 64 69  ssed for it indi
2e70: 76 69 64 75 61 6c 6c 79 2e 0a 20 20 23 0a 20 20  vidually..  #.  
2e80: 66 6f 72 65 61 63 68 20 62 75 69 6c 64 4e 61 6d  foreach buildNam
2e90: 65 20 5c 0a 20 20 20 20 20 20 5b 65 78 70 72 20  e \.      [expr 
2ea0: 7b 24 62 75 69 6c 64 4e 65 75 74 72 61 6c 20 3f  {$buildNeutral ?
2eb0: 20 5b 6c 69 73 74 20 43 6f 6d 6d 6f 6e 43 6f 6e   [list CommonCon
2ec0: 66 69 67 75 72 61 74 69 6f 6e 5d 20 3a 20 24 62  figuration] : $b
2ed0: 75 69 6c 64 4e 61 6d 65 73 7d 5d 20 7b 0a 20 20  uildNames}] {.  
2ee0: 20 20 23 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20    #.    # NOTE: 
2ef0: 53 68 6f 75 6c 64 20 74 68 65 20 63 75 72 72 65  Should the curre
2f00: 6e 74 20 66 69 6c 65 20 62 65 20 73 6b 69 70 70  nt file be skipp
2f10: 65 64 20 66 6f 72 20 74 68 69 73 20 62 75 69 6c  ed for this buil
2f20: 64 3f 0a 20 20 20 20 23 0a 20 20 20 20 69 66 20  d?.    #.    if 
2f30: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 6e 6f  {[info exists no
2f40: 24 7b 62 75 69 6c 64 4e 61 6d 65 7d 5d 20 26 26  ${buildName}] &&
2f50: 20 5b 73 65 74 20 6e 6f 24 7b 62 75 69 6c 64 4e   [set no${buildN
2f60: 61 6d 65 7d 5d 7d 20 74 68 65 6e 20 7b 0a 20 20  ame}]} then {.  
2f70: 20 20 20 20 63 6f 6e 74 69 6e 75 65 0a 20 20 20      continue.   
2f80: 20 7d 0a 0a 20 20 20 20 23 0a 20 20 20 20 23 20   }..    #.    # 
2f90: 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 63 75 72  NOTE: If the cur
2fa0: 72 65 6e 74 20 66 69 6c 65 20 69 73 20 70 6c 61  rent file is pla
2fb0: 74 66 6f 72 6d 2d 6e 65 75 74 72 61 6c 2c 20 74  tform-neutral, t
2fc0: 68 65 6e 20 6f 6e 6c 79 20 6f 6e 65 20 70 6c 61  hen only one pla
2fd0: 74 66 6f 72 6d 0a 20 20 20 20 23 20 20 20 20 20  tform.    #     
2fe0: 20 20 77 69 6c 6c 20 62 65 20 70 72 6f 63 65 73    will be proces
2ff0: 73 65 64 20 66 6f 72 20 69 74 2c 20 6e 61 6d 65  sed for it, name
3000: 6c 79 20 22 6e 65 75 74 72 61 6c 22 3b 20 6f 74  ly "neutral"; ot
3010: 68 65 72 77 69 73 65 2c 20 65 61 63 68 0a 20 20  herwise, each.  
3020: 20 20 23 20 20 20 20 20 20 20 73 75 70 70 6f 72    #       suppor
3030: 74 65 64 20 70 6c 61 74 66 6f 72 6d 20 77 69 6c  ted platform wil
3040: 6c 20 62 65 20 70 72 6f 63 65 73 73 65 64 20 66  l be processed f
3050: 6f 72 20 69 74 20 69 6e 64 69 76 69 64 75 61 6c  or it individual
3060: 6c 79 2e 0a 20 20 20 20 23 0a 20 20 20 20 66 6f  ly..    #.    fo
3070: 72 65 61 63 68 20 70 6c 61 74 66 6f 72 6d 4e 61  reach platformNa
3080: 6d 65 20 5c 0a 20 20 20 20 20 20 20 20 5b 65 78  me \.        [ex
3090: 70 72 20 7b 24 70 6c 61 74 66 6f 72 6d 4e 65 75  pr {$platformNeu
30a0: 74 72 61 6c 20 3f 20 5b 6c 69 73 74 20 6e 65 75  tral ? [list neu
30b0: 74 72 61 6c 5d 20 3a 20 24 70 6c 61 74 66 6f 72  tral] : $platfor
30c0: 6d 4e 61 6d 65 73 7d 5d 20 7b 0a 20 20 20 20 20  mNames}] {.     
30d0: 20 23 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a   #.      # NOTE:
30e0: 20 55 73 65 20 74 68 65 20 61 63 74 75 61 6c 20   Use the actual 
30f0: 70 6c 61 74 66 6f 72 6d 20 6e 61 6d 65 20 69 6e  platform name in
3100: 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
3110: 20 66 69 6c 65 20 6e 61 6d 65 2e 0a 20 20 20 20   file name..    
3120: 20 20 23 0a 20 20 20 20 20 20 73 65 74 20 6e 65    #.      set ne
3130: 77 44 65 73 74 69 6e 61 74 69 6f 6e 46 69 6c 65  wDestinationFile
3140: 4e 61 6d 65 20 5b 72 65 70 6c 61 63 65 42 75 69  Name [replaceBui
3150: 6c 64 41 6e 64 50 6c 61 74 66 6f 72 6d 20 5c 0a  ldAndPlatform \.
3160: 20 20 20 20 20 20 20 20 20 20 24 64 65 73 74 69            $desti
3170: 6e 61 74 69 6f 6e 46 69 6c 65 4e 61 6d 65 20 24  nationFileName $
3180: 62 75 69 6c 64 4e 61 6d 65 20 24 70 6c 61 74 66  buildName $platf
3190: 6f 72 6d 4e 61 6d 65 5d 0a 0a 20 20 20 20 20 20  ormName]..      
31a0: 23 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  #.      # NOTE: 
31b0: 44 6f 65 73 20 74 68 65 20 73 6f 75 72 63 65 20  Does the source 
31c0: 66 69 6c 65 20 6e 65 65 64 20 74 6f 20 62 65 20  file need to be 
31d0: 63 6f 70 69 65 64 20 74 6f 20 74 68 65 20 64 65  copied to the de
31e0: 73 74 69 6e 61 74 69 6f 6e 20 66 69 6c 65 3f 0a  stination file?.
31f0: 20 20 20 20 20 20 23 0a 20 20 20 20 20 20 69 66        #.      if
3200: 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
3210: 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65   $sourceFileName
3220: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0a 20 20  ] > 0} then {.  
3230: 20 20 20 20 20 20 23 0a 20 20 20 20 20 20 20 20        #.        
3240: 23 20 4e 4f 54 45 3a 20 46 69 72 73 74 2c 20 6d  # NOTE: First, m
3250: 61 6b 65 20 73 75 72 65 20 74 68 65 20 64 65 73  ake sure the des
3260: 74 69 6e 61 74 69 6f 6e 20 64 69 72 65 63 74 6f  tination directo
3270: 72 79 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20  ry exists..     
3280: 20 20 20 23 0a 20 20 20 20 20 20 20 20 66 69 6c     #.        fil
3290: 65 20 6d 6b 64 69 72 20 5b 66 69 6c 65 20 64 69  e mkdir [file di
32a0: 72 6e 61 6d 65 20 24 6e 65 77 44 65 73 74 69 6e  rname $newDestin
32b0: 61 74 69 6f 6e 46 69 6c 65 4e 61 6d 65 5d 0a 0a  ationFileName]..
32c0: 20 20 20 20 20 20 20 20 23 0a 20 20 20 20 20 20          #.      
32d0: 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 6e 2c 20    # NOTE: Then, 
32e0: 63 6f 70 79 20 74 68 65 20 73 6f 75 72 63 65 20  copy the source 
32f0: 66 69 6c 65 20 74 6f 20 74 68 65 20 64 65 73 74  file to the dest
3300: 69 6e 61 74 69 6f 6e 20 66 69 6c 65 20 76 65 72  ination file ver
3310: 62 61 74 69 6d 2e 0a 20 20 20 20 20 20 20 20 23  batim..        #
3320: 0a 20 20 20 20 20 20 20 20 66 69 6c 65 20 63 6f  .        file co
3330: 70 79 20 5b 72 65 70 6c 61 63 65 42 75 69 6c 64  py [replaceBuild
3340: 41 6e 64 50 6c 61 74 66 6f 72 6d 20 24 73 6f 75  AndPlatform $sou
3350: 72 63 65 46 69 6c 65 4e 61 6d 65 20 24 62 75 69  rceFileName $bui
3360: 6c 64 4e 61 6d 65 20 5c 0a 20 20 20 20 20 20 20  ldName \.       
3370: 20 20 20 20 20 24 70 6c 61 74 66 6f 72 6d 4e 61       $platformNa
3380: 6d 65 5d 20 24 6e 65 77 44 65 73 74 69 6e 61 74  me] $newDestinat
3390: 69 6f 6e 46 69 6c 65 4e 61 6d 65 0a 20 20 20 20  ionFileName.    
33a0: 20 20 7d 0a 0a 20 20 20 20 20 20 23 0a 20 20 20    }..      #.   
33b0: 20 20 20 23 20 4e 4f 54 45 3a 20 44 6f 65 73 20     # NOTE: Does 
33c0: 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  the destination 
33d0: 66 69 6c 65 20 63 6f 6e 74 61 69 6e 20 64 79 6e  file contain dyn
33e0: 61 6d 69 63 20 72 65 70 6c 61 63 65 6d 65 6e 74  amic replacement
33f0: 73 20 74 68 61 74 20 6d 75 73 74 0a 20 20 20 20  s that must.    
3400: 20 20 23 20 20 20 20 20 20 20 62 65 20 70 72 6f    #       be pro
3410: 63 65 73 73 65 64 20 6e 6f 77 3f 0a 20 20 20 20  cessed now?.    
3420: 20 20 23 0a 20 20 20 20 20 20 69 66 20 7b 24 75    #.      if {$u
3430: 73 65 53 75 62 73 74 7d 20 74 68 65 6e 20 7b 0a  seSubst} then {.
3440: 20 20 20 20 20 20 20 20 23 0a 20 20 20 20 20 20          #.      
3450: 20 20 23 20 4e 4f 54 45 3a 20 50 65 72 66 6f 72    # NOTE: Perfor
3460: 6d 20 61 6e 79 20 64 79 6e 61 6d 69 63 20 72 65  m any dynamic re
3470: 70 6c 61 63 65 6d 65 6e 74 73 20 63 6f 6e 74 61  placements conta
3480: 69 6e 65 64 20 69 6e 20 74 68 65 20 64 65 73 74  ined in the dest
3490: 69 6e 61 74 69 6f 6e 0a 20 20 20 20 20 20 20 20  ination.        
34a0: 23 20 20 20 20 20 20 20 66 69 6c 65 20 61 6e 64  #       file and
34b0: 20 74 68 65 6e 20 72 65 2d 77 72 69 74 65 20 69   then re-write i
34c0: 74 20 69 6e 2d 70 6c 61 63 65 2e 0a 20 20 20 20  t in-place..    
34d0: 20 20 20 20 23 0a 20 20 20 20 20 20 20 20 73 75      #.        su
34e0: 62 73 74 46 69 6c 65 20 24 6e 65 77 44 65 73 74  bstFile $newDest
34f0: 69 6e 61 74 69 6f 6e 46 69 6c 65 4e 61 6d 65 0a  inationFileName.
3500: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
3510: 7d 0a 7d 0a 0a 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 23 23 23 23 23 23 23 23 23 23 23 23  ################
3550: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3560: 23 23 23 23 0a 0a 23 0a 23 20 4e 4f 54 45 3a 20  ####..#.# NOTE: 
3570: 43 68 61 6e 67 65 20 74 68 65 20 63 75 72 72 65  Change the curre
3580: 6e 74 20 64 69 72 65 63 74 6f 72 79 20 74 6f 20  nt directory to 
3590: 74 68 65 20 73 74 61 67 69 6e 67 20 64 69 72 65  the staging dire
35a0: 63 74 6f 72 79 20 73 6f 20 74 68 61 74 20 74 68  ctory so that th
35b0: 65 0a 23 20 20 20 20 20 20 20 65 78 74 65 72 6e  e.#       extern
35c0: 61 6c 20 61 72 63 68 69 76 65 20 62 75 69 6c 64  al archive build
35d0: 69 6e 67 20 74 6f 6f 6c 20 63 61 6e 20 70 69 63  ing tool can pic
35e0: 6b 75 70 20 74 68 65 20 6e 65 63 65 73 73 61 72  kup the necessar
35f0: 79 20 66 69 6c 65 73 20 75 73 69 6e 67 0a 23 20  y files using.# 
3600: 20 20 20 20 20 20 72 65 6c 61 74 69 76 65 20 70        relative p
3610: 61 74 68 73 2e 0a 23 0a 63 64 20 24 73 74 61 67  aths..#.cd $stag
3620: 69 6e 67 44 69 72 65 63 74 6f 72 79 0a 0a 23 0a  ingDirectory..#.
3630: 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68  # NOTE: Build th
3640: 65 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 75 73  e Tcl command us
3650: 65 64 20 74 6f 20 61 72 63 68 69 76 65 20 74 68  ed to archive th
3660: 65 20 66 69 6e 61 6c 20 70 61 63 6b 61 67 65 20  e final package 
3670: 69 6e 20 74 68 65 0a 23 20 20 20 20 20 20 20 6f  in the.#       o
3680: 75 74 70 75 74 20 64 69 72 65 63 74 6f 72 79 2e  utput directory.
3690: 0a 23 0a 73 65 74 20 61 72 63 68 69 76 65 43 6f  .#.set archiveCo
36a0: 6d 6d 61 6e 64 20 5b 6c 69 73 74 20 65 78 65 63  mmand [list exec
36b0: 20 2d 2d 20 24 7a 69 70 20 2d 72 20 24 6f 75 74   -- $zip -r $out
36c0: 70 75 74 46 69 6c 65 20 2a 5d 0a 0a 23 0a 23 20  putFile *]..#.# 
36d0: 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20  NOTE: Build the 
36e0: 66 69 6e 61 6c 20 70 61 63 6b 61 67 65 20 61 72  final package ar
36f0: 63 68 69 76 65 20 69 6e 20 74 68 65 20 6f 75 74  chive in the out
3700: 70 75 74 20 64 69 72 65 63 74 6f 72 79 2e 0a 23  put directory..#
3710: 0a 65 76 61 6c 20 24 61 72 63 68 69 76 65 43 6f  .eval $archiveCo
3720: 6d 6d 61 6e 64 0a 0a 23 0a 23 20 4e 4f 54 45 3a  mmand..#.# NOTE:
3730: 20 43 68 61 6e 67 65 20 62 61 63 6b 20 74 6f 20   Change back to 
3740: 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20 73  the previously s
3750: 61 76 65 64 20 63 75 72 72 65 6e 74 20 64 69 72  aved current dir
3760: 65 63 74 6f 72 79 2e 0a 23 0a 63 64 20 24 63 75  ectory..#.cd $cu
3770: 72 72 65 6e 74 44 69 72 65 63 74 6f 72 79 0a 0a  rrentDirectory..
3780: 23 0a 23 20 4e 4f 54 45 3a 20 43 6c 65 61 6e 75  #.# NOTE: Cleanu
3790: 70 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  p the temporary 
37a0: 73 74 61 67 69 6e 67 20 64 69 72 65 63 74 6f 72  staging director
37b0: 79 2e 0a 23 0a 66 69 6c 65 20 64 65 6c 65 74 65  y..#.file delete
37c0: 20 2d 66 6f 72 63 65 20 24 73 74 61 67 69 6e 67   -force $staging
37d0: 44 69 72 65 63 74 6f 72 79 0a 0a 23 23 23 23 23  Directory..#####
37e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
37f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3800: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3810: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3820: 23 23 23 23 23 23 23 23 23 23 0a 0a 23 0a 23 20  ##########..#.# 
3830: 4e 4f 54 45 3a 20 53 75 63 63 65 73 73 2c 20 65  NOTE: Success, e
3840: 6d 69 74 20 74 68 65 20 66 75 6c 6c 79 20 71 75  mit the fully qu
3850: 61 6c 69 66 69 65 64 20 70 61 74 68 20 6f 66 20  alified path of 
3860: 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 56 53  the generated VS
3870: 49 58 20 66 69 6c 65 2e 0a 23 0a 70 75 74 73 20  IX file..#.puts 
3880: 73 74 64 6f 75 74 20 24 6f 75 74 70 75 74 46 69  stdout $outputFi
3890: 6c 65 0a                                         le.