Skip to content

Migrate the SDK from MINGW64 to UCRT64#117

Draft
dscho wants to merge 26 commits into
mainfrom
ucrt64
Draft

Migrate the SDK from MINGW64 to UCRT64#117
dscho wants to merge 26 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 dscho linked an issue Jun 9, 2026 that may be closed by this pull request
Git for Windows Build Agent and others added 5 commits June 9, 2026 08:37
The Git for Windows project uses `mingw-w64-7zip` these days, because p7zip is stuck way in the past, see also git-for-windows/git#5395.

Here is the output of the command that was run in
https://github.com/git-for-windows/git-for-windows-automation/actions/runs/27194161241:

+ set -x
+ pacman -Rns --noconfirm p7zip
checking dependencies...

Packages (1) p7zip-17.06-1

Total Removed Size:  10.82 MiB

:: Do you want to remove these packages? [Y/n]
:: Processing package changes...
removing p7zip...
+ echo 0
The Git for Windows project never used `unrar`. See git-for-windows/git#5395 for details.

Here is the output of the command that was run in
https://github.com/git-for-windows/git-for-windows-automation/actions/runs/27203180380:

+ set -x
+ pacman -Rns --noconfirm unrar
checking dependencies...

Packages (1) unrar-7.2.6-1

Total Removed Size:  0.36 MiB

:: Do you want to remove these packages? [Y/n]
:: Processing package changes...
removing unrar...
+ echo 0
The Git for Windows project uses `mingw-w64-7zip` these days, because
p7zip is stuck way in the past, see also
git-for-windows/git#5395.

Here is the output of the command that was run in

https://github.com/git-for-windows/git-for-windows-automation/actions/runs/27194161241:

+ set -x
+ pacman -Rns --noconfirm p7zip
checking dependencies...

Packages (1) p7zip-17.06-1

Total Removed Size:  10.82 MiB

:: Do you want to remove these packages? [Y/n]
:: Processing package changes...
removing p7zip...
+ echo 0
The Git for Windows project never used `unrar`. See
git-for-windows/git#5395 for details.

Here is the output of the command that was run in

https://github.com/git-for-windows/git-for-windows-automation/actions/runs/27203180380:

+ set -x
+ pacman -Rns --noconfirm unrar
checking dependencies...

Packages (1) unrar-7.2.6-1

Total Removed Size:  0.36 MiB

:: Do you want to remove these packages? [Y/n]
:: Processing package changes...
removing unrar...
+ echo 0
…ing-sparse"

This reverts commit 075a9ad.

