# 툴체인 설정

툴체인(toolchain)은 특정 아키텍처에서 소프트웨어를 개발하고 빌드하기 위한 도구들의 집합을 말한다. Yocto 프로젝트에서는 호스트 시스템에서 타겟 시스템의 바이너리를 생성하기 위해 교차 컴파일(cross-compilation) 도구를 사용한다. 이 장에서는 Yocto 프로젝트의 개발 환경을 설정하고, 적절한 툴체인을 구성하는 방법에 대해 설명한다.

#### 툴체인 다운로드 및 설치

Yocto 프로젝트는 `meta-toolchain` 클래스를 사용해 툴체인을 생성할 수 있다. `meta-toolchain` 클래스를 이용하면 SDK(Software Development Kit)를 생성할 수 있으며, 이를 통해 호스트 시스템에서 타겟 바이너리를 컴파일할 수 있다.

1. **빌드 설정**

   빌드 디렉토리로 이동하여, 설정을 위해 `oe-init-build-env` 스크립트를 실행한다.

   ```sh
   cd /path/to/yocto/project
   source oe-init-build-env
   ```
2. **local.conf 설정**

   `conf/local.conf` 파일을 열어 SDK 설정을 추가한다. 다소 기본적인 예를 들어보겠다.

   ```sh
   # 추가 또는 다음과 같이 수정
   MACHINE ??= "qemux86"
   ```
3. **툴체인 생성**

   `bitbake` 명령어를 사용하여 SDK 및 툴체인을 빌드한다.

   ```sh
   bitbake core-image-sato -c populate_sdk
   ```

   이는 `core-image-sato` 이미지를 생성하고 그에 맞는 SDK를 생성한다. 다른 이미지 타입도 사용할 수 있다.
4. **툴체인 설치**

   생성된 SDK가 호스트에 설치된다. 일반적으로 아래와 같은 위치에 설치 파일이 생성된다.

   ```sh
   tmp/deploy/sdk/poky-glibc-x86_64-core-image-sato-i586-toolchain-2.4.sh
   ```

   설치 파일을 실행하여 툴체인을 설치한다.

   ```sh
   ./tmp/deploy/sdk/poky-glibc-x86_64-core-image-sato-i586-toolchain-2.4.sh
   ```

   스크립트를 실행하면 설치 디렉토리를 묻는 메시지가 표시된다. 디렉토리를 입력하여 설치를 완료한다.

#### 환경 변수 설정

툴체인이 설치된 후에는 해당 툴체인을 사용하기 위해 몇 가지 환경 변수를 설정해야 한다.

1. **환경 설정 스크립트 실행**

   설치 후에는 `$INSTALL_DIR/environment-setup-*` 스크립트를 실행하여 환경을 설정한다.

   ```sh
   source /opt/poky/2.4/environment-setup-i586-poky-linux
   ```

   이 스크립트는 컴파일러, 라이브러리 경로 및 기타 필수 변수를 설정한다.
2. **환경 변수 확인**

   환경 변수가 제대로 설정되었는지 확인한다.

   ```sh
   echo $CC
   ```

   출력은 `/opt/poky/2.4/sysroots/x86_64-pokysdk-linux/usr/bin/i586-poky-linux/i586-poky-linux-gcc`와 같은 경로를 가리켜야 한다.

#### 크로스 컴파일

설치된 툴체인을 사용하여 타겟 애플리케이션을 크로스 컴파일할 수 있다. 여기서는 간단한 "Hello World" 프로그램을 예로 들어 보겠다.

1. **소스 파일 작성**

   `hello.c` 파일을 작성한다.

   ```c
   #include <stdio.h>

   int main() {
       printf("Hello, World!\n");
       return 0;
   }
   ```
2. **크로스 컴파일**

   환경 설정 스크립트를 실행한 터미널에서 크로스 컴파일한다.

   ```sh
   $CC hello.c -o hello
   ```
3. **타겟에서 실행**

   타겟 시스템으로 컴파일된 바이너리를 전송하고 실행한다.

   ```sh
   scp hello user@target:/path/to/executable
   ssh user@target /path/to/executable/hello
   ```

   실행 결과로 "Hello, World!" 메시지가 출력될 것이다.

#### 빌드 스크립트 및 설정

프로젝트 빌드 과정을 자동화하기 위해 Makefile이나 CMake를 사용할 수 있다. 이는 크게 차이는 없지만 설정 과정이 약간 다르다.

3. **Makefile 예제**

   간단한 Makefile 예제를 보겠다. `Makefile`을 작성한다.

   ```makefile
   CC = $(CROSS_COMPILE)gcc
   CFLAGS = -O2

   hello: hello.c
       $(CC)$(CFLAGS) -o hello hello.c
   ```
4. **CMake 예제**

   CMake를 사용하는 경우, `CMakeLists.txt` 파일을 작성한다.

   ```cmake
   cmake_minimum_required(VERSION 3.10)
   project(hello)

   set(CMAKE_SYSTEM_NAME Linux)
   set(CMAKE_SYSTEM_PROCESSOR i586)

   set(CMAKE_C_COMPILER /opt/poky/2.4/sysroots/x86_64-pokysdk-linux/usr/bin/i586-poky-linux/i586-poky-linux-gcc)

   add_executable(hello hello.c)
   ```

   CMake 빌드 디렉토리를 만들고, 빌드 과정을 진행한다.

   ```sh
   mkdir build
   cd build
   cmake ..
   make
   ```
