From: Johannes Schindelin <johannes.schindelin@xxxxxx> When linking against the Rust-built `xdiff`, there is now a new required dependency: Without _also_ linking to the system library `userenv`, the compile would fail with this error message: xdiff.lib(std-c85e9beb7923f636.std.df32d1bc89881d89-cgu.0.rcgu.o) : error LNK2019: unresolved external symbol __imp_GetUserProfileDirectoryW referenced in function _ZN3std3env8home_dir17hfd1c3b6676cd78f6E Therefore, just like we do in case of Makefile-based builds on Windows, we now also link to that library when building with Meson. Note that if we only have Rust depend upon libuserenv then at link time GCC would complain about: undefined reference to `GetUserProfileDirectoryW' Apparently there is _some_ closure that gets compiled in that requires this function, and that in turn forces Git to link to libuserenv. This is a new requirement, and therefore has not been made part of the "minimal Git for Windows SDK". In the near future, I intend to include it, but for now let's just ensure that the file is added manually if it is missing. Signed-off-by: Johannes Schindelin <johannes.schindelin@xxxxxx> [en: Squashed a few of Johannes's patches, and moved lib userenv handling from an earlier patch] Signed-off-by: Ezekiel Newren <ezekielnewren@xxxxxxxxx> --- .github/workflows/main.yml | 8 ++++++++ config.mak.uname | 2 ++ meson.build | 1 + 3 files changed, 11 insertions(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 8aac18a6ba45..aa18742f08c4 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -115,6 +115,14 @@ jobs: steps: - uses: actions/checkout@v4 - uses: git-for-windows/setup-git-for-windows-sdk@v1 + - name: ensure that libuserenv.a is present + shell: bash + run: | + cd /mingw64/lib && { + test -f libuserenv.a || + /c/Program\ Files/Git/mingw64/bin/curl -Lo libuserenv.a \ + https://github.com/git-for-windows/git-sdk-64/raw/HEAD/mingw64/lib/libuserenv.a + } - name: build shell: bash env: diff --git a/config.mak.uname b/config.mak.uname index a22703284b56..fbe7cebf40ed 100644 --- a/config.mak.uname +++ b/config.mak.uname @@ -746,6 +746,8 @@ ifeq ($(uname_S),MINGW) export CARGO_BUILD_TARGET RUST_TARGET_DIR = rust/target/$(CARGO_BUILD_TARGET)/$(RUST_BUILD_MODE) + # Unfortunately now needed because of Rust + EXTLIBS += -luserenv CC = gcc COMPAT_CFLAGS += -D__USE_MINGW_ANSI_STDIO=0 -DDETECT_MSYS_TTY \ diff --git a/meson.build b/meson.build index 5e89a5dd0e00..af015f04763f 100644 --- a/meson.build +++ b/meson.build @@ -1260,6 +1260,7 @@ elif host_machine.system() == 'windows' ] libgit_dependencies += compiler.find_library('ntdll') + libgit_dependencies += compiler.find_library('userenv') libgit_include_directories += 'compat/win32' if compiler.get_id() == 'msvc' libgit_include_directories += 'compat/vcbuild/include' -- gitgitgadget