概要

Juliaでは @unix_only とか @windows_only などのマクロが用意されていて、UNIX系とWindowsで手軽に処理を書き分けることができる。

今回はこの辺りの機能を確認する。

@CretedDate 2015/01/07
@Versions Julia0.3.4

UNIX系とWindowsで振る舞いを分ける

試しに下記のように書いてみる。

@unix_only println("こんにちは")
@windows_only println("ばーかばーか")

これをうちの環境で実行すると、標準出力に「こんにちは」と表示される。

複数行の処理を書きたい場合は、begin 〜 endで。

@unix_only begin
  println("こんにちは")
  println("UNIX系の人")
end

@windows_only begin
  println("こんにちは")
  println("Windows系の人")
end

unix判定しているところの処理は下記。

function is_unix(os::Symbol)
  if (os==:Windows) return false;
  elseif (os==:Linux) return true;
  elseif (os==:FreeBSD) return true;
  elseif (os==:Darwin) return true;
  else error("unknown operating system")
  end
end

Linux, FreeBSD, Darwin(OSX)がis_unixの対象になっているようだ。Solarisとかはどう判定されるんだろう。まあ、自分は使わないからいいか。

LinuxとかOSXの指定

ざっとソースを見たところ、この手のマクロには下記が用意されているようだ。

@windows_only
@unix_only
@linux_only
@osx_only
@windowsxp_only

参照したコードはosutils。

https://github.com/JuliaLang/julia/blob/master/base/osutils.jl

下記のコードを実行すれば、自分のOSでどれで判定されているかわかる。

@windows_only print("Windowsですね")
@unix_only print("UNIX系OSですね")
@linux_only print("Linuxですね")
@osx_only print("OSXですね")
@windowsxp_only print("えっ、Windows XP使ってるの?")

ちなみにWindowsXPの判定は下記になっている。

WINDOWS_XP_VER = (5,1)
macro windowsxp(qm,ex)
_os_test(qm, ex, OS_NAME===:Windows && windows_version() >= INDOWS_XP_VER)
end

この記述だとMEとか2000でもtrueになるのかな? そんな古いのはもう持ってないから実際どうなるかはわからない。