platform_darwin.odin 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511
  1. // +build darwin
  2. package sysinfo
  3. import sys "core:sys/unix"
  4. import "core:strconv"
  5. import "core:strings"
  6. @(private)
  7. version_string_buf: [1024]u8
  8. @(init, private)
  9. init_os_version :: proc () {
  10. os_version.platform = .MacOS
  11. // Start building display version
  12. b := strings.builder_from_bytes(version_string_buf[:])
  13. mib := []i32{sys.CTL_KERN, sys.KERN_OSVERSION}
  14. build_buf: [12]u8
  15. ok := sys.sysctl(mib, &build_buf)
  16. if !ok {
  17. strings.write_string(&b, "macOS Unknown")
  18. os_version.as_string = strings.to_string(b)
  19. return
  20. }
  21. build := string(cstring(&build_buf[0]))
  22. // Do we have an exact match?
  23. match: Darwin_Match
  24. rel, exact := macos_release_map[build]
  25. if exact {
  26. match = .Exact
  27. } else {
  28. // Match on XNU kernel version
  29. mib = []i32{sys.CTL_KERN, sys.KERN_OSRELEASE}
  30. version_bits: [12]u8 // enough for 999.999.999\x00
  31. have_kernel_version := sys.sysctl(mib, &version_bits)
  32. major_ok, minor_ok, patch_ok: bool
  33. triplet := strings.split(string(cstring(&version_bits[0])), ".", context.temp_allocator)
  34. if len(triplet) != 3 {
  35. have_kernel_version = false
  36. } else {
  37. rel.darwin.x, major_ok = strconv.parse_int(triplet[0])
  38. rel.darwin.y, minor_ok = strconv.parse_int(triplet[1])
  39. rel.darwin.z, patch_ok = strconv.parse_int(triplet[2])
  40. if !(major_ok && minor_ok && patch_ok) {
  41. have_kernel_version = false
  42. }
  43. }
  44. if !have_kernel_version {
  45. // We don't know the kernel version, but we do know the build
  46. strings.write_string(&b, "macOS Unknown (build ")
  47. l := strings.builder_len(b)
  48. strings.write_string(&b, build)
  49. os_version.version = strings.to_string(b)[l:]
  50. strings.write_rune(&b, ')')
  51. os_version.as_string = strings.to_string(b)
  52. return
  53. }
  54. rel, match = map_darwin_kernel_version_to_macos_release(build, rel.darwin)
  55. }
  56. os_version.major = rel.darwin.x
  57. os_version.minor = rel.darwin.y
  58. os_version.patch = rel.darwin.z
  59. strings.write_string(&b, rel.os_name)
  60. if match == .Exact || match == .Nearest {
  61. strings.write_rune(&b, ' ')
  62. strings.write_string(&b, rel.release.name)
  63. strings.write_rune(&b, ' ')
  64. strings.write_int(&b, rel.release.version.x)
  65. if rel.release.version.y > 0 || rel.release.version.z > 0 {
  66. strings.write_rune(&b, '.')
  67. strings.write_int(&b, rel.release.version.y)
  68. }
  69. if rel.release.version.z > 0 {
  70. strings.write_rune(&b, '.')
  71. strings.write_int(&b, rel.release.version.z)
  72. }
  73. if match == .Nearest {
  74. strings.write_rune(&b, '?')
  75. }
  76. } else {
  77. strings.write_string(&b, " Unknown")
  78. }
  79. strings.write_string(&b, " (build ")
  80. l := strings.builder_len(b)
  81. strings.write_string(&b, build)
  82. os_version.version = strings.to_string(b)[l:]
  83. strings.write_string(&b, ", kernel ")
  84. strings.write_int(&b, rel.darwin.x)
  85. strings.write_rune(&b, '.')
  86. strings.write_int(&b, rel.darwin.y)
  87. strings.write_rune(&b, '.')
  88. strings.write_int(&b, rel.darwin.z)
  89. strings.write_rune(&b, ')')
  90. os_version.as_string = strings.to_string(b)
  91. }
  92. @(init)
  93. init_ram :: proc() {
  94. // Retrieve RAM info using `sysctl`
  95. mib := []i32{sys.CTL_HW, sys.HW_MEMSIZE}
  96. mem_size: u64
  97. if sys.sysctl(mib, &mem_size) {
  98. ram.total_ram = int(mem_size)
  99. }
  100. }
  101. @(private)
  102. Darwin_To_Release :: struct {
  103. darwin: [3]int, // Darwin kernel triplet
  104. os_name: string, // OS X, MacOS
  105. release: struct {
  106. name: string, // Monterey, Mojave, etc.
  107. version: [3]int, // 12.4, etc.
  108. },
  109. }
  110. // Important: Order from lowest to highest kernel version
  111. @(private)
  112. macos_release_map: map[string]Darwin_To_Release = {
  113. // MacOS Tiger
  114. "8A428" = {{8, 0, 0}, "macOS", {"Tiger", {10, 4, 0}}},
  115. "8A432" = {{8, 0, 0}, "macOS", {"Tiger", {10, 4, 0}}},
  116. "8B15" = {{8, 1, 0}, "macOS", {"Tiger", {10, 4, 1}}},
  117. "8B17" = {{8, 1, 0}, "macOS", {"Tiger", {10, 4, 1}}},
  118. "8C46" = {{8, 2, 0}, "macOS", {"Tiger", {10, 4, 2}}},
  119. "8C47" = {{8, 2, 0}, "macOS", {"Tiger", {10, 4, 2}}},
  120. "8E102" = {{8, 2, 0}, "macOS", {"Tiger", {10, 4, 2}}},
  121. "8E45" = {{8, 2, 0}, "macOS", {"Tiger", {10, 4, 2}}},
  122. "8E90" = {{8, 2, 0}, "macOS", {"Tiger", {10, 4, 2}}},
  123. "8F46" = {{8, 3, 0}, "macOS", {"Tiger", {10, 4, 3}}},
  124. "8G32" = {{8, 4, 0}, "macOS", {"Tiger", {10, 4, 4}}},
  125. "8G1165" = {{8, 4, 0}, "macOS", {"Tiger", {10, 4, 4}}},
  126. "8H14" = {{8, 5, 0}, "macOS", {"Tiger", {10, 4, 5}}},
  127. "8G1454" = {{8, 5, 0}, "macOS", {"Tiger", {10, 4, 5}}},
  128. "8I127" = {{8, 6, 0}, "macOS", {"Tiger", {10, 4, 6}}},
  129. "8I1119" = {{8, 6, 0}, "macOS", {"Tiger", {10, 4, 6}}},
  130. "8J135" = {{8, 7, 0}, "macOS", {"Tiger", {10, 4, 7}}},
  131. "8J2135a" = {{8, 7, 0}, "macOS", {"Tiger", {10, 4, 7}}},
  132. "8K1079" = {{8, 7, 0}, "macOS", {"Tiger", {10, 4, 7}}},
  133. "8N5107" = {{8, 7, 0}, "macOS", {"Tiger", {10, 4, 7}}},
  134. "8L127" = {{8, 8, 0}, "macOS", {"Tiger", {10, 4, 8}}},
  135. "8L2127" = {{8, 8, 0}, "macOS", {"Tiger", {10, 4, 8}}},
  136. "8P135" = {{8, 9, 0}, "macOS", {"Tiger", {10, 4, 9}}},
  137. "8P2137" = {{8, 9, 0}, "macOS", {"Tiger", {10, 4, 9}}},
  138. "8R218" = {{8, 10, 0}, "macOS", {"Tiger", {10, 4, 10}}},
  139. "8R2218" = {{8, 10, 0}, "macOS", {"Tiger", {10, 4, 10}}},
  140. "8R2232" = {{8, 10, 0}, "macOS", {"Tiger", {10, 4, 10}}},
  141. "8S165" = {{8, 11, 0}, "macOS", {"Tiger", {10, 4, 11}}},
  142. "8S2167" = {{8, 11, 0}, "macOS", {"Tiger", {10, 4, 11}}},
  143. // MacOS Leopard
  144. "9A581" = {{9, 0, 0}, "macOS", {"Leopard", {10, 5, 0}}},
  145. "9B18" = {{9, 1, 0}, "macOS", {"Leopard", {10, 5, 1}}},
  146. "9B2117" = {{9, 1, 1}, "macOS", {"Leopard", {10, 5, 1}}},
  147. "9C31" = {{9, 2, 0}, "macOS", {"Leopard", {10, 5, 2}}},
  148. "9C7010" = {{9, 2, 0}, "macOS", {"Leopard", {10, 5, 2}}},
  149. "9D34" = {{9, 3, 0}, "macOS", {"Leopard", {10, 5, 3}}},
  150. "9E17" = {{9, 4, 0}, "macOS", {"Leopard", {10, 5, 4}}},
  151. "9F33" = {{9, 5, 0}, "macOS", {"Leopard", {10, 5, 5}}},
  152. "9G55" = {{9, 6, 0}, "macOS", {"Leopard", {10, 5, 6}}},
  153. "9G66" = {{9, 6, 0}, "macOS", {"Leopard", {10, 5, 6}}},
  154. "9G71" = {{9, 6, 0}, "macOS", {"Leopard", {10, 5, 6}}},
  155. "9J61" = {{9, 7, 0}, "macOS", {"Leopard", {10, 5, 7}}},
  156. "9L30" = {{9, 8, 0}, "macOS", {"Leopard", {10, 5, 8}}},
  157. "9L34" = {{9, 8, 0}, "macOS", {"Leopard", {10, 5, 8}}},
  158. // MacOS Snow Leopard
  159. "10A432" = {{10, 0, 0}, "macOS", {"Snow Leopard", {10, 6, 0}}},
  160. "10A433" = {{10, 0, 0}, "macOS", {"Snow Leopard", {10, 6, 0}}},
  161. "10B504" = {{10, 1, 0}, "macOS", {"Snow Leopard", {10, 6, 1}}},
  162. "10C540" = {{10, 2, 0}, "macOS", {"Snow Leopard", {10, 6, 2}}},
  163. "10D573" = {{10, 3, 0}, "macOS", {"Snow Leopard", {10, 6, 3}}},
  164. "10D575" = {{10, 3, 0}, "macOS", {"Snow Leopard", {10, 6, 3}}},
  165. "10D578" = {{10, 3, 0}, "macOS", {"Snow Leopard", {10, 6, 3}}},
  166. "10F569" = {{10, 4, 0}, "macOS", {"Snow Leopard", {10, 6, 4}}},
  167. "10H574" = {{10, 5, 0}, "macOS", {"Snow Leopard", {10, 6, 5}}},
  168. "10J567" = {{10, 6, 0}, "macOS", {"Snow Leopard", {10, 6, 6}}},
  169. "10J869" = {{10, 7, 0}, "macOS", {"Snow Leopard", {10, 6, 7}}},
  170. "10J3250" = {{10, 7, 0}, "macOS", {"Snow Leopard", {10, 6, 7}}},
  171. "10J4138" = {{10, 7, 0}, "macOS", {"Snow Leopard", {10, 6, 7}}},
  172. "10K540" = {{10, 8, 0}, "macOS", {"Snow Leopard", {10, 6, 8}}},
  173. "10K549" = {{10, 8, 0}, "macOS", {"Snow Leopard", {10, 6, 8}}},
  174. // MacOS Lion
  175. "11A511" = {{11, 0, 0}, "macOS", {"Lion", {10, 7, 0}}},
  176. "11A511s" = {{11, 0, 0}, "macOS", {"Lion", {10, 7, 0}}},
  177. "11A2061" = {{11, 0, 2}, "macOS", {"Lion", {10, 7, 0}}},
  178. "11A2063" = {{11, 0, 2}, "macOS", {"Lion", {10, 7, 0}}},
  179. "11B26" = {{11, 1, 0}, "macOS", {"Lion", {10, 7, 1}}},
  180. "11B2118" = {{11, 1, 0}, "macOS", {"Lion", {10, 7, 1}}},
  181. "11C74" = {{11, 2, 0}, "macOS", {"Lion", {10, 7, 2}}},
  182. "11D50" = {{11, 3, 0}, "macOS", {"Lion", {10, 7, 3}}},
  183. "11E53" = {{11, 4, 0}, "macOS", {"Lion", {10, 7, 4}}},
  184. "11G56" = {{11, 4, 2}, "macOS", {"Lion", {10, 7, 5}}},
  185. "11G63" = {{11, 4, 2}, "macOS", {"Lion", {10, 7, 5}}},
  186. // MacOS Mountain Lion
  187. "12A269" = {{12, 0, 0}, "macOS", {"Mountain Lion", {10, 8, 0}}},
  188. "12B19" = {{12, 1, 0}, "macOS", {"Mountain Lion", {10, 8, 1}}},
  189. "12C54" = {{12, 2, 0}, "macOS", {"Mountain Lion", {10, 8, 2}}},
  190. "12C60" = {{12, 2, 0}, "macOS", {"Mountain Lion", {10, 8, 2}}},
  191. "12C2034" = {{12, 2, 0}, "macOS", {"Mountain Lion", {10, 8, 2}}},
  192. "12C3104" = {{12, 2, 0}, "macOS", {"Mountain Lion", {10, 8, 2}}},
  193. "12D78" = {{12, 3, 0}, "macOS", {"Mountain Lion", {10, 8, 3}}},
  194. "12E55" = {{12, 4, 0}, "macOS", {"Mountain Lion", {10, 8, 4}}},
  195. "12E3067" = {{12, 4, 0}, "macOS", {"Mountain Lion", {10, 8, 4}}},
  196. "12E4022" = {{12, 4, 0}, "macOS", {"Mountain Lion", {10, 8, 4}}},
  197. "12F37" = {{12, 5, 0}, "macOS", {"Mountain Lion", {10, 8, 5}}},
  198. "12F45" = {{12, 5, 0}, "macOS", {"Mountain Lion", {10, 8, 5}}},
  199. "12F2501" = {{12, 5, 0}, "macOS", {"Mountain Lion", {10, 8, 5}}},
  200. "12F2518" = {{12, 5, 0}, "macOS", {"Mountain Lion", {10, 8, 5}}},
  201. "12F2542" = {{12, 5, 0}, "macOS", {"Mountain Lion", {10, 8, 5}}},
  202. "12F2560" = {{12, 5, 0}, "macOS", {"Mountain Lion", {10, 8, 5}}},
  203. // MacOS Mavericks
  204. "13A603" = {{13, 0, 0}, "macOS", {"Mavericks", {10, 9, 0}}},
  205. "13B42" = {{13, 0, 0}, "macOS", {"Mavericks", {10, 9, 1}}},
  206. "13C64" = {{13, 1, 0}, "macOS", {"Mavericks", {10, 9, 2}}},
  207. "13C1021" = {{13, 1, 0}, "macOS", {"Mavericks", {10, 9, 2}}},
  208. "13D65" = {{13, 2, 0}, "macOS", {"Mavericks", {10, 9, 3}}},
  209. "13E28" = {{13, 3, 0}, "macOS", {"Mavericks", {10, 9, 4}}},
  210. "13F34" = {{13, 4, 0}, "macOS", {"Mavericks", {10, 9, 5}}},
  211. "13F1066" = {{13, 4, 0}, "macOS", {"Mavericks", {10, 9, 5}}},
  212. "13F1077" = {{13, 4, 0}, "macOS", {"Mavericks", {10, 9, 5}}},
  213. "13F1096" = {{13, 4, 0}, "macOS", {"Mavericks", {10, 9, 5}}},
  214. "13F1112" = {{13, 4, 0}, "macOS", {"Mavericks", {10, 9, 5}}},
  215. "13F1134" = {{13, 4, 0}, "macOS", {"Mavericks", {10, 9, 5}}},
  216. "13F1507" = {{13, 4, 0}, "macOS", {"Mavericks", {10, 9, 5}}},
  217. "13F1603" = {{13, 4, 0}, "macOS", {"Mavericks", {10, 9, 5}}},
  218. "13F1712" = {{13, 4, 0}, "macOS", {"Mavericks", {10, 9, 5}}},
  219. "13F1808" = {{13, 4, 0}, "macOS", {"Mavericks", {10, 9, 5}}},
  220. "13F1911" = {{13, 4, 0}, "macOS", {"Mavericks", {10, 9, 5}}},
  221. // MacOS Yosemite
  222. "14A389" = {{14, 0, 0}, "macOS", {"Yosemite", {10, 10, 0}}},
  223. "14B25" = {{14, 0, 0}, "macOS", {"Yosemite", {10, 10, 1}}},
  224. "14C109" = {{14, 1, 0}, "macOS", {"Yosemite", {10, 10, 2}}},
  225. "14C1510" = {{14, 1, 0}, "macOS", {"Yosemite", {10, 10, 2}}},
  226. "14C2043" = {{14, 1, 0}, "macOS", {"Yosemite", {10, 10, 2}}},
  227. "14C1514" = {{14, 1, 0}, "macOS", {"Yosemite", {10, 10, 2}}},
  228. "14C2513" = {{14, 1, 0}, "macOS", {"Yosemite", {10, 10, 2}}},
  229. "14D131" = {{14, 3, 0}, "macOS", {"Yosemite", {10, 10, 3}}},
  230. "14D136" = {{14, 3, 0}, "macOS", {"Yosemite", {10, 10, 3}}},
  231. "14E46" = {{14, 4, 0}, "macOS", {"Yosemite", {10, 10, 4}}},
  232. "14F27" = {{14, 5, 0}, "macOS", {"Yosemite", {10, 10, 5}}},
  233. "14F1021" = {{14, 5, 0}, "macOS", {"Yosemite", {10, 10, 5}}},
  234. "14F1505" = {{14, 5, 0}, "macOS", {"Yosemite", {10, 10, 5}}},
  235. "14F1509" = {{14, 5, 0}, "macOS", {"Yosemite", {10, 10, 5}}},
  236. "14F1605" = {{14, 5, 0}, "macOS", {"Yosemite", {10, 10, 5}}},
  237. "14F1713" = {{14, 5, 0}, "macOS", {"Yosemite", {10, 10, 5}}},
  238. "14F1808" = {{14, 5, 0}, "macOS", {"Yosemite", {10, 10, 5}}},
  239. "14F1909" = {{14, 5, 0}, "macOS", {"Yosemite", {10, 10, 5}}},
  240. "14F1912" = {{14, 5, 0}, "macOS", {"Yosemite", {10, 10, 5}}},
  241. "14F2009" = {{14, 5, 0}, "macOS", {"Yosemite", {10, 10, 5}}},
  242. "14F2109" = {{14, 5, 0}, "macOS", {"Yosemite", {10, 10, 5}}},
  243. "14F2315" = {{14, 5, 0}, "macOS", {"Yosemite", {10, 10, 5}}},
  244. "14F2411" = {{14, 5, 0}, "macOS", {"Yosemite", {10, 10, 5}}},
  245. "14F2511" = {{14, 5, 0}, "macOS", {"Yosemite", {10, 10, 5}}},
  246. // MacOS El Capitan
  247. "15A284" = {{15, 0, 0}, "macOS", {"El Capitan", {10, 11, 0}}},
  248. "15B42" = {{15, 0, 0}, "macOS", {"El Capitan", {10, 11, 1}}},
  249. "15C50" = {{15, 2, 0}, "macOS", {"El Capitan", {10, 11, 2}}},
  250. "15D21" = {{15, 3, 0}, "macOS", {"El Capitan", {10, 11, 3}}},
  251. "15E65" = {{15, 4, 0}, "macOS", {"El Capitan", {10, 11, 4}}},
  252. "15F34" = {{15, 5, 0}, "macOS", {"El Capitan", {10, 11, 5}}},
  253. "15G31" = {{15, 6, 0}, "macOS", {"El Capitan", {10, 11, 6}}},
  254. "15G1004" = {{15, 6, 0}, "macOS", {"El Capitan", {10, 11, 6}}},
  255. "15G1011" = {{15, 6, 0}, "macOS", {"El Capitan", {10, 11, 6}}},
  256. "15G1108" = {{15, 6, 0}, "macOS", {"El Capitan", {10, 11, 6}}},
  257. "15G1212" = {{15, 6, 0}, "macOS", {"El Capitan", {10, 11, 6}}},
  258. "15G1217" = {{15, 6, 0}, "macOS", {"El Capitan", {10, 11, 6}}},
  259. "15G1421" = {{15, 6, 0}, "macOS", {"El Capitan", {10, 11, 6}}},
  260. "15G1510" = {{15, 6, 0}, "macOS", {"El Capitan", {10, 11, 6}}},
  261. "15G1611" = {{15, 6, 0}, "macOS", {"El Capitan", {10, 11, 6}}},
  262. "15G17023" = {{15, 6, 0}, "macOS", {"El Capitan", {10, 11, 6}}},
  263. "15G18013" = {{15, 6, 0}, "macOS", {"El Capitan", {10, 11, 6}}},
  264. "15G19009" = {{15, 6, 0}, "macOS", {"El Capitan", {10, 11, 6}}},
  265. "15G20015" = {{15, 6, 0}, "macOS", {"El Capitan", {10, 11, 6}}},
  266. "15G21013" = {{15, 6, 0}, "macOS", {"El Capitan", {10, 11, 6}}},
  267. "15G22010" = {{15, 6, 0}, "macOS", {"El Capitan", {10, 11, 6}}},
  268. // MacOS Sierra
  269. "16A323" = {{16, 0, 0}, "macOS", {"Sierra", {10, 12, 0}}},
  270. "16B2555" = {{16, 1, 0}, "macOS", {"Sierra", {10, 12, 1}}},
  271. "16B2657" = {{16, 1, 0}, "macOS", {"Sierra", {10, 12, 1}}},
  272. "16C67" = {{16, 3, 0}, "macOS", {"Sierra", {10, 12, 2}}},
  273. "16C68" = {{16, 3, 0}, "macOS", {"Sierra", {10, 12, 2}}},
  274. "16D32" = {{16, 4, 0}, "macOS", {"Sierra", {10, 12, 3}}},
  275. "16E195" = {{16, 5, 0}, "macOS", {"Sierra", {10, 12, 4}}},
  276. "16F73" = {{16, 6, 0}, "macOS", {"Sierra", {10, 12, 5}}},
  277. "16F2073" = {{16, 6, 0}, "macOS", {"Sierra", {10, 12, 5}}},
  278. "16G29" = {{16, 7, 0}, "macOS", {"Sierra", {10, 12, 6}}},
  279. "16G1036" = {{16, 7, 0}, "macOS", {"Sierra", {10, 12, 6}}},
  280. "16G1114" = {{16, 7, 0}, "macOS", {"Sierra", {10, 12, 6}}},
  281. "16G1212" = {{16, 7, 0}, "macOS", {"Sierra", {10, 12, 6}}},
  282. "16G1314" = {{16, 7, 0}, "macOS", {"Sierra", {10, 12, 6}}},
  283. "16G1408" = {{16, 7, 0}, "macOS", {"Sierra", {10, 12, 6}}},
  284. "16G1510" = {{16, 7, 0}, "macOS", {"Sierra", {10, 12, 6}}},
  285. "16G1618" = {{16, 7, 0}, "macOS", {"Sierra", {10, 12, 6}}},
  286. "16G1710" = {{16, 7, 0}, "macOS", {"Sierra", {10, 12, 6}}},
  287. "16G1815" = {{16, 7, 0}, "macOS", {"Sierra", {10, 12, 6}}},
  288. "16G1917" = {{16, 7, 0}, "macOS", {"Sierra", {10, 12, 6}}},
  289. "16G1918" = {{16, 7, 0}, "macOS", {"Sierra", {10, 12, 6}}},
  290. "16G2016" = {{16, 7, 0}, "macOS", {"Sierra", {10, 12, 6}}},
  291. "16G2127" = {{16, 7, 0}, "macOS", {"Sierra", {10, 12, 6}}},
  292. "16G2128" = {{16, 7, 0}, "macOS", {"Sierra", {10, 12, 6}}},
  293. "16G2136" = {{16, 7, 0}, "macOS", {"Sierra", {10, 12, 6}}},
  294. // MacOS High Sierra
  295. "17A365" = {{17, 0, 0}, "macOS", {"High Sierra", {10, 13, 0}}},
  296. "17A405" = {{17, 0, 0}, "macOS", {"High Sierra", {10, 13, 0}}},
  297. "17B48" = {{17, 2, 0}, "macOS", {"High Sierra", {10, 13, 1}}},
  298. "17B1002" = {{17, 2, 0}, "macOS", {"High Sierra", {10, 13, 1}}},
  299. "17B1003" = {{17, 2, 0}, "macOS", {"High Sierra", {10, 13, 1}}},
  300. "17C88" = {{17, 3, 0}, "macOS", {"High Sierra", {10, 13, 2}}},
  301. "17C89" = {{17, 3, 0}, "macOS", {"High Sierra", {10, 13, 2}}},
  302. "17C205" = {{17, 3, 0}, "macOS", {"High Sierra", {10, 13, 2}}},
  303. "17C2205" = {{17, 3, 0}, "macOS", {"High Sierra", {10, 13, 2}}},
  304. "17D47" = {{17, 4, 0}, "macOS", {"High Sierra", {10, 13, 3}}},
  305. "17D2047" = {{17, 4, 0}, "macOS", {"High Sierra", {10, 13, 3}}},
  306. "17D102" = {{17, 4, 0}, "macOS", {"High Sierra", {10, 13, 3}}},
  307. "17D2102" = {{17, 4, 0}, "macOS", {"High Sierra", {10, 13, 3}}},
  308. "17E199" = {{17, 5, 0}, "macOS", {"High Sierra", {10, 13, 4}}},
  309. "17E202" = {{17, 5, 0}, "macOS", {"High Sierra", {10, 13, 4}}},
  310. "17F77" = {{17, 6, 0}, "macOS", {"High Sierra", {10, 13, 5}}},
  311. "17G65" = {{17, 7, 0}, "macOS", {"High Sierra", {10, 13, 6}}},
  312. "17G2208" = {{17, 7, 0}, "macOS", {"High Sierra", {10, 13, 6}}},
  313. "17G2307" = {{17, 7, 0}, "macOS", {"High Sierra", {10, 13, 6}}},
  314. "17G3025" = {{17, 7, 0}, "macOS", {"High Sierra", {10, 13, 6}}},
  315. "17G4015" = {{17, 7, 0}, "macOS", {"High Sierra", {10, 13, 6}}},
  316. "17G5019" = {{17, 7, 0}, "macOS", {"High Sierra", {10, 13, 6}}},
  317. "17G6029" = {{17, 7, 0}, "macOS", {"High Sierra", {10, 13, 6}}},
  318. "17G6030" = {{17, 7, 0}, "macOS", {"High Sierra", {10, 13, 6}}},
  319. "17G7024" = {{17, 7, 0}, "macOS", {"High Sierra", {10, 13, 6}}},
  320. "17G8029" = {{17, 7, 0}, "macOS", {"High Sierra", {10, 13, 6}}},
  321. "17G8030" = {{17, 7, 0}, "macOS", {"High Sierra", {10, 13, 6}}},
  322. "17G8037" = {{17, 7, 0}, "macOS", {"High Sierra", {10, 13, 6}}},
  323. "17G9016" = {{17, 7, 0}, "macOS", {"High Sierra", {10, 13, 6}}},
  324. "17G10021" = {{17, 7, 0}, "macOS", {"High Sierra", {10, 13, 6}}},
  325. "17G11023" = {{17, 7, 0}, "macOS", {"High Sierra", {10, 13, 6}}},
  326. "17G12034" = {{17, 7, 0}, "macOS", {"High Sierra", {10, 13, 6}}},
  327. "17G13033" = {{17, 7, 0}, "macOS", {"High Sierra", {10, 13, 6}}},
  328. "17G13035" = {{17, 7, 0}, "macOS", {"High Sierra", {10, 13, 6}}},
  329. "17G14019" = {{17, 7, 0}, "macOS", {"High Sierra", {10, 13, 6}}},
  330. "17G14033" = {{17, 7, 0}, "macOS", {"High Sierra", {10, 13, 6}}},
  331. "17G14042" = {{17, 7, 0}, "macOS", {"High Sierra", {10, 13, 6}}},
  332. // MacOS Mojave
  333. "18A391" = {{18, 0, 0}, "macOS", {"Mojave", {10, 14, 0}}},
  334. "18B75" = {{18, 2, 0}, "macOS", {"Mojave", {10, 14, 1}}},
  335. "18B2107" = {{18, 2, 0}, "macOS", {"Mojave", {10, 14, 1}}},
  336. "18B3094" = {{18, 2, 0}, "macOS", {"Mojave", {10, 14, 1}}},
  337. "18C54" = {{18, 2, 0}, "macOS", {"Mojave", {10, 14, 2}}},
  338. "18D42" = {{18, 2, 0}, "macOS", {"Mojave", {10, 14, 3}}},
  339. "18D43" = {{18, 2, 0}, "macOS", {"Mojave", {10, 14, 3}}},
  340. "18D109" = {{18, 2, 0}, "macOS", {"Mojave", {10, 14, 3}}},
  341. "18E226" = {{18, 5, 0}, "macOS", {"Mojave", {10, 14, 4}}},
  342. "18E227" = {{18, 5, 0}, "macOS", {"Mojave", {10, 14, 4}}},
  343. "18F132" = {{18, 6, 0}, "macOS", {"Mojave", {10, 14, 5}}},
  344. "18G84" = {{18, 7, 0}, "macOS", {"Mojave", {10, 14, 6}}},
  345. "18G87" = {{18, 7, 0}, "macOS", {"Mojave", {10, 14, 6}}},
  346. "18G95" = {{18, 7, 0}, "macOS", {"Mojave", {10, 14, 6}}},
  347. "18G103" = {{18, 7, 0}, "macOS", {"Mojave", {10, 14, 6}}},
  348. "18G1012" = {{18, 7, 0}, "macOS", {"Mojave", {10, 14, 6}}},
  349. "18G2022" = {{18, 7, 0}, "macOS", {"Mojave", {10, 14, 6}}},
  350. "18G3020" = {{18, 7, 0}, "macOS", {"Mojave", {10, 14, 6}}},
  351. "18G4032" = {{18, 7, 0}, "macOS", {"Mojave", {10, 14, 6}}},
  352. "18G5033" = {{18, 7, 0}, "macOS", {"Mojave", {10, 14, 6}}},
  353. "18G6020" = {{18, 7, 0}, "macOS", {"Mojave", {10, 14, 6}}},
  354. "18G6032" = {{18, 7, 0}, "macOS", {"Mojave", {10, 14, 6}}},
  355. "18G6042" = {{18, 7, 0}, "macOS", {"Mojave", {10, 14, 6}}},
  356. "18G7016" = {{18, 7, 0}, "macOS", {"Mojave", {10, 14, 6}}},
  357. "18G8012" = {{18, 7, 0}, "macOS", {"Mojave", {10, 14, 6}}},
  358. "18G8022" = {{18, 7, 0}, "macOS", {"Mojave", {10, 14, 6}}},
  359. "18G9028" = {{18, 7, 0}, "macOS", {"Mojave", {10, 14, 6}}},
  360. "18G9216" = {{18, 7, 0}, "macOS", {"Mojave", {10, 14, 6}}},
  361. "18G9323" = {{18, 7, 0}, "macOS", {"Mojave", {10, 14, 6}}},
  362. // MacOS Catalina
  363. "19A583" = {{19, 0, 0}, "macOS", {"Catalina", {10, 15, 0}}},
  364. "19A602" = {{19, 0, 0}, "macOS", {"Catalina", {10, 15, 0}}},
  365. "19A603" = {{19, 0, 0}, "macOS", {"Catalina", {10, 15, 0}}},
  366. "19B88" = {{19, 0, 0}, "macOS", {"Catalina", {10, 15, 1}}},
  367. "19C57" = {{19, 2, 0}, "macOS", {"Catalina", {10, 15, 2}}},
  368. "19C58" = {{19, 2, 0}, "macOS", {"Catalina", {10, 15, 2}}},
  369. "19D76" = {{19, 3, 0}, "macOS", {"Catalina", {10, 15, 3}}},
  370. "19E266" = {{19, 4, 0}, "macOS", {"Catalina", {10, 15, 4}}},
  371. "19E287" = {{19, 4, 0}, "macOS", {"Catalina", {10, 15, 4}}},
  372. "19F96" = {{19, 5, 0}, "macOS", {"Catalina", {10, 15, 5}}},
  373. "19F101" = {{19, 5, 0}, "macOS", {"Catalina", {10, 15, 5}}},
  374. "19G73" = {{19, 6, 0}, "macOS", {"Catalina", {10, 15, 6}}},
  375. "19G2021" = {{19, 6, 0}, "macOS", {"Catalina", {10, 15, 6}}},
  376. "19H2" = {{19, 6, 0}, "macOS", {"Catalina", {10, 15, 7}}},
  377. "19H4" = {{19, 6, 0}, "macOS", {"Catalina", {10, 15, 7}}},
  378. "19H15" = {{19, 6, 0}, "macOS", {"Catalina", {10, 15, 7}}},
  379. "19H114" = {{19, 6, 0}, "macOS", {"Catalina", {10, 15, 7}}},
  380. "19H512" = {{19, 6, 0}, "macOS", {"Catalina", {10, 15, 7}}},
  381. "19H524" = {{19, 6, 0}, "macOS", {"Catalina", {10, 15, 7}}},
  382. "19H1030" = {{19, 6, 0}, "macOS", {"Catalina", {10, 15, 7}}},
  383. "19H1217" = {{19, 6, 0}, "macOS", {"Catalina", {10, 15, 7}}},
  384. "19H1323" = {{19, 6, 0}, "macOS", {"Catalina", {10, 15, 7}}},
  385. "19H1417" = {{19, 6, 0}, "macOS", {"Catalina", {10, 15, 7}}},
  386. "19H1419" = {{19, 6, 0}, "macOS", {"Catalina", {10, 15, 7}}},
  387. "19H1519" = {{19, 6, 0}, "macOS", {"Catalina", {10, 15, 7}}},
  388. "19H1615" = {{19, 6, 0}, "macOS", {"Catalina", {10, 15, 7}}},
  389. "19H1713" = {{19, 6, 0}, "macOS", {"Catalina", {10, 15, 7}}},
  390. "19H1715" = {{19, 6, 0}, "macOS", {"Catalina", {10, 15, 7}}},
  391. "19H1824" = {{19, 6, 0}, "macOS", {"Catalina", {10, 15, 7}}},
  392. "19H1922" = {{19, 6, 0}, "macOS", {"Catalina", {10, 15, 7}}},
  393. "19H2026" = {{19, 6, 0}, "macOS", {"Catalina", {10, 15, 7}}},
  394. // MacOS Big Sur
  395. "20A2411" = {{20, 1, 0}, "macOS", {"Big Sur", {11, 0, 0}}},
  396. "20B29" = {{20, 1, 0}, "macOS", {"Big Sur", {11, 0, 1}}},
  397. "20B50" = {{20, 1, 0}, "macOS", {"Big Sur", {11, 0, 1}}},
  398. "20C69" = {{20, 2, 0}, "macOS", {"Big Sur", {11, 1, 0}}},
  399. "20D64" = {{20, 3, 0}, "macOS", {"Big Sur", {11, 2, 0}}},
  400. "20D74" = {{20, 3, 0}, "macOS", {"Big Sur", {11, 2, 1}}},
  401. "20D75" = {{20, 3, 0}, "macOS", {"Big Sur", {11, 2, 1}}},
  402. "20D80" = {{20, 3, 0}, "macOS", {"Big Sur", {11, 2, 2}}},
  403. "20D91" = {{20, 3, 0}, "macOS", {"Big Sur", {11, 2, 3}}},
  404. "20E232" = {{20, 4, 0}, "macOS", {"Big Sur", {11, 3, 0}}},
  405. "20E241" = {{20, 4, 0}, "macOS", {"Big Sur", {11, 3, 1}}},
  406. "20F71" = {{20, 5, 0}, "macOS", {"Big Sur", {11, 4, 0}}},
  407. "20G71" = {{20, 6, 0}, "macOS", {"Big Sur", {11, 5, 0}}},
  408. "20G80" = {{20, 6, 0}, "macOS", {"Big Sur", {11, 5, 1}}},
  409. "20G95" = {{20, 6, 0}, "macOS", {"Big Sur", {11, 5, 2}}},
  410. "20G165" = {{20, 6, 0}, "macOS", {"Big Sur", {11, 6, 0}}},
  411. "20G224" = {{20, 6, 0}, "macOS", {"Big Sur", {11, 6, 1}}},
  412. "20G314" = {{20, 6, 0}, "macOS", {"Big Sur", {11, 6, 2}}},
  413. "20G415" = {{20, 6, 0}, "macOS", {"Big Sur", {11, 6, 3}}},
  414. "20G417" = {{20, 6, 0}, "macOS", {"Big Sur", {11, 6, 4}}},
  415. "20G527" = {{20, 6, 0}, "macOS", {"Big Sur", {11, 6, 5}}},
  416. "20G624" = {{20, 6, 0}, "macOS", {"Big Sur", {11, 6, 6}}},
  417. "20G630" = {{20, 6, 0}, "macOS", {"Big Sur", {11, 6, 7}}},
  418. "20G730" = {{20, 6, 0}, "macOS", {"Big Sur", {11, 6, 8}}},
  419. // MacOS Monterey
  420. "21A344" = {{21, 0, 1}, "macOS", {"Monterey", {12, 0, 0}}},
  421. "21A559" = {{21, 1, 0}, "macOS", {"Monterey", {12, 0, 1}}},
  422. "21C52" = {{21, 2, 0}, "macOS", {"Monterey", {12, 1, 0}}},
  423. "21D49" = {{21, 3, 0}, "macOS", {"Monterey", {12, 2, 0}}},
  424. "21D62" = {{21, 3, 0}, "macOS", {"Monterey", {12, 2, 1}}},
  425. "21E230" = {{21, 4, 0}, "macOS", {"Monterey", {12, 3, 0}}},
  426. "21E258" = {{21, 4, 0}, "macOS", {"Monterey", {12, 3, 1}}},
  427. "21F79" = {{21, 5, 0}, "macOS", {"Monterey", {12, 4, 0}}},
  428. "21F2081" = {{21, 5, 0}, "macOS", {"Monterey", {12, 4, 0}}},
  429. "21F2092" = {{21, 5, 0}, "macOS", {"Monterey", {12, 4, 0}}},
  430. "21G72" = {{21, 6, 0}, "macOS", {"Monterey", {12, 5, 0}}},
  431. "21G83" = {{21, 6, 0}, "macOS", {"Monterey", {12, 5, 1}}},
  432. "21G115" = {{21, 6, 0}, "macOS", {"Monterey", {12, 6, 0}}},
  433. }
  434. @(private)
  435. Darwin_Match :: enum {
  436. Unknown,
  437. Exact,
  438. Nearest,
  439. }
  440. @(private)
  441. map_darwin_kernel_version_to_macos_release :: proc(build: string, darwin: [3]int) -> (res: Darwin_To_Release, match: Darwin_Match) {
  442. // Find exact release match if possible.
  443. if v, v_ok := macos_release_map[build]; v_ok {
  444. return v, .Exact
  445. }
  446. nearest: Darwin_To_Release
  447. for _, v in macos_release_map {
  448. // Try an exact match on XNU version first.
  449. if darwin == v.darwin {
  450. return v, .Exact
  451. }
  452. // Major kernel version needs to match exactly,
  453. // otherwise the release is considered .Unknown
  454. if darwin.x == v.darwin.x {
  455. if nearest == {} {
  456. nearest = v
  457. }
  458. if darwin.y >= v.darwin.y && v.darwin != nearest.darwin {
  459. nearest = v
  460. if darwin.z >= v.darwin.z && v.darwin != nearest.darwin {
  461. nearest = v
  462. }
  463. }
  464. }
  465. }
  466. if nearest == {} {
  467. return {darwin, "macOS", {"Unknown", {}}}, .Unknown
  468. } else {
  469. return nearest, .Nearest
  470. }
  471. }