Skip to content

Commit

Permalink
Non-breaking move of macOS and Darwin checks to Objective-C.jl
Browse files Browse the repository at this point in the history
  • Loading branch information
christiangnrd committed Jan 28, 2025
1 parent 4293d1a commit 3de4ea0
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 75 deletions.
1 change: 1 addition & 0 deletions src/Metal.jl
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import LLVMDowngrader_jll
using Preferences: @load_preference, load_preference
using ExprTools: splitdef, combinedef
using ObjectiveC, .CoreFoundation, .Foundation, .Dispatch, .OS
import ObjectiveC: is_macos, darwin_version, macos_version
import KernelAbstractions

include("version.jl")
Expand Down
75 changes: 0 additions & 75 deletions src/version.jl
Original file line number Diff line number Diff line change
@@ -1,78 +1,3 @@
# version and support queries

@noinline function _syscall_version(name)
size = Ref{Csize_t}()
err = @ccall sysctlbyname(name::Cstring, C_NULL::Ptr{Cvoid}, size::Ptr{Csize_t},
C_NULL::Ptr{Cvoid}, 0::Csize_t)::Cint
Base.systemerror("sysctlbyname", err != 0)

osrelease = Vector{UInt8}(undef, size[])
err = @ccall sysctlbyname(name::Cstring, osrelease::Ptr{Cvoid}, size::Ptr{Csize_t},
C_NULL::Ptr{Cvoid}, 0::Csize_t)::Cint
Base.systemerror("sysctlbyname", err != 0)

verstr = view(String(osrelease), 1:size[]-1)
parse(VersionNumber, verstr)
end

@static if isdefined(Base, :OncePerProcess) # VERSION >= v"1.12.0-DEV.1421"
const darwin_version = OncePerProcess{VersionNumber}() do
_syscall_version("kern.osrelease")
end
const macos_version = OncePerProcess{VersionNumber}() do
_syscall_version("kern.osproductversion")
end
else
const _darwin_version = Ref{VersionNumber}()
function darwin_version()
if !isassigned(_darwin_version)
_darwin_version[] = _syscall_version("kern.osrelease")
end
_darwin_version[]
end

const _macos_version = Ref{VersionNumber}()
function macos_version()
if !isassigned(_macos_version)
_macos_version[] = _syscall_version("kern.osproductversion")
end
_macos_version[]
end
end

@doc """
Metal.darwin_version() -> VersionNumber
Returns the host Darwin kernel version.
See also [`Metal.macos_version`](@ref).
""" darwin_version

@doc """
Metal.macos_version() -> VersionNumber
Returns the host macOS version.
See also [`Metal.darwin_version`](@ref).
""" macos_version

"""
Metal.is_macos([ver::VersionNumber]) -> Bool
Returns whether the OS is macOS with version `ver` or newer.
See also [`Metal.macos_version`](@ref).
"""
function is_macos(ver=nothing)
if !Sys.isapple()
false
elseif ver === nothing
true
else
macos_version() >= ver
end
end


## support queries

Expand Down
11 changes: 11 additions & 0 deletions test/version.jl
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
@testset "Version" begin

@test Metal.darwin_version() isa VersionNumber
@test Metal.macos_version() isa VersionNumber
@test Metal.is_macos(Metal.macos_version())

@test Metal.metallib_support() isa VersionNumber
@test Metal.air_support() isa VersionNumber
@test Metal.metal_support() isa VersionNumber

end # testset "Version"

0 comments on commit 3de4ea0

Please sign in to comment.