Skip to content

Migrate the SDK from MINGW64 to UCRT64 - #117

Draft
dscho wants to merge 39 commits into
mainfrom
ucrt64
Draft

Migrate the SDK from MINGW64 to UCRT64#117
dscho wants to merge 39 commits into
mainfrom
ucrt64

Conversation

@dscho

@dscho dscho commented Jun 6, 2026

Copy link
Copy Markdown
Member

MSYS2 deprecated MINGW64 a while back; new packages no longer get accepted there, and updates of the ones we already ship have been winding down. The SDK has to move over to UCRT64 before what we ship there starts to bit-rot.

This branch only adds the piece that kicks the move off: a workflow that runs inside this PR, pulls in the UCRT64 equivalent of every MINGW64 package we currently have installed, and then takes the old MINGW64 and MINGW32 packages back out. The PR is a draft so the resulting commits can be looked at before any of it lands on main.

The plan was sketched in git-for-windows/git#6018 (reply in thread).

@dscho dscho self-assigned this Jun 6, 2026
MSYS2 has deprecated MINGW64. Upstream no longer accepts new packages
targeting that environment and is winding down updates for the ones we
already ship, so anything we do not migrate is going to rot in place.
UCRT64 is the supported successor for the x86_64 target, and Git for
Windows therefore has to follow.

Rather than spin up a separate `git-sdk-ucrt-64` repository just for the
new environment, we want to keep everything in this repo and make the
cutover happen on a `ucrt64` branch that eventually becomes `main`. To
produce the converted tree without running `pacman` manually, many
times, and committing the resulting churn, this commit adds a one-shot
workflow that performs exactly that work inside the PR opened from the
`ucrt64` branch: it installs the UCRT64 counterpart of every
currently-installed MINGW64 package, then uninstalls every MINGW64
package, then uninstalls every MINGW32 package. Each phase becomes one
giant commit like the ones produced by the `sync` workflow.

This approach was brain-stormed and documented in
git-for-windows/git#6018 (reply in thread).

Assisted-by: Opus 4.7
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Git for Windows Build Agent added 3 commits June 6, 2026 20:45
Installed UCRT64 packages:
    mingw-w64-ucrt-x86_64-7zip
    mingw-w64-ucrt-x86_64-antiword
    mingw-w64-ucrt-x86_64-asciidoctor
    mingw-w64-ucrt-x86_64-binutils
    mingw-w64-ucrt-x86_64-brotli
    mingw-w64-ucrt-x86_64-bzip2
    mingw-w64-ucrt-x86_64-c-ares
    mingw-w64-ucrt-x86_64-ca-certificates
    mingw-w64-ucrt-x86_64-connect
    mingw-w64-ucrt-x86_64-crt
    mingw-w64-ucrt-x86_64-curl-winssl
    mingw-w64-ucrt-x86_64-expat
    mingw-w64-ucrt-x86_64-gcc
    mingw-w64-ucrt-x86_64-gcc-libs
    mingw-w64-ucrt-x86_64-gdb
    mingw-w64-ucrt-x86_64-gdbm
    mingw-w64-ucrt-x86_64-gettext-libtextstyle
    mingw-w64-ucrt-x86_64-gettext-runtime
    mingw-w64-ucrt-x86_64-gettext-tools
    mingw-w64-ucrt-x86_64-git
    mingw-w64-ucrt-x86_64-git-credential-wincred
    mingw-w64-ucrt-x86_64-git-doc-html
    mingw-w64-ucrt-x86_64-git-for-windows-addons
    mingw-w64-ucrt-x86_64-git-gui
    mingw-w64-ucrt-x86_64-git-lfs
    mingw-w64-ucrt-x86_64-git-perl
    mingw-w64-ucrt-x86_64-git-send-email
    mingw-w64-ucrt-x86_64-git-subtree
    mingw-w64-ucrt-x86_64-git-svn
    mingw-w64-ucrt-x86_64-gitk
    mingw-w64-ucrt-x86_64-gmp
    mingw-w64-ucrt-x86_64-gnutls
    mingw-w64-ucrt-x86_64-headers
    mingw-w64-ucrt-x86_64-isl
    mingw-w64-ucrt-x86_64-libb2
    mingw-w64-ucrt-x86_64-libffi
    mingw-w64-ucrt-x86_64-libiconv
    mingw-w64-ucrt-x86_64-libidn2
    mingw-w64-ucrt-x86_64-libmangle
    mingw-w64-ucrt-x86_64-libpsl
    mingw-w64-ucrt-x86_64-libssh2-wincng
    mingw-w64-ucrt-x86_64-libsystre
    mingw-w64-ucrt-x86_64-libtasn1
    mingw-w64-ucrt-x86_64-libtre
    mingw-w64-ucrt-x86_64-libunistring
    mingw-w64-ucrt-x86_64-libwinpthread
    mingw-w64-ucrt-x86_64-libyaml
    mingw-w64-ucrt-x86_64-libzip
    mingw-w64-ucrt-x86_64-mpc
    mingw-w64-ucrt-x86_64-mpdecimal
    mingw-w64-ucrt-x86_64-mpfr
    mingw-w64-ucrt-x86_64-ncurses
    mingw-w64-ucrt-x86_64-nettle
    mingw-w64-ucrt-x86_64-nghttp2
    mingw-w64-ucrt-x86_64-odt2txt
    mingw-w64-ucrt-x86_64-openssl
    mingw-w64-ucrt-x86_64-osslsigncode
    mingw-w64-ucrt-x86_64-p11-kit
    mingw-w64-ucrt-x86_64-pcre
    mingw-w64-ucrt-x86_64-pcre2
    mingw-w64-ucrt-x86_64-pkgconf
    mingw-w64-ucrt-x86_64-python
    mingw-w64-ucrt-x86_64-readline
    mingw-w64-ucrt-x86_64-ruby
    mingw-w64-ucrt-x86_64-sqlite3
    mingw-w64-ucrt-x86_64-tcl
    mingw-w64-ucrt-x86_64-termcap
    mingw-w64-ucrt-x86_64-tk
    mingw-w64-ucrt-x86_64-tools
    mingw-w64-ucrt-x86_64-tzdata
    mingw-w64-ucrt-x86_64-windows-default-manifest
    mingw-w64-ucrt-x86_64-wineditline
    mingw-w64-ucrt-x86_64-winpthreads
    mingw-w64-ucrt-x86_64-xxhash
    mingw-w64-ucrt-x86_64-xz
    mingw-w64-ucrt-x86_64-zlib
    mingw-w64-ucrt-x86_64-zstd

