You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@httpd.apache.org by Jeff White <jl...@earthlink.net> on 2004/04/12 00:33:28 UTC

WiX - the Windows XML MSI

<quote>

What is WiX?

The Windows Installer XML (WiX) platform
is a set of tools and specifications that allow
you to easily create Windows Installer database
files (MSI and MSM). The WiX tools model the
traditional compile and link model used to create
executables from source code. For WiX, source
code is written in xml files. These files are validated
against a schema, wix.xsd, then processed by a
preprocessor, compiler, and linker to create the
desired result. The WiX platform has been designed
to allow for the easy creation of multiple Windows
Installer databases from a small set of source files.

</quote>

<quote>

The Redmond software giant is making its
Windows installer technology under OSI's
Common Public License.

snip

Microsoft made available an internally-developed
product called the "Windows Installer XML"
(WiX) to SourceForge. The code is downloadable
here:

http://sourceforge.net/projects/wix/

WiX is a toolset for building Windows installation
packages from XML source code. It runs on Windows
NT and Windows 2000.

</quote>

Dark is a tool for converting an MSI
or MSM file into a WiX source file.

An Apache2 example of the WiX
decompiler Dark.exe ran on
Windows XP:

C:\WIX>dark.exe Apache_2.0.49-win32-x86-no_ssl.msi apache249.wxs

Microsoft (R) MSI to Wix 2.0 Decompiler Version 0.1
Copyright (C) Microsoft Corporation 2003. All rights reserved.

Apache_2.0.49-win32-x86-no_ssl.msi

C:\WIX>dir

04/11/2004  03:29 PM    <DIR>          .
04/11/2004  03:29 PM    <DIR>          ..
04/11/2004  03:30 PM           387,080 apache249.wxs
04/11/2004  03:30 PM         6,097,408
apache_2.0.49-win32-x86-no_ssl.msi
04/05/2004  12:25 PM            24,576 candle.exe
04/05/2004  02:39 AM            11,666 CPL.TXT
04/05/2004  12:25 PM            24,576 dark.exe
04/11/2004  03:07 PM    <DIR>          doc
04/05/2004  12:25 PM            28,672 light.exe
04/05/2004  12:25 PM            24,576 lit.exe
04/05/2004  12:25 PM           737,280 wix.dll
04/05/2004  12:21 PM            86,016 wixcab.dll
               9 File(s)      7,421,850 bytes

apache249.wxs  contains:
<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2003/01/wi">
  <Product UpgradeCode="0EA14757-3D48-4F78-878E-B9AF261753D9"
Name="Apache HTTP Server 2.0.49" Version="2.0.49" Manufacturer="Apache
Software Foundation" Id="3A862C7D-0504-48BC-AEF8-7F7479C7C158"
Language="1033">
    <Package Id="CC46F4F0-4B90-425F-B164-23EFE176F359"
Keywords="Installer; MSI; Database" Description="The Apache HTTP Web
Server" Comments="Contact:  Your local administrator"
Manufacturer="Apache Software Foundation" InstallerVersion="110"
Platforms="Intel" Languages="1033" SummaryCodepage="1252" />
    <Property Id="DiskPrompt">[1]</Property>
    <Property Id="Registration">No</Property>
    <Property Id="DialogCaption">Installation Wizard</Property>
    <Property Id="ProductID">None</Property>
    <Property Id="ISReleaseFlags">NoSSL</Property>
    <Property Id="ALLUSERS">1</Property>

snip

    <Property Id="ReinstallModeText">omus</Property>
    <Property Id="ARPCONTACT">Apache Users Mailing List</Property>
    <Property Id="ARPNOREPAIR">0</Property>
    <Property Id="ARPURLINFOABOUT">http://httpd.apache.org/</Property>
    <Property
Id="ARPURLUPDATEINFO">http://www.apache.org/dist/httpd/binaries/win32/
</Property>
    <Property Id="ARPPRODUCTICON">apache.exe</Property>

snip

    <Property Id="SERVICENAME">Apache2</Property>
    <Property Id="SERVICEINTERNALNAME">Apache2</Property>
    <Property Id="SERVERPORT">80</Property>
    <Property Id="EXISTING_APACHE_SERVICE_PATH">
      <RegistrySearch Id="ExistingApacheService" Root="HKLM"
Key="System\CurrentControlSet\Services\[SERVICEINTERNALNAME]"
Name="ImagePath" Type="registry" />
    </Property>
    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="AppDataFolder" Name="." SourceName="APPLIC~1"
