F. Build Win2000 binaries
G. Install NSIS 2.0
H. Build NSIS Install Package
- I. Final Results
- J. Optional Items
+ I. Install Wix 2.0
+ J. Build Wix MSI Install Package
+ K. Final Results
+ L. Optional Items
The Microsoft development tools require anywhere from 660 MB to 1.8GB
of storage depending on which compilers are selected. The following
Microsoft Visual .NET
Microsoft Visual .NET 2003 (recommended)
- Any version of the Microsoft SDK and Tools released August 2001 or later.
+ Microsoft Platform SDK for Windows XP SP2
+ [Core and Data Access SDKs are required]
The NSIS installer requires about 14 MB of storage. The following
version is supported.
nmake /f NTMakefile NSIS
-STEP I. Final Results
+STEP I. Install Wix MSI Installer
+
+Download the Wix 2.0.1927.1 installer from
+
+ http://prdownloads.sourceforge.net/wix/sources-2.0.1927.1.zip
+
+Apply the following patches to the source tree and execute
+
+ make ship
+
+from the \src\wix directory.
+
+Index: src/wix/Compiler.cs
+===================================================================
+RCS file: /cvsroot/wix/wix/src/wix/Compiler.cs,v
+retrieving revision 1.10
+diff -u -w -r1.10 Compiler.cs
+--- src/wix/Compiler.cs 28 Jul 2004 15:50:22 -0000 1.10
++++ src/wix/Compiler.cs 4 Aug 2004 16:28:16 -0000
+@@ -647,7 +647,7 @@
+ // add the core registry keys for each context in the class
+ for (int i = 0; i < contextCount; ++i)
+ {
+- this.AddRegistryKey(sourceLineNumbers, null, 0, String.Concat("CLSID\\", classId, "\\", context[i]), String.Empty, String.Concat("\"[!", fileServer, "]", argument == null ? String.Empty : " ", argument, "\""), componentId); // ClassId context
++ this.AddRegistryKey(sourceLineNumbers, null, 0, String.Concat("CLSID\\", classId, "\\", context[i]), String.Empty, String.Concat("\"[#", fileServer, "]", argument == null ? String.Empty : " ", argument, "\""), componentId); // ClassId context
+ if (null != icon) // ClassId default icon
+ {
+ if (null != iconIndex)
+@@ -7385,6 +7385,20 @@
+ break;
+ }
+ break;
++ case "Delete":
++ switch (attrib.Value)
++ {
++ case "install":
++ events |= MsiInterop.MsidbServiceControlEventDelete;
++ break;
++ case "uninstall":
++ events |= MsiInterop.MsidbServiceControlEventUninstallDelete;
++ break;
++ case "both":
++ events |= MsiInterop.MsidbServiceControlEventDelete | MsiInterop.MsidbServiceControlEventUninstallDelete;
++ break;
++ }
++ break;
+ case "Wait":
+ wait = Common.IsYes(attrib.Value, sourceLineNumbers, node.Name, attrib.Name, id) ? "1" : "0"; // strings used since integer column is nullable
+ break;
+@@ -8715,6 +8729,7 @@
+ }
+ bits ^= (bit * 65536);
+ break;
++
+ default:
+ bit = this.NameToBit(MsiInterop.CommonControlAttributes, attrib.Name, attrib.Value, node.Name, id);
+ if (-1 == bit)
+Index: src/wix/Preprocessor.cs
+===================================================================
+RCS file: /cvsroot/wix/wix/src/wix/Preprocessor.cs,v
+retrieving revision 1.5
+diff -u -w -r1.5 Preprocessor.cs
+--- src/wix/Preprocessor.cs 28 Jul 2004 15:50:22 -0000 1.5
++++ src/wix/Preprocessor.cs 4 Aug 2004 16:28:16 -0000
+@@ -267,12 +267,12 @@
+ break;
+ case "ifdef":
+ stack.Push(context);
+- context = new IfContext(context.IsTrue & context.Active, this.variables.ContainsKey(reader.Value.Trim()), IfState.If);
++ context = new IfContext(context.IsTrue & context.Active, this.IsDefined(reader.Value.Trim()), IfState.If);
+ ignore = true;
+ break;
+ case "ifndef":
+ stack.Push(context);
+- context = new IfContext(context.IsTrue & context.Active, !this.variables.ContainsKey(reader.Value.Trim()), IfState.If);
++ context = new IfContext(context.IsTrue & context.Active, !this.IsDefined(reader.Value.Trim()), IfState.If);
+ ignore = true;
+ break;
+ case "elseif":
+@@ -354,6 +354,8 @@
+ break;
+ case "endforeach": // endforeach is handled in PreprocessForeach, so seeing it here is an error
+ throw new WixPreprocessorException(this.GetCurrentSourceLineNumbers(), "Cannot have a <?endforeach?> processing instruction without a matching <?foreach?>.");
++ case "error":
++ throw new WixPreprocessorException(this.GetCurrentSourceLineNumbers(), this.PreprocessVariables(reader.Value));
+ default:
+ // Console.WriteLine("processing instruction: {0}, {1}", reader.Name, reader.Value);
+ break;
+@@ -401,6 +403,22 @@
+ }
+
+ /// <summary>
++ /// Returns true if the symbol exists.
++ /// </summary>
++ /// <param name="symbol">symbol name to check</param>
++ /// <returns>true if symbol is defined</returns>
++ private bool IsDefined(string symbol)
++ {
++ if( symbol.StartsWith("env.") )
++ return Environment.GetEnvironmentVariable(symbol.Substring(4)) != null;
++ if( symbol.StartsWith("var.") )
++ return this.variables.ContainsKey(symbol.Substring(4));
++ if( symbol.StartsWith("sys.") )
++ return this.systemVariables.ContainsKey(symbol.Substring(4));
++ return this.variables.ContainsKey(symbol);
++ }
++
++ /// <summary>
+ /// Replaces parameters in the source text.
+ /// </summary>
+ /// <param name="value">Text that may contain parameters to replace.</param>
+Index: src/wix/wix.csproj
+===================================================================
+RCS file: /cvsroot/wix/wix/src/wix/wix.csproj,v
+retrieving revision 1.4
+diff -u -w -r1.4 wix.csproj
+--- src/wix/wix.csproj 31 May 2004 01:07:40 -0000 1.4
++++ src/wix/wix.csproj 4 Aug 2004 16:28:16 -0000
+@@ -659,9 +659,19 @@
+ BuildAction = "EmbeddedResource"
+ />
+ <File
++ RelPath = "Xsd\wix.xsx"
++ DependentUpon = "wix.xsd"
++ BuildAction = "None"
++ />
++ <File
+ RelPath = "Xsd\wixloc.xsd"
+ BuildAction = "Content"
+ />
++ <File
++ RelPath = "Xsd\wixloc.xsx"
++ DependentUpon = "wixloc.xsd"
++ BuildAction = "None"
++ />
+ </Include>
+ </Files>
+ </CSHARP>
+Index: src/wix/Xsd/wix.xsd
+===================================================================
+RCS file: /cvsroot/wix/wix/src/wix/Xsd/wix.xsd,v
+retrieving revision 1.12
+diff -u -w -r1.12 wix.xsd
+--- src/wix/Xsd/wix.xsd 28 Jul 2004 15:50:24 -0000 1.12
++++ src/wix/Xsd/wix.xsd 4 Aug 2004 16:28:17 -0000
+@@ -2733,6 +2733,7 @@
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
++ <xs:attribute name="Separator" type="xs:string"/>
+ <xs:attribute name="Permanent" type="YesNoType"/>
+ <xs:attribute name="System" type="YesNoType"/>
+ </xs:complexType>
+
+
+STEP J. Build Wix MSI install package
+
+From the DOS command prompt window run:
+
+ nmake /f NTMakefile wix
+
+Make sure the binaries installed to \src\wix\release\ship are
+available in the PATH environment variable
+
+
+STEP K. Final Results
The build process generates its binaries in %AFSROOT%\DEST. The subdirectory
would look like the following:
WinInstall\OpenAFSforWindows.exe - is the install package for Open AFS
-STEP J. Optional Items
+STEP L. Optional Items
The build process has an error table that is compiled for many OpenAFS
applications. This table is generated by Unix based tools. It is not