No UCRT64 counterpart in the configured Pacman repositories (skipped):
    mingw-w64-x86_64-busybox
    mingw-w64-x86_64-curl-openssl-alternate
    mingw-w64-x86_64-cv2pdb
    mingw-w64-x86_64-git-credential-manager
    mingw-w64-x86_64-git-extra
    mingw-w64-x86_64-wintoast
    mingw-w64-x86_64-xpdf-tools

Signed-off-by: Git for Windows Build Agent <ci@git-for-windows.build>
Removed MINGW64 packages:
    mingw-w64-x86_64-7zip
    mingw-w64-x86_64-antiword
    mingw-w64-x86_64-asciidoctor
    mingw-w64-x86_64-binutils
    mingw-w64-x86_64-brotli
    mingw-w64-x86_64-busybox
    mingw-w64-x86_64-bzip2
    mingw-w64-x86_64-c-ares
    mingw-w64-x86_64-ca-certificates
    mingw-w64-x86_64-connect
    mingw-w64-x86_64-crt
    mingw-w64-x86_64-curl-openssl-alternate
    mingw-w64-x86_64-curl-winssl
    mingw-w64-x86_64-cv2pdb
    mingw-w64-x86_64-expat
    mingw-w64-x86_64-gcc
    mingw-w64-x86_64-gcc-libs
    mingw-w64-x86_64-gdb
    mingw-w64-x86_64-gdbm
    mingw-w64-x86_64-gettext-libtextstyle
    mingw-w64-x86_64-gettext-runtime
    mingw-w64-x86_64-gettext-tools
    mingw-w64-x86_64-git
    mingw-w64-x86_64-git-credential-manager
    mingw-w64-x86_64-git-credential-wincred
    mingw-w64-x86_64-git-doc-html
    mingw-w64-x86_64-git-extra
    mingw-w64-x86_64-git-gui
    mingw-w64-x86_64-git-lfs
    mingw-w64-x86_64-git-perl
    mingw-w64-x86_64-git-send-email
    mingw-w64-x86_64-git-subtree
    mingw-w64-x86_64-git-svn
    mingw-w64-x86_64-gitk
    mingw-w64-x86_64-gmp
    mingw-w64-x86_64-gnutls
    mingw-w64-x86_64-headers
    mingw-w64-x86_64-isl
    mingw-w64-x86_64-libb2
    mingw-w64-x86_64-libffi
    mingw-w64-x86_64-libiconv
    mingw-w64-x86_64-libidn2
    mingw-w64-x86_64-libmangle
    mingw-w64-x86_64-libpsl
    mingw-w64-x86_64-libssh2-wincng
    mingw-w64-x86_64-libsystre
    mingw-w64-x86_64-libtasn1
    mingw-w64-x86_64-libtre
    mingw-w64-x86_64-libunistring
    mingw-w64-x86_64-libwinpthread
    mingw-w64-x86_64-libyaml
    mingw-w64-x86_64-libzip
    mingw-w64-x86_64-mpc
    mingw-w64-x86_64-mpdecimal
    mingw-w64-x86_64-mpfr
    mingw-w64-x86_64-ncurses
    mingw-w64-x86_64-nettle
    mingw-w64-x86_64-nghttp2
    mingw-w64-x86_64-odt2txt
    mingw-w64-x86_64-openssl
    mingw-w64-x86_64-osslsigncode
    mingw-w64-x86_64-p11-kit
    mingw-w64-x86_64-pcre
    mingw-w64-x86_64-pcre2
    mingw-w64-x86_64-pkgconf
    mingw-w64-x86_64-python
    mingw-w64-x86_64-readline
    mingw-w64-x86_64-ruby
    mingw-w64-x86_64-sqlite3
    mingw-w64-x86_64-tcl
    mingw-w64-x86_64-termcap
    mingw-w64-x86_64-tk
    mingw-w64-x86_64-tools
    mingw-w64-x86_64-tzdata
    mingw-w64-x86_64-windows-default-manifest
    mingw-w64-x86_64-wineditline
    mingw-w64-x86_64-winpthreads
    mingw-w64-x86_64-wintoast
    mingw-w64-x86_64-xpdf-tools
    mingw-w64-x86_64-xxhash
    mingw-w64-x86_64-xz
    mingw-w64-x86_64-zlib
    mingw-w64-x86_64-zstd

Signed-off-by: Git for Windows Build Agent <ci@git-for-windows.build>
Removed MINGW32 packages:
    mingw-w64-i686-asciidoctor
    mingw-w64-i686-binutils
    mingw-w64-i686-brotli
    mingw-w64-i686-bzip2
    mingw-w64-i686-c-ares
    mingw-w64-i686-ca-certificates
    mingw-w64-i686-crt
    mingw-w64-i686-curl-openssl-alternate
    mingw-w64-i686-curl-winssl
    mingw-w64-i686-cv2pdb
    mingw-w64-i686-expat
    mingw-w64-i686-gcc
    mingw-w64-i686-gcc-libs
    mingw-w64-i686-gdb
    mingw-w64-i686-gdbm
    mingw-w64-i686-gettext-libtextstyle
    mingw-w64-i686-gettext-runtime
    mingw-w64-i686-gettext-tools
    mingw-w64-i686-gmp
    mingw-w64-i686-headers
    mingw-w64-i686-isl
    mingw-w64-i686-libb2
    mingw-w64-i686-libffi
    mingw-w64-i686-libiconv
    mingw-w64-i686-libidn2
    mingw-w64-i686-libmangle
    mingw-w64-i686-libpsl
    mingw-w64-i686-libssh2-wincng
    mingw-w64-i686-libsystre
    mingw-w64-i686-libtasn1
    mingw-w64-i686-libtre
    mingw-w64-i686-libunistring
    mingw-w64-i686-libwinpthread
    mingw-w64-i686-libyaml
    mingw-w64-i686-make
    mingw-w64-i686-mpc
    mingw-w64-i686-mpdecimal
    mingw-w64-i686-mpfr
    mingw-w64-i686-ncurses
    mingw-w64-i686-nghttp2
    mingw-w64-i686-openssl
    mingw-w64-i686-p11-kit
    mingw-w64-i686-pcre
    mingw-w64-i686-pcre2
    mingw-w64-i686-pkgconf
    mingw-w64-i686-python
    mingw-w64-i686-readline
    mingw-w64-i686-ruby
    mingw-w64-i686-sqlite3
    mingw-w64-i686-tcl
    mingw-w64-i686-termcap
    mingw-w64-i686-tk
    mingw-w64-i686-tools
    mingw-w64-i686-tzdata
    mingw-w64-i686-windows-default-manifest
    mingw-w64-i686-wineditline
    mingw-w64-i686-winpthreads
    mingw-w64-i686-xxhash
    mingw-w64-i686-xz
    mingw-w64-i686-zlib
    mingw-w64-i686-zstd