LongSource="Application Data" />
      <Directory Id="CommonFilesFolder" Name="." SourceName="Common"
/>
      <Directory Id="DesktopFolder" Name="." SourceName="Desktop" />

snip

      <Directory Id="ProgramFilesFolder" Name="."
SourceName="PROGRA~1" LongSource="program files">
        <Directory Id="INSTALLDIR" Name="APACHE~1" LongName="Apache
Group">
          <Directory Id="APACHEDIR" Name="Apache2">
            <Component Id="ApacheAdmin"
Guid="CBAA1CEC-C5BD-40B3-A5AE-B277C0BF46ED">
              <Condition>ALLUSERS</Condition>
              <Registry Root="HKLM" Key="SOFTWARE\Apache
Group\Apache\2.0.49" Name="ServerRoot" Value="[APACHEDIR]"
Id="Registry5" />
              <Registry Root="HKLM" Key="SOFTWARE\Apache
Group\Apache\2.0.49" Name="Shared" Value="#1" KeyPath="yes"
Id="Registry6" />
              <Registry Root="HKLM" Key="SOFTWARE\Classes\.conf"
Value="txtfile" Id="Registry9" />

snip

              <Shortcut Id="Shortcut4" Directory="Dir68" Name="Stop"
Target="[#F98246_Apache.exe]" Description="Stop the Apache http
Server" Arguments="-w -n &quot;[SERVICENAME]&quot; -k stop "
Show="normal" WorkingDirectory="APACHEDIR" />
              <Shortcut Id="Shortcut5" Directory="Dir68" Name="Start"
Target="[#F98246_Apache.exe]" Description="Start the Apache http
Server" Arguments="-w -n &quot;[SERVICENAME]&quot; -k start"
Show="normal" WorkingDirectory="APACHEDIR" />
            </Component>
            <Component Id="ApacheNonAdmin"
Guid="DFE85255-CA1B-48E9-B4A8-93565D3F44BA">
              <Condition>Not ALLUSERS</Condition>
              <Registry Root="HKCU" Key="SOFTWARE\Apache
Group\Apache\2.0.49" Name="Installed" Value="#1" KeyPath="yes"
Id="Registry28" />
              <Shortcut Id="Shortcut8" Directory="Dir68"
Name="STARTA~1" LongName="Start Apache in Console"
Target="[#F98246_Apache.exe]" Description="Start Apache http Server in
a Console Window" Arguments="-w -f
&quot;[APACHECONFDIR]httpd.conf&quot; -d &quot;[APACHEDIR].&quot;"
Show="normal" WorkingDirectory="APACHEDIR" />
            </Component>

snip

      <Directory Id="APACHEMANUALDIR" Name="manual">
              <Component Id="manual"
Guid="6373C7DB-DD21-47AC-B8F5-6D342B38460C">
                <File Id="F168793_index.html.en" Name="INDEXH~1.EN"
LongName="index.html.en" Compressed="yes" KeyPath="yes" DiskId="1" />
                <File Id="F260050_LICENSE" Name="LICENSE"
Compressed="yes" DiskId="1" />
                <File Id="F260051_bind.html" Name="BIND~1.HTM"
LongName="bind.html" Compressed="yes" DiskId="1" />

snip

          <File Id="F260276_urlmapping.xml.ko" Name="URLMAP~1.KO"
LongName="urlmapping.xml.ko" Compressed="yes" DiskId="1" />
                <File Id="F260277_urlmapping.xml.meta"
Name="URLMAP~1.MET" LongName="urlmapping.xml.meta" Compressed="yes"
DiskId="1" />
              </Component>
              <Directory Id="Dir43" Name="DEVELO~1"
LongName="developer">
                <Component Id="manual_developer"
Guid="1795F656-B757-40B7-BECE-5D6E4B0F77AD">
                  <File Id="F235778_index.html.en" Name="INDEXH~1.EN"
LongName="index.html.en" Compressed="yes" KeyPath="yes" DiskId="1" />
                  <File Id="F260278_API.html" Name="API~1.HTM"
LongName="API.html" Compressed="yes" DiskId="1" />

snip

                  <File Id="F261048_namebased.xml.ko"
Name="NAME-B~1.KO" LongName="name-based.xml.ko" Compressed="yes"
DiskId="1" />
                  <File Id="F261049_namebased.xml.meta"
Name="NAME-B~1.MET" LongName="name-based.xml.meta" Compressed="yes"
DiskId="1" />
                </Component>
              </Directory>
            </Directory>
            <Directory Id="APACHEHTDOCSDIR" Name="htdocs">
              <Component Id="htdocs"
