[c++] C ++ 빌드 시스템-무엇을 사용해야합니까? [닫은]

C ++에서 새 프로젝트를 시작하려고합니다. 처음에는 제 시간에 사용 가능한 빌드 시스템을 조사하고 있습니다. 그 대답은 “많은 것이며, 모두 끔찍합니다”.

이를 위해 특별히 필요한 기능은 다음과 같습니다.

  1. C ++ 11 지원
  2. 크로스 플랫폼 (리눅스를 주요 대상으로하지만 최소한 Windows에서도 구축 가능)
  3. 괜찮은 단위 테스트 지원
  4. 코드 분리를위한 다중 모듈 지원
  5. 코드 생성 지원 (asn1c 또는 protobuf 사용-100 % 확실하지 않음)
  6. 유지 보수 용이

이제 CMake 및 Autotools를 사용하는 사람들 중 1-4 명을 쉽게 수행 할 수 있다는 것을 알고 있습니다. 아마도 SCons와 Waf 및 다른 사람들과도 마찬가지입니다. 문제는 내가 그것을 사용하여 코드 생성을 올바르게 수행하는 방법을 결코 해결하지 못했다는 것입니다. 즉 빌드 프로세스가 처음 실행될 때까지 존재하지 않는 소스 파일이므로 빌드 시스템이 실행 가능한 코드로 변환 할 수 있어야하는 소스 파일 그러나 실제로 빌드가 시작될 때까지 실제로 알지 못합니다 … (ASN1C는 특히 함께 작동 해야하는 수십 개의 헤더 및 소스 파일을 생성하며 실제 파일 세트는 asn 파일의 내용에 따라 다릅니다) 또한 CMake와 Autotools에는 작업하기 위해 관리해야 할 자체 스크립트 세트가 있습니다.

그래서-이와 같은 것에 권장되는 빌드 시스템은 무엇입니까? 아니면 지금 make 파일과 쉘 스크립트가 붙어 있습니까?



답변

“많은, 그리고 그들은 끔찍하다”+1

그러나 “가장 풍부하고 확장 성”은 아마도 Makefile 생성기 인 CMake 일 것입니다 (기본 MSVC ++ *.proj/ 생성 *.sln). 이상한 구문이지만 일단 배우면 다른 플랫폼에 대한 빌드를 멋지게 생성 할 수 있습니다. “새로 시작한”경우을 사용 CMake합니다. “코드 생성”은 원하는 작업에 따라 빌드 시스템을 넘어 “자신의 생명”을 취할 수 있지만 목록을 처리해야합니다. (아래 참조)

간단한 프로젝트의 경우 QMake 생성기는 정상 입니다 ( QMake 를 사용하기 위해 Qt 라이브러리를 사용할 필요는 없습니다). 그러나 “간단한”설명은 아닙니다. 코드 생성 및 “추가 단계 (extra-phases)”는 (또는 ) CMake와 같은 자체 확장을위한 풍부한 API를 원할 수도 있습니다.SconsWaf

우리 는 직장에서 스콘 을 사용 합니다. “글 머리 기호 방지 빌드”를 생성하지만 실제로 느립니다. 다른 시스템은 방탄하지 않습니다 Scons. 그러나 느립니다. 파이썬으로 작성되었으며 “작업 공간 구성”(모듈 종속성 만 지정)에 대한 인터페이스를 확장했으며 이는 Scons디자인 의도 (Python을 통한 이러한 유형의 확장)의 일부입니다. 편리하지만 빌드 속도가 느립니다. 방탄 빌드 (모든 개발자 상자가 최종 릴리스를 만들 수 있음)를 얻지 만 속도가 느립니다. 그리고 느립니다. Scons그러나 를 사용하면 느리다는 것을 잊지 마십시오 . 그리고 느립니다.

2000 년 이후 10 년이 지났지 만 여전히 비행 용 차량이 없다고 생각합니다. 우리는 아마 그것을 얻기 위해 또 다른 백년을 기다려야 할 것입니다. 그리고 우리는 아마도 여전히 크 래피 빌드 시스템으로 건설중인 비행 자동차에서 날아갈 것입니다 .

예, 모두 끔찍합니다.

[코드 생성에 대하여]

Scons“단계”에서 작동하며 “정적”입니다. 빌드의 일부로 생성 된 코드를 빌드 할 수 있지만 (사람들은 몇 가지 다른 방식으로이 작업을 수행함) “매우 스콘과 매우 유사한 것”으로 설명되었습니다.