Signed-off-by: Git for Windows Build Agent <ci@git-for-windows.build>
@github-actions

github-actions Bot commented Jun 6, 2026

Copy link
Copy Markdown

The following MINGW64 packages have no UCRT64 counterpart in the configured Pacman repositories and were skipped:

mingw-w64-x86_64-busybox
mingw-w64-x86_64-curl-openssl-alternate
mingw-w64-x86_64-cv2pdb
mingw-w64-x86_64-git-credential-manager
mingw-w64-x86_64-git-extra
mingw-w64-x86_64-wintoast
mingw-w64-x86_64-xpdf-tools

@dscho

dscho commented Jun 6, 2026

Copy link
Copy Markdown
Member Author

@rimrul here's something to play with ;-)

@dscho

dscho commented Jun 7, 2026

Copy link
Copy Markdown
Member Author

The following MINGW64 packages have no UCRT64 counterpart in the configured Pacman repositories and were skipped:
[...]

Before we can build those, there are a lot of loose ends to address even with this:

  • adapt the setup-git-for-windows-sdk Action so that it can handle the "architecture" ucrt64 (checking out that branch instead of main, skipping the fast path for minimal/build-installers flavors because there is no pre-built artifact to download)
  • initialize the UCRT64-only Pacman database (= new file in the x86_64 branch of git-for-windows/pacman-repo)
  • adjust git-extra so that it adds the UCRT64-only Pacman database in x86_64 Git SDKs (or maybe only in the ucrt-x86_64 variant?)
  • build tons of packages, not only the ones listed in the previous comment (basically, all the mingw-w64-* ones listed in GitHub - git-for-windows/pacman-repo at x86_64)
  • hook up ucrt64 into the build-and-deploy and git-installers automation
  • test, test, test
  • audit where else in Git for Windows' automation ucrt64 needs to be handled specially
  • start building snapshots so that helpful contributors can beta-test
  • everything else I forgot to list here 😉

dscho added 3 commits June 7, 2026 18:53
Now that the SDK is being converted to UCRT64, the minimal-sdk
sparse-checkout definition has to follow: every path that previously
lived under `/mingw64/` is now under `/ucrt64/`. The MSYS2 GCC triple
(`x86_64-w64-mingw32`) and the subdirectory names below it
(`lib/gcc/...`, the toolchain `bin/`/`lib/`/`include/` tree) are
unchanged, so a plain `/mingw64/` -> `/ucrt64/` rename is enough here.

Assisted-by: Opus 4.7
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
The bulk of this file is a straight `/mingw64/` -> `/ucrt64/`
substitution, just like the minimal-sdk definition that just got
adjusted.

Two MSYS2 naming differences need separate handling for the
asciidoctor/Ruby block, however: the Ruby DLL in the UCRT64
environment is `x64-ucrt-ruby<ver>.dll` rather than the MSVCRT-flavored
`x64-msvcrt-ruby<ver>.dll`, and the per-arch subdirectory that Ruby
uses for native extensions is `x64-mingw-ucrt/` rather than
`x64-mingw32/`. Both of those have to be renamed in tandem with the
top-level path, otherwise the sparse checkout would silently skip the
Ruby pieces that asciidoctor depends on.

`cv2pdb` is still referenced under `/ucrt64/bin/`, even though it
currently lacks a UCRT64 counterpart (it's on the skipped-packages
list posted by the conversion workflow). That's fine for a
sparse-checkout file: it only selects what to materialize once such a
package is built and added to the SDK.

Assisted-by: Opus 4.7
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
This file selects exactly the `/mingw32/` paths needed to build the
32-bit `mingw-w64-git` package out of a partial SDK clone. With the
move to UCRT64 we also drop the entire MINGW32 (i686) flavor; there is
no UCRT64 i686 environment, and the third conversion commit removes
every `mingw-w64-i686-*` package outright. The sparse definition can
no longer materialize anything useful, so retire it rather than leave a
file that points at directories that will never reappear.

Assisted-by: Opus 4.7
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
dscho added a commit that referenced this pull request Jun 7, 2026
The PR opened from this branch (#117) keeps diverging from `main` (the
package-sync commits keep landing there, and the conversion commits
keep removing the MINGW64 tree here), so the merge commit GitHub
builds for the `pull_request` event is `DIRTY` most of the time. While
in that state, GitHub skips the `pull_request` workflow dispatch
entirely, which means `ci-artifacts` no longer runs against the PR
head and we lose all signal about whether the converted SDK still
builds Git.

Adding `ucrt64` to the workflow's `push` trigger sidesteps that:
pushes to the branch run the workflow directly, without going through
a synthetic merge commit, so the build/test matrix stays exercised
until the branch is finally merged.