Guid="1D13B3F6-54C4-4920-AF8B-6DBA702F9E44">
                <File Id="F168518_index.html.en" Name="INDEXH~1.EN"
LongName="index.html.en" Compressed="yes" KeyPath="yes" DiskId="1" />
                <File Id="F259467_index.html.ca" Name="INDEXH~1.CA"
LongName="index.html.ca" Compressed="yes" DiskId="1" />

snip

       <Directory Id="APACHECONFDIR" Name="conf">
              <Component Id="conf"
Guid="00557AFD-F5B5-4EFF-87D3-8942174F9778">
                <File Id="F45780_mime.types.default"
Name="MIMETY~1.DEF" LongName="mime.types.default" Compressed="yes"
KeyPath="yes" DiskId="1" />
                <File Id="F45781_magic.default" Name="MAGIC~1.DEF"
LongName="magic.default" Compressed="yes" DiskId="1" />
                <RemoveFile Directory="APACHECONFDIR"
Name="HTTPDC~1.DEF|httpd.conf.default" On="install" Id="R01" />
                <RemoveFile Directory="APACHECONFDIR"
Name="HTTPDD~1.CON|httpd.default.conf" On="uninstall" Id="R02" />
                <RemoveFile Directory="APACHECONFDIR"
Name="SSLDEF~1.CON|ssl.default.conf" On="install" Id="R03" />
              </Component>
              <Component Id="conf_temp"
Guid="0E1C777D-47A6-4775-93D4-0A5464767D25" KeyPath="yes">
                <File Id="F46421_InstallConf.awk" Name="INSTAL~1.AWK"
LongName="InstallConf.awk" Compressed="yes" DiskId="1" />
                <File Id="F98940_httpdwin.conf" Name="HTTPD-~1.CON"
LongName="httpd-win.conf" Compressed="yes" DiskId="1" />
                <CreateFolder />
              </Component>
            </Directory>
            <Directory Id="APACHEBINDIR" Name="bin">
              <Component Id="Apache"
Guid="93F0E04F-8467-4A8B-8B02-11A6C766F196">
                <File Id="F98246_Apache.exe" Name="Apache.exe"
Compressed="yes" KeyPath="yes" DiskId="1" />

snip

    <Media Id="1" DiskPrompt="1" EmbedCab="yes" Cabinet="Data.Cab"
VolumeLabel="DISK1" />
    <CustomAction Id="InstallConfFiles" BinaryKey="awk_exe"
ExeCommand="-f &quot;[#F46421_InstallConf.awk]&quot;
&quot;[SERVERDOMAIN]&quot; &quot;[SERVERNAME]&quot;
&quot;[SERVERADMIN]&quot; [SERVERPORT] &quot;[APACHEDIR] &quot;"
Return="ignore" Execute="commit" />
    <CustomAction Id="SelfInstallService" FileKey="F98246_Apache.exe"
ExeCommand="-w -k install -n &quot;[SERVICENAME]&quot; -f
&quot;[APACHECONFDIR]httpd.conf&quot; -d &quot;[APACHEDIR].&quot;"
Return="ignore" Execute="commit" />
    <CustomAction Id="SelfRemoveService" FileKey="F98246_Apache.exe"
ExeCommand="-k uninstall -n &quot;[SERVICENAME]&quot; -f
&quot;[APACHECONFDIR]httpd.conf&quot; -d &quot;[APACHEDIR].&quot;"
Return="ignore" Execute="deferred" />
    <CustomAction Id="ResolveServerName" BinaryKey="real_features_dll"
DllEntry="_ResolveServerName@4" Return="asyncNoWait" />
    <CustomAction Id="SelfStartService" FileKey="F98246_Apache.exe"
ExeCommand="-w -k start -n &quot;[SERVICENAME]&quot;"
Return="asyncNoWait" Execute="commit" />
    <CustomAction Id="SelfStopService" FileKey="F98246_Apache.exe"
ExeCommand="-k stop -n &quot;[SERVICENAME]&quot; -f
&quot;[APACHECONFDIR]httpd.conf&quot; -d &quot;[APACHEDIR].&quot;"
Return="ignore" Execute="deferred" />
    <CustomAction Id="RemovePriorService" FileKey="F98246_Apache.exe"
ExeCommand="-k uninstall -n &quot;[SERVICENAME]&quot; -f
&quot;[APACHECONFDIR]httpd.conf&quot; -d &quot;[APACHEDIR].&quot;"
Return="ignore" Execute="commit" />
    <CustomAction Id="ValidateServerName"
