교차 컴파일
교차 컴파일 (Cross-compilation)
Crystal은 기본적인 형태의 교차 컴파일을 지원해요.
이를 위해 컴파일러 실행 파일은 두 가지 플래그를 제공해요.
--cross-compile: 주어지면 교차 컴파일 모드를 켜요--target: 사용할 LLVM Target Triple과, 여기서 기본 컴파일 타임 플래그를 결정해요
--target 플래그 값을 얻으려면 대상 시스템에 설치된 LLVM으로 llvm-config --host-target을 실행하면 돼요. 예를 들어 Linux에서는 "x86_64-unknown-linux-gnu" 같은 값이 나올 수 있어요.
--target을 통해 암묵적으로 설정되지 않는 컴파일 타임 플래그를 추가로 설정해야 한다면 -D 커맨드 라인 플래그를 사용하면 돼요.
출처: Crystal 공식 문서
본문
이 두 가지를 사용하면, Mac에서 컴파일한 프로그램을 Linux에서 실행되도록 만들 수 있어요.
crystal build your_program.cr --cross-compile --target "x86_64-unknown-linux-gnu"
그러면 .o(오브젝트 파일)이 생성되고, 교차 컴파일하려는 시스템에서 실행할 명령 한 줄이 출력돼요.
cc your_program.o -o your_program -lpcre -lrt -lm -lgc -lunwind
이 .o 파일을 그 시스템으로 복사해서 그 명령을 실행하면 돼요. 그렇게 하면 대상 시스템에서 실행 파일을 사용할 수 있어요.
이 절차는 보통 컴파일러 자체를 아직 컴파일러가 없는 새 플랫폼으로 포팅할 때 사용해요. Crystal 컴파일러를 컴파일하려면 더 오래된 Crystal 컴파일러가 필요한데, 아직 컴파일러가 없는 시스템용 컴파일러를 만드는 방법은 두 가지뿐이에요.
- Ruby로 작성된 컴파일러의 최신 버전을 체크아웃해서, 그 컴파일러로 다음 버전들을 컴파일해 현재 버전까지 이어가는 방법
- 대상 시스템에서
.o파일을 만들고, 그 파일에서 컴파일러를 만드는 방법
첫 번째 방법은 길고 번거로운 반면, 두 번째 방법은 훨씬 쉬워요.
교차 컴파일은 다른 실행 파일에도 가능하지만, 주된 대상은 컴파일러 자체예요. 어떤 시스템에 Crystal이 없다면 거기에 교차 컴파일을 시도해 볼 수 있어요.
더 알아보기
- compile time flags:
--target으로 설정되는 기본 플래그 - LLVM Target Triple: 대상 플랫폼을 지정하는 형식