.. py:currentmodule:: starlark_tugger .. _tugger_wix: =================================================== Using the WiX Toolset to Produce Windows Installers =================================================== The `WiX Toolset `_ is an open source collection of tools used for building Windows installers (``.msi`` files, ``.exe``, etc). The WiX Toolset is incredibly powerful and enables building anything from simple to complex installers. Tugger defines interfaces to the WiX Toolset via Rust APIs and exposes much of this functionality to Starlark. .. _tugger_wix_concepts: Concepts ======== With the WiX Toolset, you define your installer through ``.wxs`` XML files. You use the ``candle.exe`` program to *compile* these files into ``.wixobj`` files. These *compiled* files are then *linked* together using ``light.exe`` to produce an installer (``.msi``, ``.exe``, etc). The goal of Tugger's Rust API is to expose the low-level control over WiX Toolset that the most demanding applications will need while also providing high-level and simpler interfaces for performing common tasks (such as producing a simple ``.msi`` installer that simply materializes files into the ``Program Files`` directory). .. _tugger_wix_apis: Tugger's WiX APIs ================= Tugger implements various interfaces for interacting with WiX. This section attempts to document them at a high level and talks about when to use which. ``WxsBuilder`` The ``WxsBuilder`` Rust struct is used to build a single ``.wxs`` file. You provide the path of the ``.wxs`` and build settings and it knows how to invoke ``candle.exe`` for this file. ``WiXInstallerBuilder`` The ``WiXInstallerBuilder`` Rust struct and :py:class:`WiXInstaller` Starlark type are used to manage the end-to-end building and linking of ``.wxs`` files. This type knows how to register multiple ``WxsBuilder`` instances and build them as a collection. This type holds all the logic for invoking ``candle.exe`` and ``light.exe``. ``WiXSimpleMSIBuilder`` The ``WiXSimpleMSIBuilder`` Rust struct and :py:class:`WiXMSIBuilder` Starlark type provide a high-level interface for generating an MSI based installer with common features. It enables you to generate a ``.wxs`` file by providing a few parameters, without having to know WiX XML. A ``WiXSimpleMSIBuilder`` ultimately is converted to a ``WiXInstallerBuilder``. ``WiXBundleInstallerBuilder`` The ``WiXBundleInstallerBuilder`` Rust struct and :py:class:`WiXBundleBuilder` Starlark type provide a high-level interface for generating an ``.exe`` based installed with common features. A ``WiXBundleInstallerBuilder`` ultimately is converted to a ``WiXInstallerBuilder``. If your application only needs the limited functionality exposed by the high-level ``WiXSimpleMSIBuilder`` and ``WiXBundleInstallerBuilder`` interfaces, you are encouraged to use these for building your installer, as you won't need to concern yourself with the low-level WiX XML details. If your application needs what you think is simple or common functionality not provided by the aforementioned high-level builders, consider filing a feature request to request the missing functionality. Complex applications that have outgrown the limited capabilities of the high-level *builder* interfaces will need to use the lower level ``WiXInstallerBuilder`` / :py:class:`WiXInstaller` interface. This interface allows you to provide your own ``.wxs`` files. This means you can still use Tugger for invoking WiX, even if all of your ``.wxs`` files are maintained outside of Tugger, enabling Tugger to grow with your needs. Note that it is possible to use one of the higher-level interfaces for automatically generating a ``.wxs`` file and then supplement this automatically-generated file with other ``.wxs`` files that you maintain. .. note:: Ideally no WiX installer should be too complicated to be handled by Tugger. If Tugger's functionality is not sufficient, consider `creating an issue `_ to request a feature to close the feature gap. .. _tugger_wix_invoking: How Tugger Invokes WiX ====================== Tugger's Rust APIs collects which ``.wxs`` files to compile and their compilation settings. It also collects additional files needed to compile ``.wxs`` files. When you *build* your installer, Tugger copies all the registered ``.wxs`` files plus other registered files into a common directory. It then invokes ``candle.exe`` on each ``.wxs`` file followed by ``light.exe`` to link them together. This is different from a traditional environment, where ``.wxs`` files are often processed in place: Tugger always makes copies to try to ensure results are reproducible and the full build environment is captured. .. _tugger_wix_files_fragments: Automatic ```` Generation for Files ============================================= Tugger supports automatically generating a ``.wxs`` file with ````'s describing a set of files. Given a set of input files, it will produce a deterministic ``.wxs`` file with ```` holding ```` and ```` of every file therein as well as ```` for each distinct directory tree. This functionality is similar to what WiX Toolset's ``heat.exe`` tool can do. However, Tugger uses a deterministic mechanism to derive GUIDs and IDs for each item. This enables the produced elements to be referenced in other ``.wxs`` files more easily. And the generated file doesn't need to be saved or manually updated, as it does with the use of ``heat.exe``. You simply give Tugger a manifest of files to index and the prefix for ``Id`` attributes in XML, and it will emit a deterministic ``.wxs`` file!