| @@ -21,6 +21,7 @@ | |||||
| #include <mach/thread_act.h> | #include <mach/thread_act.h> | ||||
| #include <mach/clock.h> | #include <mach/clock.h> | ||||
| #include <mach/mach.h> | #include <mach/mach.h> | ||||
| #include <sys/sysctl.h> | |||||
| #endif | #endif | ||||
| #if defined ARCH_WIN | #if defined ARCH_WIN | ||||
| @@ -39,12 +40,10 @@ | |||||
| /* | /* | ||||
| In C++17, this will be `std::filesystem` | In C++17, this will be `std::filesystem` | ||||
| Important: When using `fs::path`, always convert strings to UTF-8 using | |||||
| Important: When using `fs::path`, always convert strings to/from UTF-8 using | |||||
| fs::path p = fs::u8path(s); | fs::path p = fs::u8path(s); | ||||
| In fact, it's best to work only with strings to avoid forgetting to decode a string as UTF-8. | |||||
| The need to do this is a fatal flaw of `fs::path`, but at least `std::filesystem` has some helpful operations. | |||||
| std::string s = p.generic_u8string(); | |||||
| */ | */ | ||||
| namespace fs = ghc::filesystem; | namespace fs = ghc::filesystem; | ||||
| @@ -723,10 +722,31 @@ double getThreadTime() { | |||||
| std::string getOperatingSystemInfo() { | std::string getOperatingSystemInfo() { | ||||
| #if defined ARCH_LIN || defined ARCH_MAC | |||||
| #if defined ARCH_LIN | |||||
| struct utsname u; | struct utsname u; | ||||
| uname(&u); | uname(&u); | ||||
| return string::f("%s %s %s %s", u.sysname, u.release, u.version, u.machine); | return string::f("%s %s %s %s", u.sysname, u.release, u.version, u.machine); | ||||
| #elif defined ARCH_MAC | |||||
| // From https://opensource.apple.com/source/cctools/cctools-973.0.1/libstuff/macosx_deployment_target.c.auto.html | |||||
| char osversion[32]; | |||||
| int osversion_name[2] = {CTL_KERN, KERN_OSRELEASE}; | |||||
| size_t osversion_len = sizeof(osversion) - 1; | |||||
| if (sysctl(osversion_name, 2, osversion, &osversion_len, NULL, 0) != 0) return "Mac"; | |||||
| int major = 0; | |||||
| int minor = 0; | |||||
| if (sscanf(osversion, "%d.%d", &major, &minor) != 2) | |||||
| return "Mac"; | |||||
| // Try to match version numbers to retail versions | |||||
| if (major >= 20) { | |||||
| major -= 9; | |||||
| return string::f("Mac %d.%d", major, minor); | |||||
| } | |||||
| else { | |||||
| major -= 4; | |||||
| return string::f("Mac 10.%d.%d", major, minor); | |||||
| } | |||||
| #elif defined ARCH_WIN | #elif defined ARCH_WIN | ||||
| OSVERSIONINFOW info; | OSVERSIONINFOW info; | ||||
| ZeroMemory(&info, sizeof(info)); | ZeroMemory(&info, sizeof(info)); | ||||