From 4cae5847694f0d62b6da3b55164f7749c0a19fef Mon Sep 17 00:00:00 2001 From: Patrick Steinhardt Date: Thu, 5 Mar 2026 12:20:21 +0100 Subject: [PATCH 1/3] meson: simplify iconv-emits-BOM check Simplify the iconv-emits-BOM check that we have in Meson a bit by: - Dropping useless variables. - Casting the `inpos` pointer to `void *` instead of using a typedef that depends on whether or not we use an old iconv library. This overall condenses the code signficantly and makes it easier to follow. Signed-off-by: Patrick Steinhardt Signed-off-by: Junio C Hamano --- meson.build | 54 +++++++++++++++++++---------------------------------- 1 file changed, 19 insertions(+), 35 deletions(-) diff --git a/meson.build b/meson.build index dd52efd1c8..1f9694e42b 100644 --- a/meson.build +++ b/meson.build @@ -1033,42 +1033,26 @@ if iconv.found() have_old_iconv = true endif - iconv_omits_bom_source = '''# - #include + if meson.can_run_host_binaries() + if compiler.run(''' + #include - int main(int argc, const char **argv) - { - ''' - if have_old_iconv - iconv_omits_bom_source += ''' - typedef const char *iconv_ibp; - ''' - else - iconv_omits_bom_source += ''' - typedef char *iconv_ibp; - ''' - endif - iconv_omits_bom_source += ''' - int v; - iconv_t conv; - char in[] = "a"; iconv_ibp pin = in; - char out[20] = ""; char *pout = out; - size_t isz = sizeof in; - size_t osz = sizeof out; - - conv = iconv_open("UTF-16", "UTF-8"); - iconv(conv, &pin, &isz, &pout, &osz); - iconv_close(conv); - v = (unsigned char)(out[0]) + (unsigned char)(out[1]); - return v != 0xfe + 0xff; - } - ''' - - if meson.can_run_host_binaries() and compiler.run(iconv_omits_bom_source, - dependencies: iconv, - name: 'iconv omits BOM', - ).returncode() != 0 - libgit_c_args += '-DICONV_OMITS_BOM' + int main(int argc, const char **argv) + { + char in[] = "a", *inpos = in; + char out[20] = "", *outpos = out; + size_t insz = sizeof(in), outsz = sizeof(out); + iconv_t conv = iconv_open("UTF-16", "UTF-8"); + iconv(conv, (void *) &inpos, &insz, &outpos, &outsz); + iconv_close(conv); + return (unsigned char)(out[0]) + (unsigned char)(out[1]) != 0xfe + 0xff; + } + ''', + dependencies: iconv, + name: 'iconv omits BOM', + ).returncode() != 0 + libgit_c_args += '-DICONV_OMITS_BOM' + endif endif else libgit_c_args += '-DNO_ICONV' From f1d734bf25570e3355c3c147e71e075a2f8f98f2 Mon Sep 17 00:00:00 2001 From: Patrick Steinhardt Date: Thu, 5 Mar 2026 12:20:22 +0100 Subject: [PATCH 2/3] meson: detect broken iconv that requires ICONV_RESTART_RESET In d0cec08d70 (utf8.c: prepare workaround for iconv under macOS 14/15, 2026-01-12) we have introduced a new workaround for a broken version of libiconv on macOS. This workaround has for now only been wired up for our Makefile, so using Meson with such a broken version will fail. We can rather easily detect the broken behaviour. Some encodings have different modes that can be switched to via an escape sequence. In the case of ISO-2022-JP this can be done via "$B" and "(J" to switch between ASCII and JIS modes. The bug now triggers when one does multiple calls to iconv(3p) to convert a string piece by piece, where the first call enters JIS mode. The second call forgets about the fact that it is still in JIS mode, and consequently it will incorrectly treat the input as ASCII, and thus the produced output is of course garbage. Wire up a test that exercises this in Meson and, if it fails, set the `ICONV_RESTART_RESET` define. Signed-off-by: Patrick Steinhardt Signed-off-by: Junio C Hamano --- meson.build | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/meson.build b/meson.build index 1f9694e42b..1f82a131d9 100644 --- a/meson.build +++ b/meson.build @@ -1053,6 +1053,32 @@ if iconv.found() ).returncode() != 0 libgit_c_args += '-DICONV_OMITS_BOM' endif + + if compiler.run(''' + #include + #include + + int main(int argc, const char *argv[]) + { + char in[] = "\x1b\x24\x42\x24\x22\x24\x22\x1b\x28\x42", *inpos = in; + char out[7] = { 0 }, *outpos = out; + size_t insz = sizeof(in) - 1, outsz = 4; + iconv_t conv = iconv_open("UTF-8", "ISO-2022-JP"); + if (!conv) + return 1; + if (iconv(conv, (void *) &inpos, &insz, &outpos, &outsz) != (size_t) -1) + return 2; + outsz = sizeof(out) - (outpos - out); + if (iconv(conv, (void *) &inpos, &insz, &outpos, &outsz) == (size_t) -1) + return 3; + return strcmp("\343\201\202\343\201\202", out) ? 4 : 0; + } + ''', + dependencies: iconv, + name: 'iconv handles restarts properly', + ).returncode() != 0 + libgit_c_args += '-DICONV_RESTART_RESET' + endif endif else libgit_c_args += '-DNO_ICONV' From 3afad3d8ae3ca59dea450ba96afa2d7ccaabab99 Mon Sep 17 00:00:00 2001 From: Patrick Steinhardt Date: Thu, 5 Mar 2026 12:20:23 +0100 Subject: [PATCH 3/3] gitlab-ci: update to macOS 15 images The macos-14-xcode-15 images for GitLab's macOS runners have been deprecated. Update to macOS 15, which is our current stable version. Signed-off-by: Patrick Steinhardt Signed-off-by: Junio C Hamano --- .gitlab-ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index b419a84e2c..53ebf806ae 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -101,13 +101,13 @@ test:osx: parallel: matrix: - jobname: osx-clang - image: macos-14-xcode-15 + image: macos-15-xcode-16 CC: clang - jobname: osx-reftable - image: macos-14-xcode-15 + image: macos-15-xcode-16 CC: clang - jobname: osx-meson - image: macos-14-xcode-15 + image: macos-15-xcode-16 CC: clang artifacts: paths: