
Build, Host, Target은 주로 Cross-Compile 환경이나 툴체인 빌드에서 사용되는 용어이다.
각 의미는 다음과 같다.
Build : 현재 빌드(컴파일)가 수행되는 시스템
Host : 생성된 바이너리가 실행될 시스템
Target : 컴파일러가 생성할 코드의 아키텍처
각 요소를 어떻게 설정하냐에 따라 목적에 맞는 프로그램 혹은 컴파일러를 만들 수 있다.
일반적인 네이티브 컴파일을 의미한다.
x86 Linux에서 x86 Linux용 프로그램을 만들고 x86 Linux에서 실행
$ gcc hello.c -o hello $ ./hello
크로스 컴파일을 의미한다.
다른 플랫폼 (ex. ARM)에서 실행할 바이너리를 만든다.
x86 Linux에서 ARM Linux에서 실행될 프로그램을 만든다.
(Build):$ arm-linux-gnueabi-gcc hello.c -o hello (Host):$ ./hello
크로스 컴파일러를 생성한다.
x86 Linux에서 실행되는 RISC-V용 컴파일러를 만든다.
$ ./configure --target=riscv64-linux-gnu $ make
여기서 만들어지는 gcc는 x86에서 실행되지만, RISC-V용 바이너리를 생성할 수 있다.
3-way 크로스 컴파일러를 생성한다.
x86 Linux에서 ARM Linux에서 실행되는 컴파일러를 만들고, 이 컴파일러는 RISC-V용 바이너리를 만든다.
$ ./configure --host=arm-linux-gnueabi --target=riscv64-linux-gnu $ make
ARM에서 실행되고 RISC-V 바이너리를 생성하는 컴파일러가 만들어진다.
앞서 Build, Host, Target의 조합에 따라 크로스 컴파일을 할 수도, 크로스 컴파일러를 만들 수도 있다는 것을 확인했다.
하지만 크로스 컴파일러를 직접 만드는 일은 흔치 않고, 이미 만들어져 있는 것을 쓰는게 편할 것이다.
대표적으로 Linux 배포판에서는 다양한 아키텍처용 크로스 툴체인을 패키지 형태로 제공한다.
예를 들어 Ubuntu에서는 아래 명령으로 ARM용 크로스 툴체인을 설치할 수 있다.
$ sudo apt install gcc-arm-linux-gnueabihf
이렇게 설치된 툴체인에는 arm-linux-gnueabihf-gcc라는 크로스 컴파일러가 포함되어 있어, x86 Linux에서도 ARM Linux용 바이너리를 쉽게 만들 수 있다.
표준 GNU 툴체인은 보통 다음과 같은 구성 요소로 이루어진다.
위 도구가 하나로 묶여서 툴체인이라고 불리며,
타겟 아키텍처에 따라 적절한 툴체인을 사용하는 것이 크로스 컴파일의 핵심이다.
대부분의 임베디드 개발 환경에서는 툴체인 제공자가 이미 잘 정리된 크로스 컴파일 툴체인을 제공한다.
개발자는 설치만 해서 사용하면 된다.
특수한 상황(희귀 아키텍처 등)을 제외하면 크로스 컴파일러를 직접 빌드할 일은 없다.
끝.