운영체제 차이 다루기
운영체제 차이 다루기
어플리케이션이나 라이브러리를 여러 운영체제에서 동작하게 만들다 보면, 운영체제마다 다른 부분을 코드에서 구분해줘야 할 때가 있어요. 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)