# CMake를 이용한 다양한 플랫폼 및 환경에서의 빌드 예제

CMake는 다양한 플랫폼에서 일관된 빌드 환경을 제공하는 도구로, 여러 운영 체제와 컴파일러를 지원한다. 아래는 CMake를 사용하여 대표적인 플랫폼과 환경에서 프로젝트를 빌드하는 예제를 제시한다.

#### 리눅스 환경에서의 빌드 예제

리눅스 환경에서는 주로 GCC 컴파일러와 Make 빌드 시스템을 사용한다. 아래는 간단한 C++ 프로젝트를 CMake로 빌드하는 예제이다.

**1. CMakeLists.txt 파일 작성**

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

set(CMAKE_CXX_STANDARD 11)

add_executable(hello main.cpp)
```

**2. `main.cpp` 소스 파일 작성**

```cpp
#include <iostream>

int main() {
    std::cout << "Hello, World!" << std::endl;
    return 0;
}
```

**3. 빌드 과정**

터미널에서 다음 명령을 실행하여 빌드한다:

```bash
mkdir build
cd build
cmake ..
make
```

이 과정에서 `cmake ..` 명령은 프로젝트의 Makefile을 생성하고, `make` 명령은 실제로 프로그램을 컴파일하고 링크하여 실행 파일을 생성한다.

#### 윈도우 환경에서의 빌드 예제

윈도우 환경에서는 Visual Studio를 많이 사용한다. CMake는 Visual Studio 솔루션 파일을 자동으로 생성할 수 있다.

**1. CMakeLists.txt 파일 작성**

리눅스에서 사용한 CMakeLists.txt 파일과 동일한다.

**2. `main.cpp` 소스 파일 작성**

마찬가지로 리눅스에서 사용한 소스 파일과 동일한다.

**3. 빌드 과정**

Visual Studio용 빌드 파일을 생성하려면 다음 명령을 사용한다:

```cmd
mkdir build
cd build
cmake .. -G "Visual Studio 16 2019"
```

이 명령은 Visual Studio 2019에 맞는 솔루션 파일(`.sln`)을 생성한다. 생성된 솔루션 파일을 Visual Studio에서 열어 빌드할 수 있다.

#### macOS 환경에서의 빌드 예제

macOS에서는 기본적으로 Clang 컴파일러를 사용하며, Xcode 프로젝트를 생성할 수 있다.

**1. CMakeLists.txt 파일 작성**

리눅스와 동일한 CMakeLists.txt 파일을 사용한다.

**2. `main.cpp` 소스 파일 작성**

역시 동일한 소스 파일을 사용한다.

**3. 빌드 과정**

Xcode 프로젝트를 생성하려면 다음 명령을 사용한다:

```bash
mkdir build
cd build
cmake .. -G "Xcode"
```

이 명령은 Xcode 프로젝트 파일(`.xcodeproj`)을 생성한다. Xcode에서 이 프로젝트 파일을 열어 빌드할 수 있다.

#### 크로스 컴파일 예제

임베디드 시스템이나 다른 플랫폼에서 실행될 바이너리를 빌드해야 할 때 크로스 컴파일이 필요하다. CMake는 이를 지원하며, 예를 들어 ARM 프로세서를 위한 크로스 컴파일 설정은 다음과 같다.

**1. 크로스 컴파일 도구체인 파일 작성**

`arm-gcc-toolchain.cmake`라는 이름의 도구체인 파일을 작성한다.

```cmake
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)

set(CMAKE_C_COMPILER arm-linux-gnueabihf-gcc)
set(CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++)
set(CMAKE_FIND_ROOT_PATH /path/to/arm/sysroot)
```

**2. CMakeLists.txt 파일 작성**

역시 리눅스에서 사용한 것과 동일하게 작성한다.

**3. 빌드 과정**

터미널에서 다음 명령을 사용해 크로스 컴파일을 수행한다:

```bash
mkdir build
cd build
cmake .. -DCMAKE_TOOLCHAIN_FILE=../arm-gcc-toolchain.cmake
make
```

이 과정에서 ARM 프로세서를 위한 바이너리가 생성된다.

#### Docker를 이용한 빌드 예제

Docker를 사용하면 특정 환경에서의 빌드를 자동화할 수 있다.

**1. Dockerfile 작성**

```Dockerfile
FROM ubuntu:20.04

RUN apt-get update && \
    apt-get install -y cmake g++ make

WORKDIR /app
COPY . .

RUN mkdir build && cd build && cmake .. && make
```

**2. CMakeLists.txt 파일 및 소스 파일 작성**

위의 리눅스 예제에서 사용한 파일들을 사용한다.

**3. Docker 빌드 및 실행**

터미널에서 다음 명령을 사용해 Docker 이미지를 빌드하고 실행한다:

```bash
docker build -t cmake-example .
docker run --rm cmake-example
```

이 명령은 Docker 컨테이너 내에서 프로젝트를 빌드하고, 생성된 실행 파일을 실행한다.

***

관련 자료:

* Kitware Inc., CMake Documentation, <https://cmake.org/cmake/help/latest/>
* Docker Documentation, <https://docs.docker.com/>
* ARM Developer, Cross Compiling for ARM with CMake, <https://developer.arm.com/>
