Commit 2922a48309

Rohlem <rohlemF@gmail.com>
2020-12-09 10:23:27
move windows runtime version detection into std.zig.system.windows
1 parent fc10c9c
Changed files (3)
lib/std/zig/system/windows.zig
@@ -0,0 +1,45 @@
+// SPDX-License-Identifier: MIT
+// Copyright (c) 2015-2020 Zig Contributors
+// This file is part of [zig](https://ziglang.org/), which is MIT licensed.
+// The MIT license requires this copyright notice to be included in all copies
+// and substantial portions of the software.
+const std = @import("std");
+
+pub const WindowsVersion = std.Target.Os.WindowsVersion;
+
+/// Returns the highest known WindowsVersion deduced from reported runtime information.
+/// Discards information about in-between versions we don't differentiate.
+pub fn detectRuntimeVersion() WindowsVersion {
+    var version_info: std.os.windows.RTL_OSVERSIONINFOW = undefined;
+    version_info.dwOSVersionInfoSize = @sizeOf(@TypeOf(version_info));
+
+    switch (std.os.windows.ntdll.RtlGetVersion(&version_info)) {
+        .SUCCESS => {},
+        else => unreachable,
+    }
+
+    // Starting from the system infos build a NTDDI-like version
+    // constant whose format is:
+    //   B0 B1 B2 B3
+    //   `---` `` ``--> Sub-version (Starting from Windows 10 onwards)
+    //     \    `--> Service pack (Always zero in the constants defined)
+    //      `--> OS version (Major & minor)
+    const os_ver: u16 = @intCast(u16, version_info.dwMajorVersion & 0xff) << 8 |
+        @intCast(u16, version_info.dwMinorVersion & 0xff);
+    const sp_ver: u8 = 0;
+    const sub_ver: u8 = if (os_ver >= 0x0A00) subver: {
+        // There's no other way to obtain this info beside
+        // checking the build number against a known set of
+        // values
+        var last_idx: usize = 0;
+        for (WindowsVersion.known_win10_build_numbers) |build, i| {
+            if (version_info.dwBuildNumber >= build)
+                last_idx = i;
+        }
+        break :subver @truncate(u8, last_idx);
+    } else 0;
+
+    const version: u32 = @as(u32, os_ver) << 16 | @as(u16, sp_ver) << 8 | sub_ver;
+
+    return @intToEnum(WindowsVersion, version);
+}
lib/std/zig/system.zig
@@ -14,6 +14,7 @@ const process = std.process;
 const Target = std.Target;
 const CrossTarget = std.zig.CrossTarget;
 const macos = @import("system/macos.zig");
+pub const windows = @import("system/windows.zig");
 
 pub const getSDKPath = macos.getSDKPath;
 
@@ -249,43 +250,9 @@ pub const NativeTargetInfo = struct {
                     }
                 },
                 .windows => {
-                    var version_info: std.os.windows.RTL_OSVERSIONINFOW = undefined;
-                    version_info.dwOSVersionInfoSize = @sizeOf(@TypeOf(version_info));
-
-                    switch (std.os.windows.ntdll.RtlGetVersion(&version_info)) {
-                        .SUCCESS => {},
-                        else => unreachable,
-                    }
-
-                    // Starting from the system infos build a NTDDI-like version
-                    // constant whose format is:
-                    //   B0 B1 B2 B3
-                    //   `---` `` ``--> Sub-version (Starting from Windows 10 onwards)
-                    //     \    `--> Service pack (Always zero in the constants defined)
-                    //      `--> OS version (Major & minor)
-                    const os_ver: u16 = @intCast(u16, version_info.dwMajorVersion & 0xff) << 8 |
-                        @intCast(u16, version_info.dwMinorVersion & 0xff);
-                    const sp_ver: u8 = 0;
-                    const sub_ver: u8 = if (os_ver >= 0x0A00) subver: {
-                        // There's no other way to obtain this info beside
-                        // checking the build number against a known set of
-                        // values
-                        const known_build_numbers = [_]u32{
-                            10240, 10586, 14393, 15063, 16299, 17134, 17763,
-                            18362, 19041,
-                        };
-                        var last_idx: usize = 0;
-                        for (known_build_numbers) |build, i| {
-                            if (version_info.dwBuildNumber >= build)
-                                last_idx = i;
-                        }
-                        break :subver @truncate(u8, last_idx);
-                    } else 0;
-
-                    const version: u32 = @as(u32, os_ver) << 16 | @as(u32, sp_ver) << 8 | sub_ver;
-
-                    os.version_range.windows.max = @intToEnum(Target.Os.WindowsVersion, version);
-                    os.version_range.windows.min = @intToEnum(Target.Os.WindowsVersion, version);
+                    const detected_version = windows.detectRuntimeVersion();
+                    os.version_range.windows.min = detected_version;
+                    os.version_range.windows.max = detected_version;
                 },
                 .macos => {
                     var scbuf: [32]u8 = undefined;
lib/std/target.zig
@@ -109,6 +109,20 @@ pub const Target = struct {
             /// Latest Windows version that the Zig Standard Library is aware of
             pub const latest = WindowsVersion.win10_20h1;
 
+            /// Compared against build numbers reported by the runtime to distinguish win10 versions,
+            /// where 0x0A000000 + index corresponds to the WindowsVersion u32 value.
+            pub const known_win10_build_numbers = [_]u32{
+                10240, //win10
+                10586, //win10_th2
+                14393, //win_rs1
+                15063, //win_rs2
+                16299, //win_rs3
+                17134, //win_rs4
+                17763, //win_rs5
+                18362, //win_19h1
+                19041, //win_20h1
+            };
+
             pub const Range = struct {
                 min: WindowsVersion,
                 max: WindowsVersion,