Handling Operating System Variation

Handling Operating System Variation

When dealing with platform libraries, it is often necessary to provide special cases for various platforms. The variable Sys.KERNEL can be used to write these special cases. There are several functions in the Sys module intended to make this easier: isunix, islinux, isapple, isbsd, and iswindows. These may be used as follows:

if Sys.iswindows()
    some_complicated_thing(a)
end

Note that islinux and isapple are mutually exclusive subsets of isunix. Additionally, there is a macro @static which makes it possible to use these functions to conditionally hide invalid code, as demonstrated in the following examples.

Simple blocks:

ccall((@static Sys.iswindows() ? :_fopen : :fopen), ...)

Complex blocks:

@static if Sys.islinux()
    some_complicated_thing(a)
else
    some_different_thing(a)
end

When chaining conditionals (including if/elseif/end), the @static must be repeated for each level (parentheses optional, but recommended for readability):

@static Sys.iswindows() ? :a : (@static Sys.isapple() ? :b : :c)