pull up r19344 from trunk
authorTom Yu <tlyu@mit.edu>
Fri, 30 Mar 2007 20:55:11 +0000 (20:55 +0000)
committerTom Yu <tlyu@mit.edu>
Fri, 30 Mar 2007 20:55:11 +0000 (20:55 +0000)
 r19344@cathode-dark-space:  kpkoch | 2007-03-30 16:08:53 -0400
 Target_Version: 1.6.1
 Ticket: 5490
 Tags: pullup

 Remove tabs.  Improve some comments.  Regroup files in copylist.pl according to destination.

 Add signing.

 Factor zipfiles out of bkw.pl and signing out of makeZip.pl.

 Rename MITKerberosForWindows.exe before zipping it into the SDK zipfile.

ticket: 5490
version_fixed: 1.6.1

git-svn-id: svn://anonsvn.mit.edu/krb5/branches/krb5-1-6@19360 dc483132-0cff-0310-8789-dd5450dbe970

src/windows/build/BKWconfig.xml
src/windows/build/bkw.pl
src/windows/build/copyfiles.pl
src/windows/build/copyfiles.xml
src/windows/build/makeZip.pl [new file with mode: 0644]
src/windows/build/sdkfiles.xml
src/windows/build/signFiles.pl [new file with mode: 0644]

index 9818db79c1a2844ae9cc213319b04e1360e244df..7e1fd24c7d3d1472bdb06105db0c43881a62c0ac 100644 (file)
 <?xml version="1.0" encoding="utf-8" ?>\r
 <!-- BKW: Build Kerberos for Windows -->\r
 <BKW_Config>\r
-       <CommandLine>\r
-               <!-- The most changeable parameters can be specified on the command line.       -->\r
-               <Tags>\r
-                       <cvs value="" />\r
-                       <svn value=""/>\r
-                       </Tags>\r
-               <Directories>\r
-                       <!--    Sources will be checked out of repositories into <src>.  The structure\r
-                                               of the repositories will cause pismere/athena to be created under <src>.        -->\r
-                       <src                    path    ="C:\projects\Autobuild" />\r
-                       <out                    path    ="public" /> <!-- Relative to src. -->\r
-                       <unixfind       path    ="c:\cygwin\bin" />\r
-                       </Directories>\r
-               <Options>\r
-                       <debug value="0" />\r
-                       <logfile value="1" path="bkw.pl.log" />\r
-                       <repository value="skip" />\r
-                       <clean value="0" />\r
-                       <nomake value="0" />\r
-                       <nopackage value="0" />\r
-                       <verbose value="0" />\r
-                       <vverbose value="0" />\r
-                       </Options>\r
-               </CommandLine>\r
-       <Stages>\r
-               <FetchSources>\r
-                       <Config>\r
-                               <CVSROOT name=":kserver:cvs.mit.edu:/cvs/pismere" />\r
-                               <SVNURL name="svn.mit.edu" />   <!-- NB:  No protocol or slashes!! -->\r
-                               <USERNAME name="" />                                    <!-- Needed for svn/plink.  Override from command line -->\r
-                               </Config>\r
-               </FetchSources>\r
-               <Make>\r
-                       <Prunes> <!-- Files to be removed from current build to match what is in the 3.1 distribution:  -->\r
-                               <Prune dummy="foo" />           <!-- Force XML::Simple behavior -->\r
-                               <Prune name="afsauth" />\r
-                               <Prune name="aklog" />\r
-                               <Prune name="vs" />\r
-                               </Prunes>\r
-                       </Make>\r
-               <PrePackage>\r
-                       <CopyList>\r
-                               <Config>\r
-                                       <!--    Debug and Release build results go in different places.\r
-                                                               The otherwise identical paths differ in one section.  For example:\r
-                                                               .../target/bin/i386/bin/rel/filename and .../target/bin/i386/dbg/filename.\r
-                                                               Here we define the two differing sections:      -->\r
-                                       <DebugArea value="dbg" />\r
-                                       <ReleaseArea value="rel" />\r
-                                       <!--    Paths in the file list that include <AlwaysTag> will always have the tag replaced \r
-                                                               with <DebugArea> or <ReleaseArea>, depending on the type of build.\r
-                                                               Paths that include <DebugTag> (or <ReleaseTag>) will only have the tag substituted \r
-                                                               and be copied when doing a debug (or release) build.  Examples:\r
-                                                               Will always be copied, from a build-dependent directory:\r
-                                                               <File name="kfwlogon.dll"       from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" /> \r
-                                                               Will only be copied in debug build:\r
-                                                               <File name="netidmgr.exe.static.manifest"       from="..\target\bin\i386\%debug%\"      to="\bin\i386" notrequired="true" />\r
-                                                               Will always be copied, from a build-independent directory:\r
-                                                               <File name="des.h"      from="auth\krb4\include\"       to="\inc\krb4" newname="foo.h"/>\r
-                                                               -->\r
-                                       <AlwaysTag value="%bldtype%" /> <!-- Pick a string that won't appear in a path. -->\r
-                                       <DebugTag value="%debug%" /> <!-- Pick a string that won't appear in a path. -->\r
-                                       <ReleaseTag value="%release%" /> <!-- Pick a string that won't appear in a path. -->\r
-                                       </Config>\r
-                               <Files>\r
-                                       <Include path="copyfiles.xml" />\r
-                                       </Files> <!-- Relative to location of bkw.pl. -->\r
-                       </CopyList>\r
-               </PrePackage>\r
-               <Package>\r
-                       <Config>\r
-                               <Paths> \r
-                                       <Versions path="pismere/athena/include/kerberos.ver" />         <!-- Relative to <src>. -->\r
-                                       </Paths>\r
-                               </Config>\r
-                       <MSI></MSI>\r
-                       <NSIS></NSIS> <!-- NB:  Most config is done in site-local.nsi.  -->\r
-               </Package>\r
-               <PostPackage>\r
-                       <Config>                                                                                                        <!-- This config info will be copied into each CopyList in PostPackage. -->\r
-                               <FileStem name="kfw-%VERSION_MAJOR%-%VERSION_MINOR%-%VERSION_PATCH%" />         <!--    <FileStem> will be substituted for %filestem%.  -->\r
-                               </Config>\r
-                       <Zips>\r
-                               <Zip dummy="foo" /> <!-- To force desired XML::Simple behavior  -->\r
-                               <!--    Files will be copied into directory <topdir>; <topdir> will appear in the paths of the files.   -->\r
-                               <!-- File from  paths are relative to <src>/pismere.    -->\r
-                               <!-- File to                    paths are relative to <out>.                                    -->\r
-                               <Zip name="Core Binaries" filename="%filestem%.zip" topdir="%filestem%-final">\r
-                                       <CopyList>\r
-                                               <Config>\r
-                                                       <DebugArea value="dbg" />\r
-                                                       <ReleaseArea value="rel" />\r
-                                                       <AlwaysTag value="%bldtype%" /> <!-- Pick a string that won't appear in a path. -->\r
-                                                       <DebugTag value="%debug%" /> <!-- Pick a string that won't appear in a path. -->\r
-                                                       <ReleaseTag value="%release%" /> <!-- Pick a string that won't appear in a path. -->\r
-                                                       </Config>\r
-                                               <Files>\r
-                                                       <Include path="corebinaryfiles.xml" />\r
-                                                       </Files> <!-- Relative to location of bkw.pl. -->\r
-                                               </CopyList>\r
-                               </Zip>\r
-                               <Zip name="SDK" filename="%filestem%-sdk.zip" topdir="%filestem%-final">\r
-                                       <CopyList>\r
-                                               <Files>\r
-                                                       <Include path="sdkfiles.xml" />\r
-                                                       </Files> <!-- Relative to location of bkw.pl. -->\r
-                                               </CopyList>\r
-                               </Zip>\r
-                               <Zip name="SRC" filename="%filestem%-src.zip" topdir="%filestem%-final">\r
-                                       <CopyList>\r
-                                               <Files>\r
-                                                       <!-- File from  paths are relative to <src>/pismere.    -->\r
-                                                       <!-- File to                    paths are relative to <out>.                                    -->\r
-                                                       <File dummy="foo" /> <!-- Forces XML::Simple behavior -->\r
-                                                       <!-- Without this, XML::Simple does not make an anonymous array and I can't figure out how to iterate over it. -->\r
-                                                       <File name="*.*" from="athena" to="src\athena" />\r
-                                                       <File name="*.*" from="doc" to="src\doc" />\r
-                                                       <File name="*.*" from="scripts" to="src\scripts" />\r
-                                                       </Files>\r
-                                       </CopyList>\r
-                                       <Prunes> <!-- Files to be removed from current build to match what is in the 3.1 distribution:  -->\r
-                                               <Prune dummy="foo" />\r
-                                               <Prune name="CVS" />\r
-                                               <Prune name=".cvsignore" flags="i" />\r
-                                               <Prune name="Changelog" flags="i" />\r
-                                               <Prune name="obj" />\r
-                                               <Prune name="site" />\r
-                                               </Prunes>\r
-                                       <Requires>\r
-                                               <Switch dummy="foo" />\r
-                                               <Switch name="REPOSITORY" value="CHECKOUT"/>\r
-                                               <ErrorMsg text="Can't build source zip unless /REPOSITORY CHECKOUT is specified." />\r
-                                               </Requires>\r
-                                       </Zip>\r
-                               </Zips>                 \r
-                       <CopyList>                      <!-- Copied at end of post-package step.        -->\r
-                               <Files>\r
-                                       <File dummy="foo" />\r
-                                       <!-- File from  paths are relative to <src>/pismere.    -->\r
-                                       <!-- File to                    paths are relative to <out>.                                    -->\r
-                                       <File name="msi-deployment-guide.txt" from="staging\install\wix\" to="" />\r
-                                       <File name="netidmgr_userdoc.pdf" from="staging\doc" to="." />\r
-                                       <File name="kfw.msi" from="staging\install\wix\" to="" newname="%filestem%.msi" />\r
-                                       <File name="MITKerberosForWindows%-DEBUG%.exe" from="staging\install\nsis" to="" newname="%filestem%%-DEBUG%.exe" />\r
-                                       </Files>\r
-                               </CopyList>\r
-                       </PostPackage>\r
-       </Stages>\r
+    <CommandLine>\r
+        <!-- The most changeable parameters can be specified on the command line.    -->\r
+        <Tags>\r
+            <cvs value="" />\r
+            <svn value=""/>\r
+            </Tags>\r
+        <Directories>\r
+            <!--    Sources will be checked out of repositories into <src>.  The structure\r
+                    of the repositories will cause pismere/athena to be created under <src>.    -->\r
+            <src        path    ="C:\projects\Autobuild" />\r
+            <out        path    ="public" /> <!-- Relative to src. -->\r
+            <unixfind   path    ="c:\cygwin\bin" />\r
+            </Directories>\r
+        <Options>\r
+            <debug      value="0" />\r
+            <logfile    value="1" path="bkw.pl.log" />\r
+            <repository value="skip" />\r
+            <clean      value="0" />\r
+            <nomake     value="0" />\r
+            <nopackage  value="0" />\r
+            <sign       value="0" timestampserver="" />\r
+            <verbose    value="0" />\r
+            <vverbose   value="0" />\r
+            </Options>\r
+        </CommandLine>\r
+    <Stages>\r
+        <FetchSources>\r
+            <Config>\r
+                <CVSROOT    name=":kserver:cvs.mit.edu:/cvs/pismere" />\r
+                <SVNURL     name="svn.mit.edu" />   <!-- NB:  No protocol or slashes!! -->\r
+                <USERNAME   name="" />              <!-- Needed for svn/plink.  Override from command line -->\r
+                </Config>\r
+        </FetchSources>\r
+        <Make>\r
+            <Prunes> <!-- Files to be removed from current build to match what is in the 3.1 distribution:    -->\r
+                <Prune dummy="foo" />       <!-- Force XML::Simple behavior -->\r
+                <Prune name="afsauth" />\r
+                <Prune name="aklog" />\r
+                <Prune name="vs" />\r
+                </Prunes>\r
+            </Make>\r
+        <PrePackage>\r
+            <CopyList>\r
+                <Config>\r
+                    <!--    Debug and Release build results go in different places.\r
+                            The otherwise identical paths differ in one section.  For example:\r
+                            .../target/bin/i386/bin/rel/filename and .../target/bin/i386/dbg/filename.\r
+                            Here we define the two differing sections:    -->\r
+                    <DebugArea value="dbg" />\r
+                    <ReleaseArea value="rel" />\r
+                    <!--    Paths in the file list that include <AlwaysTag> will always have the tag replaced \r
+                            with <DebugArea> or <ReleaseArea>, depending on the type of build.\r
+                            Paths that include <DebugTag> (or <ReleaseTag>) will only have the tag substituted \r
+                            and be copied when doing a debug (or release) build.  Examples:\r
+                            Will always be copied, from a build-dependent directory:\r
+                            <File name="kfwlogon.dll"                 from="..\target\bin\i386\%bldtype%\" to="\bin\i386" /> \r
+                            Will only be copied in debug build:\r
+                            <File name="netidmgr.exe.static.manifest" from="..\target\bin\i386\%debug%\"   to="\bin\i386" notrequired="true" />\r
+                            Will always be copied, from a build-independent directory:\r
+                            <File name="des.h"                        from="auth\krb4\include\"            to="\inc\krb4" newname="foo.h"/>\r
+                            -->\r
+                    <AlwaysTag  value="%bldtype%" />    <!-- Pick a string that won't appear in a path. -->\r
+                    <DebugTag   value="%debug%" />      <!-- Pick a string that won't appear in a path. -->\r
+                    <ReleaseTag value="%release%" />    <!-- Pick a string that won't appear in a path. -->\r
+                    </Config>\r
+                <Files>\r
+                    <Include path="copyfiles.xml" />\r
+                    </Files> <!-- Relative to location of bkw.pl. -->\r
+            </CopyList>\r
+        </PrePackage>\r
+        <Package>\r
+            <Config>\r
+                <Paths>    \r
+                    <Versions path="pismere/athena/include/kerberos.ver" /> <!-- Relative to <src>. -->\r
+                    </Paths>\r
+                </Config>\r
+            <MSI></MSI>\r
+            <NSIS></NSIS> <!-- NB:  Most config is done in site-local.nsi.  -->\r
+        </Package>\r
+        <PostPackage>\r
+            <Config>    <!-- This config info will be copied into each CopyList in PostPackage. -->\r
+                <FileStem name="kfw-%VERSION_MAJOR%-%VERSION_MINOR%-%VERSION_PATCH%" /> <!-- <FileStem> will be substituted for %filestem%. -->\r
+                <Signing>\r
+                    <CommandTemplate    value="signtool sign /a /d &quot;MIT Kerberos for Windows&quot; /du &quot;http://web.mit.edu/kerberos&quot; /t TIMESTAMPSERVERGOESHERE %filename%" />\r
+                    <FilePatterns       value="*.exe *.dll *.cpl *.msi" />\r
+                    </Signing>\r
+                </Config>\r
+            <Zips>\r
+                <Zip dummy="foo" /> <!-- To force desired XML::Simple behavior    -->\r
+                <!--    Files will be copied into directory <topdir>; <topdir> will appear in the paths of the files.    -->\r
+                <!-- File from  paths are relative to <src>/pismere.    -->\r
+                <!-- File to    paths are relative to <out>.            -->\r
+                <Zip name="Core Binaries" filename="%filestem%.zip" topdir="%filestem%-final">\r
+                    <CopyList>\r
+                        <Config>\r
+                            <DebugArea   value="dbg" />\r
+                            <ReleaseArea value="rel" />\r
+                            <AlwaysTag   value="%bldtype%" /> <!-- Pick a string that won't appear in a path. -->\r
+                            <DebugTag    value="%debug%" />   <!-- Pick a string that won't appear in a path. -->\r
+                            <ReleaseTag  value="%release%" /> <!-- Pick a string that won't appear in a path. -->\r
+                            </Config>\r
+                        <Files>\r
+                            <Include path="corebinaryfiles.xml" />  <!-- Includeed file is relative to location of bkw.pl. -->\r
+                            </Files> \r
+                        </CopyList>\r
+                </Zip>\r
+                <Zip name="SDK" filename="%filestem%-sdk.zip" topdir="%filestem%-final">\r
+                    <CopyList>\r
+                        <Files>\r
+                            <Include path="sdkfiles.xml" />         <!-- Included file is relative to location of bkw.pl. -->\r
+                            </Files>\r
+                        </CopyList>\r
+                    <Prunes> \r
+                        <Prune dummy="foo" />\r
+                        <Prune name="MIT*.exe" />   <!-- MITKerberosForWindows.exe was copied to a new name in sdkfiles.xml. -->\r
+                        </Prunes>\r
+                </Zip>\r
+                <Zip name="SRC" filename="%filestem%-src.zip" topdir="%filestem%-final">\r
+                    <CopyList>\r
+                        <Files>\r
+                            <!-- File from    paths are relative to <src>/pismere.  -->\r
+                            <!-- File to      paths are relative to <out>.          -->\r
+                            <File dummy="foo" /> <!-- Forces XML::Simple behavior   -->\r
+                            <!-- Without this, XML::Simple does not make an anonymous array and I can't figure out how to iterate over it. -->\r
+                            <File name="*.*" from="athena"  to="src\athena" />\r
+                            <File name="*.*" from="doc"     to="src\doc" />\r
+                            <File name="*.*" from="scripts" to="src\scripts" />\r
+                            </Files>\r
+                    </CopyList>\r
+                    <Prunes> <!-- Files to be removed from current build to match what is in the 3.1 distribution:    -->\r
+                        <Prune dummy="foo" />\r
+                        <Prune name="CVS" />\r
+                        <Prune name=".cvsignore" flags="i" />\r
+                        <Prune name="Changelog" flags="i" />\r
+                        <Prune name="obj" />\r
+                        <Prune name="site" />\r
+                        </Prunes>\r
+                    <Requires>\r
+                        <Switch dummy="foo" />\r
+                        <Switch name="REPOSITORY" value="CHECKOUT"/>\r
+                        <ErrorMsg text="Can't build source zip unless /REPOSITORY CHECKOUT is specified." />\r
+                        </Requires>\r
+                    </Zip>\r
+                </Zips>            \r
+            <CopyList>            <!-- Copied at end of post-package step.    -->\r
+                <Files>\r
+                    <File dummy="foo" />\r
+                    <!-- File from    paths are relative to <src>/pismere.    -->\r
+                    <!-- File to      paths are relative to <out>.            -->\r
+                    <File name="msi-deployment-guide.txt" from="staging\install\wix\" to="" />\r
+                    <File name="netidmgr_userdoc.pdf" from="staging\doc" to="." />\r
+                    <File name="kfw.msi" from="staging\install\wix\" to="" newname="%filestem%.msi" />\r
+                    <File name="MITKerberosForWindows%-DEBUG%.exe" from="staging\install\nsis" to="" newname="%filestem%%-DEBUG%.exe" />\r
+                    </Files>\r
+                </CopyList>\r
+            </PostPackage>\r
+    </Stages>\r
 </BKW_Config>
\ No newline at end of file
index 69b523c5d86387f83d301be48f60a2f4f765cf25..ca8b3f82593ceec60bbad16d16f969bdc7304e35 100644 (file)
@@ -12,6 +12,8 @@ use Data::Dumper;
 use Archive::Zip;\r
 use Logger;\r
 require "copyfiles.pl";\r
+require "signfiles.pl";\r
+require "makeZip.pl";\r
 \r
 my $BAIL;\r
 $0 = fileparse($0);\r
@@ -19,15 +21,14 @@ my $OPT = {foo => 'bar'};
 my $MAKE = 'NMAKE';\r
 our $config;\r
 \r