“일부 파일을 전처리하고 소스 파일을 생성”하는 것이 간단하다면 큰 문제는 없습니다 (많은 옵션이 있으며 이것이 파일 qmakemoc전처리를 위해 작성된 이유 입니다 *.hpp/*.cpp).

그러나 “무거운 사람”에서이 작업을 수행하는 경우 직접 스크립트를 작성해야합니다. 예를 들어, 데이터베이스를 쿼리하고 “계층”(전통적인 3 계층 응용 프로그램 개발) 사이의 인터페이스를 위해 C ++ 클래스를 생성하는 일부 구성 형 스크립트가있었습니다. 마찬가지로 IDL을 통해 서버 / 클라이언트 소스 코드를 생성하고 여러 버전의 클라이언트 / 서버가 서로 다른 버전 (동일한 “클라이언트”또는 “서버”)과 동시에 실행될 수 있도록 포함 된 버전 정보를 생성했습니다. 생성 된 소스 코드가 많습니다. 우리는 “빌드 시스템”을 “가장”만들 수 있지만, 실제로는 “구성 관리”를위한 사소한 인프라이며, 그 중 일부는 “빌드 시스템”입니다. 예를 들어이 시스템은 “테이크 다운”및 “


답변

지금 Gradle을 사용할 수 있습니다 : https://docs.gradle.org/current/userguide/native_software.html

내가 처음에 이것을 게시 한 이후 몇 년 동안 이것은 꽤 성숙 된 것 같습니다. 프로젝트가 “인큐베이팅 중”이라는 페이지가 사라졌지 만이 상태를 제거하는 공식 발표를 찾을 수 없습니다.


답변

나는 이것을 찾았지만, 개인적으로 아직 사용하지 않았습니다.

속도에 중점을 둔 작은 빌드 시스템 인 Ninja Google은 이제 Ninja를 사용하여 Make : link 대신 Android를 빌드 합니다 .

강력하고 빠른 빌드 시스템 인 Shake .

고성능 빌드 시스템 인 Tup 알고리즘 기반 디자인. Tup 분석 .

이제 모든 플랫폼이 크로스 플랫폼이며 Windows를 지원합니다. 다시 한 번, 직접 테스트하지 않았으므로 나머지 요구 사항에 대해서는 아직 확실하지 않습니다. 그들은 상업적 개발에 사용되고 있으며 CIG 는 Ninja를 선택했습니다. 나는 프로젝트 생성기로 Ninja의 쉽고 빠른 속도를 사용하고 좋아했습니다. 처음 두 가지는 Scons, Ant 등과 유사합니다.


답변

스콘은 매우 친절하고 유연한 시스템이지만, 로타, 정말 느립니다.

그러나 파이썬으로 작성된 프로그램의 성능을 향상시키는 방법이 있습니다. 이 JIT 사용. 알려진 모든 프로젝트 중에서 PyPy는 매우 강력하고 빠르게 성장하고 동기 부여 된 JIT 지원 Python 2.7 구현입니다. Python 2.7과의 PyPy 호환성은 놀랍습니다. 그러나 Scons는 PyPy 호환성 위키 에서 지원되지 않는 프로젝트로 선언했습니다 .
웹 애플리케이션 방화벽은 , 다른 한편으로는, 파이썬 기반 autotools를의 sucessor으로 모델링, 완전히 PyPy 인프라에 의해 지원됩니다. 내 프로젝트에서 PyPy로 전환 할 때 어셈블리 속도가 5-7 배 증가했습니다. PyPy에서 성능 보고서를 볼 수 있습니다 .

현대적이고 비교적 빠른 빌드 시스템의 경우 Waf는 좋은 선택입니다.


답변

Google 빌드 시스템은 좋은 대안입니다 : http://bazel.io/


답변

저는 SCons를 사용했으며이 빌드 시스템에 깊은 인상을 받았습니다. SCons는 python과 python 자체로 확장 할 수 있습니다. 파이썬은 로직을 코딩하기 만하면 필요한 모든 것을 갖추고 있기 때문에, 모든 저수준 기능은 이미 SCons와 Python에서 구현되며 크로스 플랫폼입니다. 좋은 프로그래밍 기술이 있다면 빌드 스크립트는 완벽하고 쉬워 보일 것입니다.

Make, CMake 및 유사한 빌드 시스템은 매크로의 쓰레기처럼 보입니다. Waf는 SCons 아날로그입니다. 나는 Waf를 시도하고 있지만 SCons는 더 친절 할 것이므로 SCons와 함께했습니다.

군중 의견으로는 SCons가 너무 느리지 만 프로젝트 중간에 빌드 속도에 따라 make와 SCons의 차이를 보지 못했습니다. 대신 SCons는 병렬 빌드로 잘 작동했지만 make에는 큰 문제가 있습니다.

또한 SCons를 사용하면 템플릿에서 구성, 빌드, 배포, 구성을 생성하고 테스트를 실행하고 파이썬 및 SCons로 코딩 할 수있는 다른 작업을 모두 수행 할 수 있습니다. 그것은 매우 큰 장점입니다.

간단한 프로젝트의 경우 CMake도 좋은 선택입니다.


답변

내 센트를 추가하려면 : premake

http://industriousone.com/premake

위키 에는 전용 웹 페이지 도 있습니다 .