Assisted-by: Opus 4.7
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
dscho added a commit that referenced this pull request Jun 7, 2026
Same reasoning as the matching change to `ci-artifacts.yml`: while the
PR opened from this branch (#117) is in a `DIRTY` merge state, GitHub
refuses to dispatch `pull_request` events, so the DLL check no longer
runs against the PR head. Listing `ucrt64` under the `push` trigger
restores coverage directly from the branch tip.

Assisted-by: Opus 4.7
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
dscho added a commit to git-for-windows/setup-git-for-windows-sdk that referenced this pull request Jun 7, 2026
The `test` job of `build-test` is the only PR-time gate that actually
runs this Action on a clean Windows runner and pokes at the result;
the matrix-based smoke test in `matrix.yml` only fires on manual
dispatch. So far that gate has only covered the historical default
combination (`flavor: minimal`, `architecture: x86_64`), which means
any regression on the new `ucrt64` axis would slip through CI and
only surface in a consumer repository.

Turn the job into a matrix that adds `architecture: ucrt64` next to
the existing `x86_64` row, with `flavor: full` for the UCRT64 entry
because that is the only flavor wired up end-to-end at this point
(the subset flavors still depend on follow-up work in `build-extra`
and on the `ci-artifacts` pipeline of `git-sdk-64`, tracked in
git-for-windows/git-sdk-64#117 (comment)).

The verification step's previously hard-coded `/mingw64/bin/gcc`
becomes `$MINGW_PREFIX/bin/gcc`, with `MINGW_PREFIX` injected from
the matrix so it picks up `/mingw64` for the `x86_64` row and
`/ucrt64` for the `ucrt64` row. The name follows the MSYS2 ecosystem
convention for the per-environment path, which is the same variable
the SDK's own shell profile exports.

Assisted-by: Opus 4.7
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
@dscho
dscho force-pushed the ucrt64 branch 2 times, most recently from 0863902 to 927e526 Compare June 7, 2026 21:45
dscho added a commit to git-for-windows/setup-git-for-windows-sdk that referenced this pull request Jun 8, 2026
Now that the preceding commits have actually taught the Action about
the `ucrt64` axis, document it in AGENTS.md so the institutional
description there matches the code. Add a row to the architecture
table covering repository, MSYSTEM, mingw bin path, and current
limitations, plus a follow-up paragraph that points at
git-for-windows/git-sdk-64#117 and
git-for-windows/git-sdk-64#117 (comment)
for the larger migration context.

Mention in the relationship section that `git-sdk-64` now carries the
extra long-lived `ucrt64` branch and that no UCRT64 asset exists in
the `ci-artifacts` release, which is why the fast path is forcibly
suppressed for that axis.

Assisted-by: Opus 4.7
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
dscho added a commit to git-for-windows/setup-git-for-windows-sdk that referenced this pull request Jun 8, 2026
The manually-triggered `test all artifact flavors` workflow is the
closest thing this repository has to an end-to-end smoke test that
actually downloads an SDK and runs in-place. Without an entry for the
new `ucrt64` axis it would silently keep verifying only the MINGW64
and MINGW32 paths, leaving regressions on the UCRT64 path to surface
only in consumer repositories.

Add a single `flavor: full, architecture: ucrt64` row via `include`,
because that is the only combination wired up end-to-end at this
point: the subset flavors still depend on `please.sh create-sdk-artifact`
in `build-extra` learning `--architecture=ucrt64` and on a UCRT64
asset appearing in the `ci-artifacts` release of `git-sdk-64`, both
tracked in
git-for-windows/git-sdk-64#117 (comment).
The build-installer step keys off `matrix.flavor == 'build-installers'`
and is therefore skipped for the new row, which is exactly what we
want.

Assisted-by: Opus 4.7
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
dscho added a commit to git-for-windows/setup-git-for-windows-sdk that referenced this pull request Jun 8, 2026
The `test` job of `build-test` is the only PR-time gate that actually
runs this Action on a clean Windows runner and pokes at the result;
the matrix-based smoke test in `matrix.yml` only fires on manual
dispatch. So far that gate has only covered the historical default
combination (`flavor: minimal`, `architecture: x86_64`), which means
any regression on the new `ucrt64` axis would slip through CI and
only surface in a consumer repository.

Turn the job into a matrix that adds `architecture: ucrt64` next to
the existing `x86_64` row, with `flavor: full` for the UCRT64 entry
because that is the only flavor wired up end-to-end at this point
(the subset flavors still depend on follow-up work in `build-extra`
and on the `ci-artifacts` pipeline of `git-sdk-64`, tracked in
git-for-windows/git-sdk-64#117 (comment)).

The verification step's previously hard-coded `/mingw64/bin/gcc`
becomes `$MINGW_PREFIX/bin/gcc`, with `MINGW_PREFIX` injected from
the matrix so it picks up `/mingw64` for the `x86_64` row and
`/ucrt64` for the `ucrt64` row. The name follows the MSYS2 ecosystem
convention for the per-environment path, which is the same variable
the SDK's own shell profile exports.

Assisted-by: Opus 4.7
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
dscho added a commit to dscho/build-extra that referenced this pull request Jun 8, 2026
This script translates a caller-supplied ARCH into both a directory
prefix (MSYSTEM_LOWER) and a Pacman architecture-segment used to
filter package names. The existing cases map x86_64 -> mingw64 /
x86_64, i.e. they assume the only x86_64 Git for Windows SDK is the
MINGW64 one.

git-sdk-64 is moving to UCRT64
(git-for-windows/git-sdk-64#117). The new
SDK is still x86_64 but its toolchain lives in /ucrt64/ and its
Pacman packages are named mingw-w64-ucrt-x86_64-*. Add a dedicated
ucrt64 case so callers that explicitly know which flavor they want
can pass ARCH=ucrt64 and get the right prefix and package names,
without having to teach this script to auto-detect.

Assisted-by: Opus 4.7
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
dscho added a commit to dscho/build-extra that referenced this pull request Jun 8, 2026
create_sdk_artifact's `case "$architecture" in` ladder hard-maps
x86_64 to MSYSTEM=MINGW64 / PREFIX=/mingw64, writes that into the
artifact's /etc/profile, and calls make-file-list.sh with
ARCH=$architecture. Against the new UCRT64 git-sdk-64
(git-for-windows/git-sdk-64#117), the
resulting artifact is broken: the profile points at /mingw64/bin
which doesn't exist, and the listed packages all carry the wrong
Pacman prefix.

Add a new ucrt64 architecture value that maps to MSYSTEM=UCRT64 and
PREFIX=/ucrt64 while keeping SDK_REPO=git-sdk-64 (the SDK has not
been renamed). The caller asks for the new flavor explicitly; the
make-file-list.sh side already knows what ARCH=ucrt64 means after
the previous commit.

Auto-detection is deliberately left alone: a dual-tree SDK (one
with both /mingw64 and /ucrt64) is rare enough that guessing the
wrong default would be more surprising than requiring the caller to
say what they want.

Assisted-by: Opus 4.7
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
dscho added a commit to dscho/build-extra that referenced this pull request Jun 8, 2026
This script audits import/export DLL references in an SDK
installation. It picks the directory prefix from MSYSTEM (and only
falls back to ARCH if MSYSTEM is unset or unknown), then forwards
ARCH to make-file-list.sh to learn which Pacman packages to
install.

On the UCRT64 git-sdk-64
(git-for-windows/git-sdk-64#117) the
caller's MSYSTEM is UCRT64; today the script falls through to the
*) default and ends up with MINGW_PREFIX=mingw64 and ARCH=x86_64,
asking pacman for the long-gone mingw-w64-x86_64-* packages.

Add a UCRT64 case alongside MINGW64 and CLANGARM64 that sets
MINGW_PREFIX=ucrt64 and overrides ARCH=ucrt64 the same way
CLANGARM64 overrides it to aarch64. make-file-list.sh, taught
ARCH=ucrt64 in an earlier commit, then resolves the right Pacman
package set.

Assisted-by: Opus 4.7
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
dscho added a commit to git-for-windows/git-for-windows-automation that referenced this pull request Jun 8, 2026
In git-for-windows/git-sdk-64#117, I am starting
the MINGW64 -> UCRT64 migration, and therefore I want to target that
branch, too, when uninstalling packages.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
dscho added a commit to git-for-windows/git-for-windows-automation that referenced this pull request Jun 8, 2026
In git-for-windows/git-sdk-64#117, I am starting
the MINGW64 -> UCRT64 migration, and therefore I want to target that
branch, too, when uninstalling packages.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
dscho added a commit to git-for-windows/git-for-windows-automation that referenced this pull request Jun 8, 2026
In git-for-windows/git-sdk-64#117, I am starting
the MINGW64 -> UCRT64 migration, and therefore I want to target that
branch, too, when uninstalling packages.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
dscho added a commit to git-for-windows/git-for-windows-automation that referenced this pull request Jun 25, 2026
Git for Windows is in the middle of migrating from MINGW64 to UCRT64
(see git-for-windows/git-sdk-64#117 for full
details).

For the time being, `git-artifacts` _does_ build the UCRT64 variants of
installers, portable Gits, etc, using the `-ucrt64` file name infix to
indicate this flavor. These are _not_ published with the official
releases, even though they are part of the snapshots.

To allow for efficient testing and developing of the UCR64 side of Git
for Windows, let's also deploy the corresponding Pacman packages (which
will eventually back the regular `-64-bit` artifacts, once the migration
to UCRT64 is complete.

Assisted-by: Opus 4.8
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
dscho added a commit to git-for-windows/git-for-windows-automation that referenced this pull request Jun 26, 2026
Git for Windows is in the middle of migrating from MINGW64 to UCRT64
(see git-for-windows/git-sdk-64#117 for full
details).

For the time being, `git-artifacts` _does_ build the UCRT64 variants of
installers, portable Gits, etc, using the `-ucrt64` file name infix to
indicate this flavor. These are _not_ published with the official
releases, even though they are part of the snapshots.

To allow for efficient testing and developing of the UCR64 side of Git
for Windows, let's also deploy the corresponding Pacman packages (which
will eventually back the regular `-64-bit` artifacts, once the migration
to UCRT64 is complete.
bsdcpio (3.8.7-2 -> 3.8.8-1)
bsdtar (3.8.7-2 -> 3.8.8-1)
curl (8.20.0-1 -> 8.21.0-1)
expat (2.8.1-1 -> 2.8.2-1)
findutils (4.10.0-2 -> 4.10.0-3)
libarchive (3.8.7-2 -> 3.8.8-1)
libcurl (8.20.0-1 -> 8.21.0-1)
libexpat (2.8.1-1 -> 2.8.2-1)
libsqlite (3.53.2-1 -> 3.53.2-2)
mingw-w64-ucrt-x86_64-crt (14.0.0.r98.g19f5121a2-1 -> 14.0.0.r147.g31bd54ab7-1)
mingw-w64-ucrt-x86_64-curl-openssl-alternate (8.20.0-1 -> 8.21.0-1)
mingw-w64-ucrt-x86_64-curl-winssl (8.20.0-1 -> 8.21.0-1)
mingw-w64-ucrt-x86_64-expat (2.8.1-2 -> 2.8.2-1)
mingw-w64-ucrt-x86_64-git (2.54.0.1-1 -> 2.55.0.rc2.windows.1-1)
mingw-w64-ucrt-x86_64-git-credential-wincred (2.54.0.1-1 -> 2.55.0.rc2.windows.1-1)
mingw-w64-ucrt-x86_64-git-doc-html (2.54.0.1-1 -> 2.55.0.rc2.windows.1-1)
mingw-w64-ucrt-x86_64-git-for-windows-addons (2.54.0.1-1 -> 2.55.0.rc2.windows.1-1)
mingw-w64-ucrt-x86_64-git-gui (2.54.0.1-1 -> 2.55.0.rc2.windows.1-1)
mingw-w64-ucrt-x86_64-git-perl (2.54.0.1-1 -> 2.55.0.rc2.windows.1-1)
mingw-w64-ucrt-x86_64-git-send-email (2.54.0.1-1 -> 2.55.0.rc2.windows.1-1)
mingw-w64-ucrt-x86_64-git-subtree (2.54.0.1-1 -> 2.55.0.rc2.windows.1-1)
mingw-w64-ucrt-x86_64-git-svn (2.54.0.1-1 -> 2.55.0.rc2.windows.1-1)
mingw-w64-ucrt-x86_64-gitk (2.54.0.1-1 -> 2.55.0.rc2.windows.1-1)
mingw-w64-ucrt-x86_64-headers (14.0.0.r98.g19f5121a2-1 -> 14.0.0.r147.g31bd54ab7-1)
mingw-w64-ucrt-x86_64-libffi (3.5.2-1 -> 3.6.0-1)
mingw-w64-ucrt-x86_64-libmangle (14.0.0.r98.g19f5121a2-1 -> 14.0.0.r147.g31bd54ab7-1)
mingw-w64-ucrt-x86_64-libwinpthread (14.0.0.r98.g19f5121a2-1 -> 14.0.0.r147.g31bd54ab7-1)
mingw-w64-ucrt-x86_64-tools (14.0.0.r98.g19f5121a2-1 -> 14.0.0.r147.g31bd54ab7-1)
mingw-w64-ucrt-x86_64-winpthreads (14.0.0.r98.g19f5121a2-1 -> 14.0.0.r147.g31bd54ab7-1)
mingw-w64-ucrt-x86_64-xxhash (0.8.3-1 -> 0.8.3-2)
nano (9.0-1 -> 9.1-1)
perl-HTTP-Date (6.06-1 -> 6.07-1)
vim (9.2.0677-2 -> 9.2.0725-1)

Signed-off-by: Git for Windows Build Agent <ci@git-for-windows.build>
dscho added a commit to git-for-windows/build-extra that referenced this pull request Jun 27, 2026
In d02dd41 (installers: include libwinpthread-1.dll only when needed,
2026-06-15), a bug was fixed where this DLL was included in _some_
MinGit flavors unnecessarily. Since this DLL is explicitly needed for
the MINGW32/MINGW64 installers, it was hardcoded to be included there.

For UCRT64, the same rule applies as for MINGW64; Let's make it so.

This is yet another step in the MINGW64 -> UCRT64 migration tracked in
git-for-windows/git-sdk-64#117.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Git for Windows Build Agent <ci@git-for-windows.build>
Signed-off-by: Git for Windows Build Agent <ci@git-for-windows.build>
rimrul pushed a commit to rimrul/MINGW-packages that referenced this pull request Jul 1, 2026
In upstream MSYS2, this is still a full Qt6-dependent package, of
course.

This is required to build the `mingw-w64-ucrt-x86_64-xpdf-tools` package
that is needed as part of Git for Windows' transition to UCRT64 (see
git-for-windows/git-sdk-64#117 for more
details).

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
git (2.54.0-1 -> 2.55.0-1)
libsqlite (3.53.2-2 -> 3.53.3-1)
mingw-w64-ucrt-x86_64 (7zip-26.01-1 -> 7zip-26.02-1)
mingw-w64-ucrt-x86_64-curl-openssl-alternate (8.21.0-1 -> 8.21.0-2)
mingw-w64-ucrt-x86_64-curl-winssl (8.21.0-1 -> 8.21.0-2)
mingw-w64-ucrt-x86_64-git (2.55.0.rc2.windows.1-1 -> 2.55.0.1-1)
mingw-w64-ucrt-x86_64-git-credential-wincred (2.55.0.rc2.windows.1-1 -> 2.55.0.1-1)
mingw-w64-ucrt-x86_64-git-doc-html (2.55.0.rc2.windows.1-1 -> 2.55.0.1-1)
mingw-w64-ucrt-x86_64-git-for-windows-addons (2.55.0.rc2.windows.1-1 -> 2.55.0.1-1)
mingw-w64-ucrt-x86_64-git-gui (2.55.0.rc2.windows.1-1 -> 2.55.0.1-1)
mingw-w64-ucrt-x86_64-git-perl (2.55.0.rc2.windows.1-1 -> 2.55.0.1-1)
mingw-w64-ucrt-x86_64-git-send-email (2.55.0.rc2.windows.1-1 -> 2.55.0.1-1)
mingw-w64-ucrt-x86_64-git-subtree (2.55.0.rc2.windows.1-1 -> 2.55.0.1-1)
mingw-w64-ucrt-x86_64-git-svn (2.55.0.rc2.windows.1-1 -> 2.55.0.1-1)
mingw-w64-ucrt-x86_64-gitk (2.55.0.rc2.windows.1-1 -> 2.55.0.1-1)
mingw-w64-ucrt-x86_64-sqlite3 (3.53.2-1 -> 3.53.3-1)
perl-IO-Socket-SSL (2.098-1 -> 2.099-1)

Signed-off-by: Git for Windows Build Agent <ci@git-for-windows.build>
Signed-off-by: Git for Windows Build Agent <ci@git-for-windows.build>
libffi (3.5.2-1 -> 3.6.0-1)
libunrar (7.2.6-1 -> 7.2.7-1)
mingw-w64-ucrt-x86_64-binutils (2.46.1-1 -> 2.46.1-2)
mingw-w64-ucrt-x86_64-crt (14.0.0.r147.g31bd54ab7-1 -> 14.0.0.r150.g6b5798fd4-1)
mingw-w64-ucrt-x86_64-git (2.55.0.1-1 -> 2.55.0.2-1)
mingw-w64-ucrt-x86_64-git-credential-wincred (2.55.0.1-1 -> 2.55.0.2-1)
mingw-w64-ucrt-x86_64-git-doc-html (2.55.0.1-1 -> 2.55.0.2-1)
mingw-w64-ucrt-x86_64-git-for-windows-addons (2.55.0.1-1 -> 2.55.0.2-1)
mingw-w64-ucrt-x86_64-git-gui (2.55.0.1-1 -> 2.55.0.2-1)
mingw-w64-ucrt-x86_64-git-perl (2.55.0.1-1 -> 2.55.0.2-1)
mingw-w64-ucrt-x86_64-git-send-email (2.55.0.1-1 -> 2.55.0.2-1)
mingw-w64-ucrt-x86_64-git-subtree (2.55.0.1-1 -> 2.55.0.2-1)
mingw-w64-ucrt-x86_64-git-svn (2.55.0.1-1 -> 2.55.0.2-1)
mingw-w64-ucrt-x86_64-gitk (2.55.0.1-1 -> 2.55.0.2-1)
mingw-w64-ucrt-x86_64-headers (14.0.0.r147.g31bd54ab7-1 -> 14.0.0.r150.g6b5798fd4-1)
mingw-w64-ucrt-x86_64-libmangle (14.0.0.r147.g31bd54ab7-1 -> 14.0.0.r150.g6b5798fd4-1)
mingw-w64-ucrt-x86_64-libwinpthread (14.0.0.r147.g31bd54ab7-1 -> 14.0.0.r150.g6b5798fd4-1)
mingw-w64-ucrt-x86_64-tools (14.0.0.r147.g31bd54ab7-1 -> 14.0.0.r150.g6b5798fd4-1)
mingw-w64-ucrt-x86_64-winpthreads (14.0.0.r147.g31bd54ab7-1 -> 14.0.0.r150.g6b5798fd4-1)

Signed-off-by: Git for Windows Build Agent <ci@git-for-windows.build>
bash-completion (2.17.0-2 -> 2.18.0-1)
gawk (5.4.0-1 -> 5.4.1-1)
libffi (3.6.0-1 -> 3.7.1-1)
libp11-kit (0.26.2-1 -> 0.26.4-1)
mingw-w64-ucrt-x86_64-c-ares (1.34.6-1 -> 1.34.8-1)
mingw-w64-ucrt-x86_64-crt (14.0.0.r150.g6b5798fd4-1 -> 14.0.0.r179.g24aaa6147-1)
mingw-w64-ucrt-x86_64-gdbm (1.19-7 -> 1.26-1)
mingw-w64-ucrt-x86_64-gnutls (3.8.13-2 -> 3.8.13-3)
mingw-w64-ucrt-x86_64-headers (14.0.0.r150.g6b5798fd4-1 -> 14.0.0.r179.g24aaa6147-1)
mingw-w64-ucrt-x86_64-isl (0.27-1 -> 0.28-1)
mingw-w64-ucrt-x86_64-libffi (3.6.0-1 -> 3.7.1-1)
mingw-w64-ucrt-x86_64-libmangle (14.0.0.r150.g6b5798fd4-1 -> 14.0.0.r179.g24aaa6147-1)
mingw-w64-ucrt-x86_64-libwinpthread (14.0.0.r150.g6b5798fd4-1 -> 14.0.0.r179.g24aaa6147-1)
mingw-w64-ucrt-x86_64-nettle (3.10.2-1 -> 4.0-1)
mingw-w64-ucrt-x86_64-p11-kit (0.26.2-1 -> 0.26.4-1)
mingw-w64-ucrt-x86_64-tools (14.0.0.r150.g6b5798fd4-1 -> 14.0.0.r179.g24aaa6147-1)
mingw-w64-ucrt-x86_64-tzdata (2026b-1 -> 2026c-1)
mingw-w64-ucrt-x86_64-winpthreads (14.0.0.r150.g6b5798fd4-1 -> 14.0.0.r179.g24aaa6147-1)
msys2-runtime (3.6.9-2 -> 3.6.9-3)
msys2-runtime-devel (3.6.9-2 -> 3.6.9-3)
openssh (10.3p1-1 -> 10.4p1-1)
p11-kit (0.26.2-1 -> 0.26.4-1)
perl-HTTP-Date (6.07-1 -> 6.08-1)
pinentry (1.3.2-1 -> 1.3.3-1)
vim (9.2.0725-1 -> 9.2.0782-1)
xmlto (0.0.29-1 -> 0.0.29-2)

Signed-off-by: Git for Windows Build Agent <ci@git-for-windows.build>
gh-github-automation Bot pushed a commit to actions-marketplace-validations/git-for-windows_setup-git-for-windows-sdk that referenced this pull request Jul 30, 2026
The `ucrt64` axis introduced by
git-for-windows/git-sdk-64#117 is materialised
from the same `git-sdk-64` repository as the existing `x86_64` axis,
just from a different long-lived branch (and with the UCRT64 flavour of
the MSYS2 toolchain rather than MINGW64). The two variants therefore
need distinct artifact names so that the on-disk output directory and
the @actions/cache key do not collide on a runner that has previously
materialised the other variant.

Map `architecture: ucrt64` to the `git-sdk-64` repository and pick
`git-sdk-ucrt64-<flavor>` as the artifact name; leave the other three
architectures untouched. This is the first piece of the larger change
to teach this Action about the `ucrt64` axis; subsequent commits will
hook it up in `getViaGit` and `main.ts`.

Assisted-by: Opus 4.7
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
gh-github-automation Bot pushed a commit to actions-marketplace-validations/git-for-windows_setup-git-for-windows-sdk that referenced this pull request Jul 30, 2026
For `architecture: ucrt64` the source of truth is the long-lived
`ucrt64` branch of `git-sdk-64` introduced by
git-for-windows/git-sdk-64#117, not `main`.
Pick the branch up front and pass it to both the GitHub API lookup that
resolves the tip SHA and the subsequent `clone` call, so that
`getViaGit` materialises the UCRT64 variant of the SDK rather than the
MINGW64 one. The `build-extra` clone remains on `main`; that
repository is shared between the two variants.

Side-step the `flavor === 'minimal'` workflow-runs lookup for the
`ucrt64` axis. That lookup hunts for the most recent successful CI
build on the branch and there are none on `ucrt64` yet (the CI
artifacts pipeline has no UCRT64 counterpart). The GCC v14.1 workaround
that piggy-backs on the same code path is also a MINGW64-only concern,
so falling through to the plain `getBranch` lookup is the right thing
for UCRT64 from the start.

Assisted-by: Opus 4.7
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
gh-github-automation Bot pushed a commit to actions-marketplace-validations/git-for-windows_setup-git-for-windows-sdk that referenced this pull request Jul 30, 2026
The `minimal` and (since Windows 11 24H2/Server 2025) `build-installers`
flavours normally short-circuit through `getViaCIArtifacts`, which pulls
a pre-built tarball from the `ci-artifacts` release of the matching
`git-sdk-*` repository. The `ucrt64` axis has no such pre-built
artifact today; the CI-artifacts pipeline on `git-sdk-64` only produces
the MINGW64 variants. Pulling those for the UCRT64 axis would silently
materialise the wrong toolchain on disk.

Gate the fast path on `architecture !== 'ucrt64'` so that every
flavour falls through to `getViaGit`, which the previous commits
already taught to clone the `ucrt64` branch of `git-sdk-64` and to
stamp the cache key as `git-sdk-ucrt64-<flavor>`. Only `flavor: full`
is fully wired up end-to-end at this point (it goes straight through
`git worktree add`); the non-`full` flavours additionally rely on
`please.sh create-sdk-artifact` in `build-extra` learning to handle
`--architecture=ucrt64`, which is a follow-up tracked in
git-for-windows/git-sdk-64#117 (comment).

Assisted-by: Opus 4.7
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
After msys2/MINGW-packages#30629 (i.e. upgrading
from Ruby v3 to Ruby v4), git-sdk-arm64's `git-artifacts` workflow fails,
https://github.com/git-for-windows/git-sdk-64/actions/runs/30686436267/job/91347893289#step:9:375

    ASCIIDOC ToolsForGit.html
  D:/a/git-sdk-64/git-sdk-64/build-installers/mingw64/lib/ruby/4.0.0/cgi/util.rb:3:in 'Kernel#require': cannot load such file -- cgi/escape (LoadError)
  Did you mean?  cgi/util
	from D:/a/git-sdk-64/git-sdk-64/build-installers/mingw64/lib/ruby/4.0.0/cgi/util.rb:3:in '<top (required)>'
	from D:/a/git-sdk-64/git-sdk-64/build-installers/mingw64/lib/ruby/gems/4.0.0/gems/asciidoctor-2.0.26/lib/asciidoctor.rb:9:in 'Kernel#require'
	from D:/a/git-sdk-64/git-sdk-64/build-installers/mingw64/lib/ruby/gems/4.0.0/gems/asciidoctor-2.0.26/lib/asciidoctor.rb:9:in '<top (required)>'
	from D:/a/git-sdk-64/git-sdk-64/build-installers/mingw64/lib/ruby/gems/4.0.0/gems/asciidoctor-2.0.26/bin/asciidoctor:6:in 'Kernel#require'
	from D:/a/git-sdk-64/git-sdk-64/build-installers/mingw64/lib/ruby/gems/4.0.0/gems/asciidoctor-2.0.26/bin/asciidoctor:6:in '<top (required)>'
	from D:/a/git-sdk-64/git-sdk-64/build-installers/mingw64/lib/ruby/4.0.0/rubygems.rb:305:in 'Kernel#load'
	from D:/a/git-sdk-64/git-sdk-64/build-installers/mingw64/lib/ruby/4.0.0/rubygems.rb:305:in 'Gem.activate_and_load_bin_path'
	from D:/a/git-sdk-64/git-sdk-64/build-installers/mingw64/bin/asciidoctor:36:in '<main>'
make[1]: *** [Makefile:396: ToolsForGit.html] Error 1

The reason is a changed file layout of Ruby's gems. Let's adapt to that.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
binutils (2.46.1-1 -> 2.47-1)
mingw-w64-ucrt-x86_64-asciidoctor (2.0.23-3 -> 2.0.26-2)
mingw-w64-ucrt-x86_64-binutils (2.46.1-2 -> 2.47-1)
mingw-w64-ucrt-x86_64-crt (14.0.0.r179.g24aaa6147-1 -> 14.0.0.r220.gd999af622-1)
mingw-w64-ucrt-x86_64-git-credential-manager (2.8.0-1 -> 2.9.1-1)
mingw-w64-ucrt-x86_64-headers (14.0.0.r179.g24aaa6147-1 -> 14.0.0.r220.gd999af622-1)
mingw-w64-ucrt-x86_64-libmangle (14.0.0.r179.g24aaa6147-1 -> 14.0.0.r220.gd999af622-1)
mingw-w64-ucrt-x86_64-libwinpthread (14.0.0.r179.g24aaa6147-1 -> 14.0.0.r220.gd999af622-1)
mingw-w64-ucrt-x86_64-nghttp2 (1.69.0-1 -> 1.70.0-1)
mingw-w64-ucrt-x86_64-pkgconf (1~2.5.1-2 -> 1~3.0.4-1)
mingw-w64-ucrt-x86_64-python (3.14.6-1 -> 3.14.6-2)
mingw-w64-ucrt-x86_64-ruby (removed)
mingw-w64-ucrt-x86_64-ruby (new: 4.0.6-1)
mingw-w64-ucrt-x86_64-sqlite3 (3.53.3-1 -> 3.53.4-1)
mingw-w64-ucrt-x86_64-tools (14.0.0.r179.g24aaa6147-1 -> 14.0.0.r220.gd999af622-1)
mingw-w64-ucrt-x86_64-winpthreads (14.0.0.r179.g24aaa6147-1 -> 14.0.0.r220.gd999af622-1)
msys2-runtime (3.6.9-3 -> 3.6.10-1)
msys2-runtime-devel (3.6.9-3 -> 3.6.10-1)
perl-HTTP-Cookies (6.11-1 -> 6.12-1)
perl-HTTP-Message (7.02-1 -> 7.04-1)
perl-YAML-Syck (1.46-1 -> 1.47-1)
tzcode (2026b-1 -> 2026c-1)
vim (9.2.0782-1 -> 9.2.0858-1)

Signed-off-by: Git for Windows Build Agent <ci@git-for-windows.build>
dscho added 2 commits August 3, 2026 16:16
We are about to drop Windows 8.1 support, which allows us to switch from
the MSVCRT-targeting MINGW64 flavor to the UCRT-targeting UCRT64.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
This will make sure that this branch, which is destined to be integrated
into `main` Real Soon Now, is in good shape.

While at it, also add a `workflow_dispatch` trigger.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
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.

Consider builds for UCRT64?

2 participants