-sub get_info\r
-    {\r
-       my $cmd = shift || die;\r
-       my $which = $^X.' which.pl';\r
-       my $full = `$which $cmd`;\r
-       return 0 if ($? / 256);\r
-       chomp($full);\r
-       $full = "\"".$full."\"";\r
-       return { cmd => $cmd, full => $full};\r
+sub get_info {\r
+    my $cmd = shift || die;\r
+    my $which = $^X.' which.pl';\r
+    my $full = `$which $cmd`;\r
+    return 0 if ($? / 256);\r
+    chomp($full);\r
+    $full = "\"".$full."\"";\r
+    return { cmd => $cmd, full => $full};\r
     }\r
 \r
 sub usage {\r
@@ -37,32 +38,34 @@ Usage: $0 (-f --config) config-file [options] NMAKE-options
   Options are case insensitive.\r
 \r
   Options:\r
-    /help /?        usage information (what you now see).\r
+    /help /?           usage information (what you now see).\r
     /config /c path    Path to config file.\r
     /srcdir /r dir     Source directory to use.  Should contain \r
-                    pismere/athena.  If cvstag or svntag is null, \r
-                    the directory should be prepopulated.\r
+                       pismere/athena.  If cvstag or svntag is null, \r
+                       the directory should be prepopulated.\r
     /outdir /o dir     Directory to be created where build results will go\r
     /repository checkout | co \\  What repository action to take.\r
-               update   | up  ) Options are to checkout, update or \r
-               skip          /  take no action [skip].\r
+                update   | up  ) Options are to checkout, update or \r
+                skip          /  take no action [skip].\r
     /username /u name  username used to access svn if checking out.\r
     /cvstag /c tag   \\ If non-empty, the tag is appended to cvs and svn\r
     /svntag /s tag   / commands to select the rev to fetch.\r
     /debug /d          Do debug make instead of release make.\r
-    /nomake         Skip make step.\r
-    /clean          Build clean target.\r
-    /nopackage      Skip packaging step.\r
+    /nomake            Skip make step.\r
+    /clean             Build clean target.\r
+    /nopackage         Skip packaging step.\r
+    /sign              Sign files\r
+    /nosign            Don't sign files\r
     /verbose /v        Debug mode - verbose output.\r
     /logfile /l path   Where to write output.  Default is bkw.pl.log\r
-    /nolog     Don't save output\r
+    /nolog             Don't save output\r
   Other:\r
-    NMAKE-options    any options you want to pass to NMAKE, which can be:\r
-                     (note: /nologo is always used)\r
+    NMAKE-options      any options you want to pass to NMAKE, which can be:\r
+                       (note: /nologo is always used)\r
 \r
 USAGE\r
     system("$MAKE /?");\r
-       }\r
+    }\r
 \r
 sub handler {\r
     my $sig = shift;\r
@@ -78,70 +81,72 @@ EOH
 \r
 sub main {\r
     Getopt::Long::Configure('no_bundling', 'no_auto_abbrev',\r
-                           'no_getopt_compat', 'require_order',\r
-                           'ignore_case', 'pass_through',\r
-                           'prefix_pattern=(--|-|\+|\/)',\r
-                          );\r
+           'no_getopt_compat', 'require_order',\r
+           'ignore_case', 'pass_through',\r
+           'prefix_pattern=(--|-|\+|\/)',\r
+           );\r
     GetOptions($OPT,\r
-              'help|h|?',\r
-              'cvstag|c:s',\r
-              'svntag|s:s',\r
-              'srcdir|r:s',\r
-              'outdir|o:s',\r
-              'debug|d',\r
-              'config|f:s',\r
-              'logfile|l:s',\r
-              'nolog',\r
-              'repository:s',\r
-              'username|u:s',\r
-              'verbose|v',\r
-              'vverbose|vv',\r
-              'nomake',\r
-              'clean',\r
-              'nopackage',\r
-              );\r
+           'help|h|?',\r
+           'cvstag|c:s',\r
+           'svntag|s:s',\r
+           'srcdir|r:s',\r
+           'outdir|o:s',\r
+           'debug|d',\r
+           'config|f:s',\r
+           'logfile|l:s',\r
+           'nolog',\r
+           'repository:s',\r
+           'username|u:s',\r
+           'verbose|v',\r
+           'vverbose|vv',\r
+           'nomake',\r
+           'clean',\r
+           'nopackage',\r
+           'sign',\r
+           'nosign',\r
+           );\r
 \r
     if ( $OPT->{help} ) {\r
-               usage();\r
-               exit(0);\r
-               }\r
-               \r
+        usage();\r
+        exit(0);\r
+        }\r
+        \r
 ##++ Validate required conditions:\r
 \r
     if ($OPT->{config}) {}\r
     else {\r
-      print "Fatal -- Configuration file must be specified.\n";\r
-      usage();\r
-      exit(0);\r
-      }\r
+        print "Fatal -- Configuration file must be specified.\n";\r
+        usage();\r
+        exit(0);\r
+        }\r
 \r
     # List of programs which must be in PATH:\r
     my @required_list = ('sed', 'awk', 'which', 'cat', 'rm', 'cvs', 'svn', 'doxygen', 'hhc', 'candle', 'light', 'makensis', 'nmake', 'plink');\r
     my $requirements_met = 1;\r
     my $first_missing = 0;\r
     my $error_list = "";\r
-       foreach my $required (@required_list) {\r
+    foreach my $required (@required_list) {\r
         if (!get_info($required)) {\r
-                       $requirements_met = 0;\r
-                       if (!$first_missing) {\r
-                               $first_missing = 1;\r
-                               $error_list = "Fatal -- Environment problem!  The following program(s) are not in PATH:\n";\r
-                               }\r
-                       $error_list .= "$required\n";\r
-                       }\r
-               }\r
-       if (!$requirements_met) {\r
-               print $error_list;\r
-               print "Info -- Update PATH or install the programs and try again.\n";\r
-               exit(0);\r
-               }\r
+            $requirements_met = 0;\r
+            if (!$first_missing) {\r
+                $first_missing = 1;\r
+                $error_list = "Fatal -- Environment problem!  The following program(s) are not in PATH:\n";\r
+                }\r
+            $error_list .= "$required\n";\r
+            }\r
+        }\r
+    if (!$requirements_met) {\r
+        print $error_list;\r
+        print "Info -- Update PATH or install the programs and try again.\n";\r
+        exit(0);\r
+        }\r
 \r
 ##-- Validate required conditions.\r
-       \r
+    \r
     use Time::gmtime;\r
     $ENV{DATE} = gmctime()." GMT";\r
-       our $originalDir = `cd`;\r
-       $originalDir =~ s/\n//g;\r
+    our $originalDir = `cd`;\r
+    $originalDir =~ s/\n//g;\r
 \r
 ##++ Assemble configuration from config file and command line:\r
 \r
@@ -151,498 +156,432 @@ sub main {
     print "Info -- Reading configuration from $configfile.\n";\r
 \r
     # Get configuration file:\r
-       my $xml = new XML::Simple();\r
-       $config = $xml->XMLin($configfile);\r
+    my $xml = new XML::Simple();\r
+    $config = $xml->XMLin($configfile);\r
 \r
-       # Set up convenience variables:\r
-       my (@switches, @paths, @tags, @fetch);\r
-       @switches               = $config->{CommandLine}->{Options};\r
-       @paths                  = $config->{CommandLine}->{Directories};\r
-       @tags                           = $config->{CommandLine}->{Tags};\r
-       @fetch                  = $config->{Stages}->{FetchSources}->{Config};\r
+    # Set up convenience variables:\r
+    my (@switches, @paths, @tags, @fetch);\r
+    @switches   = $config->{CommandLine}->{Options};\r
+    @paths      = $config->{CommandLine}->{Directories};\r
+    @tags       = $config->{CommandLine}->{Tags};\r
+    @fetch      = $config->{Stages}->{FetchSources}->{Config};\r
 \r
     # Update the configuration with overrides from the command line:\r
-       $tags[0]->{cvs}->{value} = $OPT->{cvstag}                                                               if exists $OPT->{cvstag};\r
-       $tags[0]->{svn}->{value} = $OPT->{svnurl}                                                               if exists $OPT->{svnurl};\r
-       $paths[0]->{src}->{path} = $OPT->{srcdir}                                                               if exists $OPT->{srcdir};\r
-    $paths[0]->{out}->{path} = $OPT->{outdir}                                                  if exists $OPT->{outdir};\r
-    $switches[0]->{debug}->{value} = $OPT->{debug}                             if exists $OPT->{debug};\r
-    $switches[0]->{clean}->{value} = 1                                                                                 if exists $OPT->{clean};\r
-    $switches[0]->{repository}->{value} = $OPT->{repository}   if exists $OPT->{repository};\r
-    $fetch[0]->{USERNAME}->{name} = $OPT->{username}   if exists $OPT->{username};\r
-    $switches[0]->{nomake}->{value} = 1                                                                                if exists $OPT->{nomake};\r
-    $switches[0]->{nopackage}->{value} = 1                                                                     if exists $OPT->{nopackage};\r
-    $switches[0]->{verbose}->{value} = $OPT->{verbose}                 if exists $OPT->{verbose};\r
-    $switches[0]->{vverbose}->{value} = $OPT->{verbose}                if exists $OPT->{vverbose};\r
-       if (exists $OPT->{logfile}) {\r
-               $switches[0]->{logfile}->{path} = $OPT->{logfile};\r
-               $switches[0]->{logfile}->{value} = 1;\r
-               }\r
-       if (exists $OPT->{nolog}) {\r
-               $switches[0]->{logfile}->{value} = 0;\r
-               }\r
-    our $verbose               = $config->{CommandLine}->{Options}->{verbose}->{value};\r
-    our $vverbose              = $config->{CommandLine}->{Options}->{vverbose}->{value};\r
-    our $clean                         = $switches[0]->{clean}->{value};\r
-       my $src                                 = $paths[0]->{src}->{path};\r
-\r
-       if ($clean && !$switches[0]->{nopackage}->{value}) {\r
-               print "Info -- /clean forces /nopackage.\n";\r
-               $switches[0]->{nopackage}->{value} = 1;\r
-               }\r
+    $tags[0]->{cvs}->{value} = $OPT->{cvstag}                   if exists $OPT->{cvstag};\r
+    $tags[0]->{svn}->{value} = $OPT->{svnurl}                   if exists $OPT->{svnurl};\r
+    $paths[0]->{src}->{path} = $OPT->{srcdir}                   if exists $OPT->{srcdir};\r
+    $paths[0]->{out}->{path} = $OPT->{outdir}                   if exists $OPT->{outdir};\r
+    $switches[0]->{debug}->{value} = $OPT->{debug}              if exists $OPT->{debug};\r
+    $switches[0]->{clean}->{value} = 1                          if exists $OPT->{clean};\r
+    $switches[0]->{repository}->{value} = $OPT->{repository}    if exists $OPT->{repository};\r
+    $fetch[0]->{USERNAME}->{name} = $OPT->{username}            if exists $OPT->{username};\r
+    $switches[0]->{nomake}->{value} = 1                         if exists $OPT->{nomake};\r
+    $switches[0]->{nopackage}->{value} = 1                      if exists $OPT->{nopackage};\r
+    $switches[0]->{verbose}->{value} = $OPT->{verbose}          if exists $OPT->{verbose};\r
+    $switches[0]->{vverbose}->{value} = $OPT->{verbose}         if exists $OPT->{vverbose};\r
+    if (exists $OPT->{logfile}) {\r
+        $switches[0]->{logfile}->{path} = $OPT->{logfile};\r
+        $switches[0]->{logfile}->{value} = 1;\r
+        }\r
+    if (exists $OPT->{nolog}) {\r
+        $switches[0]->{logfile}->{value} = 0;\r
+        }\r
+    if (exists $OPT->{sign}) {\r
+        $switches[0]->{sign}->{timestampserver} = $OPT->{sign};\r
+        $switches[0]->{sign}->{value} = 1;\r
+        }\r
+    if (exists $OPT->{nosign}) {\r
+        $switches[0]->{sign}->{value} = 0;\r
+        }\r
+    our $verbose    = $config->{CommandLine}->{Options}->{verbose}->{value};\r
+    our $vverbose   = $config->{CommandLine}->{Options}->{vverbose}->{value};\r
+    our $clean      = $switches[0]->{clean}->{value};\r
+    local $src      = $paths[0]->{src}->{path};\r
+    local $toPath   = $paths[0]->{out}->{path};\r
+\r
+    if ($clean && !$switches[0]->{nopackage}->{value}) {\r
+        print "Info -- /clean forces /nopackage.\n";\r
+        $switches[0]->{nopackage}->{value} = 1;\r
+        }\r
 \r
     if ($vverbose) {print "Debug -- Config: ".Dumper($config);}\r
     \r
-       # Examples of use:\r
-       #print "Logfile path: $switches[0]->{log}->{path}\n";\r
-       #print "src path: $paths[0]->{src}->{path}\n";\r
-       #print "cvs tag: $tags[0]->{cvs}->{value}\n";\r
-       #print "CVSROOT:   $fetch[0]->{CVSROOT}->{name}\n";\r
+    # Examples of use:\r
+    #print "Logfile path: $switches[0]->{log}->{path}\n";\r
+    #print "src path: $paths[0]->{src}->{path}\n";\r
+    #print "cvs tag: $tags[0]->{cvs}->{value}\n";\r
+    #print "CVSROOT:   $fetch[0]->{CVSROOT}->{name}\n";\r
 \r
 ##-- Assemble configuration from config file and command line.\r
 \r
-       my $sw = $switches[0]->{repository}->{value};\r
-       my $rverb;\r
-       if              ($sw =~ /skip/i)                        {$rverb = "skip";}\r
-       elsif   ($sw =~ /update/i)              {$rverb = "update";}\r
-       elsif   ($sw =~ /up/i)                          {$rverb = "update";}\r
-       elsif   ($sw =~ /checkout/i)    {$rverb = "checkout";}\r
-       elsif   ($sw =~ /co/i)                          {$rverb = "checkout";}\r
-       else {\r
-                       print "Fatal -- invalid /repository value.\n";\r
-                       usage();\r
-                       die;\r
-                       }\r
-\r
-       my $wd  = $src."\\pismere";\r
-\r
-       if (! ($rverb =~ /skip/)) {\r
-               local $len = 0;\r
-               if (exists $fetch[0]->{USERNAME}->{name}) {\r
-                       $len = length $fetch[0]->{USERNAME}->{name};\r
-                       }\r
-           if ($len < 1) {\r
-                       die "Fatal -- you won't get far accessing the repository without specifying a username.";\r
-                       }\r
-               }\r
-\r
-       if ( ($rverb =~ /checkout/) && (-d $wd) ){\r
-               print "\n\nHEADS UP!!\n\n";\r
-               print "/REPOSITORY CHECKOUT will cause everything under $wd to be deleted.\n";\r
-               print "If this is not what you intended, here's your chance to bail out!\n\n\n";\r
-               print "Are you sure you want to remove everything under $wd? ";\r
-               my $char = getc;\r
-               if (! ($char =~ /y/i)) {die "Info -- operation aborted by user."}\r
-               !system("rm -rf $wd/*")                                         or die "Fatal -- Couldn't clean $wd.";\r
-               !system("rmdir $wd")                                                    or die "Fatal -- Couldn't remove $wd.";\r
-#              !system("attrib -h -r $wd\\* /s /d")    or die "Fatal -- Couldn't clear read-only attributes.";\r
-#              !system("del /s /q $wd\\*.*")                           or die "Fatal -- Couldn't clean files from $wd."; \r
-#              !system("rm -rf $wd\\*.*")                                      or die "Fatal -- Couldn't clean directories from $wd.";\r
-               }\r
+    my $sw = $switches[0]->{repository}->{value};\r
+    my $rverb;\r
+    if       ($sw =~ /skip/i)       {$rverb = "skip";}\r
+    elsif    ($sw =~ /update/i)     {$rverb = "update";}\r
+    elsif    ($sw =~ /up/i)         {$rverb = "update";}\r
+    elsif    ($sw =~ /checkout/i)   {$rverb = "checkout";}\r
+    elsif    ($sw =~ /co/i)         {$rverb = "checkout";}\r
+    else {\r
+        print "Fatal -- invalid /repository value.\n";\r
+        usage();\r
+        die;\r
+        }\r
+    $switches[0]->{repository}->{value} = $rverb;   ## Save canonicalized repository verb.\r
+\r
+    my $wd  = $src."\\pismere";\r
+\r
+    if (! ($rverb =~ /skip/)) {\r
+        local $len = 0;\r
+        if (exists $fetch[0]->{USERNAME}->{name}) {\r
+            $len = length $fetch[0]->{USERNAME}->{name};\r
+            }\r
+        if ($len < 1) {\r
+            die "Fatal -- you won't get far accessing the repository without specifying a username.";\r
+            }\r
+        }\r
+\r
+    if ( ($rverb =~ /checkout/) && (-d $wd) ){\r
+        print "\n\nHEADS UP!!\n\n";\r
+        print "/REPOSITORY CHECKOUT will cause everything under $wd to be deleted.\n";\r
+        print "If this is not what you intended, here's your chance to bail out!\n\n\n";\r
+        print "Are you sure you want to remove everything under $wd? ";\r
+        my $char = getc;\r
+        if (! ($char =~ /y/i))  {die "Info -- operation aborted by user."}\r
+        !system("rm -rf $wd/*") or die "Fatal -- Couldn't clean $wd.";\r
+        !system("rmdir $wd")    or die "Fatal -- Couldn't remove $wd.";\r
+        }\r
 \r
 # Begin logging:\r
     my $l;\r
     if ($switches[0]->{logfile}->{value}) {\r
-               print "Info -- logging to $switches[0]->{logfile}->{path}.\n";\r
-               $l = new Logger $switches[0]->{logfile}->{path};\r
-               $l->start;\r
-               $l->no_die_handler;             ## Needed so XML::Simple won't throw exceptions.\r
-               }\r
+        print "Info -- logging to $switches[0]->{logfile}->{path}.\n";\r
+        $l = new Logger $switches[0]->{logfile}->{path};\r
+        $l->start;\r
+        $l->no_die_handler;        ## Needed so XML::Simple won't throw exceptions.\r
+        }\r
 \r
 ##++ Begin repository action:\r