The build-extra changes that this commit was waiting on
(git-for-windows/build-extra#710) have
landed on `git-for-windows/build-extra` `main`, so the workflows
can go back to cloning the upstream branch.

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 11, 2026
Previously, the workflow would only work for packages whose name is
unchanged across Git for Windows SDKs, i.e. MSYS packages. However,
MINGW packages' names start with a prefix that encodes the architecture.
Let's support that via `mingw-w64-<name>`, which is auto-expanded to
`${MINGW_PACKAGE_PREFIX}-<name>`.

While at it, also support UCRT64, which [is currently
developed](git-for-windows/git-sdk-64#117) on
the `ucrt64` branch of git-sdk-64.
dscho added a commit to git-for-windows/setup-git-for-windows-sdk that referenced this pull request Jun 12, 2026
MSYS2 deprecated MINGW64 [a while
back](https://www.msys2.org/news/#2026-03-15-deprecating-the-mingw64-environment);
new packages no longer get accepted there, and updates of the ones we
already ship have been winding down. Git for Windows therefore has to
move the SDK over to UCRT64, and the kickoff for that move on
`git-sdk-64` itself happened in
git-for-windows/git-sdk-64#117.

Several Git for Windows component repositories (notably
https://github.com/git-for-windows/git,
https://github.com/git-for-windows/build-extra, and
https://github.com/git-for-windows/MINGW-packages) materialise their CI
environment by calling into this Action. Once they want to start
exercising UCRT64 builds, they have to be able to ask for `architecture:
ucrt64` and get a UCRT64 SDK back. That is what this PR sets up.

The `ucrt64` axis added here lives on a dedicated long-lived branch of
`git-sdk-64`, runs under `MSYSTEM=UCRT64`, and keeps its on-disk output
directory and cache key distinct from the existing `x86_64` axis so the
two variants can coexist on the same runner without clobbering each
other. Only `flavor: full` is wired up end-to-end at this point; the
other flavors depend on follow-up work in `build-extra` and on the
`ci-artifacts` pipeline of `git-sdk-64`, both of which are explicitly
tracked in
git-for-windows/git-sdk-64#117 (comment).

The long-term plan is to "merge --theirs" `ucrt64` into `main` in the
git-sdk-64, therefore the `architecture: ucrt64` setting is
intentionally transitional (eventually it will be synonymous to
`x86_64`).

The branch starts with a fresh `AGENTS.md` written against the
pre-UCRT64 state of the repository, and only the later commits extend
that document as the actual `ucrt64` support lands. That way each commit
reads as an accurate snapshot of the tree at that point, which makes the
series easier to review one commit at a time. The final commit is the
conventional `npm run build && npm run package` regeneration of
`dist/index.js`.
@dscho

dscho commented Jun 16, 2026

Copy link
Copy Markdown
Member Author

In the meantime, I deployed the following mingw-w64-ucrt-x86_64-* packages to the Pacman repository:

@dscho

dscho commented Jun 16, 2026

Copy link
Copy Markdown
Member Author

In the meantime, I deployed the following mingw-w64-ucrt-x86_64-* packages to the Pacman repository:

Add to that:

dscho added 4 commits June 16, 2026 16:18
A long time ago, we had to transition from our home-grown
`asciidoctor-extensions` package, and needed support in this
script so that the update would run smoothly via the next
`sync` workflow run.

This transition has concluded a long time ago, and therefore
the support code is no longer necessary.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
This is the `ucrt64` branch of git-sdk-64, destined to become the
`main` branch once the migration from MINGW64 to UCRT64 outlined in
#117 is complete.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
The migration of Git for Windows' SDK from MINGW64 to UCRT64 is under
way, and as part of that, we need to ensure that the Git for
Windows-specific addons package is installed in the SDK.

Technically, this logic is not _really_ necessary in this branch
because the split package is already installed. But hey, the logic
is there, and it cannot hurt to have something "self-healing" in
place just in case the addons package gets uninstalled at some
stage by mistake.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
The script still had one left-over from the MINGW64 flavor of Git
for Windows' SDK: the final `pacman` call that ensures that the
`git-extra` package is installed (mostly for the benefit of letting
its post-install script modify all the things in a regular MSYS2
setup to what Git for Windows needs and which cannot be configured
in any other way).

With this commit, this script now installs the UCRT64 flavor of
that package, and the migration of this script is now complete.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
apr (1.7.6-1 -> 1.7.6-2)
bash (5.3.012-1 -> 5.3.015-1)
binutils (2.46-2 -> 2.46.1-1)
bsdcpio (3.8.7-1 -> 3.8.7-2)
bsdtar (3.8.7-1 -> 3.8.7-2)
file (5.47-1 -> 5.48-1)
gcc (15.2.0-1 -> 15.3.0-1)
gcc-libs (15.2.0-1 -> 15.3.0-1)
gdb (17.1-2 -> 17.1-3)
less (702-1 -> 704-1)
libarchive (3.8.7-1 -> 3.8.7-2)
libltdl (2.5.4-4 -> 2.5.4-5)
libopenssl (3.5.6-1 -> 3.5.7-1)
libsqlite (3.53.1-1 -> 3.53.2-1)
libtool (2.5.4-4 -> 2.5.4-5)
mingw-w64-ucrt-x86_64-binutils (2.46-3 -> 2.46.1-1)
mingw-w64-ucrt-x86_64-crt (14.0.0.r59.g93753750c-1 -> 14.0.0.r98.g19f5121a2-1)
mingw-w64-ucrt-x86_64-docx2txt-rs (new: 0.2.0-1)
mingw-w64-ucrt-x86_64-expat (2.8.1-1 -> 2.8.1-2)
mingw-w64-ucrt-x86_64-git-extra (new: 1.1.709.fa78d67ca-1)
mingw-w64-ucrt-x86_64-headers (14.0.0.r59.g93753750c-1 -> 14.0.0.r98.g19f5121a2-1)
mingw-w64-ucrt-x86_64-libmangle (14.0.0.r59.g93753750c-1 -> 14.0.0.r98.g19f5121a2-1)
mingw-w64-ucrt-x86_64-libwinpthread (14.0.0.r59.g93753750c-1 -> 14.0.0.r98.g19f5121a2-1)
mingw-w64-ucrt-x86_64-openssl (3.6.2-2 -> 3.6.3-1)
mingw-w64-ucrt-x86_64-python (3.14.5-1 -> 3.14.6-1)
mingw-w64-ucrt-x86_64-tools (14.0.0.r59.g93753750c-1 -> 14.0.0.r98.g19f5121a2-1)
mingw-w64-ucrt-x86_64-winpthreads (14.0.0.r59.g93753750c-1 -> 14.0.0.r98.g19f5121a2-1)
mintty (1~3.8.2-1 -> 1~3.8.3-1)
msys2-runtime (3.6.9-1 -> 3.6.9-2)
msys2-runtime-devel (3.6.9-1 -> 3.6.9-2)
openssl (3.5.6-1 -> 3.5.7-1)
pacman (6.1.0-24 -> 6.1.0-25)
perl-HTTP-Message (7.01-1 -> 7.02-1)
rsync (3.4.3-1 -> 3.4.4-1)
tig (2.6.0-1 -> 2.6.1-1)
vim (9.2.0577-1 -> 9.2.0640-1)

Signed-off-by: Git for Windows Build Agent <ci@git-for-windows.build>
…e installed

The set of Pacman packages required to build Git for Windows' installer/portable
Git/MinGit from scratch need to be installed in the `git-sdk-*` repositories, so
that MinGit or other backports are possible without having to rely on external
Pacman repositories whose contents might have been culled to make more space.

Let's ensure that these packages (which were uninstalled as part of moving
from MINGW64 to UCRT64 because their UCRT64 counterparts were not yet available)
are installed.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
mingw-w64-ucrt-x86_64-curl-openssl-alternate (new: 8.20.0-1)
mingw-w64-ucrt-x86_64-cv2pdb (new: 0.53-1)
mingw-w64-ucrt-x86_64-git-credential-manager (new: 2.8.0-1)
mingw-w64-ucrt-x86_64-wintoast (new: 1.0.0.275.a44fa02-1)
mingw-w64-ucrt-x86_64-xpdf-tools (new: 4.06-1)

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

dscho commented Jun 16, 2026

Copy link
Copy Markdown
Member Author

check-for-missing-dlls / check (push) check-for-missing-dlls / check (push) Failing after 2m

The PR git-for-windows/build-extra#716 will fix this.

dscho added a commit to git-for-windows/git-for-windows-automation that referenced this pull request Jun 17, 2026
This is part of the overall effort in git-for-windows/git-sdk-64#117,
and it was used to deploy the UCRT64 variants of the Git for
Windows-only MINGW packages to the Pacman repository.
dscho added a commit to git-for-windows/build-extra that referenced this pull request Jun 17, 2026
I noticed over in git-for-windows/git-sdk-64#117 that the
`check-for-missing-dlls` job failed. That's because the script needed
some adjustment. (The `make-file-list.sh` script, to be precise.)
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