summaryrefslogtreecommitdiffstats
path: root/src/etc/installer
diff options
context:
space:
mode:
Diffstat (limited to 'src/etc/installer')
-rw-r--r--src/etc/installer/README.md28
-rw-r--r--src/etc/installer/gfx/banner.bmpbin0 -> 114514 bytes
-rw-r--r--src/etc/installer/gfx/banner.xcfbin0 -> 148261 bytes
-rw-r--r--src/etc/installer/gfx/dialogbg.bmpbin0 -> 615402 bytes
-rw-r--r--src/etc/installer/gfx/dialogbg.xcfbin0 -> 216045 bytes
-rw-r--r--src/etc/installer/gfx/rust-logo.icobin0 -> 370070 bytes
-rw-r--r--src/etc/installer/gfx/rust-logo.pngbin0 -> 3909 bytes
-rw-r--r--src/etc/installer/msi/remove-duplicates.xsl24
-rw-r--r--src/etc/installer/msi/rust.wxs293
-rw-r--r--src/etc/installer/msi/rustwelcomedlg.wxs57
-rw-r--r--src/etc/installer/msi/squash-components.xsl34
-rw-r--r--src/etc/installer/msi/ui.wxs83
-rw-r--r--src/etc/installer/pkg/Distribution.xml88
-rwxr-xr-xsrc/etc/installer/pkg/postinstall26
14 files changed, 633 insertions, 0 deletions
diff --git a/src/etc/installer/README.md b/src/etc/installer/README.md
new file mode 100644
index 000000000..cded3bbf7
--- /dev/null
+++ b/src/etc/installer/README.md
@@ -0,0 +1,28 @@
+# The Rust Programming Language
+
+This is a compiler for Rust, including standard libraries, tools and
+documentation. Rust is a systems programming language that is fast,
+memory safe and multithreaded, but does not employ a garbage collector
+or otherwise impose significant runtime overhead.
+
+To install to /usr/local (the default), run the included `install.sh` script:
+
+ $ sudo ./install.sh
+
+To uninstall:
+
+ $ sudo /usr/local/lib/rustlib/uninstall.sh
+
+`install.sh` has a few options, including the possibility to set an installation
+prefix. You can display these options by running:
+
+ $ sudo ./install.sh --help
+
+Read [The Book](https://doc.rust-lang.org/book/index.html) to learn how
+to use Rust.
+
+Rust is primarily distributed under the terms of both the MIT license
+and the Apache License (Version 2.0), with portions covered by various
+BSD-like licenses.
+
+See LICENSE-APACHE, LICENSE-MIT, and COPYRIGHT for details.
diff --git a/src/etc/installer/gfx/banner.bmp b/src/etc/installer/gfx/banner.bmp
new file mode 100644
index 000000000..b5459a797
--- /dev/null
+++ b/src/etc/installer/gfx/banner.bmp
Binary files differ
diff --git a/src/etc/installer/gfx/banner.xcf b/src/etc/installer/gfx/banner.xcf
new file mode 100644
index 000000000..53296518e
--- /dev/null
+++ b/src/etc/installer/gfx/banner.xcf
Binary files differ
diff --git a/src/etc/installer/gfx/dialogbg.bmp b/src/etc/installer/gfx/dialogbg.bmp
new file mode 100644
index 000000000..7e4674a4f
--- /dev/null
+++ b/src/etc/installer/gfx/dialogbg.bmp
Binary files differ
diff --git a/src/etc/installer/gfx/dialogbg.xcf b/src/etc/installer/gfx/dialogbg.xcf
new file mode 100644
index 000000000..49ca4e0c3
--- /dev/null
+++ b/src/etc/installer/gfx/dialogbg.xcf
Binary files differ
diff --git a/src/etc/installer/gfx/rust-logo.ico b/src/etc/installer/gfx/rust-logo.ico
new file mode 100644
index 000000000..a58225d5a
--- /dev/null
+++ b/src/etc/installer/gfx/rust-logo.ico
Binary files differ
diff --git a/src/etc/installer/gfx/rust-logo.png b/src/etc/installer/gfx/rust-logo.png
new file mode 100644
index 000000000..99ee7507f
--- /dev/null
+++ b/src/etc/installer/gfx/rust-logo.png
Binary files differ
diff --git a/src/etc/installer/msi/remove-duplicates.xsl b/src/etc/installer/msi/remove-duplicates.xsl
new file mode 100644
index 000000000..05b4c9bcc
--- /dev/null
+++ b/src/etc/installer/msi/remove-duplicates.xsl
@@ -0,0 +1,24 @@
+<?xml version="1.0" ?>
+<xsl:stylesheet version="1.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:wix="http://schemas.microsoft.com/wix/2006/wi">
+ <!-- Copy all attributes and elements to the output. -->
+ <xsl:template match="@*|*">
+ <xsl:copy>
+ <xsl:apply-templates select="@*|*"/>
+ </xsl:copy>
+ </xsl:template>
+ <xsl:output method="xml" indent="yes" />
+
+ <!-- LICENSE* files are installed from rustc dir. -->
+ <xsl:key name="duplicates-cmp-ids" match="wix:Component[./wix:File[contains(@Source, 'LICENSE')]|./wix:File[contains(@Source, 'rust-installer-version')]]" use="@Id" />
+ <xsl:template match="wix:Component[key('duplicates-cmp-ids', @Id)]" />
+ <xsl:template match="wix:ComponentRef[key('duplicates-cmp-ids', @Id)]" />
+
+ <xsl:template match="wix:File[contains(@Source, 'README.md')]">
+ <xsl:copy>
+ <xsl:apply-templates select="@*|*"/>
+ <xsl:attribute name="Name">README-CARGO.md</xsl:attribute>
+ </xsl:copy>
+ </xsl:template>
+</xsl:stylesheet>
diff --git a/src/etc/installer/msi/rust.wxs b/src/etc/installer/msi/rust.wxs
new file mode 100644
index 000000000..a182bc406
--- /dev/null
+++ b/src/etc/installer/msi/rust.wxs
@@ -0,0 +1,293 @@
+<?xml version="1.0"?>
+<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
+
+ <?if $(sys.BUILDARCH)="x64" ?>
+ <?define ArchSuffix=" 64-bit" ?>
+ <?else?>
+ <?define ArchSuffix="" ?>
+ <?endif?>
+
+ <?if $(env.CFG_CHANNEL)="stable" ?>
+ <?define ProductName="Rust $(env.CFG_VER_MAJOR).$(env.CFG_VER_MINOR) ($(env.CFG_ABI)$(var.ArchSuffix))" ?>
+ <?else?>
+ <?define ProductName="Rust $(env.CFG_CHANNEL) $(env.CFG_VER_MAJOR).$(env.CFG_VER_MINOR) ($(env.CFG_ABI)$(var.ArchSuffix))" ?>
+ <?endif?>
+
+ <?define BaseRegKey="Software\[Manufacturer]\Rust $(env.CFG_CHANNEL) ($(env.CFG_ABI)$(var.ArchSuffix))\$(env.CFG_VER_MAJOR).$(env.CFG_VER_MINOR)" ?>
+
+ <!-- Upgrade code should be different for each platform -->
+ <?if $(sys.BUILDARCH)="x64" ?>
+ <?if $(env.CFG_ABI)="GNU" ?>
+ <!-- UpgradeCode should stay the same for all MSI versions in channel -->
+ <?if $(env.CFG_CHANNEL)="stable" ?>
+ <?define UpgradeCode="B440B077-F8D1-4730-8E1D-D6D37702B4CE" ?>
+ <?elseif $(env.CFG_CHANNEL)="beta" ?>
+ <?define UpgradeCode="7205CEDC-CDA6-4B62-8E4E-4D19EC5D88FC" ?>
+ <?elseif $(env.CFG_CHANNEL)="nightly" ?>
+ <?define UpgradeCode="622497D9-E0B1-448E-838A-4A33D0C5F82C" ?>
+ <?elseif $(env.CFG_CHANNEL)="dev" ?>
+ <?define UpgradeCode="7D32FD99-BB26-45CF-935D-1B0593BBDDBE" ?>
+ <?endif ?>
+ <?elseif $(env.CFG_ABI)="MSVC" ?>
+ <?if $(env.CFG_CHANNEL)="stable" ?>
+ <?define UpgradeCode="123039F9-68E3-44F1-AC9F-C78ADD4D0723" ?>
+ <?elseif $(env.CFG_CHANNEL)="beta" ?>
+ <?define UpgradeCode="ABC640B9-2AB5-4270-9A0D-E54E502A1CCA" ?>
+ <?elseif $(env.CFG_CHANNEL)="nightly" ?>
+ <?define UpgradeCode="56263F12-4AA1-4FE1-AFAE-572915C4FA3E" ?>
+ <?elseif $(env.CFG_CHANNEL)="dev" ?>
+ <?define UpgradeCode="231A9544-7E39-4A60-A069-0EB3CA4BAB2E" ?>
+ <?endif ?>
+ <?endif ?>
+ <?define PlatformProgramFilesFolder="ProgramFiles64Folder" ?>
+ <?elseif $(sys.BUILDARCH)="x86" ?>
+ <?if $(env.CFG_ABI)="GNU" ?>
+ <?if $(env.CFG_CHANNEL)="stable" ?>
+ <?define UpgradeCode="1C7CADA5-D117-43F8-A356-DF15F9FBEFF6" ?>
+ <?elseif $(env.CFG_CHANNEL)="beta" ?>
+ <?define UpgradeCode="5229EAC1-AB7C-4A62-9881-6FAD2DE7D0F9" ?>
+ <?elseif $(env.CFG_CHANNEL)="nightly" ?>
+ <?define UpgradeCode="B94FF1C2-2C7B-4859-A08B-546815516FDA" ?>
+ <?elseif $(env.CFG_CHANNEL)="dev" ?>
+ <?define UpgradeCode="7E6D1349-2773-4792-B8CD-EA2685D86A99" ?>
+ <?endif ?>
+ <?elseif $(env.CFG_ABI)="MSVC" ?>
+ <?if $(env.CFG_CHANNEL)="stable" ?>
+ <?define UpgradeCode="5805719C-45E9-4CF6-9CE7-1E8B57F3C243" ?>
+ <?elseif $(env.CFG_CHANNEL)="beta" ?>
+ <?define UpgradeCode="BC0731C1-BED1-424C-BE99-3589C35C84DE" ?>
+ <?elseif $(env.CFG_CHANNEL)="nightly" ?>
+ <?define UpgradeCode="FF193BBC-E73B-4FBD-ADE0-12F3CFC84145" ?>
+ <?elseif $(env.CFG_CHANNEL)="dev" ?>
+ <?define UpgradeCode="87DFC303-6492-4E9B-911E-56EAD56C5E58" ?>
+ <?endif ?>
+ <?endif ?>
+ <?define PlatformProgramFilesFolder="ProgramFilesFolder" ?>
+ <?else ?>
+ <?error Unsupported value of sys.BUILDARCH=$(sys.BUILDARCH)?>
+ <?endif ?>
+
+ <Product Id="*"
+ Name="$(var.ProductName)"
+ Language="1033"
+ Version="$(env.CFG_VER_MAJOR).$(env.CFG_VER_MINOR).$(env.CFG_VER_PATCH).$(env.CFG_VER_BUILD)"
+ UpgradeCode="$(var.UpgradeCode)"
+ Manufacturer="The Rust Project Developers">
+ <Package
+ Comments="Rust is a systems programming language that runs blazingly fast, prevents almost all crashes, and eliminates data races."
+ InstallerVersion="200"
+ InstallPrivileges="elevated"
+ Compressed="yes" />
+
+ <Icon Id="rust.ico" SourceFile="rust-logo.ico" />
+ <Property Id="ApplicationFolderName" Value="Rust $(env.CFG_CHANNEL) $(env.CFG_ABI) $(env.CFG_VER_MAJOR).$(env.CFG_VER_MINOR)" />
+ <Property Id="WixAppFolder" Value="WixPerMachineFolder" />
+ <Property Id="ARPPRODUCTICON" Value="rust.ico" />
+ <Property Id="ARPURLINFOABOUT" Value="https://www.rust-lang.org/" />
+ <Property Id="ARPCOMMENTS" Value="$(env.CFG_RELEASE_INFO)" />
+ <!-- This is a dual-mode package. https://docs.microsoft.com/en-us/windows/win32/msi/single-package-authoring -->
+ <Property Id="ALLUSERS" Value="2" Secure="yes" />
+ <Property Id="MSIINSTALLPERUSER" Secure="yes" />
+ <!-- The actual install location (initialized below) -->
+ <Property Id="INSTALLDIR" Secure="yes" />
+
+ <!-- Detect path(s) of a previous installation. -->
+ <Property Id="INSTALLDIR_USER">
+ <RegistrySearch Id="InstallDir_User" Type="raw" Root="HKCU" Key="$(var.BaseRegKey)" Name="InstallDir" />
+ </Property>
+ <Property Id="INSTALLDIR_MACHINE">
+ <RegistrySearch Id="InstallDir_Mach" Type="raw" Root="HKLM" Key="$(var.BaseRegKey)" Name="InstallDir" />
+ </Property>
+
+ <!-- Set ALLUSERS to match the previous installation mode, otherwise FindRelatedProducts will ignore
+ the previous installation. If both INSTALLDIR_USER and INSTALLDIR_MACHINE are set, prefer the former. -->
+ <SetProperty Sequence="first" Before="FindRelatedProducts"
+ Id="ALLUSERS" Value="{}">INSTALLDIR_USER</SetProperty>
+
+ <!-- Set default values if RegSearch found nothing, or if we not upgrading -->
+ <SetProperty Sequence="both" Before="SetINSTALLDIR1"
+ Id="INSTALLDIR_USER" Value="[LocalAppDataFolder]Programs\[ApplicationFolderName]">NOT INSTALLDIR_USER</SetProperty>
+ <SetProperty Sequence="both" Before="SetINSTALLDIR1"
+ Id="INSTALLDIR_MACHINE" Value="[$(var.PlatformProgramFilesFolder)][ApplicationFolderName]">NOT INSTALLDIR_MACHINE</SetProperty>
+
+ <!-- Choose the default install location according to ALLUSERS (unless set from the command line) -->
+ <SetProperty Sequence="both" Action="SetINSTALLDIR1" Before="SetINSTALLDIR2"
+ Id="INSTALLDIR" Value="[INSTALLDIR_USER]">NOT INSTALLDIR AND NOT ALLUSERS</SetProperty>
+ <SetProperty Sequence="both" Action="SetINSTALLDIR2" Before="CostFinalize"
+ Id="INSTALLDIR" Value="[INSTALLDIR_MACHINE]">NOT INSTALLDIR AND ALLUSERS</SetProperty>
+
+ <SetProperty Sequence="ui" Before="CostFinalize"
+ Id="WixAppFolder" Value="WixPerUserFolder">NOT ALLUSERS</SetProperty>
+
+ <!-- UI sets ALLUSERS per user selection; progagate this choice to MSIINSTALLPERUSER before executing installation actions -->
+ <SetProperty Sequence="ui" Before="ExecuteAction"
+ Id="MSIINSTALLPERUSER" Value="1">NOT ALLUSERS</SetProperty>
+
+ <!-- Update ARPINSTALLLOCATION to match INSTALLDIR -->
+ <SetProperty Sequence="execute" Before="CostFinalize"
+ Id="ARPINSTALLLOCATION" Value="[INSTALLDIR]" />
+
+ <!-- Path of cmd.exe for the shortcut -->
+ <Property Id="SHORTCUTTARGET" Value="%windir%\System32\cmd.exe" />
+ <!-- Microsoft Installer will resolve any Environment Variables in the working directory at install time -->
+ <Property Id="SHORTCUTWKDIR" Value="%SystemDrive%\" />
+
+ <InstallUISequence>
+ <FindRelatedProducts After="AppSearch" />
+ </InstallUISequence>
+ <InstallExecuteSequence>
+ <FindRelatedProducts After="AppSearch" />
+ <RemoveExistingProducts Before="InstallInitialize" />
+ </InstallExecuteSequence>
+
+ <Upgrade Id="$(var.UpgradeCode)">
+ <UpgradeVersion
+ Minimum="$(env.CFG_VER_MAJOR).$(env.CFG_VER_MINOR).0"
+ Maximum="$(env.CFG_VER_MAJOR).$(env.CFG_VER_MINOR).65535"
+ IncludeMinimum="yes"
+ IncludeMaximum="yes"
+ MigrateFeatures="yes"
+ Property="UPGRADE_DETECTED"
+ />
+ </Upgrade>
+
+ <!-- Specifies a single cab file to be embedded in the installer's .msi. -->
+ <MediaTemplate EmbedCab="yes" CompressionLevel="mszip" />
+
+ <!-- Send a WM_SETTINGCHANGE message to tell processes like explorer to update their
+ environments so any new command prompts get the updated %PATH% -->
+ <CustomActionRef Id="WixBroadcastEnvironmentChange" />
+
+ <!-- Installation directory and files are defined in Files.wxs -->
+ <Directory Id="TARGETDIR" Name="SourceDir">
+ <Directory Id="$(var.PlatformProgramFilesFolder)">
+ <Directory Id="INSTALLDIR" Name="Rust">
+ <!-- Root directories for every feature should have different IDs for correct work of heat.exe -->
+ <Directory Id="Rustc" Name="." />
+ <?if $(env.CFG_MINGW)="1" ?>
+ <Directory Id="Gcc" Name="." />
+ <?endif?>
+ <Directory Id="Docs" Name="." />
+ <Directory Id="Cargo" Name="." />
+ <Directory Id="Std" Name="." />
+ <!-- tool-rls-start -->
+ <Directory Id="Rls" Name="." />
+ <Directory Id="Analysis" Name="." />
+ <!-- tool-rls-end -->
+ </Directory>
+ </Directory>
+
+ <!-- Record our install location -->
+ <Component Id="InstallDir" Guid="*">
+ <RegistryValue Root="HKMU" Key="$(var.BaseRegKey)"
+ Type="string"
+ Name="InstallDir"
+ Value="[INSTALLDIR]" />
+ </Component>
+
+ <!-- Add $/bin to PATH -->
+ <Component Id="PathEnvPerMachine" Guid="*">
+ <Condition>ALLUSERS=1 OR (ALLUSERS=2 AND Privileged)</Condition>
+ <RegistryValue Root="HKMU" Key="$(var.BaseRegKey)" Name="PathEnvPerMachine" Type="string" Value="1" KeyPath="yes" />
+ <!-- [INSTALLDIR] contains trailing backslash -->
+ <Environment Id="PathPerMachine" Name="PATH" Value="[INSTALLDIR]bin" Permanent="no" Part="last" Action="set" System="yes" />
+ </Component>
+ <Component Id="PathEnvPerUser" Guid="*">
+ <Condition>ALLUSERS="" OR (ALLUSERS=2 AND (NOT Privileged))</Condition>
+ <RegistryValue Root="HKMU" Key="$(var.BaseRegKey)" Name="PathEnvPerUser" Type="string" Value="1" KeyPath="yes" />
+ <Environment Id="PathPerUser" Name="PATH" Value="[INSTALLDIR]bin" Permanent="no" Part="last" Action="set" System="no" />
+ </Component>
+
+ <!-- Start Menu shortcuts -->
+ <Directory Id="ProgramMenuFolder">
+ <Directory Id="ApplicationProgramsFolder" Name="Rust">
+ <Component Id="RustShellShortcut" Guid="*">
+ <Shortcut Id="RustShell"
+ Name="$(var.ProductName) Shell"
+ Description="Opens Command Prompt with Rust tools directory added to the PATH"
+ Target="[SHORTCUTTARGET]"
+ Arguments="/K path [INSTALLDIR]bin;%PATH%"
+ WorkingDirectory="SHORTCUTWKDIR">
+ <Icon Id="rust2.ico" SourceFile="rust-logo.ico" />
+ </Shortcut>
+ <RegistryValue Root="HKMU" Key="$(var.BaseRegKey)" Name="RustShell" Type="integer" Value="1" KeyPath="yes" />
+ <RemoveFolder Id="ApplicationProgramsFolder1" On="uninstall" />
+ </Component>
+ <Component Id="DocIndexShortcut" Guid="*">
+ <Shortcut Id="RustDocs"
+ Name="$(var.ProductName) Documentation"
+ Description="Opens Rust HTML documentation in the default browser"
+ Target="[INSTALLDIR]share\doc\rust\html\index.html" />
+ <RegistryValue Root="HKMU" Key="$(var.BaseRegKey)" Name="RustDocs" Type="integer" Value="1" KeyPath="yes" />
+ <RemoveFolder Id="ApplicationProgramsFolder2" On="uninstall" />
+ </Component>
+ </Directory>
+ </Directory>
+
+ </Directory>
+
+ <Feature Id="Rustc"
+ Title="Rust compiler and standard crates"
+ Display="1"
+ Level="1"
+ Absent="disallow"
+ AllowAdvertise="no">
+ <ComponentGroupRef Id="RustcGroup" />
+ <ComponentRef Id="RustShellShortcut" />
+ <ComponentRef Id="InstallDir" />
+ </Feature>
+ <Feature Id="Std"
+ Title="The Rust standard library"
+ Display="2"
+ Level="1"
+ AllowAdvertise="no">
+ <ComponentGroupRef Id="StdGroup" />
+ </Feature>
+ <Feature Id="Cargo"
+ Title="Cargo, the Rust package manager"
+ Display="3"
+ Level="1"
+ AllowAdvertise="no">
+ <ComponentGroupRef Id="CargoGroup" />
+ </Feature>
+ <?if $(env.CFG_MINGW)="1" ?>
+ <Feature Id="Gcc"
+ Title="Linker and platform libraries"
+ Description="If you choose to not install this component, you will require an external MinGW installation in order to create executables and libraries."
+ Display="4"
+ Level="1"
+ AllowAdvertise="no">
+ <ComponentGroupRef Id="GccGroup" />
+ </Feature>
+ <?endif?>
+ <Feature Id="Docs"
+ Title="HTML documentation"
+ Display="5"
+ Level="1"
+ AllowAdvertise="no">
+ <ComponentGroupRef Id="DocsGroup" />
+ <ComponentRef Id="DocIndexShortcut" />
+ </Feature>
+ <Feature Id="Path"
+ Title="Add to PATH"
+ Description="Add Rust to PATH environment variable"
+ Display="6"
+ Level="1"
+ AllowAdvertise="no">
+ <ComponentRef Id="PathEnvPerMachine" />
+ <ComponentRef Id="PathEnvPerUser" />
+ </Feature>
+ <!-- tool-rls-start -->
+ <Feature Id="RLS"
+ Title="RLS, the Rust Language Server"
+ Display="7"
+ Level="2"
+ AllowAdvertise="no">
+ <ComponentGroupRef Id="RlsGroup" />
+ <ComponentGroupRef Id="AnalysisGroup" />
+ </Feature>
+ <!-- tool-rls-end -->
+
+ <UIRef Id="RustUI" />
+ </Product>
+</Wix>
diff --git a/src/etc/installer/msi/rustwelcomedlg.wxs b/src/etc/installer/msi/rustwelcomedlg.wxs
new file mode 100644
index 000000000..0ee5415ff
--- /dev/null
+++ b/src/etc/installer/msi/rustwelcomedlg.wxs
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
+ <Fragment>
+ <UI>
+ <Dialog Id="RustWelcomeDlg" Width="370" Height="270" Title="!(loc.AdvancedWelcomeEulaDlg_Title)">
+ <Control Id="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" TabSkip="no" Text="!(loc.AdvancedWelcomeEulaDlgBannerBitmap)" />
+ <Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0" />
+ <Control Id="Title" Type="Text" X="20" Y="10" Width="300" Height="24" Transparent="yes" NoPrefix="yes" Text="!(loc.AdvancedWelcomeEulaDlgTitle)" />
+ <Control Id="DescriptionPerMachine" Type="Text" X="20" Y="182" Width="330" Height="31" Transparent="yes" NoPrefix="yes" Hidden="yes" Text="!(loc.AdvancedWelcomeEulaDlgDescriptionPerMachine)">
+ <Condition Action="show">NOT UPGRADE_DETECTED AND ALLUSERS</Condition>
+ </Control>
+ <Control Id="DescriptionPerUser" Type="Text" X="20" Y="182" Width="330" Height="31" Transparent="yes" NoPrefix="yes" Hidden="yes" Text="!(loc.AdvancedWelcomeEulaDlgDescriptionPerUser)">
+ <Condition Action="show">NOT UPGRADE_DETECTED AND NOT ALLUSERS</Condition>
+ </Control>
+ <Control Id="DescriptionUpgrade" Type="Text" X="20" Y="182" Width="330" Height="31" Transparent="yes" NoPrefix="yes" Hidden="yes"
+ Text="Click Install to upgrade the existing version of [ProductName]. Click Advanced to change installation options.">
+ <Condition Action="show">UPGRADE_DETECTED</Condition>
+ </Control>
+ <Control Id="TargetPath" Type="Text" X="20" Y="212" Width="330" Height="31" Transparent="yes" NoPrefix="yes" Hidden="no"
+ Text="Install Directory: [INSTALLDIR]">
+ </Control>
+ <Control Id="Print" Type="PushButton" X="88" Y="243" Width="56" Height="17" Text="!(loc.WixUIPrint)">
+ <Publish Event="DoAction" Value="WixUIPrintEula">1</Publish>
+ </Control>
+ <Control Id="Advanced" Type="PushButton" X="156" Y="243" Width="56" Height="17" Text="!(loc.AdvancedWelcomeEulaDlgAdvanced)" />
+ <Control Id="Install" Type="PushButton" ElevationShield="yes" X="212" Y="243" Width="80" Height="17" Default="yes" Text="!(loc.AdvancedWelcomeEulaDlgInstall)" Hidden="yes">
+ <Publish Event="SpawnWaitDialog" Value="WaitForCostingDlg">!(wix.WixUICostingPopupOptOut) OR CostingComplete = 1</Publish>
+ <Publish Event="EndDialog" Value="Return"><![CDATA[OutOfDiskSpace <> 1]]></Publish>
+ <Publish Event="SpawnDialog" Value="OutOfRbDiskDlg">OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND (PROMPTROLLBACKCOST="P" OR NOT PROMPTROLLBACKCOST)</Publish>
+ <Publish Event="EndDialog" Value="Return">OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST="D"</Publish>
+ <Publish Event="EnableRollback" Value="False">OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST="D"</Publish>
+ <Publish Event="SpawnDialog" Value="OutOfDiskDlg">(OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 1) OR (OutOfDiskSpace = 1 AND PROMPTROLLBACKCOST="F")</Publish>
+ <Condition Action="show">ALLUSERS</Condition>
+ </Control>
+ <Control Id="InstallNoShield" Type="PushButton" ElevationShield="no" X="212" Y="243" Width="80" Height="17" Default="yes" Text="!(loc.AdvancedWelcomeEulaDlgInstall)" Hidden="yes">
+ <Publish Event="SpawnWaitDialog" Value="WaitForCostingDlg">!(wix.WixUICostingPopupOptOut) OR CostingComplete = 1</Publish>
+ <Publish Event="EndDialog" Value="Return"><![CDATA[OutOfDiskSpace <> 1]]></Publish>
+ <Publish Event="SpawnDialog" Value="OutOfRbDiskDlg">OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND (PROMPTROLLBACKCOST="P" OR NOT PROMPTROLLBACKCOST)</Publish>
+ <Publish Event="EndDialog" Value="Return">OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST="D"</Publish>
+ <Publish Event="EnableRollback" Value="False">OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST="D"</Publish>
+ <Publish Event="SpawnDialog" Value="OutOfDiskDlg">(OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 1) OR (OutOfDiskSpace = 1 AND PROMPTROLLBACKCOST="F")</Publish>
+ <Condition Action="show">NOT ALLUSERS</Condition>
+ </Control>
+ <Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Cancel="yes" Text="!(loc.WixUICancel)">
+ <Publish Event="SpawnDialog" Value="CancelDlg">1</Publish>
+ </Control>
+ <Control Id="LicenseText" Type="ScrollableText" X="20" Y="55" Width="330" Height="121" Sunken="yes" TabSkip="no">
+ <Text SourceFile="!(wix.WixUILicenseRtf)" />
+ </Control>
+ </Dialog>
+ </UI>
+
+ <InstallUISequence>
+ <Show Dialog="RustWelcomeDlg" Before="ProgressDlg">NOT Installed</Show>
+ </InstallUISequence>
+ </Fragment>
+</Wix>
diff --git a/src/etc/installer/msi/squash-components.xsl b/src/etc/installer/msi/squash-components.xsl
new file mode 100644
index 000000000..17b4e0388
--- /dev/null
+++ b/src/etc/installer/msi/squash-components.xsl
@@ -0,0 +1,34 @@
+<?xml version="1.0" ?>
+<xsl:stylesheet version="1.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:wix="http://schemas.microsoft.com/wix/2006/wi">
+ <!-- Copy all attributes and elements to the output. -->
+ <xsl:template match="@*|*">
+ <xsl:copy>
+ <xsl:apply-templates select="@*|*"/>
+ </xsl:copy>
+ </xsl:template>
+ <xsl:output method="xml" indent="yes" />
+
+ <!-- Move all files in directory into first component in that directory. -->
+ <xsl:template match="wix:Component[1]">
+ <xsl:copy>
+ <xsl:apply-templates select="@*|*"/>
+ <xsl:for-each select="../wix:Component[preceding-sibling::*]/wix:File">
+ <xsl:copy>
+ <!-- Component can only have one KeyPath -->
+ <xsl:apply-templates select="@*[not(name()='KeyPath')]|*"/>
+ </xsl:copy>
+ </xsl:for-each>
+ </xsl:copy>
+ </xsl:template>
+
+ <!-- Now the rest of components are empty, find them. -->
+ <xsl:key name="empty-cmp-ids" match="wix:Component[preceding-sibling::*]" use="@Id" />
+
+ <!-- And remove. -->
+ <xsl:template match="wix:Component[preceding-sibling::*]" />
+
+ <!-- Also remove componentsrefs referencing empty components. -->
+ <xsl:template match="wix:ComponentRef[key('empty-cmp-ids', @Id)]" />
+</xsl:stylesheet>
diff --git a/src/etc/installer/msi/ui.wxs b/src/etc/installer/msi/ui.wxs
new file mode 100644
index 000000000..3e2db6051
--- /dev/null
+++ b/src/etc/installer/msi/ui.wxs
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Based on WixUI_Advanced
+-->
+
+<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
+ <Fragment>
+ <WixVariable Id="WixUISupportPerUser" Value="1" Overridable="yes" />
+ <WixVariable Id="WixUISupportPerMachine" Value="1" Overridable="yes" />
+ <WixVariable Id="WixUILicenseRtf" Value="LICENSE.rtf" />
+ <WixVariable Id="WixUIDialogBmp" Value="dialogbg.bmp" />
+ <WixVariable Id="WixUIBannerBmp" Value="banner.bmp" />
+
+ <UI Id="RustUI">
+ <TextStyle Id="WixUI_Font_Normal" FaceName="!(loc.Advanced_Font_FaceName)" Size="!(loc.Advanced_Font_Normal_Size)" />
+ <TextStyle Id="WixUI_Font_Bigger" FaceName="!(loc.Advanced_Font_FaceName)" Size="!(loc.Advanced_Font_Bigger_Size)" />
+ <TextStyle Id="WixUI_Font_Title" FaceName="!(loc.Advanced_Font_FaceName)" Size="!(loc.Advanced_Font_Title_Size)" Bold="yes" />
+ <TextStyle Id="WixUI_Font_Emphasized" FaceName="!(loc.Advanced_Font_FaceName)" Size="!(loc.Advanced_Font_Emphasized_Size)" Bold="yes" />
+
+ <Property Id="DefaultUIFont" Value="WixUI_Font_Normal" />
+ <Property Id="WixUI_Mode" Value="Advanced" />
+
+ <DialogRef Id="BrowseDlg" />
+ <DialogRef Id="DiskCostDlg" />
+ <DialogRef Id="ErrorDlg" />
+ <DialogRef Id="FatalError" />
+ <DialogRef Id="FilesInUse" />
+ <DialogRef Id="MsiRMFilesInUse" />
+ <DialogRef Id="PrepareDlg" />
+ <DialogRef Id="ProgressDlg" />
+ <DialogRef Id="ResumeDlg" />
+ <DialogRef Id="UserExit" />
+ <DialogRef Id="WelcomeDlg"/>
+
+ <Publish Dialog="ExitDialog" Control="Finish" Event="EndDialog" Value="Return" Order="999">1</Publish>
+
+ <Publish Dialog="BrowseDlg" Control="OK" Event="DoAction" Value="WixUIValidatePath" Order="1">1</Publish>
+ <Publish Dialog="BrowseDlg" Control="OK" Event="SpawnDialog" Value="InvalidDirDlg" Order="2"><![CDATA[WIXUI_INSTALLDIR_VALID<>"1"]]></Publish>
+
+ <Publish Dialog="RustWelcomeDlg" Control="Advanced" Event="NewDialog" Value="InstallScopeDlg" Order="1" />
+
+ <Publish Dialog="InstallScopeDlg" Control="Back" Event="NewDialog" Value="RustWelcomeDlg">1</Publish>
+ <!-- override default WixAppFolder of WixPerMachineFolder as standard user won't be shown the radio group to set WixAppFolder -->
+ <Publish Dialog="InstallScopeDlg" Control="Next" Property="WixAppFolder" Value="WixPerUserFolder" Order="1">!(wix.WixUISupportPerUser) AND NOT Privileged</Publish>
+ <Publish Dialog="InstallScopeDlg" Control="Next" Property="ALLUSERS" Value="{}" Order="2">WixAppFolder = "WixPerUserFolder"</Publish>
+ <Publish Dialog="InstallScopeDlg" Control="Next" Property="ALLUSERS" Value="1" Order="3">WixAppFolder = "WixPerMachineFolder"</Publish>
+ <Publish Dialog="InstallScopeDlg" Control="Next" Property="INSTALLDIR" Value="[INSTALLDIR_USER]" Order="4">WixAppFolder = "WixPerUserFolder"</Publish>
+ <Publish Dialog="InstallScopeDlg" Control="Next" Property="INSTALLDIR" Value="[INSTALLDIR_MACHINE]" Order="5">WixAppFolder = "WixPerMachineFolder"</Publish>
+ <Publish Dialog="InstallScopeDlg" Control="Next" Event="NewDialog" Value="InstallDirDlg" Order="6">1</Publish>
+
+ <Publish Dialog="InstallDirDlg" Control="Back" Event="NewDialog" Value="InstallScopeDlg" />
+ <Publish Dialog="InstallDirDlg" Control="Next" Event="SetTargetPath" Value="[WIXUI_INSTALLDIR]" Order="1">1</Publish>
+ <Publish Dialog="InstallDirDlg" Control="Next" Event="DoAction" Value="WixUIValidatePath" Order="2">NOT WIXUI_DONTVALIDATEPATH</Publish>
+ <Publish Dialog="InstallDirDlg" Control="Next" Event="SpawnDialog" Value="InvalidDirDlg" Order="3"><![CDATA[NOT WIXUI_DONTVALIDATEPATH AND WIXUI_INSTALLDIR_VALID<>"1"]]></Publish>
+ <Publish Dialog="InstallDirDlg" Control="Next" Event="NewDialog" Value="FeaturesDlg" Order="4">WIXUI_DONTVALIDATEPATH OR WIXUI_INSTALLDIR_VALID="1"</Publish>
+ <Publish Dialog="InstallDirDlg" Control="ChangeFolder" Property="_BrowseProperty" Value="[WIXUI_INSTALLDIR]" Order="1">1</Publish>
+ <Publish Dialog="InstallDirDlg" Control="ChangeFolder" Event="SpawnDialog" Value="BrowseDlg" Order="2">1</Publish>
+
+ <Publish Dialog="FeaturesDlg" Control="Back" Event="NewDialog" Value="InstallDirDlg">NOT Installed AND WixAppFolder = "WixPerUserFolder"</Publish>
+ <Publish Dialog="FeaturesDlg" Control="Back" Event="NewDialog" Value="InstallDirDlg">NOT Installed AND WixAppFolder = "WixPerMachineFolder"</Publish>
+ <Publish Dialog="FeaturesDlg" Control="Back" Event="NewDialog" Value="MaintenanceTypeDlg">Installed</Publish>
+
+ <Publish Dialog="MaintenanceWelcomeDlg" Control="Next" Event="NewDialog" Value="MaintenanceTypeDlg">1</Publish>
+
+ <Publish Dialog="MaintenanceTypeDlg" Control="ChangeButton" Event="NewDialog" Value="FeaturesDlg">1</Publish>
+ <Publish Dialog="MaintenanceTypeDlg" Control="RepairButton" Event="NewDialog" Value="VerifyReadyDlg">1</Publish>
+ <Publish Dialog="MaintenanceTypeDlg" Control="RemoveButton" Event="NewDialog" Value="VerifyReadyDlg">1</Publish>
+ <Publish Dialog="MaintenanceTypeDlg" Control="Back" Event="NewDialog" Value="MaintenanceWelcomeDlg">1</Publish>
+
+ <Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="MaintenanceTypeDlg" Order="2">Installed AND NOT PATCH</Publish>
+ <Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg" Order="3">Installed AND PATCH</Publish>
+
+ <Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="VerifyReadyDlg">Installed AND PATCH</Publish>
+ </UI>
+
+ <InstallUISequence>
+ <Show Dialog="WelcomeDlg" Before="RustWelcomeDlg" >Installed AND PATCH</Show>
+ </InstallUISequence>
+
+ <Property Id="WIXUI_INSTALLDIR" Value="INSTALLDIR" />
+ <UIRef Id="WixUI_Common" />
+ </Fragment>
+</Wix>
diff --git a/src/etc/installer/pkg/Distribution.xml b/src/etc/installer/pkg/Distribution.xml
new file mode 100644
index 000000000..077ee1751
--- /dev/null
+++ b/src/etc/installer/pkg/Distribution.xml
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<installer-gui-script minSpecVersion="2">
+ <title>The Rust Compiler</title>
+ <license file="LICENSE.txt" mime-type="text/plain"/>
+ <pkg-ref id="org.rust-lang.rust"/>
+ <options customize="always" require-scripts="false" hostArchitectures="i386,x86_64"/>
+ <domains enable_anywhere="false" enable_currentUserHome="false" enable_localSystem="true" />
+ <volume-check>
+ <allowed-os-versions>
+ <os-version min="10.7"/>
+ </allowed-os-versions>
+ </volume-check>
+ <choices-outline>
+ <line choice="install">
+ <line choice="rustc"/>
+ <line choice="rust-std"/>
+ <line choice="cargo"/>
+ <line choice="rust-docs"/>
+ <!-- tool-rls-start -->
+ <line choice="rls"/>
+ <!-- tool-rls-end -->
+ </line>
+ <line choice="uninstall" />
+ </choices-outline>
+ <!--
+ These 'selected' scripts ensure that install and uninstall can never be selected at
+ the same time. Exectly how they work is pretty mysterious, tied to the unspecified algorithm
+ the installer uses to traverse the options after one is toggled.
+ -->
+ <choice id="install" visible="true"
+ title="Install Rust" description="Install the Rust compiler, package manager and documentation."
+ customLocation="/usr/local"
+ selected="!choices.uninstall.selected"
+ />
+ <choice id="uninstall" visible="true"
+ title="Uninstall Rust" description="Select this option to uninstall an existing Rust installation."
+ customLocation="/usr/local"
+ selected="!(choices.install.selected || choices.rustc.selected || choices.cargo.selected || choices['rust-docs'].selected)"
+ start_selected="false"
+ >
+ <pkg-ref id="org.rust-lang.uninstall"/>
+ </choice>
+ <choice id="rustc" visible="true"
+ title="Compiler" description="rustc, the Rust compiler, and rustdoc, the API documentation tool."
+ selected="(!choices.uninstall.selected &amp;&amp; choices.rustc.selected) || (choices.uninstall.selected &amp;&amp; choices.install.selected)"
+ >
+ <pkg-ref id="org.rust-lang.rustc"/>
+ </choice>
+ <choice id="cargo" visible="true"
+ title="Cargo" description="cargo, the Rust package manager."
+ selected="(!choices.uninstall.selected &amp;&amp; choices.cargo.selected) || (choices.uninstall.selected &amp;&amp; choices.install.selected)"
+ >
+ <pkg-ref id="org.rust-lang.cargo"/>
+ </choice>
+ <choice id="rust-std" visible="true"
+ title="Standard Library" description="The Rust standard library."
+ selected="(!choices.uninstall.selected &amp;&amp; choices['rust-std'].selected) || (choices.uninstall.selected &amp;&amp; choices.install.selected)"
+ >
+ <pkg-ref id="org.rust-lang.rust-std"/>
+ </choice>
+ <choice id="rust-docs" visible="true"
+ title="Documentation" description="HTML documentation."
+ selected="(!choices.uninstall.selected &amp;&amp; choices['rust-docs'].selected) || (choices.uninstall.selected &amp;&amp; choices.install.selected)"
+ >
+ <pkg-ref id="org.rust-lang.rust-docs"/>
+ </choice>
+ <!-- tool-rls-start -->
+ <choice id="rls" visible="true"
+ title="RLS" description="RLS, the Rust Language Server"
+ selected="(!choices.uninstall.selected &amp;&amp; choices['rls'].selected) || (choices.uninstall.selected &amp;&amp; choices.install.selected)"
+ start_selected="false"
+ >
+ <pkg-ref id="org.rust-lang.rls"/>
+ <pkg-ref id="org.rust-lang.rust-analysis"/>
+ </choice>
+ <!-- tool-rls-end -->
+ <pkg-ref id="org.rust-lang.rustc" version="0" onConclusion="none">rustc.pkg</pkg-ref>
+ <pkg-ref id="org.rust-lang.cargo" version="0" onConclusion="none">cargo.pkg</pkg-ref>
+ <pkg-ref id="org.rust-lang.rust-docs" version="0" onConclusion="none">rust-docs.pkg</pkg-ref>
+ <pkg-ref id="org.rust-lang.rust-std" version="0" onConclusion="none">rust-std.pkg</pkg-ref>
+ <!-- tool-rls-start -->
+ <pkg-ref id="org.rust-lang.rls" version="0" onConclusion="none">rls.pkg</pkg-ref>
+ <!-- tool-rls-end -->
+ <pkg-ref id="org.rust-lang.rust-analysis" version="0" onConclusion="none">rust-analysis.pkg</pkg-ref>
+ <pkg-ref id="org.rust-lang.uninstall" version="0" onConclusion="none">uninstall.pkg</pkg-ref>
+ <background file="rust-logo.png" mime-type="image/png"
+ alignment="bottomleft"/>
+</installer-gui-script>
diff --git a/src/etc/installer/pkg/postinstall b/src/etc/installer/pkg/postinstall
new file mode 100755
index 000000000..fb035a486
--- /dev/null
+++ b/src/etc/installer/pkg/postinstall
@@ -0,0 +1,26 @@
+#!/bin/sh
+
+source_dir="$(dirname "$0")"
+dest_dir="$2"
+package_id="$INSTALL_PKG_SESSION_ID"
+
+if [ -z "$source_dir" ]; then
+ exit 1
+fi
+if [ -z "$dest_dir" ]; then
+ exit 1
+fi
+if [ -z "$package_id" ]; then
+ exit 1
+fi
+
+if [ "$package_id" = "org.rust-lang.uninstall" ]; then
+ if [ ! -e "$dest_dir/lib/rustlib/uninstall.sh" ]; then
+ exit 1
+ fi
+ sh "$dest_dir/lib/rustlib/uninstall.sh"
+else
+ sh "$source_dir/install.sh" --prefix="$dest_dir"
+fi
+
+exit 0