-       if ($rverb =~ /skip/) {print "Info -- *** Skipping repository access.\n"        if ($verbose);}\r
-       else {\r
-               if ($verbose) {print "Info -- *** Begin fetching sources.\n";}\r
-               if (! -d $wd) {                                         ## xcopy will create the entire path for us.\r
-                       !system("echo foo > a.tmp")                                                                                     or die "Fatal -- Couldn't create temporary file in ".`cd`;\r
-                       !system("echo F | xcopy a.tmp $wd\\CVS\\a.tmp") or die "Fatal -- Couldn't xcopy to $wd.";\r
-                       !system("rm a.tmp")                                                                                                             or die "Fatal -- Couldn't remove temporary file.";\r
-                       !system("rm $wd\\CVS\\a.tmp")                                                                   or die "Fatal -- Couldn't remove temporary file.";\r
-                       }\r
-               \r
-               # Set up cvs environment variables:\r
-               $ENV{CVSROOT} = $fetch[0]->{CVSROOT}->{name};\r
-               chdir($src)                                                                                     or die "Fatal -- couldn't chdir to $src\n";\r
-               print "Info -- chdir to ".`cd`."\n"                             if ($verbose);\r
-               my $krb5dir     = $wd."\\athena\\auth\\krb5";\r
-\r
-               my $cvscmdroot  = "cvs $rverb";\r
-               my $cvscmd                      = $cvscmdroot;\r
-               if ($rverb =~ /checkout/) {             \r
-                       my @cvsmodules  = (     \r
-                               'krb',  \r
-                               'pismere/athena/util/lib/delaydlls', \r
-                               'pismere/athena/util/lib/getopt', \r
-                               'pismere/athena/util/guiwrap'\r
-                               );\r
-\r
-                       foreach my $module (@cvsmodules) {\r
-                               $cvscmd = $cvscmdroot." ".$module;\r
-                               $cvscmd .= " ".$tags[0]->{cvs}->{value} if ($tags[0]->{cvs}->{value});\r
-                               if ($verbose) {print "Info -- cvs command: $cvscmd\n";}\r
-                               !system($cvscmd)                                                                or die "Fatal -- command \"$cvscmd\" failed; return code $?\n";\r
-                               }\r
-                       }\r
-               else {                          ## Update.\r
-                       $cvscmd = $cvscmdroot;\r
-                       $cvscmd .= " ".$tags[0]->{cvs}->{value} if ($tags[0]->{cvs}->{value});\r
-                       if ($verbose) {print "Info -- cvs command: $cvscmd\n";}\r
-                       !system($cvscmd)                                                                        or die "Fatal -- command \"$cvscmd\" failed; return code $?\n";\r
-                       }\r
-                                       \r
-               # Set up svn environment variable:\r
-               $ENV{SVN_SSH} = "plink.exe";\r
-               # If  the directory structure doesn't exist, many cd commands will fail.\r
-               if (! -d $krb5dir) {mkdir($krb5dir)             or die "Fatal -- Couldn't  create $krb5dir";}\r
-               chdir($krb5dir)                                                                                 or die "Fatal -- Couldn't chdir to $krb5dir";\r
-               print "Info -- chdir to ".`cd`."\n"                     if ($verbose);\r
-               my $svncmd = "svn $rverb ";\r
-               if ($rverb =~ /checkout/) {             # Append the rest of the checkout command:\r
-                       chdir("..");\r
-                       $svncmd .= "svn+ssh://".$fetch[0]->{USERNAME}->{name}."@".$fetch[0]->{SVNURL}->{name}."/krb5/trunk krb5";\r
-                       }\r
-               if ($tags[0]->{svn}->{value}) {$svncmd .= " ".$tags[0]->{svn}->{value};}        # Add any specific tag\r
-               if ($verbose) {print "Info -- svn command: $svncmd\n";}\r
-               !system($svncmd)                        or die "Fatal -- command \"$svncmd\" failed; return code $?\n";\r
-\r
-               if ($verbose) {print "Info -- ***   End fetching sources.\n";}\r
-               }\r
+    if ($rverb =~ /skip/) {print "Info -- *** Skipping repository access.\n"    if ($verbose);}\r
+    else {\r
+        if ($verbose) {print "Info -- *** Begin fetching sources.\n";}\r
+        if (! -d $wd) {                        ## xcopy will create the entire path for us.\r
+            !system("echo foo > a.tmp")                     or die "Fatal -- Couldn't create temporary file in ".`cd`;\r
+            !system("echo F | xcopy a.tmp $wd\\CVS\\a.tmp") or die "Fatal -- Couldn't xcopy to $wd.";\r
+            !system("rm a.tmp")                             or die "Fatal -- Couldn't remove temporary file.";\r
+            !system("rm $wd\\CVS\\a.tmp")                   or die "Fatal -- Couldn't remove temporary file.";\r
+            }\r
+        \r
+        # Set up cvs environment variables:\r
+        $ENV{CVSROOT}   = $fetch[0]->{CVSROOT}->{name};\r
+        chdir($src)                                         or die "Fatal -- couldn't chdir to $src\n";\r
+        print "Info -- chdir to ".`cd`."\n"                 if ($verbose);\r
+        my $krb5dir     = "$wd\\athena\\auth\\krb5";\r
+\r
+        my $cvscmdroot  = "cvs $rverb";\r
+        my $cvscmd      = $cvscmdroot;\r
+        if ($rverb =~ /checkout/) {        \r
+            my @cvsmodules    = (    \r
+                'krb',  \r
+                'pismere/athena/util/lib/delaydlls', \r
+                'pismere/athena/util/lib/getopt', \r
+                'pismere/athena/util/guiwrap'\r
+                );\r
+\r
+            foreach my $module (@cvsmodules) {\r
+                $cvscmd = $cvscmdroot." ".$module;\r
+                $cvscmd .= " ".$tags[0]->{cvs}->{value} if ($tags[0]->{cvs}->{value});\r
+                if ($verbose) {print "Info -- cvs command: $cvscmd\n";}\r
+                !system($cvscmd)                        or die "Fatal -- command \"$cvscmd\" failed; return code $?\n";\r
+                }\r
+            }\r
+        else {                ## Update.\r
+            $cvscmd = $cvscmdroot;\r
+            $cvscmd .= " ".$tags[0]->{cvs}->{value}     if ($tags[0]->{cvs}->{value});\r
+            if ($verbose) {print "Info -- cvs command: $cvscmd\n";}\r
+            !system($cvscmd)                            or die "Fatal -- command \"$cvscmd\" failed; return code $?\n";\r
+            }\r
+                    \r
+        # Set up svn environment variable:\r
+        $ENV{SVN_SSH} = "plink.exe";\r
+        # If  the directory structure doesn't exist, many cd commands will fail.\r
+        if (! -d $krb5dir) {mkdir($krb5dir)             or die "Fatal -- Couldn't  create $krb5dir";}\r
+        chdir($krb5dir)                                 or die "Fatal -- Couldn't chdir to $krb5dir";\r
+        print "Info -- chdir to ".`cd`."\n"             if ($verbose);\r
+        my $svncmd = "svn $rverb ";\r
+        if ($rverb =~ /checkout/) {        # Append the rest of the checkout command:\r
+            chdir("..");\r
+            $svncmd .= "svn+ssh://".$fetch[0]->{USERNAME}->{name}."@".$fetch[0]->{SVNURL}->{name}."/krb5/trunk krb5";\r
+            }\r
+        if ($tags[0]->{svn}->{value}) {$svncmd .= " ".$tags[0]->{svn}->{value};}    # Add any specific tag\r
+        if ($verbose) {print "Info -- svn command: $svncmd\n";}\r
+        !system($svncmd)            or die "Fatal -- command \"$svncmd\" failed; return code $?\n";\r
+\r
+        if ($verbose) {print "Info -- ***   End fetching sources.\n";}\r
+        }\r
 ##-- End  repository action.\r
-               \r
+        \r
 ##++ Make action:\r
-       if (    (!$switches[0]->{nomake}->{value}) ) {\r
-               if ($verbose) {print "Info -- *** Begin preparing for build.\n";}\r
-\r
-               $wd = $paths[0]->{src}->{path};\r
-               chdir("$wd") or die "Fatal -- couldn't chdir to $wd\n";\r
-               print "Info -- chdir to ".`cd`."\n"                             if ($verbose);\r
-       \r
-               my ($path, $destpath);\r
-               \r
-               # Copy athena\scripts\site\graft\krb5\Makefile.src to athena\auth\krb5:\r
-               $path = "pismere\\scripts\\site\\graft\\krb5\\Makefile.src";\r
-               if (!-e  $path) {die "Fatal -- Expected file $wd\\$path not found.";}\r
-               $destpath = "pismere\\athena\\auth\\krb5\\Makefile.src";\r
-               !system("echo F | xcopy /D $wd\\$path $wd\\$destpath /Y > NUL") or die "Fatal -- Copy of $wd\\$path to $wd\\$destpath failed.";\r
-               print "Info -- copied $wd\\$path to $wd\\$destpath\n"           if ($verbose);;\r
-               \r
-               # Add DEBUG_SYMBOL to .../wshelper/Makefile.src:\r
-               $path = "pismere\\athena\\wshelper\\wshelper\\Makefile.src";\r
-               if (!-e  $path) {die "Fatal -- Expected file $wd\\$path not found.";}\r
-               if (system("grep DEBUG_SYMBOL $path > NUL") != 0) {\r
-                       !system ("echo DEBUG_SYMBOL=1 >> $wd\\$path") or die "Fatal -- Append line to file failed.\n";\r
-                       print "Info -- Added DEBUG_SYMBOL to $wd\\$path\n"      if ($verbose);\r
-                       }\r
-               \r
-               # Prune any unwanted directories before the build:\r
-               if (exists $config->{Stages}->{Make}->{Prunes}) {\r
-                       # Use Unix find instead of Windows find.  Save PATH so we can restore it when we're done:\r
-                       my $savedPATH   = $ENV{PATH};\r
-                       $ENV{PATH} = $config->{CommandLine}->{Directories}->{unixfind}->{path}.";".$savedPATH;\r
-                       my $prunes = $config->{Stages}->{Make}->{Prunes};\r
-                       my $j=0;\r
-                       print "Info -- Processing prunes in ".`cd`."\n" if ($verbose);\r
-                       while ($prunes->{Prune}->[$j]) {\r
-                               if (exists $prunes->{Prune}->[$j]->{name}) {                                            ## Don't process dummy entry!\r
-                                       my $prune       = $prunes->{Prune}->[$j]->{name};\r
-                                       my $flags       = $prunes->{Prune}->[$j]->{flags};\r
-                                       $flags = "" if (!$flags);\r
-                                       my $cmd = "find . -".$flags."name $prune";\r
-                                       print "Info -- Looking for filenames containing $prune\n";\r
-                                       my $list = `$cmd`;\r
-                                       foreach $target (split("\n", $list)) {\r
-                                               print "Info -- Pruning $target\n" if ($verbose);\r
-                                               ! system("rm -rf $target")                              or die "Unable to prune $target";\r
-                                               }\r
-                                       }\r
-                               $j++;\r
-                               }\r
-                       $ENV{PATH} = $savedPATH;\r
-                       }\r
-\r
-               if ($verbose) {print "Info -- ***   End preparing for build.\n";}\r
-       \r
-               my ($buildtarget, $buildtext);\r
-               if ($clean) {\r
-                       $buildtarget = "clean" ;\r
-                       $buildtext = " clean."\r
-                       }\r
-               else {\r
-                       $buildtarget = "" ;\r
-                       $buildtext = "."\r
-                       }\r
-               \r
-               chdir("pismere/athena") or die "Fatal -- couldn't chdir to source directory $wd\\pismere\\athena\n";\r
-               if ($verbose) {print "Info -- chdir to $wd\\pismere\\athena\n";}\r
-               my $dbgswitch = ($switches[0]->{debug}->{value}) ? " " : "NODEBUG=1";\r
-               !system("perl ../scripts/build.pl --softdirs --nolog $buildtarget $dbgswitch")  or die "Fatal -- build $buildtarget failed.";\r
-                       \r
-               chdir("$wd\\pismere") or die "Fatal -- couldn't chdir to $wd\\pismere.";\r
-               if ($clean) {\r
-                       if (-d "staging") {\r
-                               !system("rm -rf staging") or die "Fatal -- Couldn't remove pismere/staging.";\r
-                               }\r
-                       }\r
-       \r
-               if ($verbose) {print "Info -- ***   End build".$buildtext."\n";}\r
-               }                               ## End make conditional.\r
-       else {print "Info -- *** Skipping build.\n"     if ($verbose);}\r
+    if (    (!$switches[0]->{nomake}->{value}) ) {\r
+        if ($verbose) {print "Info -- *** Begin preparing for build.\n";}\r
+\r
+        chdir("$wd") or die "Fatal -- couldn't chdir to $wd\n";\r
+        print "Info -- chdir to ".`cd`."\n"             if ($verbose);\r
+    \r
+        my ($path, $destpath);\r
+        \r
+        # Copy athena\scripts\site\graft\krb5\Makefile.src to athena\auth\krb5:\r
+        $path = "scripts\\site\\graft\\krb5\\Makefile.src";\r
+        if (!-e  $path) {die "Fatal -- Expected file $wd\\$path not found.";}\r
+        $destpath = "athena\\auth\\krb5\\Makefile.src";\r
+        !system("echo F | xcopy /D $wd\\$path $wd\\$destpath /Y > NUL") or die "Fatal -- Copy of $wd\\$path to $wd\\$destpath failed.";\r
+        print "Info -- copied $wd\\$path to $wd\\$destpath\n"   if ($verbose);;\r
+        \r
+        # Add DEBUG_SYMBOL to .../wshelper/Makefile.src:\r
+        $path = "athena\\wshelper\\wshelper\\Makefile.src";\r
+        if (!-e  $path) {die "Fatal -- Expected file $wd\\$path not found.";}\r
+        if (system("grep DEBUG_SYMBOL $path > NUL") != 0) {\r
+            !system ("echo DEBUG_SYMBOL=1 >> $wd\\$path") or die "Fatal -- Append line to file failed.\n";\r
+            print "Info -- Added DEBUG_SYMBOL to $wd\\$path\n"  if ($verbose);\r
+            }\r
+        \r
+        # Prune any unwanted directories before the build:\r
+        if (exists $config->{Stages}->{Make}->{Prunes}) {\r
+            # Use Unix find instead of Windows find.  Save PATH so we can restore it when we're done:\r
+            my $savedPATH    = $ENV{PATH};\r
+            $ENV{PATH} = $config->{CommandLine}->{Directories}->{unixfind}->{path}.";".$savedPATH;\r
+            my $prunes = $config->{Stages}->{Make}->{Prunes};\r
+            my $j=0;\r
+            print "Info -- Processing prunes in ".`cd`."\n"     if ($verbose);\r
+            while ($prunes->{Prune}->[$j]) {\r
+                if (exists $prunes->{Prune}->[$j]->{name}) {    ## Don't process dummy entry!\r
+                    my $prune    = $prunes->{Prune}->[$j]->{name};\r
+                    my $flags    = $prunes->{Prune}->[$j]->{flags};\r
+                    $flags = "" if (!$flags);\r
+                    my $cmd    = "find . -".$flags."name $prune";\r
+                    print "Info -- Looking for filenames containing $prune\n";\r
+                    my $list = `$cmd`;\r
+                    foreach $target (split("\n", $list)) {\r
+                        print "Info -- Pruning $target\n" if ($verbose);\r
+                        ! system("rm -rf $target")              or die "Unable to prune $target";\r
+                        }\r
+                    }\r
+                $j++;\r
+                }\r
+            $ENV{PATH} = $savedPATH;\r
+            }\r
+\r
+        if ($verbose) {print "Info -- ***   End preparing for build.\n";}\r
+    \r
+        my ($buildtarget, $buildtext);\r
+        if ($clean) {\r
+            $buildtarget = "clean" ;\r
+            $buildtext   = " clean."\r
+            }\r
+        else {\r
+            $buildtarget = "" ;\r
+            $buildtext   = "."\r
+            }\r
+        \r
+        chdir("$wd\\athena") or die "Fatal -- couldn't chdir to source directory $wd\\athena\n";\r
+        print "Info -- chdir to ".`cd`."\n"         if ($verbose);\r
+        my $dbgswitch = ($switches[0]->{debug}->{value}) ? " " : "NODEBUG=1";\r
+        !system("perl ../scripts/build.pl --softdirs --nolog $buildtarget $dbgswitch")    or die "Fatal -- build $buildtarget failed.";\r
+            \r
+        chdir("$wd")               or die "Fatal -- couldn't chdir to $wd.";\r
+        if ($clean) {\r
+            if (-d "staging") {\r
+                !system("rm -rf staging")   or die "Fatal -- Couldn't remove $wd\\staging.";\r
+                }\r
+            }\r
+    \r
+        if ($verbose) {print "Info -- ***   End build".$buildtext."\n";}\r
+        }                                           ## End make conditional.\r
+    else {print "Info -- *** Skipping build.\n"    if ($verbose);}\r
 ##-- Make action.\r
