platform_darwin.odin 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. package sysinfo
  2. import "base:runtime"
  3. import "core:strconv"
  4. import "core:strings"
  5. import "core:sys/unix"
  6. import NS "core:sys/darwin/Foundation"
  7. @(private)
  8. version_string_buf: [1024]u8
  9. @(init, private)
  10. init_platform :: proc "contextless" () {
  11. context = runtime.default_context()
  12. ws :: strings.write_string
  13. wi :: strings.write_int
  14. b := strings.builder_from_bytes(version_string_buf[:])
  15. version: NS.OperatingSystemVersion
  16. {
  17. NS.scoped_autoreleasepool()
  18. info := NS.ProcessInfo.processInfo()
  19. version = info->operatingSystemVersion()
  20. mem := info->physicalMemory()
  21. ram.total_ram = int(mem)
  22. }
  23. macos_version = {int(version.majorVersion), int(version.minorVersion), int(version.patchVersion)}
  24. when ODIN_PLATFORM_SUBTARGET_IOS {
  25. os_version.platform = .iOS
  26. ws(&b, "iOS")
  27. } else {
  28. os_version.platform = .MacOS
  29. switch version.majorVersion {
  30. case 26: ws(&b, "macOS Tahoe")
  31. case 15: ws(&b, "macOS Sequoia")
  32. case 14: ws(&b, "macOS Sonoma")
  33. case 13: ws(&b, "macOS Ventura")
  34. case 12: ws(&b, "macOS Monterey")
  35. case 11: ws(&b, "macOS Big Sur")
  36. case 10:
  37. switch version.minorVersion {
  38. case 15: ws(&b, "macOS Catalina")
  39. case 14: ws(&b, "macOS Mojave")
  40. case 13: ws(&b, "macOS High Sierra")
  41. case 12: ws(&b, "macOS Sierra")
  42. case 11: ws(&b, "OS X El Capitan")
  43. case 10: ws(&b, "OS X Yosemite")
  44. case:
  45. // `ProcessInfo.operatingSystemVersion` is 10.10 and up.
  46. unreachable()
  47. }
  48. case:
  49. // New version not yet added here.
  50. assert(version.majorVersion > 15)
  51. ws(&b, "macOS Unknown")
  52. }
  53. }
  54. ws(&b, " ")
  55. wi(&b, int(version.majorVersion))
  56. ws(&b, ".")
  57. wi(&b, int(version.minorVersion))
  58. ws(&b, ".")
  59. wi(&b, int(version.patchVersion))
  60. {
  61. build_buf: [12]u8
  62. mib := []i32{unix.CTL_KERN, unix.KERN_OSVERSION}
  63. ok := unix.sysctl(mib, &build_buf)
  64. build := string(cstring(raw_data(build_buf[:]))) if ok else "Unknown"
  65. ws(&b, " (build ")
  66. build_start := len(b.buf)
  67. ws(&b, build)
  68. os_version.version = string(b.buf[build_start:][:len(build)])
  69. }
  70. {
  71. // Match on XNU kernel version
  72. version_bits: [12]u8 // enough for 999.999.999\x00
  73. mib := []i32{unix.CTL_KERN, unix.KERN_OSRELEASE}
  74. ok := unix.sysctl(mib, &version_bits)
  75. kernel := string(cstring(raw_data(version_bits[:]))) if ok else "Unknown"
  76. major, _, tail := strings.partition(kernel, ".")
  77. minor, _, patch := strings.partition(tail, ".")
  78. os_version.major, _ = strconv.parse_int(major, 10)
  79. os_version.minor, _ = strconv.parse_int(minor, 10)
  80. os_version.patch, _ = strconv.parse_int(patch, 10)
  81. ws(&b, ", kernel ")
  82. ws(&b, kernel)
  83. ws(&b, ")")
  84. }
  85. os_version.as_string = string(b.buf[:])
  86. }