On Sat, 26 Dec 2020, Jacek Caban wrote:

Signed-off-by: Jacek Caban <[email protected]>
---

I think it's reasonable to assume that the current default value of Windows XP does not reflect reality. The new value deserves some considerations. I propose to go all the way to Windows 10 and match Windows SDK.

The main concern about this is compatibility. This value is commonly mistaken with 'minimum version supported in runtime', which is simply not the case. It's only a version that headers will provide declarations for. As long as the application does not use new APIs, its compatibility with older Windows will not change.

In addition to hiding declarations, it can also affect how APIs that used to exist are accessed.

A concrete case is psapi.h: I can include psapi.h and call EnumProcessModules. If NTDDI_VERSION >= NTDDI_WIN7 when including the header, the call to EnumProcessModules gets redirected to K32EnumProcessModules which exists in kernel32.dll from win7. If I include the header with a lower version defined, it ends up calling EnumProcessModules in psapi.dll instead.

Likewise, the optional IPv6 APIs end up called via GetProcAddress based wrappers. At least in official WinSDK (if I remember correctly and read the headers right), these end up skipped if _WIN32_WINNT targets a high enough version (but I think mingw-w64 headers always end up using the compat wrappers).

A second concern is that the existing practice of build systems/configure scripts probing for function availability, expecting the declarations to be hidden if they aren't supposed to be used - VLC is one prime such example, and many others work the same way.

And e.g. for that case, there's many different components that all can set the version, with varying levels of precedence:

- The toolchain defaults. (E.g. in the case of llvm-mingw, the default is Win7, as libc++ on windows requires that, so there's no point in targeting anything below that.)


- The user's preference (if e.g. passing CFLAGS="-D_WIN32_WINNT=0x602" to configure)

- The project's configure script. At least for the case of VLC, currently it doesn't IIRC set anything if it's already predefined e.g. in CFLAGS, but sets a higher version if the toolchain's default is lower than what the project itself strictly requires. If the toolchain's default is higher than the project required level, the version is not overridden to a lower version.

So at least VLC would need some amount of tweaks to cope with the toolchain defaulting to a higher version, or require everyone building it to override the desired target version in CFLAGS.

But yeah, in practice this only affects projects that have optional codepaths that can use newer features - except for the cases with e.g. psapi.h.

I think that the change reflects expectations of majority of users.

I'm not entierely sure I agree with this - I think different ecosystems have different expectations here. (It'd be interesting to e.g. rebuild all of msys2's mingw package repository with such headers, and see how many of them fail to run on the previous minimum version.)

If users still want headers to not provide Win10-only declarations, they may just set _WIN32_WINNT explicitly in build system to the exact version they want. If packagers prefer it the old way, they can use the configure stitch for that.

Yeah, it's good that we're able to override the default - I think I'd still keep doing that. But I think there's at least some amount of projects (mingw centric projects primarily, as the default in MSVC is different) that expect and rely on the current norm of it being set to the minimum.

// Martin



_______________________________________________
Mingw-w64-public mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public

Reply via email to