-               \r
-       if (!$switches[0]->{nopackage}->{value}) {              ## If /clean, this switch will have been cleared.\r
-               if ($verbose) {print "Info -- *** Begin prepackage.\n";}\r
-\r
-               # We read in the version information to be able to update the site-local files in the install build areas:\r
-               local $version_path = $config->{Stages}->{Package}->{Config}->{Paths}->{Versions}->{path};\r
-               open(DAT, "$src/$version_path")         or die "Could not open $version_path.";\r
-               @raw = <DAT>;\r
-               close DAT;\r
-               foreach $line (@raw) {\r
-                       chomp $line;\r
-                       if ($line =~ /#define/) {                                       # Process #define lines:\r
-                               $line =~ s/#define//;                                   # Remove #define token\r
-                               $line =~ s/^\s+//;                                              #  and leading & trailing whitespace\r
-                               $line =~ s/\s+$//;\r
-                               local @qr = split("\"", $line);         # Try splitting with quotes\r
-                               if (exists $qr[1]) {\r
-                                       $qr[0] =~ s/^\s+//;                             #  Clean up whitespace\r
-                                       $qr[0] =~ s/\s+$//;\r
-                                       $config->{Versions}->{$qr[0]} = $qr[1];         # Save string\r
-                                       }\r
-                               else {                                                                                          # No quotes, so\r
-                                       local @ar = split(" ", $line);          #  split with space\r
-                                       $ar[0] =~ s/^\s+//;                             #  Clean up whitespace\r
-                                       $ar[0] =~ s/\s+$//;\r
-                                       $config->{Versions}->{$ar[0]} = $ar[1];                 # and  save numeric value\r
-                                       }\r
-                               }\r
-                       }\r
-\r
-               # Check that the versions we will need for site-local have been defined:\r
-           my @required_versions = ('VER_PROD_MAJOR', 'VER_PROD_MINOR', 'VER_PROD_REV', \r
-                                                                                                               'VER_PROD_MAJOR_STR', 'VER_PROD_MINOR_STR', 'VER_PROD_REV_STR', \r
-                                                                                                               'VER_PRODUCTNAME_STR');\r
-           my $requirements_met = 1;\r
-           my $first_missing = 0;\r
-           my $error_list = "";\r
-               foreach my $required (@required_versions) {\r
-               if (! exists $config->{Versions}->{$required}) {\r
-                               $requirements_met = 0;\r
-                               if (!$first_missing) {\r
-                                       $first_missing = 1;\r
-                                       $error_list = "Fatal -- The following version(s) are not defined in $src/$version_path.\n";\r
-                                       }\r
-                               $error_list .= "$required\n";\r
-                               }\r
-                       }\r
-               if (!$requirements_met) {\r
-                       print $error_list;\r
-                       exit(0);\r
-                       }\r
-               # Apply any of these tags to filestem:\r
-               my $filestem            = $config->{Stages}->{PostPackage}->{Config}->{FileStem}->{name};\r
-               $filestem                       =~ s/%VERSION_MAJOR%/$config->{Versions}->{'VER_PROD_MAJOR_STR'}/;\r
-               $filestem                       =~ s/%VERSION_MINOR%/$config->{Versions}->{'VER_PROD_MINOR_STR'}/;\r
-               $filestem                       =~ s/%VERSION_PATCH%/$config->{Versions}->{'VER_PROD_REV_STR'}/;\r
-               $config->{Stages}->{PostPackage}->{Config}->{FileStem}->{name}  = $filestem;\r
-               \r
-               # The build results are copied to a staging area, where the packager expects to find them.\r
-               #  We put the staging area in the fixed area .../pismere/staging.\r
-               my $prepackage  = $config->{Stages}->{PrePackage};\r
-               $wd = $paths[0]->{src}->{path}."\\pismere";\r
-               my $staging_area = "$wd\\staging";\r
-               chdir($wd) or die "Fatal -- couldn't chdir to $wd\n";\r
-               if ($verbose) {print "Info -- chdir to $wd\n";}\r
-               (-e $staging_area) or mkdir($staging_area);\r
-               \r
-               # Force Where From and To are relative to:\r
-               $prepackage->{CopyList}->{Config}->{From}->{root}               = "$src\\pismere\\athena";\r
-               $prepackage->{CopyList}->{Config}->{To}->{root}                 = "$src\\pismere\\staging";\r
-               copyFiles($prepackage->{CopyList}, $config);                            ## Copy any files [this step takes a while]\r
-\r
-               chdir("staging\\install\\wix") or die "Fatal -- Couldn't cd to $wd\\staging\\install\\wix";\r
-               # Correct errors in files.wxi:\r
-               !system("sed 's/WorkingDirectory=\"\\[dirbin\\]\"/WorkingDirectory=\"dirbin\"/g' files.wxi > a.tmp") or die "Fatal -- Couldn't modify files.wxi.";\r
-               !system("mv a.tmp files.wxi") or die "Fatal -- Couldn't update files.wxi.";\r
-                       \r
-               # Make sed script to run on the site-local configuration files:\r
-               local $tmpfile  = "site-local.sed" ;\r
-               system("del $tmpfile");\r
-               # Basic substitutions:\r
-               local $dblback_wd                       = $wd;\r
-               $dblback_wd                                             =~ s/\\/\\\\/g;\r
-               !system("echo s/%BUILDDIR%/$dblback_wd/ >> $tmpfile")                                                   or die "Fatal -- Couldn't modify $tmpfile.";    \r
-               local $dblback_staging  = "$wd\\staging";\r
-               $dblback_staging                                =~ s/\\/\\\\/g;\r
-               !system("echo s/%TARGETDIR%/$dblback_staging/ >> $tmpfile")                             or die "Fatal -- Couldn't modify $tmpfile.";    \r
-               local $dblback_sample   = "$wd\\staging\\sample";\r
-               $dblback_sample                         =~ s/\\/\\\\/g;\r
-               !system("echo s/%CONFIGDIR-WIX%/$dblback_sample/ >> $tmpfile")          or die "Fatal -- Couldn't modify $tmpfile.";    \r
-               !system("echo s/%CONFIGDIR-NSI%/$dblback_staging/ >> $tmpfile")         or die "Fatal -- Couldn't modify $tmpfile.";    \r
-               !system("echo s/%VERSION_MAJOR%/$config->{Versions}->{'VER_PROD_MAJOR_STR'}/ >> $tmpfile")              or die "Fatal -- Couldn't modify $tmpfile.";    \r
-               !system("echo s/%VERSION_MINOR%/$config->{Versions}->{'VER_PROD_MINOR_STR'}/ >> $tmpfile")              or die "Fatal -- Couldn't modify $tmpfile.";    \r
-               !system("echo s/%VERSION_PATCH%/$config->{Versions}->{'VER_PROD_REV_STR'}/ >> $tmpfile")                        or die "Fatal -- Couldn't modify $tmpfile.";    \r
-               # Strip out some defines so they can be replaced:  [used for site-local.nsi]\r
-               !system("echo /\^!define\.\*RELEASE\.\*\$/d >> $tmpfile")                                                       or die "Fatal -- Couldn't modify $tmpfile.";    \r
-               !system("echo /\^!define\.\*DEBUG\.\*\$/d >> $tmpfile")                                                 or die "Fatal -- Couldn't modify $tmpfile.";    \r
-               !system("echo /\^!define\.\*BETA\.\*\$/d >> $tmpfile")                                                          or die "Fatal -- Couldn't modify $tmpfile.";    \r
-\r
-               # Run the script on site-local.wxi:\r
-               !system("sed -f $tmpfile site-local-tagged.wxi > site-local.wxi")                                       or die "Fatal -- Couldn't modify site-local.wxi.";\r
-\r
-               # Now update site-local.nsi:\r
-               chdir "..\\nsis";\r
-               print "Info -- chdir to ".`cd`."\n"                                                                             if ($verbose);\r
-               local $tmpfile  = "site-local.sed" ;\r
-               !system("sed -f ..\\wix\\$tmpfile site-local-tagged.nsi > b.tmp")                               or die "Fatal -- Couldn't modify site-local.wxi.";\r
-               # Add DEBUG or RELEASE:\r
-               if ($switches[0]->{debug}->{value}) {                           ## debug build\r
-                       !system("echo !define DEBUG >> b.tmp")                                                                                                          or die "Fatal -- Couldn't modify b.tmp.";       \r
-                       }\r
-               else {                                                                                                                                          ## release build\r
-                       !system("echo !define RELEASE >> b.tmp")                                                                                                                or die "Fatal -- Couldn't modify b.tmp.";       \r
-                       !system("echo !define NO_DEBUG >> b.tmp")                                                                                               or die "Fatal -- Couldn't modify b.tmp.";       \r
-                       }\r
-               # Add BETA if present:\r
-               if ( exists $config->{Versions}->{'BETA_STR'}) {\r
-                       !system("echo !define BETA $config->{Versions}->{'BETA_STR'} >> b.tmp") or die "Fatal -- Couldn't modify b.tmp.";       \r
-                       }\r
-               !system("mv -f b.tmp site-local.nsi")                                                                                                                                   or die "Fatal -- Couldn't replace site-local.nsi.";\r
-\r
-               # Run the script on nsi-includes-tagged.nsi:\r
-               !system("sed -f ..\\wix\\$tmpfile nsi-includes-tagged.nsi > nsi-includes.nsi")          or die "Fatal -- Couldn't modify nsi-includes.nsi.";\r
-\r
-               if ($verbose) {print "Info -- ***   End prepackage.\n";}\r
-               \r
-               if ($verbose) {print "Info -- *** Begin package.\n";}\r
-               # Make the msi:\r
-               chdir("$wd\\staging\\install\\wix") or die "Fatal -- Couldn't cd to $wd\\staging\\install\\wix";\r
-               print "Info -- *** Make .msi:\n"                                                        if ($verbose);\r
-               !system("$MAKE")                                                                                                        or die "Error -- msi installer build failed.";\r
-                               \r
-               chdir("$wd\\staging\\install\\nsis") or die "Fatal -- Couldn't cd to $wd\\staging\\install\\nsis";\r
-               print "Info -- chdir to ".`cd`."\n"                                             if ($verbose);\r
-               print "Info -- *** Make NSIS:\n"                                                        if ($verbose);\r
-               !system("cl.exe killer.cpp advapi32.lib")                       or die "Error -- nsis killer.exe not built.";\r
-               !system("rename killer.exe Killer.exe")                         or die "Error -- Couldn't rename killer.exe";\r
-               !system("makensis kfw.nsi")                                                             or die "Error -- executable installer build failed.";\r
+        \r
+##++ Package action:\r
+    if ($switches[0]->{nopackage}->{value}) {      ## If /clean, this switch will have been cleared.\r
+        print "Info -- *** Skipping packaging.";\r
+        }\r
+    else {\r
+        if ($verbose) {print "Info -- *** Begin prepackage.\n";}\r
+\r
+        # We read in the version information to be able to update the site-local files in the install build areas:\r
+        local $version_path = $config->{Stages}->{Package}->{Config}->{Paths}->{Versions}->{path};\r
+        open(DAT, "$src/$version_path")     or die "Could not open $version_path.";\r
+        @raw = <DAT>;\r
+        close DAT;\r
+        foreach $line (@raw) {\r
+            chomp $line;\r
+            if ($line =~ /#define/) {                   # Process #define lines:\r
+                $line =~ s/#define//;                   # Remove #define token\r
+                $line =~ s/^\s+//;                      #  and leading & trailing whitespace\r
+                $line =~ s/\s+$//;\r
+                local @qr = split("\"", $line);         # Try splitting with quotes\r
+                if (exists $qr[1]) {\r
+                    $qr[0] =~ s/^\s+//;                 #  Clean up whitespace\r
+                    $qr[0] =~ s/\s+$//;\r
+                    $config->{Versions}->{$qr[0]} = $qr[1]; # Save string\r
+                    }\r
+                else {                                  # No quotes, so\r
+                    local @ar = split(" ", $line);      #  split with space\r
+                    $ar[0] =~ s/^\s+//;                 #  Clean up whitespace\r
+                    $ar[0] =~ s/\s+$//;\r
+                    $config->{Versions}->{$ar[0]} = $ar[1]; # and  save numeric value\r
+                    }\r
+                }\r
+            }\r
+\r
+        # Check that the versions we will need for site-local have been defined:\r
+        my @required_versions = ('VER_PROD_MAJOR', 'VER_PROD_MINOR', 'VER_PROD_REV', \r
+                                 'VER_PROD_MAJOR_STR', 'VER_PROD_MINOR_STR', 'VER_PROD_REV_STR', \r
+                                 'VER_PRODUCTNAME_STR');\r
+        my $requirements_met = 1;\r
+        my $first_missing = 0;\r
+        my $error_list = "";\r
+        foreach my $required (@required_versions) {\r
+            if (! exists $config->{Versions}->{$required}) {\r
+                $requirements_met = 0;\r
+                if (!$first_missing) {\r
+                    $first_missing = 1;\r
+                    $error_list = "Fatal -- The following version(s) are not defined in $src/$version_path.\n";\r
+                    }\r
+                $error_list .= "$required\n";\r
+                }\r
+            }\r
+        if (!$requirements_met) {\r
+            print $error_list;\r
+            exit(0);\r
+            }\r
+        # Apply any of these tags to filestem:\r
+        my $filestem    = $config->{Stages}->{PostPackage}->{Config}->{FileStem}->{name};\r
+        $filestem       =~ s/%VERSION_MAJOR%/$config->{Versions}->{'VER_PROD_MAJOR_STR'}/;\r
+        $filestem       =~ s/%VERSION_MINOR%/$config->{Versions}->{'VER_PROD_MINOR_STR'}/;\r
+        $filestem       =~ s/%VERSION_PATCH%/$config->{Versions}->{'VER_PROD_REV_STR'}/;\r
+        $config->{Stages}->{PostPackage}->{Config}->{FileStem}->{name}    = $filestem;\r
+        \r
+        # The build results are copied to a staging area, where the packager expects to find them.\r
+        #  We put the staging area in the fixed area .../pismere/staging.\r
+        my $prepackage    = $config->{Stages}->{PrePackage};\r
+        my $staging_area = "$wd\\staging";\r
+        chdir($wd) or die "Fatal -- couldn't chdir to $wd\n";\r
+        if ($verbose) {print "Info -- chdir to $wd\n";}\r
+        (-e $staging_area) or mkdir($staging_area);\r
+        \r
+        # Force Where From and To are relative to:\r
+        $prepackage->{CopyList}->{Config}->{From}->{root}   = "$wd\\athena";\r
+        $prepackage->{CopyList}->{Config}->{To}->{root}     = "$wd\\staging";\r
+        copyFiles($prepackage->{CopyList}, $config);        ## Copy any files [this step takes a while]\r
+\r
+        chdir("staging\\install\\wix") or die "Fatal -- Couldn't cd to $wd\\staging\\install\\wix";\r
+        # Correct errors in files.wxi:\r
+        !system("sed 's/WorkingDirectory=\"\\[dirbin\\]\"/WorkingDirectory=\"dirbin\"/g' files.wxi > a.tmp") or die "Fatal -- Couldn't modify files.wxi.";\r
+        !system("mv a.tmp files.wxi") or die "Fatal -- Couldn't update files.wxi.";\r
+            \r
+        # Make sed script to run on the site-local configuration files:\r
+        local $tmpfile      = "site-local.sed" ;\r
+        system("del $tmpfile");\r
+        # Basic substitutions:\r
+        local $dblback_wd   = $wd;\r
+        $dblback_wd         =~ s/\\/\\\\/g;\r
+        !system("echo s/%BUILDDIR%/$dblback_wd/ >> $tmpfile")               or die "Fatal -- Couldn't modify $tmpfile.";    \r
+        local $dblback_staging  = "$wd\\staging";\r
+        $dblback_staging        =~ s/\\/\\\\/g;\r
+        !system("echo s/%TARGETDIR%/$dblback_staging/ >> $tmpfile")         or die "Fatal -- Couldn't modify $tmpfile.";    \r
+        local $dblback_sample   = "$wd\\staging\\sample";\r
+        $dblback_sample         =~ s/\\/\\\\/g;\r
+        !system("echo s/%CONFIGDIR-WIX%/$dblback_sample/ >> $tmpfile")      or die "Fatal -- Couldn't modify $tmpfile.";    \r
+        !system("echo s/%CONFIGDIR-NSI%/$dblback_staging/ >> $tmpfile")     or die "Fatal -- Couldn't modify $tmpfile.";    \r
+        !system("echo s/%VERSION_MAJOR%/$config->{Versions}->{'VER_PROD_MAJOR_STR'}/ >> $tmpfile")  or die "Fatal -- Couldn't modify $tmpfile.";    \r
+        !system("echo s/%VERSION_MINOR%/$config->{Versions}->{'VER_PROD_MINOR_STR'}/ >> $tmpfile")  or die "Fatal -- Couldn't modify $tmpfile.";    \r
+        !system("echo s/%VERSION_PATCH%/$config->{Versions}->{'VER_PROD_REV_STR'}/ >> $tmpfile")    or die "Fatal -- Couldn't modify $tmpfile.";    \r
+        # Strip out some defines so they can be replaced:  [used for site-local.nsi]\r
+        !system("echo /\^!define\.\*RELEASE\.\*\$/d >> $tmpfile")           or die "Fatal -- Couldn't modify $tmpfile.";    \r
+        !system("echo /\^!define\.\*DEBUG\.\*\$/d >> $tmpfile")             or die "Fatal -- Couldn't modify $tmpfile.";    \r
+        !system("echo /\^!define\.\*BETA\.\*\$/d >> $tmpfile")              or die "Fatal -- Couldn't modify $tmpfile.";    \r
+\r
+        # Run the script on site-local.wxi:\r
+        !system("sed -f $tmpfile site-local-tagged.wxi > site-local.wxi")   or die "Fatal -- Couldn't modify site-local.wxi.";\r
+\r
+        # Now update site-local.nsi:\r
+        chdir "..\\nsis";\r
+        print "Info -- chdir to ".`cd`."\n"                                 if ($verbose);\r
+        local $tmpfile    = "site-local.sed" ;\r
+        !system("sed -f ..\\wix\\$tmpfile site-local-tagged.nsi > b.tmp")   or die "Fatal -- Couldn't modify site-local.wxi.";\r
+        # Add DEBUG or RELEASE:\r
+        if ($switches[0]->{debug}->{value}) {                               ## debug build\r
+            !system("echo !define DEBUG >> b.tmp")                          or die "Fatal -- Couldn't modify b.tmp.";    \r
+            }\r
+        else {                                                              ## release build\r
+            !system("echo !define RELEASE >> b.tmp")                        or die "Fatal -- Couldn't modify b.tmp.";    \r
+            !system("echo !define NO_DEBUG >> b.tmp")                       or die "Fatal -- Couldn't modify b.tmp.";    \r
+            }\r
+        # Add BETA if present:\r
+        if ( exists $config->{Versions}->{'BETA_STR'}) {\r
+            !system("echo !define BETA $config->{Versions}->{'BETA_STR'} >> b.tmp") or die "Fatal -- Couldn't modify b.tmp.";    \r
+            }\r
+        !system("mv -f b.tmp site-local.nsi")                               or die "Fatal -- Couldn't replace site-local.nsi.";\r
+\r
+        # Run the script on nsi-includes-tagged.nsi:\r
+        !system("sed -f ..\\wix\\$tmpfile nsi-includes-tagged.nsi > nsi-includes.nsi")  or die "Fatal -- Couldn't modify nsi-includes.nsi.";\r
+\r
+        if ($verbose) {print "Info -- ***   End prepackage.\n";}\r
+        \r
+        if ($verbose) {print "Info -- *** Begin package.\n";}\r
+        # Make the msi:\r
+        chdir("$wd\\staging\\install\\wix") or die "Fatal -- Couldn't cd to $wd\\staging\\install\\wix";\r
+        print "Info -- *** Make .msi:\n"            if ($verbose);\r
+        !system("$MAKE")                            or die "Error -- msi installer build failed.";\r
+                \r
+        chdir("$wd\\staging\\install\\nsis") or die "Fatal -- Couldn't cd to $wd\\staging\\install\\nsis";\r
+        print "Info -- chdir to ".`cd`."\n"         if ($verbose);\r
+        print "Info -- *** Make NSIS:\n"            if ($verbose);\r
+        !system("cl.exe killer.cpp advapi32.lib")   or die "Error -- nsis killer.exe not built.";\r
+        !system("rename killer.exe Killer.exe")     or die "Error -- Couldn't rename killer.exe";\r
+        !system("makensis kfw.nsi")                 or die "Error -- executable installer build failed.";\r
 \r
 # Begin packaging extra items:\r
-               my $fromRoot    = $paths[0]->{src}->{path};\r
-               my $toRoot              = $paths[0]->{out}->{path};\r
-               chdir($fromRoot);               # Now in <src>.\r
-               print "Info -- chdir to ".`cd`."\n"                                                                             if ($verbose);\r
-               system("rm -rf $toRoot")                                                                                                        if (-d $toRoot);\r
-               die "Fatal -- Couldn't remove $fromRoot\\$toRoot."      if (-d $toRoot);\r
-               mkdir($toRoot);\r
-               my $zipsXML = $config->{Stages}->{PostPackage}->{Zips};\r
-\r
-               $config->{Stages}->{PostPackage}->{CopyList}->{Config}->{From}->{root}          = "$src\\pismere";              ## Used after zips are made.\r
-               $config->{Stages}->{PostPackage}->{CopyList}->{Config}->{To}->{root}                    = "$src\\$toRoot\\ziptemp";\r
-\r
-               local $i = 0;\r
-               while ($zipsXML->{Zip}[$i]) {\r
-                       my $zip = $zipsXML->{Zip}[$i];\r
-                       if (exists $zip->{name}) {                                                                                              ## Ignore dummy entry.\r
-                               my $zipname     = $zip->{filename};\r
-                               $zipname                        =~ s/%filestem%/$filestem/g;\r
-                               my $bMakeIt             = 1;\r
-                               if (exists $zip->{Requires}) {\r
-                                       local $j = 0;\r
-                                       while ($zip->{Requires}->{Switch}[$j]) {                                ## Check Require switches\r
-                                               local $switch   = $zip->{Requires}->{Switch}[$j];\r
-                                               if (exists $switch->{name}) {                                                           ## Ignore dummy entry\r
-                                                       # We handle REPOSITORY and CLEAN switches:\r
-                                                       if ($switch->{name} =~ /REPOSITORY/i) {\r
-                                                               $bMakeIt &&= ($switch->{value} =~ /$rverb/i);   ## Repository verb must match requirement\r
-                                                               }\r
-                                                       elsif ($switch->{name} =~ /CLEAN/i) {           ## Clean must be specified\r
-                                                               $bMakeIt &&= $clean;\r
-                                                               }\r
-                                                       else {print "Error -- Unsupported switch $switch->{name} in Requires in ".Dumper($zip);}\r
-                                                       }\r
-                                               $j++;\r
-                                               }\r
-                                       if ( !$bMakeIt && (exists $zip->{Requires}->{ErrorMsg}) ) {\r
-                                               print "Error -- $zip->{Requires}->{ErrorMsg}->{text}\n";\r
-                                               }\r
-                                       }\r
-                               if ($bMakeIt) {\r
-                                       my $todir                       = "$src\\$toRoot\\ziptemp";\r
-                                       system("rm -rf $todir")                                                         if (-d $todir);\r
-                                       die "Fatal -- Couldn't remove $todir"           if (-d $todir);\r
-                                       mkdir($todir);\r
-#      Add to the zip's config section.  Don't copy Postpackage->Config, because the Zip's Config might contain substitution tags.\r
-                                       $zip->{CopyList}->{Config}->{FileStem}                          = $config->{Stages}->{PostPackage}->{Config}->{FileStem};               ## Each zip uses the post package config.\r
-                                       $zip->{CopyList}->{Config}->{From}->{root}              = "$src\\pismere";                                                              ## Used by zips\r
-                                       $zip->{CopyList}->{Config}->{To}->{root}                        = "$src\\$toRoot\\ziptemp\\$zip->{topdir}";\r
-                                       copyFiles($zip->{CopyList}, $config);\r
-                                       # Drop down into <out>/ziptemp so the path to the added file won't include <out>:\r
-                                       chdir $todir;\r
-                                       print "Info -- chdir to ".`cd`."\n"                             if ($verbose);\r
-\r
-                                       # Prune any unwanted files or directories from the directory we're about to zip:\r
-                                       if (exists $zip->{Prunes}) {\r
-                                               # Use Unix find instead of Windows find.  Save PATH so we can restore it when we're done:\r
-                                               my $savedPATH   = $ENV{PATH};\r
-                                               $ENV{PATH} = $config->{CommandLine}->{Directories}->{unixfind}->{path}.";".$savedPATH;\r
-                                               my $prunes = $zip->{Prunes};\r
-                                               my $j=0;\r
-                                               print "Info -- Processing prunes in ".`cd`."\n" if ($verbose);\r
-                                               while ($prunes->{Prune}->[$j]) {\r
-                                                       if (exists $prunes->{Prune}->[$j]->{name}) {                                            ## Don't process dummy entry!\r
-                                                               my $prune       = $prunes->{Prune}->[$j]->{name};\r
-                                                               my $flags       = $prunes->{Prune}->[$j]->{flags};\r
-                                                               $flags = "" if (!$flags);\r
-                                                               my $cmd = "find . -".$flags."name $prune";\r
-                                                               print "Info -- Looking for filenames containing $prune\n";\r
-                                                               my $list = `$cmd`;\r
-                                                               foreach $target (split("\n", $list)) {\r
-                                                                       print "Info -- Pruning $target\n" if ($verbose);\r
-                                                                       !system("rm -rf $target")                       or die "Error -- Couldn't remove $target.";;\r
-                                                                       }\r
-                                                               }\r
-                                                       $j++;\r
-                                                       }\r
-                                               $ENV{PATH} = $savedPATH;\r
-                                               }\r
-\r
-                                       my $zipfile                     = Archive::Zip->new();\r
-                                       my $topdir              = $zip->{topdir};\r
-                                       $topdir                         =~ s/%filestem%/$filestem/g;\r
-                                       $zipfile->addTree('.', $topdir);\r
-                                       if (-e $zipname)        {!system("rm -f $zipname")      or die "Error -- Couldn't remove $zipname.";}\r
-                                       $zipfile->writeToFileNamed($zipname);\r
-                                       print "Info -- created $src\\$toRoot\\$zipname.\n"      if ($verbose);\r
-                                       !system("mv -f $zipname  ..")                                   or die "Error -- Couldn't move $zipname to ..";\r
-                                       chdir "..";                                             ## Back to <out>\r
-                                       print "Info -- chdir to ".`cd`."\n"                             if ($verbose);\r
-                                       }                                               ## End else OK to process zip\r
-                               }                                                       ## End not the dummy entry\r
-                               $i++;                                   \r
-                       }                                                               ## End zip in xml.\r
-                               \r
-               $todir  = "$src\\$toRoot\\ziptemp";                                     ## Clean up any temp directory.\r
-               system("rm -rf $todir")                                                                                 if (-d $todir);\r
-                               \r
-               my $out         = $config->{CommandLine}->{Directories}->{out}->{path};\r
-               $config->{Stages}->{PostPackage}->{CopyList}->{Config} = $config->{Stages}->{PostPackage}->{Config};            ## Use the post package config.\r
-               $config->{Stages}->{PostPackage}->{CopyList}->{Config}->{From}->{root}          = "$src\\pismere";\r
-               $config->{Stages}->{PostPackage}->{CopyList}->{Config}->{To}->{root}                    = "$src\\$out";\r
-               copyFiles($config->{Stages}->{PostPackage}->{CopyList}, $config);                       ## Copy any files\r
-               if ($verbose) {print "Info -- ***   End package.\n";}\r
-               }\r
-       else {\r
-               print "Info -- Package step skipped.";\r
-               }\r
-\r
-       system("rm -rf $src/a.tmp");                                                                    ## Clean up junk.\r
-                               \r
+        chdir($src);        # Now in <src>.\r
+        print "Info -- chdir to ".`cd`."\n"             if ($verbose);\r
+        system("rm -rf $toPath")                        if (-d $toPath);\r
+        die "Fatal -- Couldn't remove $src\\$toPath."   if (-d $toPath);\r
+        mkdir($toPath);\r
+        my $zipsXML = $config->{Stages}->{PostPackage}->{Zips};\r
+\r
+        local $i = 0;\r
+            while ($zipsXML->{Zip}[$i]) {\r
+                local $zip = $zipsXML->{Zip}[$i];\r
+                makeZip($zip, $config)  if (exists $zip->{name});   ## Ignore dummy entry.\r
+                $i++;                    \r
+            }                                   ## End zip in xml.\r
+                \r
+        $ziptemp    = "$src\\$toPath\\ziptemp"; ## Clean up any temp directory.\r
+        chdir("$src\\$toPath");\r
+        print "Info -- chdir to ".`cd`."\n"     if ($verbose);\r
+        system("rm -rf $ziptemp")               if (-d $ziptemp);\r
+                \r
+        my $out     = $config->{CommandLine}->{Directories}->{out}->{path};\r
+        $config->{Stages}->{PostPackage}->{CopyList}->{Config} = $config->{Stages}->{PostPackage}->{Config};    ## Use the post package config.\r
+        $config->{Stages}->{PostPackage}->{CopyList}->{Config}->{From}->{root}  = "$src\\pismere";\r
+        $config->{Stages}->{PostPackage}->{CopyList}->{Config}->{To}->{root}    = "$src\\$out";\r
+        copyFiles($config->{Stages}->{PostPackage}->{CopyList}, $config);       ## Copy any files\r
+\r
+        if ($switches[0]->{sign}->{value}) {\r
+            signFiles($config->{Stages}->{PostPackage}->{Config}->{Signing}, $config);\r
+            }\r
+\r
+        if ($verbose) {print "Info -- ***   End package.\n";}\r
+        }\r
+##-- Package action.\r
+\r
+    system("rm -rf $src/a.tmp");                ## Clean up junk.\r
+    system("rm -rf $src/$toPath/ziptemp");    ## Clean up junk.\r
+                \r
 # End logging:\r
