nixpkgs/pkgs/development/tools/misc/linuxkit/darwin-os-version.patch
Boey Maun Suang 64faf2372d linuxkit: Fix Darwin runtime OS detection
The wrapper that linuxkit uses around the macOS Virtualization framework
tries to detect which OS it is running on, and aborts if it thinks that
the macOS version is not new enough to have the required framework
features.  This commit (mostly) fixes that macOS version detection when
the code is linked as if it is linked against the 10.12 SDK (as the
current Darwin ld wrapper does via the -platform_version switch), but is
then run on macOS 11 or later.
2023-02-15 20:24:20 +11:00

54 lines
2.2 KiB
Diff

diff --git a/src/cmd/linuxkit/vendor/github.com/Code-Hex/vz/v3/osversion.go b/src/cmd/linuxkit/vendor/github.com/Code-Hex/vz/v3/osversion.go
index d72a7856d..b186d3aff 100644
--- a/src/cmd/linuxkit/vendor/github.com/Code-Hex/vz/v3/osversion.go
+++ b/src/cmd/linuxkit/vendor/github.com/Code-Hex/vz/v3/osversion.go
@@ -9,6 +9,7 @@ import "C"
import (
"errors"
"fmt"
+ "os/exec"
"strconv"
"strings"
"sync"
@@ -48,6 +49,40 @@ func fetchMajorMinorVersion() (float64, error) {
if err != nil {
return 0, err
}
+
+ // For backward compatibility reasons, if code compiled against an SDK
+ // earlier than macOS 11 is run on macOS 11 or later, and then tries to read
+ // value of kern.osproductversion, the OS will return the value "10.16"
+ // instead of the real OS version string. By contrast, the command `sw_vers
+ // -productVersion` will return the real OS version string unless the
+ // environment variable SYSTEM_VERSION_COMPAT is set to 1 or 2, in which
+ // case it will respectively return "10.16" and "15.7" (the latter is for
+ // some iOS compatibility reason).
+ //
+ // The only (currently) sure way to get the real OS version string
+ // regardless of SYSTEM_VERSION_COMPAT or the SDK compiled against is
+ // apparently to parse
+ // /System/Library/CoreServices/.SystemVersionPlatform.plist if it exists,
+ // and /System/Library/CoreServices/SystemVersion.plist otherwise. Doing
+ // so, however, requires parsing XML plist files.
+ //
+ // Given what this library does, it doesn't seem likely that there would be
+ // a good reason to run its code with SYSTEM_VERSION_COMPAT set, so using
+ // `sw_vers` should be adequate until a proper parsing of plist files is
+ // added.
+ //
+ // See https://github.com/ziglang/zig/issues/7569,
+ // https://github.com/ziglang/zig/pull/7714 and
+ // https://eclecticlight.co/2020/08/13/macos-version-numbering-isnt-so-simple/
+ // for more information.
+ if osver == "10.16" {
+ out, err := exec.Command("sw_vers", "-productVersion").Output()
+ if err != nil {
+ return 0, err
+ }
+ osver = strings.TrimRight(string(out), "\r\n")
+ }
+
prefix := "v"
majorMinor := strings.TrimPrefix(semver.MajorMinor(prefix+osver), prefix)
version, err := strconv.ParseFloat(majorMinor, 64)