9P by regentag 17일전 | favorite | 댓글 10개

CMake는 점점 더 C++에 대한 나쁜 솔루션이라고 느껴진다. C++ 개발자의 요구에 부응하지 못할 뿐만아니라, 일관성 없는 언어로 매우 불분명하고 구조화되지 않은 방식으로 makefile을 빌드하는 암흑기에 머무르게 한다.

문제

C++ 빌드 세계에는 두 가지 유형의 문제가 있다.

  1. 기존 프로젝트가 스스로 만든 문제 (역주: 이미 존재하는 커다란 프로젝트를 빌드하는 문제)
  2. C++에서 새 프로젝트를 선택할 때 겪는 문제

CMake는 첫 번째 문제를 해결하려고 노력하며, 두 번째 문제는 전혀 해결하지 못한다. 하지만 이러한 문제를 해결하려 하지 않기 때문에 덜 유용한 도구가 되고있다.

CMake는 프로젝트 정의를 빌드 시스템으로 번역하는 번역자가 되고 싶어하며, 이 부분에서 심하게 실패했다. 나쁜 프로젝트 정의 언어이며, 일관성이 없고 직관적이지 않다.

C++ 커뮤니티의 모두는 이제 Rust의 도구들에 대해 이야기한다. Cargo는 대부분의 개발자가 필요하다고 생각하는것을 실제로 수행하기 때문이다. Cargo는 인터넷에서 종속성을 다운로드하여 격리된 툴킷을 만들고(나쁜 생각이지만), 정적으로 링크된 라이브러리를 제공한다(역시 나쁜생각이지만). 사람들은 엄청난 속도로 보안 구멍을 추가하는 도구를 필요로 하진 않지만(역주: 저자는 Cargo의 인터넷에서 자동으로 코드를 받아와 링크하는 방식이 보안 측면에서 공급망 공격과 같은 취약점이 된다고 주장합니다. I Hate Rust 참조.), Cargo가 실제로 제공하는것은 필요하다:

  1. 매우 엄격한 프로젝트 구조
  2. 라이브러리가 어디에 있는지에 대한 문제를 해결하기 위해 외부 서버에 의존하는 매우 간단한 구성 시스템
  3. 단 하나 의 도구집합.

사람들은 실제로 작업에 집중할 수 있도록 더 작은 자유가 필요하고, 컴파일러를 가장 완벽한 방식으로 호출하는 데 능숙하지 않다.

해결책

아직 해결책은 없다. 여가 시간에 klb를 작성하고 있지만, 지금은 해결책이 아니다. (시간과 돈이 필요하다.)

하지만 사람들이 필요로 하는것이 무엇인지는 분명하다. 더 많은 옵션이 아니라 더 적은 옵션이다. 옵션이 적다는 것은 프로젝트 컴파일을 망칠 수 있는 방법이 적다는 것을 의미한다.

CMake는 지금 C++ 세계에서 여전히 최고의 옵션이지만, 지난 20년 동안 C++에 일어난 최악의 일이기도 하다. 다른 모든 것은 개선되고 있지만 빌드 시스템만 악화되고 있다.

오랫동안 욕하면서 CMake를 써 왔는데 막상 CMake만한게 없긴 합니다. bazel은 정말헬.. 새로 프로젝트를 시작한다면 meson을 고민해 볼 것 같네요.

문법이 좀 더럽긴 한데 CMake만한게 없더군요.
M4 같은걸 비-POSIX 환경에서 돌리려면 머리가 아픕니다.
애초에 빌드 환경에 뭐가 주렁주렁 붙는걸 안 좋아하다보니 meson나 scone같은건 손이 안 가고 premake는 뭔가 좀 나사가 빠져 보이다 보니 CMake로 그냥 더도말고 최대한 단순하게 코드 정의만 해서 쓰게 되더군요.

Meson이나 Bazel은 어떤가요?

저는 둘 다 써본적이 없어 잘 모르겠네요...
제 개인적으로는 작은 프로젝트에는 gprbuild가 마음에 들어서 쓰고있습니다.

Camke외 다른 방법도 복잡하긴마찬가지
Cross platform 으로 그나마.....

그래서 Visual Studio가 인기있는것 같습니다. 즉시 코딩을 시작할 수 있으니까요.
이것도 세세하게 파고들면 끝이 없긴 하지만요.

CMake만 보면 토가 쏠립니다...

CMake는 make 의 대체제가 아니라 autotools(automake)의 대체제라고 생각하면 된다고 생각해요.

그래도 그냥 Makefile보다는 나은것 같기도 합니다.
지난달에 셸 스크립트와 Perl, OS 환경변수, 이리저리 얽힌 Makefile 여러개로 구성된 빌드환경을 분석할일이 있었는데 정말 환장하겠더군요.

세세하게 뭘 해보려고 하면 토끼굴로 들어갑니다...