-    if ($switches[0]->{logfile}->{value})      {$l->stop;}\r
+    if ($switches[0]->{logfile}->{value})   {$l->stop;}\r
 \r
     return 0;\r
-       }                                                       ## End subroutine main.\r
+    }                                           ## End subroutine main.\r
 \r
 $SIG{'INT'} = \&handler;\r
 $SIG{'QUIT'} = \&handler;\r
index 5e4200bb185ad3e580863bc563aaab60a0406553..9160db07bc78b4327feea5d85401a6afaf41b5e5 100644 (file)
@@ -5,134 +5,133 @@ use XML::Simple;
 use Data::Dumper;\r
 \r
 sub copyFiles {\r
-       local ($xml, $config)   = @_;\r
-       local @switches                         = $config->{CommandLine}->{Options};\r
-       local @files                                            = $xml->{Files};\r
-       # Check for includes:\r
-       if (exists $xml->{Files}->{Include}->{path}) {\r
-               my $includepath = $xml->{Files}->{Include}->{path};\r
-               print "Info -- Including files from $includepath\n";\r
-               my $savedDir = `cd`;\r
-               $savedDir =~ s/\n//g;\r
-               chdir $originalDir;                                                                             ## Includes are relative to where we were invoked.\r
-               print "Info -- chdir to ".`cd`."\n"                             if ($verbose);\r
-               my $tmp = new XML::Simple;\r
-               my $includeXML = $tmp->XMLin($includepath);\r
-               chdir $savedDir;\r
-               print "Info -- chdir to ".`cd`."\n"                             if ($verbose);\r
+    local ($xml, $config)   = @_;\r
+    local @switches         = $config->{CommandLine}->{Options};\r
+    local @files            = $xml->{Files};\r
+    # Check for includes:\r
+    if (exists $xml->{Files}->{Include}->{path}) {\r
+        my $includepath    = $xml->{Files}->{Include}->{path};\r
+        print "Info -- Including files from $includepath\n";\r
+        my $savedDir = `cd`;\r
+        $savedDir =~ s/\n//g;\r
+        chdir $originalDir;                         ## Includes are relative to where we were invoked.\r
+        print "Info -- chdir to ".`cd`."\n"         if ($verbose);\r
+        my $tmp    = new XML::Simple;\r
+        my $includeXML = $tmp->XMLin($includepath);\r
+        chdir $savedDir;\r
+        print "Info -- chdir to ".`cd`."\n"         if ($verbose);\r
 \r
-               local $i = 0;\r
-               while ($includeXML->{File}[$i]) {                               ## Copy File entries from includeXML.\r
-                       $files[0]->{File}[++$#{$files[0]->{File}}] = $includeXML->{File}[$i];           \r
-                       $i++;\r
-                       }\r
-               delete $files->{Include};\r
-               }\r
-       ##++ Set up path substitution variables for use inside the copy loop:\r
-       # A path can contain a variable part, which will be handled here.  If the variable part is \r
-       # the Always or BuildDependent tag, then the variable will be changed to the \r
-       # build-type-dependent PathFragment.\r
-       # If the variable part is the IgnoreTag, then the file will not be copied.\r
-       # If the variable part is %filestem%, it will be replaced with Config->FileStem->name.\r
-       my ($PathFragment, $BuildDependentTag, $IgnoreTag, $FileStemFragment, $fromRoot, $toRoot); \r
-       my $bPathTags   = (exists $xml->{Config}->{DebugArea}) && (exists $xml->{Config}->{ReleaseArea});\r
-       my $bFileStem   = (exists $xml->{Config}->{FileStem});\r
-       \r
-       if ($switches[0]->{debug}->{value}) {           ## Debug build tags:\r
-               $PathFragment                           = $xml->{Config}->{DebugArea}->{value};\r
-               $BuildDependentTag      = $xml->{Config}->{DebugTag}->{value};\r
-               $IgnoreTag                                      = $xml->{Config}->{ReleaseTag}->{value};\r
-               }\r
-       else {                                                                                                                          ## Release build tags:\r
-               $PathFragment                           = $xml->{Config}->{ReleaseArea}->{value};\r
-               $BuildDependentTag      = $xml->{Config}->{ReleaseTag}->{value};\r
-               $IgnoreTag                                      = $xml->{Config}->{DebugTag}->{value};\r
-               }                       \r
-       my $AlwaysTag                           = $xml->{Config}->{AlwaysTag}->{value};\r
-       $FileStemFragment                       = $xml->{Config}->{FileStem}->{name};   \r
-       $fromRoot                                                       = $xml->{Config}->{From}->{root};       \r
-       $toRoot                                                         = $xml->{Config}->{To}->{root}; \r
-       ##-- Set up path substitution variables for use inside the copy loop.\r
-       # For each file in the file list:\r
-       #  Substitute any variable parts of the path name.\r
-       #  Handle wildcards\r
-       #  Copy\r
+        local $i = 0;\r
+        while ($includeXML->{File}[$i]) {           ## Copy File entries from includeXML.\r
+            $files[0]->{File}[++$#{$files[0]->{File}}] = $includeXML->{File}[$i];        \r
+            $i++;\r
+            }\r
+        delete $files->{Include};\r
+        }\r
+    ##++ Set up path substitution variables for use inside the copy loop:\r
+    # A path can contain a variable part, which will be handled here.  If the variable part is \r
+    # the Always or BuildDependent tag, then the variable will be changed to the \r
+    # build-type-dependent PathFragment.\r
+    # If the variable part is the IgnoreTag, then the file will not be copied.\r
+    # If the variable part is %filestem%, it will be replaced with Config->FileStem->name.\r
+    my ($PathFragment, $BuildDependentTag, $IgnoreTag, $FileStemFragment, $fromRoot, $toRoot); \r
+    my $bPathTags    = (exists $xml->{Config}->{DebugArea}) && (exists $xml->{Config}->{ReleaseArea});\r
+    my $bFileStem    = (exists $xml->{Config}->{FileStem});\r
+    \r
+    if ($switches[0]->{debug}->{value}) {   ## Debug build tags:\r
+        $PathFragment       = $xml->{Config}->{DebugArea}->{value};\r
+        $BuildDependentTag  = $xml->{Config}->{DebugTag}->{value};\r
+        $IgnoreTag          = $xml->{Config}->{ReleaseTag}->{value};\r
+        }\r
+    else {                                  ## Release build tags:\r
+        $PathFragment       = $xml->{Config}->{ReleaseArea}->{value};\r
+        $BuildDependentTag  = $xml->{Config}->{ReleaseTag}->{value};\r
+        $IgnoreTag          = $xml->{Config}->{DebugTag}->{value};\r
+        }            \r
+    my $AlwaysTag           = $xml->{Config}->{AlwaysTag}->{value};\r
+    $FileStemFragment       = $xml->{Config}->{FileStem}->{name};    \r
+    $fromRoot               = $xml->{Config}->{From}->{root};    \r
+    $toRoot                 = $xml->{Config}->{To}->{root};    \r
+    ##-- Set up path substitution variables for use inside the copy loop.\r
+    # For each file in the file list:\r
+    #  Substitute any variable parts of the path name.\r
+    #  Handle wildcards\r
+    #  Copy\r
 \r
-       local $i = 0;\r
-       my $bOldDot     = 1;\r
-       my $bDot                        = 0;\r
-       while ($files[0]->{File}[$i]) {\r
+    local $i    = 0;\r
+    my $bOldDot = 1;\r
+    my $bDot    = 0;\r
+    while ($files[0]->{File}[$i]) {\r
 \r
-               my ($name, $newname, $from, $to, $file);\r
-               $file                   = $files[0]->{File}->[$i];\r
-               $name   = $file->{name};\r
-               if (exists $file->{newname})    {$newname = $file->{newname};}\r
-               else                                                                                            {$newname = $name;}\r
-               if ($name && (! exists $file->{ignore})) {              ## Ignore or process this entry?\r
-                       $from   = "$fromRoot\\$file->{from}\\$name";\r
-                       $to             = "$toRoot\\$file->{to}\\$newname";\r
-                       if ( $bPathTags || $bFileStem || (index($from.$to, $IgnoreTag) <0) ) {          ## Copy this file?\r
-                               if ($bPathTags) {                                                                               ## Apply PathTag substitutions:\r
-                                       $from   =~ s/$AlwaysTag/$PathFragment/g;\r
-                                       $to             =~ s/$AlwaysTag/$PathFragment/g;\r
-                                       $from   =~ s/$BuildDependentTag/$PathFragment/g;\r
-                                       $to             =~ s/$BuildDependentTag/$PathFragment/g;\r
-                                       }\r
-                               if ($bFileStem) {                                                                               ## FileStem substitution?\r
-                                       $from   =~ s/%filestem%/$FileStemFragment/g;\r
-                                       $to             =~ s/%filestem%/$FileStemFragment/g;\r
-                                       }               \r
-                               # %-DEBUG% substitution:\r
-                               local $DebugFragment    = ($switches[0]->{debug}->{value}) ? "-DEBUG" : "";\r
-if ($from =~ /\-DEBUG/) {print "\n$from ... \n";}\r
-                               $from   =~ s/%\-DEBUG%/$DebugFragment/g;\r
-                               $to             =~ s/%\-DEBUG%/$DebugFragment/g;\r
-if ($from =~ /DEBUG/) {print "\n$from ... \n";}\r
-                               $to                                                     =~ s/\*.*//;                            ## Truncate to path before any wildcard\r
+        my ($name, $newname, $from, $to, $file);\r
+        $file   = $files[0]->{File}->[$i];\r
+        $name   = $file->{name};\r
+        if (exists $file->{newname})    {$newname = $file->{newname};}\r
+        else                            {$newname = $name;}\r
+        if ($name && (! exists $file->{ignore})) {      ## Ignore or process this entry?\r
+            $from   = "$fromRoot\\$file->{from}\\$name";\r
+            $to     = "$toRoot\\$file->{to}\\$newname";\r
+            # Copy this file?  Check for ignore tag [debug-only in release mode or vice versa].\r
+            if ( $bPathTags || $bFileStem || (index($from.$to, $IgnoreTag) <0) ) {  \r
+                if ($bPathTags) {                                   ## Apply PathTag substitutions:\r
+                    $from   =~ s/$AlwaysTag/$PathFragment/g;\r
+                    $to     =~ s/$AlwaysTag/$PathFragment/g;\r
+                    $from   =~ s/$BuildDependentTag/$PathFragment/g;\r
+                    $to     =~ s/$BuildDependentTag/$PathFragment/g;\r
+                    }\r
+                if ($bFileStem) {                                   ## FileStem substitution?\r
+                    $from   =~ s/%filestem%/$FileStemFragment/g;\r
+                    $to     =~ s/%filestem%/$FileStemFragment/g;\r
+                    }        \r
+                # %-DEBUG% substitution:\r
+                local $DebugFragment    = ($switches[0]->{debug}->{value}) ? "-DEBUG" : "";\r
+                $from       =~ s/%\-DEBUG%/$DebugFragment/g;\r
+                $to         =~ s/%\-DEBUG%/$DebugFragment/g;\r
+                $to         =~ s/\*.*//;                ## Truncate to path before any wildcard\r
 \r
-                               my $bCopyOK             = 1;\r
-                               my $fromcheck   = $from;\r
-                               my $bRequired           = ! (exists $file->{notrequired});\r
-                               if ($name =~ /\*/) {                                                                    ## Wildcard case\r
-                                       $fromcheck =~ s/\*.*//;\r
-                                       if ($bRequired && (! -d $fromcheck)) {\r
-                                               if ($bDot) {print "\n";}\r
-                                               die "Fatal -- Can't find $fromcheck";\r
-                                               }\r
-                                       $bCopyOK = !system("echo D | xcopy /D /F /Y /S  $from $to > a.tmp 2>NUL");\r
-                                       }\r
-                               else {                                                                                                                  ## Specific file case\r
-                                       if ($bRequired && (! -e $fromcheck)) {\r
-                                               if ($bDot) {print "\n";}\r
-                                               die "Fatal -- Can't find $fromcheck";\r
-                                               }\r
-                                       $bCopyOK        = !system("echo F | xcopy /D /F /Y $from $to > a.tmp 2>NUL");\r
-                                       }\r
+                my $bCopyOK     = 1;\r
+                my $fromcheck   = $from;\r
+                my $bRequired   = ! (exists $file->{notrequired});\r
+                if ($name =~ /\*/) {                    ## Wildcard case\r
+                    $fromcheck =~ s/\*.*//;\r
+                    if ($bRequired && (! -d $fromcheck)) {\r
+                        if ($bDot) {print "\n";}\r
+                        die "Fatal -- Can't find $fromcheck";\r
+                        }\r
+                    $bCopyOK = !system("echo D | xcopy /D /F /Y /S  $from $to > a.tmp 2>NUL");\r
+                    }\r
+                else {                                  ## Specific file case\r
+                    if ($bRequired && (! -e $fromcheck)) {\r
+                        if ($bDot) {print "\n";}\r
+                        die "Fatal -- Can't find $fromcheck";\r
+                        }\r
+                    $bCopyOK    = !system("echo F | xcopy /D /F /Y $from $to > a.tmp 2>NUL");\r
+                    }\r
 \r
-                               if ($bCopyOK) {                                                                                 ## xcopy OK - show progress\r
-                                       # To show progress when files aren't copied, print a string of dots.\r
-                                       open(MYINPUTFILE, "<a.tmp");\r
-                                       my(@lines) = <MYINPUTFILE>;\r
-                                       foreach $line (@lines) { \r
-                                               $bDot = ($line =~ /^0/);\r
-                                               }\r
-                                       close(MYINPUTFILE);\r
-                                       if (!$bDot && $bOldDot) {print "\n";}\r
-                                       if ($bDot) {print "."; STDOUT->flush;}\r
-                                       else {print "$from copied to $to\n";}\r
-                                       $bOldDot = $bDot;\r
-                                       }\r
-                               else {                                                                                                                  ## xcopy failed\r
-                                       if (!exists $file->{notrequired}) {\r
-                                               if ($bDot) {print "\n";}\r
-                                               die "Fatal -- Copy of $from to $to failed";\r
-                                               }\r
-                                       }                                                                                                                               ## End xcopy succeed or fail\r
-                               }                                                                                                                                       ## End not dummy entry nor ignored\r
-                       }\r
-               $i++;\r
-               }\r
-       if ($bDot) {print "\n";}\r
-       }\r
+                if ($bCopyOK) {                         ## xcopy OK - show progress\r
+                    # To show progress when files aren't copied, print a string of dots.\r
+                    open(MYINPUTFILE, "<a.tmp");\r
+                    my(@lines) = <MYINPUTFILE>;\r
+                    foreach $line (@lines) { \r
+                        $bDot = ($line =~ /^0/);\r
+                        }\r
+                    close(MYINPUTFILE);\r
+                    if (!$bDot && $bOldDot) {print "\n";}\r
+                    if ($bDot) {print "."; STDOUT->flush;}\r
+                    else {print "$from copied to $to\n";}\r
+                    $bOldDot = $bDot;\r
+                    }\r
+                else {                                  ## xcopy failed\r
+                    if (!exists $file->{notrequired}) {\r
+                        if ($bDot) {print "\n";}\r
+                        die "Fatal -- Copy of $from to $to failed";\r
+                        }\r
+                    }                                   ## End xcopy succeed or fail\r
+                }                                       ## End not dummy entry nor ignored\r
+            }\r
+        $i++;\r
+        }\r
+    if ($bDot) {print "\n";}\r
+    }\r
 \r
 return 1;\r
index 1071c5180566421ec983110db47da59b34c78bda..d571be63dcff44b05bec7ff9e5b30e34661a5fe0 100644 (file)
 <?xml version="1.0" encoding="utf-8" ?>\r
-       <Files>\r
-               <!-- File from  paths are relative to <src>\pismere\athena  -->\r
-               <!-- File to                    paths are relative to <src>\pismere\staging -->\r
-               <File dummy="foo" /> <!-- Forces XML::Simple behavior -->\r
-                       <!-- Without this, XML::Simple does not make an anonymous array and I can't figure out how to iterate over it. -->\r
+    <Files>\r
+        <!-- File from    paths are relative to <src>\pismere\athena  -->\r
+        <!-- File to            paths are relative to <src>\pismere\staging -->\r
+        <File dummy="foo" /> <!-- Forces XML::Simple behavior -->\r
+            <!-- Without this, XML::Simple does not make an anonymous array and I can't figure out how to iterate over it. -->\r
 \r
-               <!-- Build-dependent files (from release or debug build): -->\r
-               <File name="netidmgr.h" from="auth\krb5\src\windows\identity\obj\i386\%bldtype%\inc\"   to="\inc\netidmgr" />\r
-               <File name="netidmgr_version.h" from="auth\krb5\src\windows\identity\obj\i386\%bldtype%\inc\"   to="\inc\netidmgr"/>\r
-               <File name="perfstat.h" from="auth\krb5\src\windows\identity\obj\i386\%bldtype%\inc\"   to="\inc\netidmgr"/>\r
-               <File name="utils.h"    from="auth\krb5\src\windows\identity\obj\i386\%bldtype%\inc\"   to="\inc\netidmgr" />\r
-               <File name="sync.h"     from="auth\krb5\src\windows\identity\obj\i386\%bldtype%\inc\"   to="\inc\netidmgr" />\r
-               <File name="mstring.h"  from="auth\krb5\src\windows\identity\obj\i386\%bldtype%\inc\"   to="\inc\netidmgr" />\r
-               <File name="kplugin.h"  from="auth\krb5\src\windows\identity\obj\i386\%bldtype%\inc\"   to="\inc\netidmgr" />\r
-               <File name="kmq.h"      from="auth\krb5\src\windows\identity\obj\i386\%bldtype%\inc\"   to="\inc\netidmgr" />\r
-               <File name="kmm.h"      from="auth\krb5\src\windows\identity\obj\i386\%bldtype%\inc\"   to="\inc\netidmgr" />\r
-               <File name="khuidefs.h" from="auth\krb5\src\windows\identity\obj\i386\%bldtype%\inc\"   to="\inc\netidmgr" />\r
-               <File name="khtracker.h"        from="auth\krb5\src\windows\identity\obj\i386\%bldtype%\inc\"   to="\inc\netidmgr" />\r
-               <File name="khrescache.h"       from="auth\krb5\src\windows\identity\obj\i386\%bldtype%\inc\"   to="\inc\netidmgr" />\r
-               <File name="khremote.h" from="auth\krb5\src\windows\identity\obj\i386\%bldtype%\inc\"   to="\inc\netidmgr" />\r
-               <File name="khprops.h"  from="auth\krb5\src\windows\identity\obj\i386\%bldtype%\inc\"   to="\inc\netidmgr" />\r
-               <File name="khnewcred.h"        from="auth\krb5\src\windows\identity\obj\i386\%bldtype%\inc\"   to="\inc\netidmgr" />\r
-               <File name="khmsgtypes.h"       from="auth\krb5\src\windows\identity\obj\i386\%bldtype%\inc\"   to="\inc\netidmgr" />\r
-               <File name="khlist.h"   from="auth\krb5\src\windows\identity\obj\i386\%bldtype%\inc\"   to="\inc\netidmgr" />\r
-               <File name="khhtlink.h" from="auth\krb5\src\windows\identity\obj\i386\%bldtype%\inc\"   to="\inc\netidmgr" />\r
-               <File name="kherror.h"  from="auth\krb5\src\windows\identity\obj\i386\%bldtype%\inc\"   to="\inc\netidmgr" />\r
-               <File name="kherr.h"    from="auth\krb5\src\windows\identity\obj\i386\%bldtype%\inc\"   to="\inc\netidmgr" />\r
-               <File name="khdefs.h"   from="auth\krb5\src\windows\identity\obj\i386\%bldtype%\inc\"   to="\inc\netidmgr" />\r
-               <File name="khconfigui.h"       from="auth\krb5\src\windows\identity\obj\i386\%bldtype%\inc\"   to="\inc\netidmgr" />\r
-               <File name="khalerts.h" from="auth\krb5\src\windows\identity\obj\i386\%bldtype%\inc\"   to="\inc\netidmgr" />\r
-               <File name="khactiondef.h"      from="auth\krb5\src\windows\identity\obj\i386\%bldtype%\inc\"   to="\inc\netidmgr" />\r
-               <File name="khaction.h" from="auth\krb5\src\windows\identity\obj\i386\%bldtype%\inc\"   to="\inc\netidmgr" />\r
-               <File name="kcreddb.h"  from="auth\krb5\src\windows\identity\obj\i386\%bldtype%\inc\"   to="\inc\netidmgr" />\r
-               <File name="kconfig.h"  from="auth\krb5\src\windows\identity\obj\i386\%bldtype%\inc\"   to="\inc\netidmgr" />\r
-               <File name="hashtable.h"        from="auth\krb5\src\windows\identity\obj\i386\%bldtype%\inc\"   to="\inc\netidmgr" />\r
-               <File name="nidmgr32.lib"       from="..\target\lib\i386\%bldtype%\"    to="\lib\i386" />\r
-               <File name="xpprof32.lib"       from="..\target\lib\i386\%bldtype%\"    to="\lib\i386" />\r
-               <File name="wshelp32.lib"       from="..\target\lib\i386\%bldtype%\"    to="\lib\i386" />\r
-               <File name="loadfuncs.lib"      from="..\target\lib\i386\%bldtype%\"    to="\lib\i386" />\r
-               <File name="leashw32.lib"       from="..\target\lib\i386\%bldtype%\"    to="\lib\i386" />\r
-               <File name="krbv4w32.lib"       from="..\target\lib\i386\%bldtype%\"    to="\lib\i386" />\r
-               <File name="krbcc32.lib"        from="..\target\lib\i386\%bldtype%\"    to="\lib\i386" />\r
-               <File name="krb5_32.lib"        from="..\target\lib\i386\%bldtype%\"    to="\lib\i386" />\r
-               <File name="krb524.lib" from="..\target\lib\i386\%bldtype%\"    to="\lib\i386" />\r
-               <File name="kclnt32.lib"        from="..\target\lib\i386\%bldtype%\"    to="\lib\i386" />\r
-               <File name="gssapi32.lib"       from="..\target\lib\i386\%bldtype%\"    to="\lib\i386" />\r
-               <File name="getopt.lib" from="..\target\lib\i386\%bldtype%\"    to="\lib\i386" />\r
-               <File name="delaydlls.lib"      from="..\target\lib\i386\%bldtype%\"    to="\lib\i386" />\r
-               <File name="comerr32.lib"       from="..\target\lib\i386\%bldtype%\"    to="\lib\i386" />\r
-               <File name="netidmgr.pdb"       from="auth\krb5\src\windows\identity\obj\i386\%bldtype%\w2k\"   to="\bin\i386\w2k" />\r
-               <File name="nidmgr32.pdb"       from="auth\krb5\src\windows\identity\obj\i386\%bldtype%\w2k\"   to="\bin\i386\w2k" />\r
-               <File name="kfwcpcc.pdb"        from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
-               <File name="kfwlogon.pdb"       from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
-               <File name="netidmgr.pdb"       from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
-               <File name="nidmgr32.pdb"       from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
-               <File name="krb4cred.pdb"       from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
-               <File name="krb5cred.pdb"       from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
-               <File name="mit2ms.pdb" from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
-               <File name="kdeltkt.pdb"        from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
-               <File name="kcpytkt.pdb"        from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
-               <File name="xpprof32.pdb"       from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
-               <File name="wshelp32.pdb"       from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
-               <File name="ms2mit.pdb" from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
-               <File name="leashw32.pdb"       from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
-               <File name="leash32.pdb"        from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
-               <File name="leash32.chm"        from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
-               <File name="kpasswd.pdb"        from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
-               <File name="kvno.pdb"   from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
-               <File name="krbv4w32.pdb"       from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
-               <File name="krbcc32s.pdb"       from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
-               <File name="krbcc32.pdb"        from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
-               <File name="k5sprt32.pdb"       from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
-               <File name="krb5_32.pdb"        from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
-               <File name="krb524.pdb" from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
-               <File name="klist.pdb"  from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
-               <File name="kinit.pdb"  from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
-               <File name="kdestroy.pdb"       from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
-               <File name="kclnt32.pdb"        from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
-               <File name="k524init.pdb"       from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
-               <File name="gssapi32.pdb"       from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
-               <File name="gss-server.pdb"     from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
-               <File name="gss-client.pdb"     from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
-               <File name="gss.pdb"    from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
-               <File name="comerr32.pdb"       from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
-               <File name="netidmgr.exe"       from="auth\krb5\src\windows\identity\obj\i386\%bldtype%\w2k\"   to="\bin\i386\w2k" />\r
-               <File name="nidmgr32.dll"       from="auth\krb5\src\windows\identity\obj\i386\%bldtype%\w2k\"   to="\bin\i386\w2k" />\r
-               <File name="kfwcpcc.exe"        from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
-               <File name="kfwlogon.dll"       from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
-               <File name="netidmgr.chm"       from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
-               <File name="netidmgr.exe"       from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
-               <File name="netiddev.chm"       from="..\target\bin\i386\%bldtype%\"    to="\doc" />\r
-               <File name="nidmgr32.dll"       from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
-               <File name="krb4cred_en_us.dll" from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
-               <File name="krb4cred.dll"       from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
-               <File name="krb5cred_en_us.dll" from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
-               <File name="krb5cred.dll"       from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
-               <File name="mit2ms.exe" from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
-               <File name="kdeltkt.exe"        from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
-               <File name="kcpytkt.exe"        from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
-               <File name="xpprof32.dll"       from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
-               <File name="wshelp32.dll"       from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
-               <File name="ms2mit.exe" from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
-               <File name="leashw32.dll"       from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
-               <File name="leash32.exe"        from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
-               <File name="kpasswd.exe"        from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
-               <File name="kvno.exe"   from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
-               <File name="krbv4w32.dll"       from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
-               <File name="krbcc32s.exe"       from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
-               <File name="krbcc32.dll"        from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
-               <File name="k5sprt32.dll"       from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
-               <File name="krb5_32.dll"        from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
-               <File name="krb524.dll" from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
-               <File name="klist.exe"  from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
-               <File name="kinit.exe"  from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
-               <File name="kdestroy.exe"       from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
-               <File name="kclnt32.dll"        from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
-               <File name="k524init.exe"       from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
-               <File name="gssapi32.dll"       from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
-               <File name="gss-server.exe"     from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
-               <File name="gss-client.exe"     from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
-               <File name="gss.exe"    from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
-               <File name="comerr32.dll"       from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
-               <File name="NetIddev.chm"       from="auth\krb5\src\windows\identity\obj\i386\%bldtype%\doc\"   to="\doc" newname="netiddev.chm" />\r
+        <!-- Build-dependent files (from release or debug build): -->\r
+          <File name="netidmgr_version.h"   from="auth\krb5\src\windows\identity\obj\i386\%bldtype%\inc\"    to="\inc\netidmgr"/>\r
+          <File name="netidmgr.h"           from="auth\krb5\src\windows\identity\obj\i386\%bldtype%\inc\"    to="\inc\netidmgr" />\r
+          <File name="perfstat.h"           from="auth\krb5\src\windows\identity\obj\i386\%bldtype%\inc\"    to="\inc\netidmgr"/>\r
+          <File name="utils.h"              from="auth\krb5\src\windows\identity\obj\i386\%bldtype%\inc\"    to="\inc\netidmgr" />\r
+          <File name="sync.h"               from="auth\krb5\src\windows\identity\obj\i386\%bldtype%\inc\"    to="\inc\netidmgr" />\r
+          <File name="mstring.h"            from="auth\krb5\src\windows\identity\obj\i386\%bldtype%\inc\"    to="\inc\netidmgr" />\r
+          <File name="kplugin.h"            from="auth\krb5\src\windows\identity\obj\i386\%bldtype%\inc\"    to="\inc\netidmgr" />\r
+          <File name="kmq.h"                from="auth\krb5\src\windows\identity\obj\i386\%bldtype%\inc\"    to="\inc\netidmgr" />\r
+          <File name="kmm.h"                from="auth\krb5\src\windows\identity\obj\i386\%bldtype%\inc\"    to="\inc\netidmgr" />\r
+          <File name="khuidefs.h"           from="auth\krb5\src\windows\identity\obj\i386\%bldtype%\inc\"    to="\inc\netidmgr" />\r
+          <File name="khtracker.h"          from="auth\krb5\src\windows\identity\obj\i386\%bldtype%\inc\"    to="\inc\netidmgr" />\r
+          <File name="khrescache.h"         from="auth\krb5\src\windows\identity\obj\i386\%bldtype%\inc\"    to="\inc\netidmgr" />\r
+          <File name="khremote.h"           from="auth\krb5\src\windows\identity\obj\i386\%bldtype%\inc\"    to="\inc\netidmgr" />\r
+          <File name="khprops.h"            from="auth\krb5\src\windows\identity\obj\i386\%bldtype%\inc\"    to="\inc\netidmgr" />\r
+          <File name="khnewcred.h"          from="auth\krb5\src\windows\identity\obj\i386\%bldtype%\inc\"    to="\inc\netidmgr" />\r
+          <File name="khmsgtypes.h"         from="auth\krb5\src\windows\identity\obj\i386\%bldtype%\inc\"    to="\inc\netidmgr" />\r
+          <File name="khlist.h"             from="auth\krb5\src\windows\identity\obj\i386\%bldtype%\inc\"    to="\inc\netidmgr" />\r
+          <File name="khhtlink.h"           from="auth\krb5\src\windows\identity\obj\i386\%bldtype%\inc\"    to="\inc\netidmgr" />\r
+          <File name="kherror.h"            from="auth\krb5\src\windows\identity\obj\i386\%bldtype%\inc\"    to="\inc\netidmgr" />\r
+          <File name="kherr.h"              from="auth\krb5\src\windows\identity\obj\i386\%bldtype%\inc\"    to="\inc\netidmgr" />\r
+          <File name="khdefs.h"             from="auth\krb5\src\windows\identity\obj\i386\%bldtype%\inc\"    to="\inc\netidmgr" />\r
+          <File name="khconfigui.h"         from="auth\krb5\src\windows\identity\obj\i386\%bldtype%\inc\"    to="\inc\netidmgr" />\r
+          <File name="khalerts.h"           from="auth\krb5\src\windows\identity\obj\i386\%bldtype%\inc\"    to="\inc\netidmgr" />\r
+          <File name="khactiondef.h"        from="auth\krb5\src\windows\identity\obj\i386\%bldtype%\inc\"    to="\inc\netidmgr" />\r
+          <File name="khaction.h"           from="auth\krb5\src\windows\identity\obj\i386\%bldtype%\inc\"    to="\inc\netidmgr" />\r
+          <File name="kcreddb.h"            from="auth\krb5\src\windows\identity\obj\i386\%bldtype%\inc\"    to="\inc\netidmgr" />\r
+          <File name="kconfig.h"            from="auth\krb5\src\windows\identity\obj\i386\%bldtype%\inc\"    to="\inc\netidmgr" />\r
+          <File name="hashtable.h"          from="auth\krb5\src\windows\identity\obj\i386\%bldtype%\inc\"    to="\inc\netidmgr" />\r
+          <File name="nidmgr32.lib"         from="..\target\lib\i386\%bldtype%\"    to="\lib\i386" />\r
+          <File name="xpprof32.lib"         from="..\target\lib\i386\%bldtype%\"    to="\lib\i386" />\r
+          <File name="wshelp32.lib"         from="..\target\lib\i386\%bldtype%\"    to="\lib\i386" />\r
+          <File name="loadfuncs.lib"        from="..\target\lib\i386\%bldtype%\"    to="\lib\i386" />\r
+          <File name="leashw32.lib"         from="..\target\lib\i386\%bldtype%\"    to="\lib\i386" />\r
+          <File name="krbv4w32.lib"         from="..\target\lib\i386\%bldtype%\"    to="\lib\i386" />\r
+          <File name="krbcc32.lib"          from="..\target\lib\i386\%bldtype%\"    to="\lib\i386" />\r
+          <File name="krb5_32.lib"          from="..\target\lib\i386\%bldtype%\"    to="\lib\i386" />\r
+          <File name="krb524.lib"           from="..\target\lib\i386\%bldtype%\"    to="\lib\i386" />\r
+          <File name="kclnt32.lib"          from="..\target\lib\i386\%bldtype%\"    to="\lib\i386" />\r
+          <File name="gssapi32.lib"         from="..\target\lib\i386\%bldtype%\"    to="\lib\i386" />\r
+          <File name="getopt.lib"           from="..\target\lib\i386\%bldtype%\"    to="\lib\i386" />\r
+          <File name="delaydlls.lib"        from="..\target\lib\i386\%bldtype%\"    to="\lib\i386" />\r
+          <File name="comerr32.lib"         from="..\target\lib\i386\%bldtype%\"    to="\lib\i386" />\r
+          <File name="netidmgr.exe"         from="auth\krb5\src\windows\identity\obj\i386\%bldtype%\w2k\"    to="\bin\i386\w2k" />\r
+          <File name="nidmgr32.dll"         from="auth\krb5\src\windows\identity\obj\i386\%bldtype%\w2k\"    to="\bin\i386\w2k" />\r
+          <File name="netidmgr.pdb"         from="auth\krb5\src\windows\identity\obj\i386\%bldtype%\w2k\"    to="\bin\i386\w2k" />\r
+          <File name="nidmgr32.pdb"         from="auth\krb5\src\windows\identity\obj\i386\%bldtype%\w2k\"    to="\bin\i386\w2k" />\r
+          <File name="kfwcpcc.pdb"          from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
+          <File name="kfwlogon.pdb"         from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
+          <File name="netidmgr.pdb"         from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
+          <File name="nidmgr32.pdb"         from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
+          <File name="krb4cred.pdb"         from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
+          <File name="krb5cred.pdb"         from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
+          <File name="mit2ms.pdb"           from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
+          <File name="kdeltkt.pdb"          from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
+          <File name="kcpytkt.pdb"          from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
+          <File name="xpprof32.pdb"         from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
+          <File name="wshelp32.pdb"         from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
+          <File name="ms2mit.pdb"           from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
+          <File name="leashw32.pdb"         from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
+          <File name="leash32.pdb"          from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
+          <File name="leash32.chm"          from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
+          <File name="kpasswd.pdb"          from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
+          <File name="kvno.pdb"             from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
+          <File name="krbv4w32.pdb"         from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
+          <File name="krbcc32s.pdb"         from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
+          <File name="krbcc32.pdb"          from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
+          <File name="k5sprt32.pdb"         from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
+          <File name="krb5_32.pdb"          from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
+          <File name="krb524.pdb"           from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
+          <File name="klist.pdb"            from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
+          <File name="kinit.pdb"            from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
+          <File name="kdestroy.pdb"         from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
+          <File name="kclnt32.pdb"          from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
+          <File name="k524init.pdb"         from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
+          <File name="gssapi32.pdb"         from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
+          <File name="gss-server.pdb"       from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
+          <File name="gss-client.pdb"       from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
+          <File name="gss.pdb"              from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
+          <File name="comerr32.pdb"         from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
+          <File name="kfwcpcc.exe"          from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
+          <File name="kfwlogon.dll"         from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
+          <File name="netidmgr.chm"         from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
+          <File name="netidmgr.exe"         from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
+          <File name="nidmgr32.dll"         from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
+          <File name="krb4cred_en_us.dll"   from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
+          <File name="krb4cred.dll"         from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
+          <File name="krb5cred_en_us.dll"   from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
+          <File name="krb5cred.dll"         from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
+          <File name="mit2ms.exe"           from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
+          <File name="kdeltkt.exe"          from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
+          <File name="kcpytkt.exe"          from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
+          <File name="xpprof32.dll"         from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
+          <File name="wshelp32.dll"         from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
+          <File name="ms2mit.exe"           from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
+          <File name="leashw32.dll"         from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
+          <File name="leash32.exe"          from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
+          <File name="kpasswd.exe"          from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
+          <File name="kvno.exe"             from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
+          <File name="krbv4w32.dll"         from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
+          <File name="krbcc32s.exe"         from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
+          <File name="krbcc32.dll"          from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
+          <File name="k5sprt32.dll"         from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
+          <File name="krb5_32.dll"          from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
+          <File name="krb524.dll"           from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
+          <File name="klist.exe"            from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
+          <File name="kinit.exe"            from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
+          <File name="kdestroy.exe"         from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
+          <File name="kclnt32.dll"          from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
+          <File name="k524init.exe"         from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
+          <File name="gssapi32.dll"         from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
+          <File name="gss-server.exe"       from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
+          <File name="gss-client.exe"       from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
+          <File name="gss.exe"              from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
+          <File name="comerr32.dll"         from="..\target\bin\i386\%bldtype%\"    to="\bin\i386" />\r
+          <File name="netiddev.chm"         from="..\target\bin\i386\%bldtype%\"                            to="\doc" />\r
+          <File name="NetIddev.chm"         from="auth\krb5\src\windows\identity\obj\i386\%bldtype%\doc\"   to="\doc" newname="netiddev.chm" />\r
 \r
-               <!-- Build-INdependent files, always copied: -->\r
-               <File name="relnotes.html"      from="..\doc\kerberos\" to="\doc" />\r
-               <File name="leash_userdoc.pdf"  from="auth\leash\help\" to="\doc" />\r
-               <File name="NetIdMgr.pdf" from="auth\krb5\src\windows\identity\doc\" to="\doc" newname="netidmgr_userdoc.pdf" />\r
-               <File name="*"  from="auth\krb5\src\windows\identity\sample\templates\credprov\"        to="\sample\templates\credprov\" />\r
-               <File name="*"  from="auth\krb5\src\windows\identity\sample\templates\credprov\images\" to="\sample\templates\credprov\images" />\r
-               <File name="*"  from="auth\krb5\src\windows\identity\sample\templates\credprov\lang\"   to="\sample\templates\credprov\lang" />\r
-               <File name="*"  from="auth\krb5\src\windows\identity\sample\templates\credprov\lang\en_us\"     to="\sample\templates\credprov\lang\en_us" />\r
-               <File name="kclient.h"  from="auth\krb4\kclient\include\"       to="\inc\kclient" />\r
-               <File name="kcmacerr.h" from="auth\krb4\kclient\include\"       to="\inc\kclient" />\r
-               <File name="com_err.h"  from="auth\krb4\include\"       to="\inc\krb4" />\r
-               <File name="conf-pc.h"  from="auth\krb4\include\"       to="\inc\krb4" />\r
-               <File name="conf.h"     from="auth\krb4\include\"       to="\inc\krb4" />\r
-               <File name="des.h"      from="auth\krb4\include\"       to="\inc\krb4" />\r
-               <File name="kadm_err.h" from="auth\krb4\include\"       to="\inc\krb4" />\r
-               <File name="krb.h"      from="auth\krb4\include\"       to="\inc\krb4" />\r
-               <File name="krberr.h"   from="auth\krb4\include\"       to="\inc\krb4" />\r
-               <File name="mit_copy.h" from="auth\krb4\include\"       to="\inc\krb4" />\r
-               <File name="osconf.h"   from="auth\krb4\include\"       to="\inc\krb4" />\r
-               <File name="com_err.h"  from="auth\krb5\src\include\"   to="\inc\krb5" />\r
-               <File name="gssapi.h"   from="auth\krb5\src\include\gssapi\"    to="\inc\krb5\gssapi" />\r
-               <File name="gssapi_generic.h"   from="auth\krb5\src\include\gssapi\"    to="\inc\krb5\gssapi" />\r
-               <File name="gssapi_krb5.h"      from="auth\krb5\src\include\gssapi\"    to="\inc\krb5\gssapi" />\r
-               <File name="des.h"      from="auth\krb5\src\include\KerberosIV\"        to="\inc\krb5\KerberosIV" />\r
-               <File name="kadm_err.h" from="auth\krb5\src\include\KerberosIV\"        to="\inc\krb5\KerberosIV" />\r
-               <File name="krb_err.h"  from="auth\krb5\src\include\KerberosIV\"        to="\inc\krb5\KerberosIV" />\r
-               <File name="krb.h"      from="auth\krb5\src\include\KerberosIV\"        to="\inc\krb5\KerberosIV" />\r
-               <File name="mit-copyright.h"    from="auth\krb5\src\include\KerberosIV\"        to="\inc\krb5\KerberosIV" />\r
-               <File name="krb5.h"     from="auth\krb5\src\include\"   to="\inc\krb5" />\r
-               <File name="profile.h"  from="auth\krb5\src\include\"   to="\inc\krb5" />\r
-               <File name="win-mac.h"  from="auth\krb5\src\include\"   to="\inc\krb5" />\r
-               <File name="krb5.h"     from="auth\krb5\src\include\krb5\"      to="\inc\krb5\krb5" notrequired="true" />\r
-               <File name="cacheapi.h" from="auth\krbcc\include\"      to="\inc\krbcc" />\r
-               <File name="leasherr.h" from="auth\leash\include\"      to="\inc\leash" />\r
-               <File name="leashinfo.h"        from="auth\leash\include\"      to="\inc\leash" />\r
-               <File name="leashwin.h" from="auth\leash\include\"      to="\inc\leash" />\r
-               <File name="loadfuncs-afs.h"    from="util\loadfuncs\"  to="\inc\loadfuncs" />\r
-               <File name="loadfuncs-afs36.h"  from="util\loadfuncs\"  to="\inc\loadfuncs" />\r
-               <File name="loadfuncs-com_err.h"        from="util\loadfuncs\"  to="\inc\loadfuncs" />\r
-               <File name="loadfuncs-krb.h"    from="util\loadfuncs\"  to="\inc\loadfuncs" />\r
-               <File name="loadfuncs-krb5.h"   from="util\loadfuncs\"  to="\inc\loadfuncs" />\r
-               <File name="loadfuncs-krb524.h" from="util\loadfuncs\"  to="\inc\loadfuncs" />\r
-               <File name="loadfuncs-leash.h"  from="util\loadfuncs\"  to="\inc\loadfuncs" />\r
-               <File name="loadfuncs-lsa.h"    from="util\loadfuncs\"  to="\inc\loadfuncs" />\r
-               <File name="loadfuncs-profile.h"        from="util\loadfuncs\"  to="\inc\loadfuncs" />\r
-               <File name="loadfuncs-wshelper.h"       from="util\loadfuncs\"  to="\inc\loadfuncs" />\r
-               <File name="loadfuncs.c"        from="util\loadfuncs\"  to="\inc\loadfuncs" />\r
-               <File name="loadfuncs.h"        from="util\loadfuncs\"  to="\inc\loadfuncs" />\r
-               <File name="nameser.h"  from="wshelper\include\arpa\"   to="\inc\wshelper\arpa" />\r
-               <File name="hesiod.h"   from="wshelper\include\"        to="\inc\wshelper" />\r
-               <File name="mitwhich.h" from="wshelper\include\"        to="\inc\wshelper" />\r
-               <File name="resolv.h"   from="wshelper\include\"        to="\inc\wshelper" />\r
-               <File name="wshelper.h" from="wshelper\include\"        to="\inc\wshelper" />\r
-               <File name="kfw-fixed.nsi"      from="auth\krb5\src\windows\installer\nsis\"    to="\install\nsis" />\r
-               <File name="kfw.ico"    from="auth\krb5\src\windows\installer\nsis\"    to="\install\nsis" />\r
-               <File name="kfw.nsi"    from="auth\krb5\src\windows\installer\nsis\"    to="\install\nsis" />\r
-               <File name="KfWConfigPage.ini"  from="auth\krb5\src\windows\installer\nsis\"    to="\install\nsis" />\r
-               <File name="KfWConfigPage2.ini" from="auth\krb5\src\windows\installer\nsis\"    to="\install\nsis" />\r
-               <File name="killer.cpp" from="auth\krb5\src\windows\installer\nsis\"    to="\install\nsis" />\r
-               <File name="licenses.rtf"       from="auth\krb5\src\windows\installer\nsis\"    to="\install\nsis" />\r
-               <File name="site-local-tagged.nsi"      from="auth\krb5\src\windows\installer\nsis\"    to="\install\nsis" />\r
-               <File name="nsi-includes-tagged.nsi"    from="auth\krb5\src\windows\installer\nsis\"    to="\install\nsis" />\r
-               <File name="utils.nsi"  from="auth\krb5\src\windows\installer\nsis\"    to="\install\nsis" />\r
-               <File name="msi-deployment-guide.txt"   from="auth\krb5\src\windows\installer\wix\"     to="\install\wix" />\r
-               <File name="config.wxi" from="auth\krb5\src\windows\installer\wix\"     to="\install\wix" />\r
-               <File name="features.wxi"       from="auth\krb5\src\windows\installer\wix\"     to="\install\wix" />\r
-               <File name="files.wxi"  from="auth\krb5\src\windows\installer\wix\"     to="\install\wix" />\r
-               <File name="kfw.wxs"    from="auth\krb5\src\windows\installer\wix\"     to="\install\wix" />\r
-               <File name="Makefile"   from="auth\krb5\src\windows\installer\wix\"     to="\install\wix" />\r
-               <File name="property.wxi"       from="auth\krb5\src\windows\installer\wix\"     to="\install\wix" />\r
-               <File name="site-local-tagged.wxi"      from="auth\krb5\src\windows\installer\wix\"     to="\install\wix" />\r
-               <File name="bannrbmp.bmp"       from="auth\krb5\src\windows\installer\wix\Binary\"      to="\install\wix\Binary" />\r
-               <File name="completi.ico"       from="auth\krb5\src\windows\installer\wix\Binary\"      to="\install\wix\Binary" />\r
-               <File name="custicon.ico"       from="auth\krb5\src\windows\installer\wix\Binary\"      to="\install\wix\Binary" />\r
-               <File name="dlgbmp.bmp" from="auth\krb5\src\windows\installer\wix\Binary\"      to="\install\wix\Binary" />\r
-               <File name="exclamic.ico"       from="auth\krb5\src\windows\installer\wix\Binary\"      to="\install\wix\Binary" />\r
-               <File name="info.bmp"   from="auth\krb5\src\windows\installer\wix\Binary\"      to="\install\wix\Binary" />\r
-               <File name="insticon.ico"       from="auth\krb5\src\windows\installer\wix\Binary\"      to="\install\wix\Binary" />\r
-               <File name="new.bmp"    from="auth\krb5\src\windows\installer\wix\Binary\"      to="\install\wix\Binary" />\r
-               <File name="removico.ico"       from="auth\krb5\src\windows\installer\wix\Binary\"      to="\install\wix\Binary" />\r
-               <File name="repairic.ico"       from="auth\krb5\src\windows\installer\wix\Binary\"      to="\install\wix\Binary" />\r
-               <File name="up.bmp"     from="auth\krb5\src\windows\installer\wix\Binary\"      to="\install\wix\Binary" />\r
-               <File name="custom.cpp" from="auth\krb5\src\windows\installer\wix\custom\"      to="\install\wix\custom" />\r
-               <File name="custom.h"   from="auth\krb5\src\windows\installer\wix\custom\"      to="\install\wix\custom" />\r
-               <File name="config_1033.wxi"    from="auth\krb5\src\windows\installer\wix\lang\"        to="\install\wix\lang" />\r
-               <File name="strings_1033.wxl"   from="auth\krb5\src\windows\installer\wix\lang\"        to="\install\wix\lang" />\r
-               <File name="ui_1033.wxi"        from="auth\krb5\src\windows\installer\wix\lang\"        to="\install\wix\lang" />\r
-               <File name="license.rtf"        from="auth\krb5\src\windows\installer\wix\lang\"        to="\install\wix\lang" />\r
-               <File name="krb5.conf"  from="auth\krb5\src\config-files\"      to="\sample" newname="krb5.ini" />\r
-               <File name="krb.con"    from="auth\krb4\sample-config\" to="\sample" />\r
-               <File name="krbrealm.con"       from="auth\krb4\sample-config\" to="\sample" />\r
-       </Files>
\ No newline at end of file
+        <!-- Build-INdependent files, always copied: -->\r
+        <File name="relnotes.html"          from="..\doc\kerberos\"                                         to="\doc" />\r
+        <File name="leash_userdoc.pdf"      from="auth\leash\help\"                                         to="\doc" />\r
+        <File name="NetIdMgr.pdf"           from="auth\krb5\src\windows\identity\doc\"                      to="\doc" newname="netidmgr_userdoc.pdf" />\r
+        <File name="*"                      from="auth\krb5\src\windows\identity\sample\templates\credprov\"            to="\sample\templates\credprov\" />\r
+        <File name="*"                      from="auth\krb5\src\windows\identity\sample\templates\credprov\images\"     to="\sample\templates\credprov\images" />\r
+        <File name="*"                      from="auth\krb5\src\windows\identity\sample\templates\credprov\lang\"       to="\sample\templates\credprov\lang" />\r
+        <File name="*"                      from="auth\krb5\src\windows\identity\sample\templates\credprov\lang\en_us\" to="\sample\templates\credprov\lang\en_us" />\r
+        <File name="kclient.h"              from="auth\krb4\kclient\include\"    to="\inc\kclient" />\r
+        <File name="kcmacerr.h"             from="auth\krb4\kclient\include\"    to="\inc\kclient" />\r
+        <File name="com_err.h"              from="auth\krb4\include\"    to="\inc\krb4" />\r
+        <File name="conf-pc.h"              from="auth\krb4\include\"    to="\inc\krb4" />\r
+        <File name="conf.h"                 from="auth\krb4\include\"    to="\inc\krb4" />\r
+        <File name="des.h"                  from="auth\krb4\include\"    to="\inc\krb4" />\r
+        <File name="kadm_err.h"             from="auth\krb4\include\"    to="\inc\krb4" />\r
+        <File name="krb.h"                  from="auth\krb4\include\"    to="\inc\krb4" />\r
+        <File name="krberr.h"               from="auth\krb4\include\"    to="\inc\krb4" />\r
+        <File name="mit_copy.h"             from="auth\krb4\include\"    to="\inc\krb4" />\r
+        <File name="osconf.h"               from="auth\krb4\include\"    to="\inc\krb4" />\r
+        <File name="com_err.h"              from="auth\krb5\src\include\"       to="\inc\krb5" />\r
+        <File name="krb5.h"                 from="auth\krb5\src\include\"       to="\inc\krb5" />\r
+        <File name="profile.h"              from="auth\krb5\src\include\"       to="\inc\krb5" />\r
+        <File name="win-mac.h"              from="auth\krb5\src\include\"       to="\inc\krb5" />\r
+        <File name="krb5.h"                 from="auth\krb5\src\include\krb5\"  to="\inc\krb5\krb5" notrequired="true" />\r
+        <File name="gssapi.h"               from="auth\krb5\src\include\gssapi\"    to="\inc\krb5\gssapi" />\r
+        <File name="gssapi_generic.h"       from="auth\krb5\src\include\gssapi\"    to="\inc\krb5\gssapi" />\r
+        <File name="gssapi_krb5.h"          from="auth\krb5\src\include\gssapi\"    to="\inc\krb5\gssapi" />\r
+        <File name="des.h"                  from="auth\krb5\src\include\KerberosIV\"    to="\inc\krb5\KerberosIV" />\r
+        <File name="kadm_err.h"             from="auth\krb5\src\include\KerberosIV\"    to="\inc\krb5\KerberosIV" />\r
+        <File name="krb_err.h"              from="auth\krb5\src\include\KerberosIV\"    to="\inc\krb5\KerberosIV" />\r
+        <File name="krb.h"                  from="auth\krb5\src\include\KerberosIV\"    to="\inc\krb5\KerberosIV" />\r
+        <File name="mit-copyright.h"        from="auth\krb5\src\include\KerberosIV\"    to="\inc\krb5\KerberosIV" />\r
+        <File name="cacheapi.h"             from="auth\krbcc\include\"    to="\inc\krbcc" />\r
+        <File name="leasherr.h"             from="auth\leash\include\"    to="\inc\leash" />\r
+        <File name="leashinfo.h"            from="auth\leash\include\"    to="\inc\leash" />\r
+        <File name="leashwin.h"             from="auth\leash\include\"    to="\inc\leash" />\r
+        <File name="loadfuncs-afs.h"        from="util\loadfuncs\"    to="\inc\loadfuncs" />\r
+        <File name="loadfuncs-afs36.h"      from="util\loadfuncs\"    to="\inc\loadfuncs" />\r
+        <File name="loadfuncs-com_err.h"    from="util\loadfuncs\"    to="\inc\loadfuncs" />\r
+        <File name="loadfuncs-krb.h"        from="util\loadfuncs\"    to="\inc\loadfuncs" />\r
+        <File name="loadfuncs-krb5.h"       from="util\loadfuncs\"    to="\inc\loadfuncs" />\r
+        <File name="loadfuncs-krb524.h"     from="util\loadfuncs\"    to="\inc\loadfuncs" />\r
+        <File name="loadfuncs-leash.h"      from="util\loadfuncs\"    to="\inc\loadfuncs" />\r
+        <File name="loadfuncs-lsa.h"        from="util\loadfuncs\"    to="\inc\loadfuncs" />\r
+        <File name="loadfuncs-profile.h"    from="util\loadfuncs\"    to="\inc\loadfuncs" />\r
+        <File name="loadfuncs-wshelper.h"   from="util\loadfuncs\"    to="\inc\loadfuncs" />\r
+        <File name="loadfuncs.c"            from="util\loadfuncs\"    to="\inc\loadfuncs" />\r
+        <File name="loadfuncs.h"            from="util\loadfuncs\"    to="\inc\loadfuncs" />\r
+        <File name="nameser.h"              from="wshelper\include\arpa\"   to="\inc\wshelper\arpa" />\r
+        <File name="hesiod.h"               from="wshelper\include\"        to="\inc\wshelper" />\r
+        <File name="mitwhich.h"             from="wshelper\include\"        to="\inc\wshelper" />\r
+        <File name="resolv.h"               from="wshelper\include\"        to="\inc\wshelper" />\r
+        <File name="wshelper.h"             from="wshelper\include\"        to="\inc\wshelper" />\r
+        <File name="kfw-fixed.nsi"          from="auth\krb5\src\windows\installer\nsis\"    to="\install\nsis" />\r
+        <File name="kfw.ico"                from="auth\krb5\src\windows\installer\nsis\"    to="\install\nsis" />\r
+        <File name="kfw.nsi"                from="auth\krb5\src\windows\installer\nsis\"    to="\install\nsis" />\r
+        <File name="KfWConfigPage.ini"      from="auth\krb5\src\windows\installer\nsis\"    to="\install\nsis" />\r
+        <File name="KfWConfigPage2.ini"     from="auth\krb5\src\windows\installer\nsis\"    to="\install\nsis" />\r
+        <File name="killer.cpp"             from="auth\krb5\src\windows\installer\nsis\"    to="\install\nsis" />\r
+        <File name="licenses.rtf"           from="auth\krb5\src\windows\installer\nsis\"    to="\install\nsis" />\r
+        <File name="site-local-tagged.nsi"  from="auth\krb5\src\windows\installer\nsis\"    to="\install\nsis" />\r
+        <File name="nsi-includes-tagged.nsi" from="auth\krb5\src\windows\installer\nsis\"   to="\install\nsis" />\r
+        <File name="utils.nsi"              from="auth\krb5\src\windows\installer\nsis\"    to="\install\nsis" />\r
+        <File name="msi-deployment-guide.txt" from="auth\krb5\src\windows\installer\wix\"   to="\install\wix" />\r
+        <File name="config.wxi"             from="auth\krb5\src\windows\installer\wix\"     to="\install\wix" />\r
+        <File name="features.wxi"           from="auth\krb5\src\windows\installer\wix\"     to="\install\wix" />\r
+        <File name="files.wxi"              from="auth\krb5\src\windows\installer\wix\"     to="\install\wix" />\r
+        <File name="kfw.wxs"                from="auth\krb5\src\windows\installer\wix\"     to="\install\wix" />\r
+        <File name="Makefile"               from="auth\krb5\src\windows\installer\wix\"     to="\install\wix" />\r
+        <File name="property.wxi"           from="auth\krb5\src\windows\installer\wix\"     to="\install\wix" />\r
+        <File name="site-local-tagged.wxi"  from="auth\krb5\src\windows\installer\wix\"     to="\install\wix" />\r
+        <File name="bannrbmp.bmp"           from="auth\krb5\src\windows\installer\wix\Binary\"  to="\install\wix\Binary" />\r
+        <File name="completi.ico"           from="auth\krb5\src\windows\installer\wix\Binary\"  to="\install\wix\Binary" />\r
+        <File name="custicon.ico"           from="auth\krb5\src\windows\installer\wix\Binary\"  to="\install\wix\Binary" />\r
+        <File name="dlgbmp.bmp"             from="auth\krb5\src\windows\installer\wix\Binary\"  to="\install\wix\Binary" />\r
+        <File name="exclamic.ico"           from="auth\krb5\src\windows\installer\wix\Binary\"  to="\install\wix\Binary" />\r
+        <File name="info.bmp"               from="auth\krb5\src\windows\installer\wix\Binary\"  to="\install\wix\Binary" />\r
+        <File name="insticon.ico"           from="auth\krb5\src\windows\installer\wix\Binary\"  to="\install\wix\Binary" />\r
+        <File name="new.bmp"                from="auth\krb5\src\windows\installer\wix\Binary\"  to="\install\wix\Binary" />\r
+        <File name="removico.ico"           from="auth\krb5\src\windows\installer\wix\Binary\"  to="\install\wix\Binary" />\r
+        <File name="repairic.ico"           from="auth\krb5\src\windows\installer\wix\Binary\"  to="\install\wix\Binary" />\r
+        <File name="up.bmp"                 from="auth\krb5\src\windows\installer\wix\Binary\"  to="\install\wix\Binary" />\r
+        <File name="custom.cpp"             from="auth\krb5\src\windows\installer\wix\custom\"  to="\install\wix\custom" />\r
+        <File name="custom.h"               from="auth\krb5\src\windows\installer\wix\custom\"  to="\install\wix\custom" />\r
+        <File name="config_1033.wxi"        from="auth\krb5\src\windows\installer\wix\lang\"    to="\install\wix\lang" />\r
+        <File name="strings_1033.wxl"       from="auth\krb5\src\windows\installer\wix\lang\"    to="\install\wix\lang" />\r
+        <File name="ui_1033.wxi"            from="auth\krb5\src\windows\installer\wix\lang\"    to="\install\wix\lang" />\r
+        <File name="license.rtf"            from="auth\krb5\src\windows\installer\wix\lang\"    to="\install\wix\lang" />\r
+        <File name="krb5.conf"              from="auth\krb5\src\config-files\"  to="\sample" newname="krb5.ini" />\r
+        <File name="krb.con"                from="auth\krb4\sample-config\"     to="\sample" />\r
+        <File name="krbrealm.con"           from="auth\krb4\sample-config\"     to="\sample" />\r
+    </Files>
\ No newline at end of file
diff --git a/src/windows/build/makeZip.pl b/src/windows/build/makeZip.pl
new file mode 100644 (file)
index 0000000..ab11005
--- /dev/null
@@ -0,0 +1,108 @@
+#!perl -w\r
+\r
+#use strict;\r
+use Data::Dumper;\r
+\r
+require "signfiles.pl";\r
+\r
+sub makeZip {\r
+    local ($zip, $config)   = @_;\r
+\r
+    local $src          = $config->{CommandLine}->{Directories}->{src}->{path};\r
+    local $toPath       = $config->{CommandLine}->{Directories}->{out}->{path};\r
+    local @switches     = $config->{CommandLine}->{Options};\r
+    local $zipname      = $zip->{filename};\r
+    local $filestem     = $config->{Stages}->{PostPackage}->{Config}->{FileStem}->{name};\r
+    $zipname            =~ s/%filestem%/$filestem/g;\r
+    if (exists $zip->{Requires}) {\r
+        local $bMakeIt  = 1;\r
+        local $rverb    = $switches[0]->{repository}->{value};\r
+        local $j        = 0;\r
+        while ($zip->{Requires}->{Switch}[$j]) {                    ## Check Require switches\r
+            local $switch    = $zip->{Requires}->{Switch}[$j];\r
+            if (exists $switch->{name}) {                           ## Ignore dummy entry\r
+                # We handle REPOSITORY and CLEAN switches:\r
+                if ($switch->{name} =~ /REPOSITORY/i) {\r
+                    $bMakeIt &&= ($switch->{value} =~ /$rverb/i);   ## Repository verb must match requirement\r
+                    }\r
+                 elsif ($switch->{name} =~ /CLEAN/i) {               ## Clean must be specified\r
+                    $bMakeIt &&= $clean;\r
+                    }\r
+                 else {print "Error -- Unsupported switch $switch->{name} in Requires in ".Dumper($zip);\r
+                    $bMakeIt    = 0;\r
+                    }\r
+                 }\r
+             $j++;\r
+             }   \r
+        if ( !$bMakeIt ) {\r
+            if (exists $zip->{Requires}->{ErrorMsg}) {\r
+                print "Error -- $zip->{Requires}->{ErrorMsg}->{text}\n";\r
+                }\r
+            else {\r
+                print "Error -- requirements not met for building $zipname.\n";\r
+                }\r
+            return 0;\r
+            }\r
+        }\r
+        \r
+    local $ziptemp    = "$src\\$toPath\\ziptemp";\r
+    chdir "$src\\$toPath";\r
+    print "Info -- chdir to ".`cd`."\n"         if ($verbose);\r
+    system("rm -rf $ziptemp")                 if (-d $ziptemp);\r
+    die "Fatal -- Couldn't remove $ziptemp"   if (-d $ziptemp);\r
+    mkdir($ziptemp);\r
+    # Set up the zip's config section:\r
+    $zip->{Config}                                  = $config->{Stages}->{PostPackage}->{Config};\r
+    # Add to the copylist's config section.  Don't copy Postpackage->Config, \r
+    #  because the CopyList's Config might contain substitution tags.\r
+    $zip->{CopyList}->{Config}->{FileStem}->{name}  = $config->{Stages}->{PostPackage}->{Config}->{FileStem}->{name};\r
+    $zip->{CopyList}->{Config}->{From}->{root}      = "$src\\pismere";  ## Add zip-specific config settings.\r
+    $zip->{CopyList}->{Config}->{To}->{root}        = "$ziptemp\\$zip->{topdir}";\r
+    copyFiles($zip->{CopyList}, $config);\r
+    # Drop down into <out>/ziptemp so the path to the added file won't include <out>:\r
+    chdir $ziptemp;\r
+    print "Info -- chdir to ".`cd`."\n"         if ($verbose);\r
+\r
+    # Prune any unwanted files or directories from the directory we're about to zip:\r
+    if (exists $zip->{Prunes}) {\r
+        # Use Unix find instead of Windows find.  Save PATH so we can restore it when we're done:\r
+        local $savedPATH    = $ENV{PATH};\r
+        $ENV{PATH}          = $config->{CommandLine}->{Directories}->{unixfind}->{path}.";".$savedPATH;\r
+        local $prunes       = $zip->{Prunes};\r
+        local $j            = 0;\r
+        print "Info -- Processing prunes in ".`cd`."\n" if ($verbose);\r
+        while ($prunes->{Prune}->[$j]) {\r
+            if (exists $prunes->{Prune}->[$j]->{name}) {        ## Don't process dummy entry!\r
+                local $prune    = $prunes->{Prune}->[$j]->{name};\r
+                local $flags    = $prunes->{Prune}->[$j]->{flags};\r
+                $flags = "" if (!$flags);\r
+                local $cmd    = "find . -".$flags."name $prune";\r
+                print "Info -- Looking for filenames containing $prune\n";\r
+                local $list = `$cmd`;\r
+                foreach $target (split("\n", $list)) {\r
+                    print "Info -- Pruning $target\n" if ($verbose);\r
+                    !system("rm -rf $target")   or die "Error -- Couldn't remove $target.";;\r
+                    }\r
+                }\r
+            $j++;\r
+            }\r
+        $ENV{PATH} = $savedPATH;\r
+        }\r
+                    \r
+    # Sign files:\r
+    if ($switches[0]->{sign}->{value}) {\r
+        signFiles($zip->{Config}->{Signing}, $config);\r
+        }\r
+            \r
+    local $zipfile  = Archive::Zip->new();\r
+    local $topdir   = $zip->{topdir};\r
+    $topdir         =~ s/%filestem%/$filestem/g;\r
+    $zipfile->addTree('.', $topdir);\r
+    if (-e $zipname)    {!system("rm -f $zipname")     or die "Error -- Couldn't remove $zipname.";}\r
+    $zipfile->writeToFileNamed($zipname);\r
+    print "Info -- created $src\\$toPath\\$zipname.\n"  if ($verbose);\r
+       # move .zip from <src>/<out>/ziptemp to <src>/<out>.\r
+    !system("mv -f $zipname     ..")                    or die "Error -- Couldn't move $zipname to ..";\r
+    }\r
+    \r
+return 1;
\ No newline at end of file
index d80a681d7c6ee652f6e749eff1d81db21fff5b33..35535854145ee678ad616200ce8e82cdefe8a66d 100644 (file)
 <?xml version="1.0" encoding="utf-8" ?>\r
        <Files>\r
                <!-- File from  paths are relative to <src>/pismere.    -->\r
-               <!-- File to                    paths are relative to <out>.                                    -->\r
-               <File dummy="foo" /> <!-- Forces XML::Simple behavior -->\r
+               <!-- File to    paths are relative to <out>.                    -->\r
+               <File dummy="foo" /> <!-- Forces XML::Simple behavior   -->\r
                        <!-- Without this, XML::Simple does not make an anonymous array and I can't figure out how to iterate over it. -->\r
 \r
-               <File name="relnotes.html" from="doc\kerberos" to="doc" />\r
-               <File name="kclient.rtf" from="athena\auth\krb4\kclient\doc" to="doc" />\r
+               <File name="relnotes.html"  from="doc\kerberos"                 to="doc" />\r
+               <File name="kclient.rtf"    from="athena\auth\krb4\kclient\doc" to="doc" />\r
 \r
-               <File  name="*.h" from="staging\inc" to="inc" />\r
-<!--   \r
-               <File  name="*.h" from="staging\inc\kclient" to="inc\kclient\" />\r
-               <File  name="*.h" from="staging\inc\krb4" to="inc\krb4\" />\r
-               <File  name="*.h" from="staging\inc\krb5" to="inc\krb5\" />\r
+               <File  name="*.h"           from="staging\inc"                  to="inc" />\r
 \r
-               <File  name="gssapi.h" from="" to="" inc\krb5\gssapi\\r
-               <File  name="gssapi_generic.h" from="" to="" inc\krb5\gssapi\\r
-               <File  name="gssapi_krb5.h" from="" to="" inc\krb5\gssapi\\r
+               <File  name="*.*"           from="staging\install\nsis"         to="install\nsis\" />\r
 \r
-               <File  name="des.h" from="" to="" inc\krb5\KerberosIV\\r
-               <File  name="kadm_err.h" from="" to="" inc\krb5\KerberosIV\\r
-               <File  name="krb.h" from="" to="" inc\krb5\KerberosIV\\r
-               <File  name="krb_err.h" from="" to="" inc\krb5\KerberosIV\\r
-               <File  name="mit-copyright.h" from="" to="" inc\krb5\KerberosIV\\r
+               <File  name="MITKerberosForWindows%-DEBUG%.exe"\r
+                                           from="staging\install\nsis"         to="install\nsis\"  newname="%filestem%.exe" />\r
+        <!-- We'll clean up the MITKerberosForWindows.exe in the target directory in a later step.  -->\r
 \r
-               <File  name="krb5.h" from="" to="" inc\krb5\krb5\\r
-\r
-               <File  name="cacheapi.h" from="" to="" inc\krbcc\\r
-\r
-               <File  name="leasherr.h" from="" to="" inc\leash\\r
-               <File  name="leashinfo.h" from="" to="" inc\leash\\r
-               <File  name="leashwin.h" from="" to="" inc\leash\\r
-\r
-               <File  name="loadfuncs.h" from="" to="" inc\loadfuncs\\r
-               <File  name="loadfuncs-afs.h" from="" to="" inc\loadfuncs\\r
-               <File  name="loadfuncs-afs36.h" from="" to="" inc\loadfuncs\\r
-               <File  name="loadfuncs-com_err.h" from="" to="" inc\loadfuncs\\r
-               <File  name="loadfuncs-krb.h" from="" to="" inc\loadfuncs\\r
-               <File  name="loadfuncs-krb5.h" from="" to="" inc\loadfuncs\\r
-               <File  name="loadfuncs-krb524.h" from="" to="" inc\loadfuncs\\r
-               <File  name="loadfuncs-leash.h" from="" to="" inc\loadfuncs\\r
-               <File  name="loadfuncs-lsa.h" from="" to="" inc\loadfuncs\\r
-               <File  name="loadfuncs-profile.h" from="" to="" inc\loadfuncs\\r
-               <File  name="loadfuncs-wshelper.h" from="" to="" inc\loadfuncs\\r
-\r
-               <File  name="loadfuncs.c" from="" to="" inc\loadfuncs\\r
-\r
-               <File  name="hashtable.h" from="" to="" inc\netidmgr\\r
-               <File  name="kconfig.h" from="" to="" inc\netidmgr\\r
-               <File  name="kcreddb.h" from="" to="" inc\netidmgr\\r
-               <File  name="khaction.h" from="" to="" inc\netidmgr\\r
-               <File  name="khactiondef.h" from="" to="" inc\netidmgr\\r
-               <File  name="khalerts.h" from="" to="" inc\netidmgr\\r
-               <File  name="khconfigui.h" from="" to="" inc\netidmgr\\r
-               <File  name="khdefs.h" from="" to="" inc\netidmgr\\r
-               <File  name="kherr.h" from="" to="" inc\netidmgr\\r
-               <File  name="kherror.h" from="" to="" inc\netidmgr\\r
-               <File  name="khhtlink.h" from="" to="" inc\netidmgr\\r
-               <File  name="khlist.h" from="" to="" inc\netidmgr\\r
-               <File  name="khmsgtypes.h" from="" to="" inc\netidmgr\\r
-               <File  name="khnewcred.h" from="" to="" inc\netidmgr\\r
-               <File  name="khprops.h" from="" to="" inc\netidmgr\\r
-               <File  name="khremote.h" from="" to="" inc\netidmgr\\r
-               <File  name="khrescache.h" from="" to="" inc\netidmgr\\r
-               <File  name="khtracker.h" from="" to="" inc\netidmgr\\r
-               <File  name="khuidefs.h" from="" to="" inc\netidmgr\\r
-               <File  name="kmm.h" from="" to="" inc\netidmgr\\r
-               <File  name="kmq.h" from="" to="" inc\netidmgr\\r
-               <File  name="kplugin.h" from="" to="" inc\netidmgr\\r
-               <File  name="mstring.h" from="" to="" inc\netidmgr\\r
-               <File  name="netidmgr.h" from="" to="" inc\netidmgr\\r
-               <File  name="netidmgr_version.h" from="" to="" inc\netidmgr\\r
-               <File  name="perfstat.h" from="" to="" inc\netidmgr\\r
-               <File  name="sync.h" from="" to="" inc\netidmgr\\r
-               <File  name="utils.h" from="" to="" inc\netidmgr\\r
-\r
-               <File  name="nameser.h" from="" to="" inc\wshelper\arpa\\r
-\r
-               <File  name="hesiod.h" from="" to="" inc\wshelper\\r
-               <File  name="mitwhich.h" from="" to="" inc\wshelper\\r
-               <File  name="resolv.h" from="" to="" inc\wshelper\\r
-               <File  name="wshelper.h" from="" to="" inc\wshelper\\r
--->\r
-\r
-               <File  name="*.*" from="staging\install\nsis" to="install\nsis\" />\r
-<!--           <File  name="kfw-fixed.nsi" from="" to="" install\nsis\\r
-               <File  name="kfw.ico" from="" to="" install\nsis\\r
-               <File  name="kfw.nsi" from="" to="" install\nsis\\r
-               <File  name="KfWConfigPage.ini" from="" to="" install\nsis\\r
-               <File  name="KfWConfigPage2.ini" from="" to="" install\nsis\\r
-               <File  name="killer.cpp" from="" to="" install\nsis\\r
-               <File  name="licenses.rtf" from="" to="" install\nsis\\r
-               <File  name="site-local.nsi" from="" to="" install\nsis\\r
-               <File  name="utils.nsi" from="" to="" install\nsis\\r
--->\r
-\r
-               <File  name="config.wxi" from="staging\install\wix" to="install\wix\" />\r
-               <File  name="features.wxi" from="staging\install\wix" to="install\wix\" />\r
-               <File  name="files.wxi" from="staging\install\wix" to="install\wix\" />\r
-               <File  name="kfw.wxs" from="staging\install\wix" to="install\wix\" />\r
-               <File  name="Makefile" from="staging\install\wix" to="install\wix\" />\r
+               <File  name="config.wxi"    from="staging\install\wix"          to="install\wix\" />\r
+               <File  name="features.wxi"  from="staging\install\wix"          to="install\wix\" />\r
+               <File  name="files.wxi"     from="staging\install\wix"          to="install\wix\" />\r
+               <File  name="kfw.wxs"       from="staging\install\wix"          to="install\wix\" />\r
+               <File  name="Makefile"      from="staging\install\wix"          to="install\wix\" />\r
                <File  name="msi-deployment-guide.txt" from="staging\install\wix" to="install\wix\" />\r
-               <File  name="property.wxi" from="staging\install\wix" to="install\wix\" />\r
-               <File  name="site-local.wxi" from="staging\install\wix" to="install\wix\" />\r
+               <File  name="property.wxi"  from="staging\install\wix"          to="install\wix\" />\r
+               <File  name="site-local.wxi" from="staging\install\wix"         to="install\wix\" />\r
 \r
-               <File  name="*.*" from="staging\install\wix\Binary" to="install\wix\Binary\" />\r
-<!--           <File  name="bannrbmp.bmp" from="" to="" install\wix\Binary\\r
-               <File  name="completi.ico" from="" to="" install\wix\Binary\\r
-               <File  name="custicon.ico" from="" to="" install\wix\Binary\\r
-               <File  name="dlgbmp.bmp" from="" to="" install\wix\Binary\\r
-               <File  name="exclamic.ico" from="" to="" install\wix\Binary\\r
-               <File  name="info.bmp" from="" to="" install\wix\Binary\\r
-               <File  name="insticon.ico" from="" to="" install\wix\Binary\\r
-               <File  name="new.bmp" from="" to="" install\wix\Binary\\r
-               <File  name="removico.ico" from="" to="" install\wix\Binary\\r
-               <File  name="repairic.ico" from="" to="" install\wix\Binary\\r
-               <File  name="up.bmp" from="" to="" install\wix\Binary\\r
--->            \r
+               <File  name="*.*"           from="staging\install\wix\Binary"   to="install\wix\Binary\" />\r
 \r
-               <File  name="custom.cpp" from="staging\install\wix\custom" to="install\wix\custom\" />\r
-               <File  name="custom.h" from="staging\install\wix\custom" to="install\wix\custom\" />\r
+               <File  name="custom.cpp"    from="staging\install\wix\custom"   to="install\wix\custom\" />\r
+               <File  name="custom.h"      from="staging\install\wix\custom"   to="install\wix\custom\" />\r
 \r
-               <File  name="config_1033.wxi" from="staging\install\wix\lang" to="install\wix\lang\" />\r
-               <File  name="strings_1033.wxl" from="staging\install\wix\lang" to="install\wix\lang\" />\r
-               <File  name="ui_1033.wxi" from="staging\install\wix\lang" to="install\wix\lang\" />\r
+               <File  name="config_1033.wxi" from="staging\install\wix\lang"   to="install\wix\lang\" />\r
+               <File  name="strings_1033.wxl" from="staging\install\wix\lang"  to="install\wix\lang\" />\r
+               <File  name="ui_1033.wxi"   from="staging\install\wix\lang"     to="install\wix\lang\" />\r
                <!-- Why not license.rtf? -->\r
 \r
-               <File  name="*.lib" from="staging\lib\i386" to="lib\i386\" />\r
-<!--           \r
-               <File  name="comerr32.lib" from="" to="" lib\i386\\r
-               <File  name="delaydlls.lib" from="" to="" lib\i386\\r
-               <File  name="getopt.lib" from="" to="" lib\i386\\r
-               <File  name="gssapi32.lib" from="" to="" lib\i386\\r
-               <File  name="kclnt32.lib" from="" to="" lib\i386\\r
-               <File  name="krb524.lib" from="" to="" lib\i386\\r
-               <File  name="krb5_32.lib" from="" to="" lib\i386\\r
-               <File  name="krbcc32.lib" from="" to="" lib\i386\\r
-               <File  name="krbv4w32.lib" from="" to="" lib\i386\\r
-               <File  name="leashw32.lib" from="" to="" lib\i386\\r
-               <File  name="loadfuncs.lib" from="" to="" lib\i386\\r
-               <File  name="nidmgr32.lib" from="" to="" lib\i386\\r
-               <File  name="wshelp32.lib" from="" to="" lib\i386\\r
-               <File  name="xpprof32.lib" from="" to="" lib\i386\\r
--->    \r
+               <File  name="*.lib"         from="staging\lib\i386"             to="lib\i386\" />\r
        \r
        </Files>
\ No newline at end of file
diff --git a/src/windows/build/signFiles.pl b/src/windows/build/signFiles.pl
new file mode 100644 (file)
index 0000000..a94c4f2
--- /dev/null
@@ -0,0 +1,27 @@
+#!perl -w\r
+\r
+#use strict;\r
+use Data::Dumper;\r
+\r
+sub signFiles {\r
+    local ($signing, $config)   = @_;\r
+    local $exprs    = $signing->{FilePatterns}->{value};\r
+    local $template = $signing->{CommandTemplate}->{value};\r
+    # Use Unix find instead of Windows find.  Save PATH so we can restore it when we're done:\r
+    local $savedPATH= $ENV{PATH};\r
+    $ENV{PATH}      = $config->{CommandLine}->{Directories}->{unixfind}->{path}.";".$savedPATH;\r
+    foreach $expr (split(" ", $exprs)) {            ## exprs is something like "*.exe *.dll"\r
+        local $cmd  = "find . -iname \"$expr\"";\r
+        local $list = `$cmd`;                       ## $list is files matching *.exe, for example.\r
+    foreach $target (split("\n", $list)) {\r
+            $target =~ s|/|\\|g;                    ## Flip path separators from unix-style to windows-style.\r
+            local $template2    = $template;\r
+            $template2          =~ s/%filename%/$target/;\r
+            print "Info -- Signing $target\n" if ($verbose);\r
+            !system($template2) or die "Fatal -- Error signing $target.";\r
+            }\r
+        }\r
+        $ENV{PATH} = $savedPATH;\r
+    }\r
+\r
+return 1;
\ No newline at end of file