Cosmopolitan을 이용한 포터블 mruby 바이너리
Source: Dev.to
배경
mruby의 주요 매력 중 하나는 독립 실행형 실행 파일을 만들 수 있다는 점입니다. 이것은 잘 작동하지만, 고전적인 제한 사항은 대부분의 독립 실행형 바이너리가 빌드된 시스템과 동일하거나 매우 유사한 시스템에서만 실행된다는 것입니다. 예를 들어, amd64 Linux에서 빌드된 실행 파일은 Silicon Mac에서 실행되지 않습니다:
$ ./hello
exec: Failed to execute process: './hello' the file could not be run by the operating system.
exec: Maybe the interpreter directive (#! line) is broken?
mruby는 일부 교차 컴파일 기능을 제공하지만, 이는 위협적으로 느껴질 수 있고 작동시키기가 종종 어렵습니다(예: Linux → macOS). 그래서 다음과 같은 질문이 떠오릅니다: macOS Docker 이미지 없이 진정으로 포터블한 mruby 바이너리를 만들 수 있을까?
Cosmopolitan Libc
mruby 변경 로그를 살펴보던 중 눈에 띈 항목이 있습니다:
New Platform: Cosmopolitan Libc
Cosmopolitan Libc는 C를 “어디서든 빌드하고, 어디서든 실행”할 수 있는 언어로 만들고자 하며, 인터프리터나 가상 머신이 필요 없는 Java와 비슷합니다. GCC/Clang을 재구성하여 POSIX‑인증 폴리글롯 포맷을 출력하도록 하며, 이 포맷은 다음 환경에서 네이티브로 실행됩니다:
- Linux
- macOS
- Windows
- FreeBSD, OpenBSD, NetBSD
- BIOS (AMD64 & ARM64)
성능은 네이티브에 가깝습니다.
Cosmopolitan으로 mruby 빌드하기
사전 준비
-
Cosmopolitan 툴킷을 다운로드합니다:
wget https://cosmo.zip/pub/cosmocc/cosmocc.zip unzip cosmocc.zip -d ~/Downloads/cosmocc -
툴킷이
~/Downloads/cosmocc에 압축 해제되었는지 확인하거나, 경로를 적절히 조정합니다.
Step 1 – mruby 빌드
COSMO_ROOT=~/Downloads/cosmocc rake MRUBY_CONFIG=cosmopolitan
Note: 작성 시점에
mirb타깃은 Cosmopolitan과 함께 컴파일이 실패하므로 설정에서 제거해야 했습니다.
Step 2 – 바이트코드 생성
Cosmopolitan 전용 mrbc 바이너리를 사용합니다:
./mruby/bin/mrbc.com -Bhello_world hello.rb
이 명령은 컴파일된 Ruby 바이트코드를 담은 hello_world라는 C 배열을 생성합니다.
Step 3 – 최종 실행 파일 컴파일
~/Downloads/cosmocc/bin/cosmocc -std=c99 -Imruby/include main.c \
-o hello mruby/build/host/lib/libmruby.a -lm
main.c는 생성된 바이트코드를 로드하는 작은 C 엔트리 파일입니다.- 결과물인
hello바이너리는 Cosmopolitan 실행 파일입니다.
결과
생성된 hello 바이너리는 Linux와 macOS(Apple Silicon 포함) 모두에서 수정 없이 실행됩니다. 포터블성을 위해 전통적인 mruby 실행 파일보다 크기가 큰 것이 단점이지만, 여러 플랫폼을 대상으로 배포할 때는 간편해집니다.