CMake는 가라! Meson과 함께하는 차세대 C++ 빌드 시스템 구축

· by 박승재

Meson차세대 멀티플랫폼 빌드 시스템으로, C, C++, D, Fortran 등 다양한 언어를 지원합니다.

Meson는 CMake나 Bazel과 같은 타 빌드 시스템보다 빠르게 코드를 빌드할 수 있고, 빌드 설정 파일을 다루기 쉽다는 장점이 있습니다.

참고: Meson - Build System Comparison

위키백과이 글을 읽어보시면 Meson을 이해하는데 도움이 될 것 같습니다.

설치

이 글은 우분투 20.04 환경을 기준으로 작성되었습니다.

Meson을 설치하기 위해서는 Python 3와 Ninja를가 필요합니다.

먼저 build-essential을 설치해 소스코드 빌드 시 필요한 기본적인 패키지들을 다운로드 합니다:

$ sudo apt install build-essential

그리고 Ninja를 설치합니다:

$ sudo apt install ninja-build

Ninja는 속도에 중점을 둔 소형 빌드 시스템으로, Make느린 증분 빌드의 대안으로 만들어졌습니다.

Ninja는 빌드 생성기를 이용해 빌드 파일을 생성하며, CMake, GYP, Meson 등에서 Ninja 파일 생성을 지원합니다.

마지막으로 Meson을 설치합니다:

$ python3 -m pip install meson

주의: $ sudo apt install meson를 통해 Meson을 설치하면 구버전이 설치되어 이 문서와 호환되지 않을 수 있습니다.

아래와 같이 빌드 정보가 잘 나오면 올바르게 설치된 것입니다.

$ meson --version
0.58.1
$ ninja --version
1.10.0

시작

C++ 언어로 “hello” 프로젝트를 생성합니다:

$ meson init -n hello -l cpp
Using "hello" (project name) as name of executable to build.
Sample project created. To build it run the
following commands:

meson setup builddir
meson compile -C builddir

프로젝트가 초기화되면 아래 두 파일이 생성됩니다:

meson.build:

project('hello', 'cpp',
  version : '0.1',
  default_options : ['warning_level=3',
                     'cpp_std=c++14'])

exe = executable('hello', 'hello.cpp',
  install : true)

test('basic', exe)

hello.cpp:

#include <iostream>

#define PROJECT_NAME "hello"

int main(int argc, char **argv) {
    if(argc != 1) {
        std::cout << argv[0] <<  "takes no arguments.\n";
        return 1;
    }
    std::cout << "This is project " << PROJECT_NAME << ".\n";
    return 0;
}

참고: Meson - init

설정

프로젝트의 빌드 디렉토리를 설정합니다:

$ meson setup builddir
The Meson build system
Version: 0.58.1
Source dir: /home/ubuntu/projects/hello
Build dir: /home/ubuntu/projects/hello/builddir
Build type: native build
Project name: hello
Project version: 0.1
C++ compiler for the host machine: c++ (gcc 9.3.0 "c++ (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0")
C++ linker for the host machine: c++ ld.bfd 2.34
Host machine cpu family: aarch64
Host machine cpu: aarch64
Build targets in project: 1

Found ninja-1.10.0 at /usr/bin/ninja

meson builddir은 Meson 구버전에서 사용하던 명령으로, meson setup builddir과 동일합니다.

setup 명령은 buildirsourcedir 인자를 가지고 있는데, sourcedir가 주어지지 않는다면 meson.build 파일의 pwd를 값으로 사용합니다.

주요 옵션으로는 --backend--buildtype이 있는데 각각 “ninja”와 “debug”가 기본값입니다.

GCC가 아닌 Clang을 사용할 경우 아래와 같이 환경변수로 전달할 수 있습니다:

CC=clang CXX=clang++ meson setup buildclang

참고: Meson - Configuring the build directory

컴파일

builddir을 컴파일합니다:

$ meson compile -C builddir
ninja: Entering directory `builddir'
[2/2] Linking target hello

-C빌드할 파일이 들어있는 디렉토리로, setup을 통해 생성한 디렉토리를 입력해주면 됩니다.

컴파일한 프로그램은 builddir에 생성됩니다:

$ builddir/hello
This is project hello.

참고: Meson

테스트

Meson은 유닛 테스트를 지원합니다:

$ meson test -C builddir/
ninja: Entering directory `/home/ubuntu/projects/hello/builddir'
ninja: no work to do.
1/1 basic        OK              0.01s                           

Ok:                 1   
Expected Fail:      0   
Fail:               0   
Unexpected Pass:    0   
Skipped:            0   
Timeout:            0   

Full log written to /home/ubuntu/projects/hello/builddir/meson-logs/testlog.txt

참고: Meson - Unit tests