Meson
2019년부터 사용된 로고 | |
dav1d를 구성하는 Meson | |
| 개발자 | Jussi Pakkanen |
|---|---|
| 발표일 | 2013년 3월 2일 |
| 안정화 버전 | |
| 저장소 | |
| 프로그래밍 언어 | 파이썬 |
| 운영 체제 | 크로스 플랫폼 |
| 종류 | 소프트웨어 개발 도구 |
| 라이선스 | 아파치 라이선스 2.0 |
| 웹사이트 | mesonbuild |
Meson(/ˈmɛ.sɒn/)[2]은 코드베이스를 빌드하기 위한 빌드 자동화 소프트웨어 개발 도구이다. Meson은 가장 일반적인 작업을 구성하는 데 필요한 데이터를 최소화하기 위해 설정보다 관습 방식을 채택한다.[3] Meson은 아파치 라이선스 2.0에 따라 자유-오픈 소스 소프트웨어이다.[4]
Meson은 파이썬으로 작성되었으며 유닉스 계열(리눅스 및 macOS 포함), 마이크로소프트 윈도우 및 기타 운영 체제에서 실행된다. C, C++, C 샤프, CUDA, 오브젝티브-C, D, 포트란, 자바, 러스트, 발라 빌드를 지원한다.[5] 랩(Wrap)이라는 메커니즘을 통해 종속성을 처리한다. GNU 컴파일러 모음 (gcc), 클랭, 마이크로소프트 비주얼 C++ 및 Emscripten 및 사이썬과 같은 비전통적인 컴파일러를 포함한 다른 컴파일러를 지원한다.[6] 이 프로젝트는 닌자를 기본 백엔드 빌드 시스템으로 사용하지만, Visual Studio 또는 엑스코드 백엔드도 사용할 수 있다.
Meson의 포트란 및 사이썬 지원은 예를 들어 SciPy와 같이 다양한 과학 프로젝트가 setuptools에서 Meson으로 전환하는 데 도움이 되도록 개선되었다.[7] Meson은 meson-python 패키지를 통해 파이썬 휠을 빌드하기 위한 PEP517 백엔드로 사용할 수 있다.[8]
언어
[편집]Meson의 빌드 설명 파일인 Meson 언어의 구문은 파이썬에서 차용했지만 파이썬은 아니다. 다른 언어로 다시 구현할 수 있도록 설계되었다.[9] 예를 들어 muon[10]은 C 구현이며, Meson++[11]은 C++ 구현이다. 파이썬에 대한 의존성은 구현 세부 사항이다.
Meson 언어는 의도적으로 튜링 완전이 아니므로 임의의 프로그램을 표현할 수 없다.[9] 대신, 지원되는 언어를 컴파일하는 것 이상의 임의의 빌드 단계는 사용자 정의 대상으로 표현할 수 있다.
Meson 언어는 강력한 형식 지정 언어로, 라이브러리, 실행 파일, 문자열 및 이들의 목록과 같은 내장형은 상호 교환할 수 없다.[12] 특히, Make와 달리 목록 형식은 공백으로 문자열을 분할하지 않는다.[9] 따라서 파일 이름 및 프로그램 인수에서 공백 및 기타 문자가 깔끔하게 처리된다.
속도 및 정확성
[편집]일반적인 빌드 시스템과 마찬가지로 올바른 증분 빌드는 가장 중요한 속도 기능이다(사용자가 강제로 클린 빌드를 수행해야 할 때 모든 증분 진행이 폐기되기 때문이다).
일반 Make와 달리 별도의 구성 단계는 인수, 환경 변수 및 명령 출력의 변경 사항이 후속 빌드에서 부분적으로 적용되지 않도록 하여 오래된 빌드로 이어지지 않도록 한다.
Ninja와 마찬가지로 Meson은 소스 파일의 글로빙을 지원하지 않는다.[9] 모든 소스 파일이 빌드 정의 파일에 나열되어야 하므로, 빌드 정의 파일 타임스탬프는 소스 파일 집합이 변경되었는지 여부를 결정하는 데 충분하므로 제거된 소스 파일이 감지된다. CMake는 글로빙을 지원하지만 동일한 이유로 권장하지 않는다.[13]
Meson은 ccache가 설치되어 있으면 자동으로 사용한다.[14] 또한 ABI 변경이 없을 때 라이브러리에 대해 실행 파일의 다시 연결을 건너뛰기 위해 공유 라이브러리의 심볼 테이블 변경 사항을 감지한다. 프리컴파일러 헤더는 지원되지만 구성이 필요하다.[15] 디버그 빌드는 기본적으로 최적화 없이 수행된다.
기능
[편집]Meson의 목표는 현대적인 개발 방식을 용이하게 하는 것이다. 따라서 Meson은 유니티 빌드를 수행하고,[16] 코드 커버리지를 통해 빌드하는 방법[17] 등을 프로그래머가 이를 지원하기 위해 코드를 작성할 필요 없이 수행하는 방법을 알고 있다.
하위 프로젝트
[편집]Meson은 pkg-config, CMake 및 프로젝트별 조회를 통해 사용자 시스템에 설치된 외부 종속성을 자동으로 찾아 사용할 수 있다.[18] 대신, 또는 대체로, 종속성은 하위 프로젝트로 제공될 수 있다. 이는 다른 프로젝트 내에 포함되거나 다운로드 링크로 제공되며, 패치가 포함될 수도 있다.[19] 이는 Meson이 프로젝트를 컴파일하려는 일반 사용자의 편의를 위해 의존성 지옥을 해결할 수 있게 하지만, 일반 설치된 종속성을 대신 사용할 수 있었다면 소프트웨어 블롯에 기여할 수도 있다. 따라서 리눅스 패키저가 선호하는 모드는 폴백(fallback)이다.[20]
Meson은 Meson 및 CMake 하위 프로젝트를 지원한다. Meson 빌드 파일은 WrapDB 서비스를 참조할 수도 있다.[19]
교차 컴파일
[편집]교차 컴파일은 추가 구성이 필요하며, Meson은 Meson 프로젝트 외부에서도 가능한 별도의 교차 파일 형태로 이를 지원한다.[21]
설치 디렉터리 설정
[편집]x86_64 유닉스에서 라이브러리 설치 디렉터리 설정은 Meson이 자동으로 처리하지만, 오토툴(Autotools)과 같은 다른 도구에서는 그렇지 않다.
채택자
[편집]그놈은 프로젝트를 Meson으로 포팅하는 것을 목표로 삼았다.[22] 2017년 후반부터 그놈 셸 자체는 오토툴을 포기한 후 Meson만을 독점적으로 요구하며,[23] GTK+, Clutter-GTK, GLib 및 GStreamer와 같은 중앙 구성 요소도 Meson으로 빌드할 수 있다.[22]
많은 Freedesktop.org 프로젝트가 Meson으로 전환되었다. Systemd는 버전 234에서 오토툴을 버린 이후 Meson에 의존하며,[24] X.Org[25] 및 메사[26]도 Meson으로 포팅되었다.
기능 비교
[편집]| 기능 | Meson | CMake | Make |
|---|---|---|---|
| 데이터 형식 | 예 | 아니요 | 아니요 |
| 목록 데이터 형식 | 예 | 세미콜론으로 구분된 문자열 | 공백으로 구분된 문자열 |
| 사전 데이터 형식 | 0.47.0부터 | 아니요 | 아니요 |
| 파일 글로빙 | 아니요 | 예 | 일부 변형의 비표준 확장 |
| 사용자 정의 함수를 통한 확장 | 아니요 | 예 | 아니요 |
| 임의 명령의 출력 읽기 (구성 시점) | run_command | 예 | 예 |
| 빌드 시점에 임의 명령 실행 (사용자 정의 대상의 레시피로) | 예 | 예 | 예 |
| 오래된 빌드 방지 (입력 변경에 대한 부분 재빌드) | 예 (버그가 없는 한) | 소스 파일 글로빙이 아닌 경우 | 재귀적 Make (관용적인 패턴)는 이 점에서 문제가 있다[27] |
테스트를 실행하는 대상은 빌드된 테스트에 의존한다 (예: test는 all에 의존) | 예 | 아니요, 그리고 add_dependencies(test all)은 금지된다. test 대상이 예약되어 있기 때문이다.[28] | 추가하기 매우 쉽다 |
| Ccache | 자동 | 추가하기 매우 쉽다 | 추가하기 매우 쉽다 |
| Distcc | 추가하기 매우 쉽다 | 추가하기 매우 쉽다 | 추가하기 매우 쉽다 |
| 심볼 테이블 인식 재링크 | 예 | 직접 해야 한다 | 직접 해야 한다 |
| 프리컴파일러 헤더 | 선택 사항 | CMake ≥ 3.16[29][2] | 직접 해야 한다 |
| 설치된 종속성 찾기 | pkg-config, CMake 패키지 | CMake 모듈, pkg-config | — |
| 종속성 자동 다운로드 | 하위 프로젝트 | FetchContent[30] | — |
| 설치된 종속성 찾기, 다운로드 폴백 포함 | pkg-config + 하위 프로젝트 | CMake 모듈/pkg-config + FetchContent | — |
| pkg-config 파일 생성기 | 예 | 아니요 | — |
| 자동 다운로드 가능한 종속성으로 사용 용이성 | Meson 하위 프로젝트로 사용 가능 | 아니요 | — |
같이 보기
[편집]각주
[편집]- ↑ “Release 1.10.0”. 2025년 12월 8일. 2025년 12월 10일에 확인함.
- 1 2 “Making build systems not suck (linux.conf.au video)”. 《유튜브》. 2015년 1월 16일.
- ↑ “High productivity build system”. 2025년 1월 30일.
Meson aims to optimize programmer productivity by providing simple, out-of-the-box support for modern software development tools and practices, such as unit tests, coverage reports, Valgrind, CCache and the like.
- ↑ “mesonbuild/meson: The Meson Build System”. 《GitHub》. 2016년 4월 13일에 확인함.
- ↑ “Reference manual”.
- ↑ “Compiler IDs”.
- ↑ “How to build SciPy with Meson”.
- ↑ “meson-python package on PyPI”.
- 1 2 3 4 “Meson Frequently Asked Questions”.
- ↑ “muon.build”. 2023년 1월 27일에 확인함.
- ↑ Baker, Dylan (2021년 5월 28일). “dcbaker/meson-plus-plus”. 《깃허브》. 2021년 5월 28일에 확인함.
- ↑ “Meson Syntax”.
- ↑ “CMake FILE command”.
Note: We do not recommend using GLOB to collect a list of source files from your source tree. If no CMakeLists.txt file changes when a source is added or removed, the generated build system cannot know when to ask CMake to regenerate.
- ↑ “Feature Autodetection”.
- ↑ “Precompiled headers”.
- ↑ “Unity builds”.
- ↑ “Unit-tests”.
- ↑ “Dependencies with custom lookup functionality — Meson documentation”.
- 1 2 “Wrap dependency system manual”.
- ↑ “Meson and 3rd party dependencies. Only one correct way”.
- ↑ “Cross compilation”.
- 1 2 “GNOME Goal: Port modules to use Meson build system”.
- ↑ “GNOME 3.26 Beta Debuts: More Meson Porting, Wayland Action”.
- ↑ “Drop support for autotools”. 《깃허브》.
- ↑ “Meson Support Has Landed In The X.Org Server”.
- ↑ “Mesa Developers Move Closer To Dropping Autotools Build System In Favor Of Meson”.
- ↑ “Non-recursive Make Considered Harmful” (PDF). 《마이크로소프트》.
Recursive Make is considered harmful for very good reasons (Miller 1998); it is not possible to accurately track dependencies when the build system is constructed of separate components that invoke each other.
- ↑ “Make test does not depend on make all”. 《Kitware issue tracker》. 2016년 6월 23일. 2020년 9월 3일에 확인함.
- ↑ “CMake support for precompiled headers”. 2018년 3월 13일에 확인함.
- ↑ “FetchContent — CMake 3.15.7 Documentation”.
외부 링크
[편집]- Meson
- 공식 웹사이트