운영체제 차이 다루기

운영체제 차이 다루기

어플리케이션이나 라이브러리를 여러 운영체제에서 동작하게 만들다 보면, 운영체제마다 다른 부분을 코드에서 구분해줘야 할 때가 있어요. Julia는 이런 상황을 위해 Sys 모듈에 운영체제를 판별하는 함수들을 준비해뒀어요. 이 글에서는 그 함수들의 쓰임과, 컴파일 시점에 조건을 확정하는 @static 매크로를 함께 살펴볼게요.

출처: Handling Operating System Variation — The Julia Language

본문

크로스플랫폼으로 쓸 어플리케이션이나 라이브러리를 작성할 때는, 운영체제 간의 차이를 고려해야 하는 경우가 많아요. 이때 Sys.KERNEL 변수를 쓸 수 있어요. Sys 모듈에는 이런 처리를 쉽게 해주는 함수들이 몇 가지 있는데, isunix, islinux, isapple, isbsd, isfreebsd, iswindows 같은 것들이 있어요. 다음과 같이 쓰면 돼요.

if Sys.iswindows()
    windows_specific_thing(a)
end

여기서 짚고 넘어갈 점이 하나 있어요. islinux, isapple, isfreebsd는 모두 isunix의 부분집합이라 서로 배타적이에요. 즉 같은 운영체제에서 두 개가 동시에 참이 되는 일은 없죠.

여기에 더해 @static 매크로가 있어요. 이 매크로를 쓰면 이러한 판별 함수들을 이용해, 컴파일 시점에 무효한 코드를 조건적으로 감추는 게 가능해져요. 예시를 볼게요.

간단한 블록:

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

복잡한 블록:

@static if Sys.islinux()
    linux_specific_thing(a)
elseif Sys.isapple()
    apple_specific_thing(a)
else
    generic_thing(a)
end

조건문을 중첩할 때는 각 단계마다 @static을 반복해줘야 해요. 괄호는 필수가 아니지만 가독성을 위해 쓰는 걸 권장해요.

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

더 알아보기