platform_darwin.odin 2.5 KB

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