교차 컴파일

교차 컴파일 (Cross-compilation)

Crystal은 기본적인 형태의 교차 컴파일을 지원해요.

이를 위해 컴파일러 실행 파일은 두 가지 플래그를 제공해요.

--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: 대상 플랫폼을 지정하는 형식