BinaryKey="real_features_dll" DllEntry="_ValidateServerName@4"
Return="ignore" />
    <CustomAction Id="StartApacheMonitor"
FileKey="F161005_ApacheMonitor.exe" ExeCommand="" Return="asyncNoWait"
Execute="commit" />
    <CustomAction Id="StopPriorService" FileKey="F98246_Apache.exe"
ExeCommand="-k stop -n &quot;[SERVICENAME]&quot; -f
&quot;[APACHECONFDIR]httpd.conf&quot; -d &quot;[APACHEDIR].&quot;"
Return="ignore" Execute="commit" />
    <UI>
      <Property Id="DefaultUIFont">Tahoma8</Property>
      <Property Id="ErrorDialog">SetupError</Property>
      <Dialog Id="SetupCompleteError" Width="374" Height="267"
Title="[ApplicationName] - Installation Wizard" NoMinimize="yes"
CustomPalette="yes">
        <Control Id="Finish" Type="PushButton" X="230" Y="243"
Width="66" Height="17" Default="yes" Cancel="yes" Text="&amp;Finish">
          <Publish Event="DoAction"
Value="CleanUp">ISSCRIPTRUNNING="1"</Publish>
          <Publish Event="EndDialog" Value="Exit">1</Publish>

snip

        <Show Dialog="MaintenanceWelcome"
After="SetupResume">Installed And Not RESUME And Not Preselected And
Not PATCH</Show>
        <Show Dialog="SetupProgress" After="MaintenanceWelcome" />
      </InstallUISequence>
    </UI>
    <AdvtExecuteSequence />
    <AdminExecuteSequence />
    <InstallExecuteSequence>
      <Custom Action="SelfStopService"
After="StopServices">?ApacheAdmin=3 And
EXISTING_APACHE_SERVICE_PATH</Custom>
      <Custom Action="SelfRemoveService"
After="DeleteServices">$ApacheAdmin=2 And
EXISTING_APACHE_SERVICE_PATH</Custom>
      <Custom Action="InstallConfFiles" After="InstallFiles">$conf=3
Or (?conf=3 And $conf&lt;&gt;2)</Custom>
      <Custom Action="StopPriorService"
After="CreateShortcuts">$ApacheAdmin=3 And ?ApacheAdmin&lt;&gt;3 And
EXISTING_APACHE_SERVICE_PATH</Custom>
      <Custom Action="RemovePriorService"
After="StopPriorService">$ApacheAdmin=3 And
EXISTING_APACHE_SERVICE_PATH</Custom>
      <Custom Action="SelfInstallService"
After="RegisterComPlus">$ApacheAdmin=3</Custom>
      <Custom Action="SelfStartService"
After="InstallServices">$ApacheAdmin=3 Or (?ApacheAdmin=3 and
$ApacheAdmin&lt;&gt;2)</Custom>
      <Custom Action="StartApacheMonitor"
After="SelfRegModules">$ApacheMonitor=3 Or (?ApacheMonitor=3 and
$ApacheMonitor&lt;&gt;2)</Custom>
    </InstallExecuteSequence>
    <Binary Id="awk_exe" src="Binary\awk_exe.ibd" />
    <Binary Id="real_features_dll" src="Binary\real_features_dll.ibd"
/>
    <Binary Id="Binary2" src="Binary\Binary2.ibd" />

snip

    <Binary Id="Binary17" src="Binary\Binary17.ibd" />
    <Binary Id="Binary18" src="Binary\Binary18.ibd" />
    <Icon Id="apache.exe" src="Icon\apache.exe.ibd" />
  </Product>
</Wix>


WiX covers the installation package file (.msi)
and the merge module file (.msm). WiX includes
full CSharp source files, already compiled binary
.NET files and docs.

 Jeff



Re: WiX - the Windows XML MSI

Posted by Greg Stein <gs...@lyra.org>.
On Sun, Apr 11, 2004 at 05:33:28PM -0500, Jeff White wrote:
>...
> desired result. The WiX platform has been designed
> to allow for the easy creation of multiple Windows
> Installer databases from a small set of source files.

My friend at Microsoft says that all the cool kids on the block use WiX.
He said that it is *really* the way to go for creating installation
packages.

Of course, I'm not involved with the current win32 package creation, so it
may be that the current system is just hunky dory. But based on my bud's
recommendation, I would very much suggest that WiX be looked at. It might
end up helping things quite a bit.

Cheers,
-g

-- 
Greg Stein, http://www.lyra.org/