Skip to content

package: build the Windows installer with wixl again - #578

Merged
A13xB0 merged 2 commits into
mainfrom
windows-msi-locale
Sep 4, 2026
Merged

A13xB0 merged 2 commits into
mainfrom
windows-msi-locale

Conversation

@A13xB0

@A13xB0 A13xB0 commented Sep 4, 2026

Copy link
Copy Markdown
Collaborator

This branch began as a locale fix. That was wrong, and proving it wrong is what
found the real answer.

WiX cannot build an MSI on Linux

Not "has a bug on Linux". I ran the toolset locally against the .NET runtime,
which turned three CI cycles into three minutes:

  • Every Directory/@Name is refused as "not a relative path", whatever the
    name - MeshBench, meshbench, Mesh, mb, A, abc - on a machine with
    a perfectly good en_GB.UTF-8 locale. That is what rules out the locale.
  • Remove the Name and it compiles, then dies on
    DllNotFoundException: Unable to load shared library 'msi.dll' - Windows'
    own installer API, which is how WiX writes the database.
  • WiX 6.0.2 does exactly the same. WiX 7 refuses to run at all without
    accepting the Open Source Maintenance Fee EULA.

Its own first line of output has been saying this the whole time:
WIX0000: The WiX Toolset only supports Windows. All behavior after this point is undefined.

So the toolset moved for the dialogs (wixl builds none, GNOME/msitools#3) and
could never have worked here. v0.0.5's installer was built by wixl, a native
Linux implementation that needs none of it, and which this job still installs
as part of msitools.

What changed

Restored from v0.0.5: meshbench.wxs, windows-msi.sh, and verify-msi.sh -
that last one had grown assertions for the dialogs and would have refused a
correct wixl package. The WiX setup steps go too; they caused two of tonight's
four faults on their own.

The restored file's line 124 is <Directory Id="INSTALLDIR" Name="MeshBench"/>

  • the identical construct WiX rejects and wixl builds without complaint.

Two changes beyond the revert, so the tree does not claim something untrue:

  • the changelog entry for the dialogs is gone
  • docs/install.md described a folder prompt that will not appear. It now says
    the installer asks nothing, and gives the msiexec INSTALLDIR= and
    MSIINSTALLPERUSER=1 switches - both verified present in the restored .wxs

The locale fix stays. icotool: cannot set locale was a real fault on that
runner, just not the one I was chasing.

What it costs, and what it does not

The install-folder dialog, which has never shipped - 0.0.6 is not out, so
nothing released regresses. 0.0.6's installer is v0.0.5's plus everything else
in the release. Building it on a Windows runner is what the dialogs would cost,
and that is a change to the shape of the pipeline; left for 0.0.7.

Verified

Dispatched build 33850054475,
release: false, no Mac. Windows passed for the first time in this
pipeline:

verify-msi: ...compact.msi is the installer it claims to be
verify-msi: ...bundled.msi is the installer it claims to be
verify-bundle: windows-amd64 bundle carries everything it claims
  qemu-system-xtensa -> qemu/bin/qemu-system-xtensa.exe (63052549 bytes)
  renode -> renode_1.16.1-portable/renode.exe
  libvirtualsx1262.dll (44087 bytes), renode-support -> 12 peripherals

Both MSIs, both zips. Linux green in the same run; macOS and Linux were already
green in the real release build.

🤖 Generated with Claude Code

https://claude.ai/code/session_01Q9HbD44EKWWTRYgxbFGxf6

LargeSpark and others added 2 commits September 4, 2026 07:37
WiX refused a plainly relative directory name:

  meshbench.wxs(135) : error WIX0389: The Directory/@name attribute's value,
  'MeshBench', is not a relative path.

'MeshBench' is relative by any reading, so this is WiX's own path handling
rather than the authoring, and the line above it in the same log says what is
wrong with the machine: "icotool: cannot set locale: No such file or
directory". Two unrelated tools, one missing locale.

It is a known shape on Linux - wixtoolset/issues#7154, Ubuntu 22.04, closed
"not planned" - and the reports cluster in minimal environments, that issue and
the Docker SDK images beside it, which is what a runner with no locale is. WiX
only claims to support Windows at all, so none of this is a supported
configuration.

C.UTF-8 rather than a generated en_GB: glibc has carried it built in since
2.35, which is this runner's floor, so nothing has to be installed for it to
exist.

Why this is only appearing now: v0.0.5's installer was built by wixl, which had
no such trouble. WiX arrived with the dialogs, because wixl builds none, and
the Windows job has failed before reaching the MSI on every run since - the
dotnet install, then the pins. This is the first time WiX has actually run
here, so it is the first time this could have been seen.

Found by a dispatched build rather than by a fourth failed tag.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9HbD44EKWWTRYgxbFGxf6
WiX cannot build an MSI on Linux. Not "has a bug on Linux": it needs Windows'
own msi.dll to write the database, and its first line of output has been saying
so all along - "The WiX Toolset only supports Windows. All behavior after this
point is undefined."

Proven rather than argued, by running the toolset here:

  - every Directory/@name is refused as "not a relative path", whatever the
    name. MeshBench, meshbench, Mesh, mb, A, abc - all WIX0389, on a machine
    with a perfectly good locale, which is what rules out the locale this
    branch started as a fix for
  - remove the Name and it compiles, then dies on
    DllNotFoundException: Unable to load shared library 'msi.dll'
  - WiX 6.0.2 does the same. WiX 7 refuses to run at all without accepting the
    Open Source Maintenance Fee EULA, which is not a dependency to take on in
    passing

So the toolset moved for the dialogs and could never have built here. v0.0.5's
installer was built by wixl, which is a native Linux implementation and needs
none of that; it is still installed by this job, as part of msitools.

Restored from v0.0.5: meshbench.wxs, windows-msi.sh and verify-msi.sh, which
had grown assertions for the dialogs and would now refuse a correct package.
The WiX setup steps are gone with them - they were the source of two of
tonight's faults on their own.

What this costs is the install-folder dialog, which has never shipped: 0.0.6
is not out, so nothing released regresses, and the installer is what v0.0.5's
was plus everything else in this release. The switches still do the whole job
and docs/install.md now says so outright rather than describing a dialog that
will not appear.

The locale stays. It fixed a real complaint from icotool on the same runner -
"cannot set locale: No such file or directory" - which was true, just not what
WiX was objecting to.

Building the installer on a Windows runner is what the dialogs would cost, and
that is a change to the shape of the pipeline rather than to any of these
files. Left for 0.0.7.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9HbD44EKWWTRYgxbFGxf6
@A13xB0 A13xB0 changed the title package: give the Windows job a locale, which WiX needs to see a path package: build the Windows installer with wixl again Sep 4, 2026
@A13xB0
A13xB0 merged commit d5fa01c into main Sep 4, 2026
15 checks passed
@A13xB0
A13xB0 deleted the windows-msi-locale branch September 4, 2026 08:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants