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


136

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

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

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

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

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


11
"답은 '많은 사람들이며 모두 끔찍한 것 같습니다'"는 나의 인상이기도합니다 ( '내 견해에서 끔찍한 것'이 추가됨). 이러한 용어로 너무 많이 일반화하는 것을 좋아하지 않습니다. ). 나는 실제로 바로 그 이유 때문에 내 자신을 설정했으며, 내가 원하는 것을하고 항상 일을 원했던 방식을 수행했기 때문에 예상보다 잘 작동했습니다. 약간의 시간이 덜 걸리는 경우 기존 도구를 살펴보고 다른 도구보다 두통이 적은 도구를 선택해야 할 것입니다.
Christian Stieber

4
tup을 사용해보십시오 .
Kerrek SB

또한보십시오 : stackoverflow.com/q/3349956
ergosys

8
빌드 시스템에서 어떤 종류의 C ++ 11 지원을 기대하십니까? 이것은 컴파일러에서 얻은 것입니다. 빌드 시스템은 실제 소스 파일을 구문 분석하거나 읽지 않으며 심지어 필요한 사람에게 전달합니다.
Baruch

5
물론 C ++ 11 지원을 사용하도록 컴파일러에 쉽게 알리는 것이 좋습니다. g ++에는 하나의 플래그가 필요하고 다른 세트를 clang, msvc는 필요하지 않습니다. 또한 어떤 c ++ 11 기능이 사용 가능한지 감지하는 것이 컴파일러마다 다르기 때문에 유용 할 것입니다.
Graham

답변:


117

"많은, 그리고 그들은 끔찍하다"+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을 통해 서버 / 클라이언트 소스 코드를 생성하고 여러 버전의 클라이언트 / 서버가 서로 다른 버전 (동일한 "클라이언트"또는 "서버")과 동시에 실행될 수 있도록 포함 된 버전 정보를 생성했습니다. 생성 된 소스 코드가 많습니다. 우리는 "빌드 시스템"을 "가장"만들 수 있지만, 실제로는 "구성 관리"를위한 사소한 인프라이며, 그 중 일부는 "빌드 시스템"입니다. 예를 들어이 시스템은 "테이크 다운"및 "


37
나는 스콘도 좋아하지만 느리다고 생각합니다.
Lothar

1
코드 생성시 CMake가 Makefile 래퍼로 코드 생성을 처리하여 선택적 2 단계를 수행 할 수 있습니다. 나는 전체 의존성 추적, 코드 생성 후 조기 종료를 통해 re-cmake 등을 트리거 할 수 있었다. javaglue.com/javaglue.html#tag:JavaGluecode.google.com/p/javaglue
sdw

3
거의 2 년이 지났는데도 여전히 SCON이 느리다고 생각하십니까? 내가 빌드 시스템을 선택할 때, 나는 우연히 그것을 SCons는 갈 내 결정에 기여했다.
JBentley

2
@Ben, 그건 사실이지만 느리다.
charley

2
이것을 보는 사람은 Meson (닌자를 사용하는)을 고려해야합니다.
Matthew D. Scholefield

33

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

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


Gradle에 동의합니다. Gradle은 확장 가능하도록 설계되었습니다. 그러나 플러그인 구현 속도에 따라 다릅니다. gradle 자체에 대한 오버 헤드도 있습니다. 또한 일부 플러그인은 사용 사례에 맞게 사용자 정의해야 할 수도 있습니다.
JE42

C ++ 지원에 대한 gradle의 관심을 보는 것이 흥미 롭습니다. 그들이 우리 모두가 빠진 c ++ 프로젝트를위한 훌륭하고 견고한 빌딩 시스템을 생산하기를 바랍니다.
hbobenicio 님의

@ 오징어 감사합니다.
Nate Glenn

1
Gradle은 강력하면서도 간단합니다. 이상한 구문은 없지만 단일 gradle.build 파일로 여러 실행 가능한 출력 (메인, 테스트 등)으로 전체 프로젝트를 빌드하기에 충분합니다. 모든 소스 디렉토리에 파일 덤프가 없습니다. 버전 관리에 매우 친숙합니다.
Overdrivr

1
지난 2 일 동안 Gradle과의 싸움을하면서 "hello world"라이브러리, 앱 및 gtest를 만들려고했지만 새 프로젝트에 추천 할 수는 없습니다. 도구가 모두있을 수 있지만 문서가 없습니다 (의심의 이익을주는). 아마도 실행 가능한 것으로 보이는 사람들이 좋아하는 리소스를 가리킬 수 있습니까?
jwm

16

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

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

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

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

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


1
Tup은 심볼 조회를 엉망으로 만들며, 다른 빌드 시스템과 잘 어울리지 않으며 (실제로) 무작위 출력 (예 : 파일 javac로 분리 된 내부 클래스로 생성 된 클래스)과 잘 어울리지 않습니다. class$1.class글을 잘못 작성하고 시스템 해킹을 사용하여 작업을 수행합니다. 소규모 시스템에 좋습니다. 대규모 프로젝트에서는 유지 관리 할 수 ​​없습니다.
Qix-MONICA가 MISTREATED

@ Qix : 출력을 저장소와 별도로 유지할 수 없습니까?
Kerrek SB 2016 년

1
@KerrekSB 가능하지만 심볼 조회에는 문제가 없습니다. Tup은 FUSE를 사용 하고 자체 미들웨어를에 마운트합니다 .tup/mnt. 그런 다음 모든 빌드 프로그램을 폴더 (예 :) .tup/mnt/@tupjob-XXXXX에서 작업 디렉토리로 실행하여 읽기 / 쓰기를 모니터링하여 빌드 구성을 시행합니다. 경로가 절대적으로 저장되지 않는 한 (즉, 기호로) 잘 작동합니다. 바이너리를 컴파일하면 심볼 경로가 바이너리 자체에 저장됩니다. 즉, GDB가 심볼을로드하려고 할 때 tupjob존재하지 않는 해당 경로를 찾습니다 .
Qix-MONICA가 MISTREATED

Tup과 Ninja는 모두 Make보다 낮거나 낮은 매우 낮은 수준의 도구입니다. 그들은 C ++에 맞지 않습니다. 실제 툴 시스템 이 복잡한 실제 프로젝트를 처리하기 위해 제공하는 중요한 고급 기능이 많이 없기 때문에 이러한 툴을 자체적으로 빌드 시스템 이라고 부릅니다 . 이러한 시스템 중 일부는 Ninja를 백엔드로 사용할 수 있습니다.
Johan Boulé

11

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

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

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


링크 된 위키 페이지에서 scons가 "Compatible"로 표시되어 있으므로 PyPy에서 작동합니다.
가짜 이름

8

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


3
"크로스 플랫폼 (리눅스를 주요 대상으로하지만 최소한 Windows에서도 구축 할 수 있음)". Bazel의 FAQ에 따르면 "현재 Windows 지원을 개선하기 위해 적극적으로 노력하고 있지만 여전히 유용하지는 않습니다."
Michael Mrozek

3
시스템 자체인지 프로젝트를 설정 한 사람인지 확실하지 않지만 @ work를 사용하여 허리에 큰 통증이있었습니다. 충분히 융통성이 없으며 (소설이 좋지 않은 경우 종종 차선책이 아닌 일을하는 한 가지 방법 만 지원한다는 점에서) 강력하지 않고 문서화되지 않은 (기본 사례 제외) 커뮤니티가 거의 없으므로 스택 오버 플로우가 당신을 구할 것으로 기대하지 마십시오. , 그 자체로 의존성이 높기 때문에 대부분의 시스템 등에서 대부분의 IDE와 잘 작동하지 않습니다. 따라서 Google 팬이 아닌 한 멀리하십시오 .Bob- 페이스 북 팬들을 위해)
Slava

안녕하세요, CMake를 사용하려고 6 주를 보낸 후에 사용 하기 가 정말 쉽다는 것을 알았습니다 . 타사 종속성을 다운로드하고 컴파일하기를 원했습니다 (파이썬 및 JavaScript의 멋진 빌드 도구에 사용되었으므로). 이것은 쉬워졌지만 지원하지 않는 타사를 위해 자신의 bazel 파일을 작성해야 할 단점이 있습니다. 그들은 i'ze reckon에 이것을 저장하기 위해 중앙 저장소가 필요합니다.
CpILL

6

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

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

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

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

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


3
내 문제는 내가 버릇이 있다는 것입니다. 저는 전문직 Java 개발자이며 Java 세계의 Gradle과 같은 도구는 C ++ 개발에 실제로 필요한 도구입니다. 단일 라인 빌드 파일을 사용하여 외부 종속성없이 gradle 프로젝트를 설정할 수 있습니다. 그게 다야. 많은 의존성을 가진 다중 모듈 프로젝트는 여전히 쉽게 수행 할 수 있으며 실제로 간단한 C ++ 프로젝트보다 훨씬 적은 구성으로 무게를 측정 할 수 있습니다.
Graham

-I include dirs 및 -L library dirs와 같은 시스템 구성 플래그를 추상화하지 않기 때문에 Scon을 사용하는 다른 패키지를 빌드하는 데 문제가있었습니다. CFLAGS는 필요하지 않습니다. 각 scons 스크립트를 수정하여 올바른 위치에 보이도록해야합니다.
ACyclic

5

내 센트를 추가하려면 : premake

http://industriousone.com/premake

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


2
불행히도 Premake는 OP 요구 사항에 따른 코드 생성을 지원하지 않습니다. 그리고 몇 가지 할 수있는 일이 있지만 단위 테스트에 대한 지원을 "괜찮은"것으로 부르지 않을 것입니다.
ergosys

@ ergosys 나는 개미가 언급되지 않았고 antC / C ++도 지원 한다는 것을 알았습니다. 이것이 당신에게 좋은지 확인하십시오. 제가 가지고있는 마지막 이름입니다.
user827992

2

Ceedling 을 사용할 수 있습니다 . 그러나 현재 C 만 지원하며 작성자의 Unity 및 CMock 테스트 프레임 워크와 밀접하게 연결되어 있습니다.

C ++ 컴파일러 및 단위 테스트 / 조롱 프레임 워크와 함께 작동하도록 포크 및 수정이 가능합니다.

또한 Tup 은 가치있는 언급입니다. 매우 빠르지 만 프레임 워크 테스트 등에 대해서는 아무것도 모르므로 Tup을 사용하여 자체 빌드 시스템을 작성해야합니다. TDD를 할 계획이라면 아마도 Tup이 나아갈 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.