Autotools, Cmake 및 Scon의 차이점은 무엇입니까?


259

Autotools, Cmake 및 Scon의 차이점은 무엇입니까?


이 주제는 Scons wiki 에서 이미 논의되었습니다 . 다음 링크를 방문하십시오. 1. scons.org/wiki/SconsVsOtherBuildTools 우분투 포럼 에서 매우 유사한 토론 스레드를 방문 했습니까 ?
bhadra

이 PDF를 확인할 수 있습니다 www-alt.gsi.de/documents/DOC-2007-Sep-17-1.pdf ; 장단점이 있으며 각 도구에 대한 세부 정보도 있습니다.
Adam

답변:


190

사실 Autotools의 진정한 '절약의 은총'은 모든 GNU 프로젝트가 주로 사용하는 것입니다.

Autotools 관련 문제 :

  • ARCANE m4 매크로 구문은 "호환성"등을 테스트하기위한 자세한 트위스트 쉘 스크립팅과 결합되었습니다.
  • 주의를 기울이지 않으면 크로스 컴파일 기능을 엉망으로 만들 입니다 (Nokia는 Semoatch / Scratchbox2를 사용 하여 Maemo / Meego에 대한 매우 깨진 Autotools 빌드 설정을 회피했습니다.) 이유는 테스트에서 고정 된 고정 경로를 가지고 있기 때문에 sysroot 사양을 따르지 않고 호스트 시스템에서 항목을 가져 오기 때문에 크로스 컴파일 지원을 중단하는 것입니다. 크로스 컴파일 지원을 중단하면 OpenEmbedded와 같은 코드에서 코드를 사용할 수 없게되고 대상이 아닌 크로스 컴파일러에서 릴리스를 빌드하려는 배포에서 "재미있게"만듭니다.
  • NOBODY가 현재이 시대와 거의 모든 생산에서 사용 하는 고대의 깨진 컴파일러 문제에 대해 엄청난 양의 테스트를 수행합니다 . 진정한 고대 버전의 Solaris, AIX 등에서 glibc, libstdc ++ 또는 GCC와 같은 것을 빌드하지 않는 한 테스트는 시간 낭비이며 위에서 언급 한 것과 같은 많은 잠재적 인 손상의 원인이됩니다.
  • Windows 시스템에 사용할 수있는 코드를 빌드하기 위해 Autotools 설정을 얻는 것은 상당히 고통스러운 경험입니다. (Windows에서는 거의 사용하지 않았지만 교차 플랫폼 코드를 개발하는 경우 심각한 문제입니다.)
  • 그것이 깨질 때, 당신은 스크립팅을 작성한 사람이 당신의 빌드를 분류하기 위해 잘못한 것들을 정리하려고 꼬리를 쫓는 데 HOURS 를 쓸 것입니다 (실제로 이것이 내가하려고하는 것입니다. Autotools를 완전히 찢어 라-이번 달의 나머지 부분에서 혼란을 해결할 충분한 시간이 있는지 의심 스럽다 ...)이를 입력하면서 지금 당장 작업 할 수 있습니다 Apache Thrift는 교차하지 않는 BROKEN 빌드 시스템 중 하나 -엮다.)
  • "정상적인"사용자는 실제로 "./configure; make"를하지 않을 것입니다. 많은 것들을 위해, 그들은 PPA 나 유통 업체와 같은 누군가가 제공 한 패키지를 가져올 것입니다. "일반"사용자는 개발자가 아니며 많은 경우에 타르볼을 잡지 않습니다. 그것은 거기에 해당 될 것이라고 추정하기 위해 모든 사람들이 멍청한 짓입니다. 타르볼을 사용하는 일반적인 사용자는 일을하는 개발자이므로 파손이있는 경우 엉망이됩니다.

그것은 대부분의 경우 작동합니다 ... Autotools에 대해 말할 수있는 모든 것입니다. 기본 핵심 툴체인 코드와 관련하여 GNU 프로젝트에만 관련된 몇 가지 문제를 해결하는 시스템입니다. (편집 (2014년 5월 24일) : 관심이 유형의 잠재적 것을 주목해야한다 BAD 부분적으로 당신이 생각에서하고 정확한, 현대적인 시스템을 막아야 Heartbleed와 소개 - 걱정 될 일이 정말Autotools가 해결하는 많은 부분을 다루는 비즈니스가 없습니다. GNU는 아마도 Heartbleed에서 일어난 일에 비추어 코드베이스를 과도하게 제거해야 할 것입니다.) 프로젝트를 수행하는 데 사용할 수 있으며 Linux를 제외한 다른 곳에서는 작동하지 않을 작은 프로젝트에 적합합니다. GNU 툴체인이 올바르게 작동하고 있습니다. 성명은 "잘 리눅스와 통합한다"는 것을 매우 대담한 진술과 아주 잘못된 . 그것은 GNU 툴 슈트와 합리적으로 잘 통합되고 IT가 목표와 관련된 문제를 해결합니다.

이것은 여기 스레드에서 논의 된 다른 옵션에 문제가 없다고 말하는 것은 아닙니다.

SCons는 Make / GMake / etc를 대체합니다. 그리고 꽤 멋져 보이지만 모든 것이 고려됩니다 ...

  • 여전히 실제로 POSIX 전용 도구에 가깝습니다. Autotools를 사용하는 것보다 MinGW가 Windows를 사용하여 Windows를 구축하는 것이 더 쉬울 수 있지만 POSIX 작업을 수행하는 데 실제로 더 적합하며이를 사용 하려면 Python SCons를 설치해야 합니다.
  • Scratchbox2와 같은 것을 사용하지 않으면 크로스 컴파일에 문제가 있습니다.
  • 자체 비교에서 CMake보다 느리고 안정적입니다. 그들은 SCons에 비해 반감기 (POSIX 측은 make / gmake to build ...를 만들 필요가 있습니다)의 CMake에 대한 부정적인 결과를 낳습니다. (여담으로, 당신이 필요로하는 경우에 있는지 다른 솔루션에 비해 훨씬 확장, 당신은 당신의 프로젝트가 너무 복잡 여부를 스스로 질문해야한다 ...)

이 스레드에서 CMake에 제공된 예제는 약간 가짜입니다.

하나...

  • 새로운 언어를 배워야합니다.
  • Make, SCons 또는 Autotools에 익숙하다면 반 직관적 인 것들이 있습니다.
  • 구축하려는 시스템에 CMake를 설치해야합니다.
  • 미리 빌드 된 바이너리가없는 경우 견고한 C ++ 컴파일러가 필요합니다.

사실, 당신의 목표는 당신이 여기에서 선택한 것을 지시해야합니다.

  • 유효한 작업 바이너리를 생성하려면 많은 깨진 툴체인 을 처리해야 합니까? 그렇다면, 위에서 언급 한 단점을 알고 Autotools를 고려할 수 있습니다. CMake는이 많은 것에 대처할 수 있지만 Autotools보다 걱정이 적습니다. SCons는 그것에 대해 걱정하도록 확장 될 수 있지만 기본 답변은 아닙니다.
  • Windows 대상에 대해 걱정할 필요가 있습니까? 그렇다면 Autotools는 문자 그대로 실행되지 않아야합니다. 그렇다면 SCons가 좋은 선택이 아닐 수도 있습니다. 그렇다면 CMake는 확실한 선택입니다.
  • 당신은 크로스 컴파일에 대해 걱정할 필요 (범용 애플 리케이션 / 라이브러리 등 구글 Protobufs, 아파치 드리프트, 같은 일을해야합니까 해야한다 ... 이것에 대해 관심을)? 그렇다면 Autotools Windows에 대해 걱정할 필요가없는 한 귀하를 위해 일하십시오. 그러나 상황이 바뀌면 구성 시스템을 유지 관리하는 데 많은 시간을 소비하게됩니다. SCons는 Scratchbox2를 사용하지 않는 한 현재로서는 거의 이동이 불가능합니다. 실제로 크로스 컴파일을 처리하지 않으며 확장 성을 사용하고 다음과 같은 방식으로 유지해야합니다. 당신은 Automake와 함께합니다. 그렇다면 CMake는 샌드 박스에서 누출에 대해 걱정할 필요없이 크로스 컴파일을 지원하고 Scratchbox2와 함께 작동하거나 사용하지 않고 OpenEmbedded와 통합되므로 CMake를 고려할 수 있습니다 .

많은, 많은 프로젝트가 qmake, Autotools 등을 버리고 CMake로 옮기는 이유가 있습니다. 지금까지 CMake 기반 프로젝트가 크로스 컴파일 상황이나 VisualStudio 설정으로 떨어지거나 프로젝트가 Windows 전용 또는 OSX 전용 부분을 설명하지 않았기 때문에 소량 만 정리하면됩니다. 코드베이스에. 나는 정말 SCons는의 아웃 프로젝트 - 기반 기대할 수 없습니다와 나는 완전히 1 / 3 이상의 Autotools가 프로젝트 찍었을 것으로 예상 뭔가 배제가 하나 또는 Scratchbox2를 구축하는 호스트를 제외한 모든 컨텍스트를 마우스 오른쪽 버튼으로 구축하는 것을 잘못.


12
Heartbleed에 관한 섹션은이 좌절 된 rant에서 벗어나게합니다. OpenSSL은 손상된 malloc을 감지하기 위해 구성자 유형 패키지를 사용하지 않고 시스템 라이브러리를 다시 구현하고 결함을 훨씬 빨리 발견 한 라이브러리를 생성 한 플랫폼 개발자를 물리 치는 문제가있었습니다. 프로그램을 포팅하는 한 가지 이유는 당신이 만들고 있다는 것을 깨닫지 못했던 작은 가정에 덜 의존하기 때문에 프로그램의 품질이 높아지기 때문입니다.
Rob11311

9
문제는 전혀 혼란스럽지 않다는 것입니다. Autotools를 사용하면 그런 것들에 대한 보상에 대해 걱정하고 있습니다. 이러한 재 구현은 바로 그 생각의 확장입니다. 그대로 다음 단계로 가져갑니다. 그 배경에서 그것을보아야합니다 ... 어느 시점에서 그것을 방해하지 않습니다. 당신은 당신의 추론에서 근본 원인을 파악하지 않았습니다. 나는 Shellshock과 같은 몇 가지 다른 것들을 가져 왔습니다. 깨진 경우 수정해야합니다. 당신이 할 수 없다면-왜 계속되는지 물어봐야합니다.
Svartalf

5
autotools와 scons가 빨라지는 것을 의심하지는 않지만이 답변은 CMake (내가 선호하는 빌드 시스템, 매우 슬픈 빌드 시스템 상태 때문에)의 단점을 지적하는 데 좋지 않습니다. 기본적으로 CMake는 대부분의 것을 처리하는 일부 핵심 추상화가 아니라 개별 엣지 케이스를 기본적으로 지원하는 불일치의 프랙탈입니다. 그것은 분명히 덕트 테이프와 bailing 프로그래밍 와이어입니다. 나는 내가 잘못하고 있다고 확신하지만 CMakeLists.txt 당 하나의 VS 프로젝트를 허용하지 않으면 VisualStudio를 지원하지 않습니다 (VS 사용자는 아니지만 Winfriends가 나쁘다고 말합니다).
weberc2

5
다른 증오 프로그래밍 도구와 달리 , "CMake, good parts"(팜플렛 또는 블로그 게시물)라는 책을 만들기에는 자료가 충분하지 않으며 PHP 보다 디자인이 복잡 합니다.
weberc2

2
@JAB VS 사용자에게 이것이 관용적이지 않다고 들었습니다. 실제로 CMake는 "아이디 오 매틱"VS 프로젝트 파일을 생성하는 방법을 알 수 없었기 때문에 프로젝트의 빌드 시스템으로 대체되었습니다.
weberc2

73

도구를 사용하는 사람간에 중요한 차이점이 있어야합니다. Cmake는 소프트웨어를 빌드 할 때 사용자가 사용해야하는 도구입니다. autotools는 SuS 호환 시스템에서 사용할 수있는 표준 도구 만 사용하여 소프트웨어를 빌드하는 데 사용할 수있는 배포판 타르볼을 생성하는 데 사용됩니다. 즉, autotools를 사용하여 작성된 tarball에서 소프트웨어를 설치하는 경우 autotools를 사용하지 않는 것 입니다. 당신이 Cmake를 사용하는 소프트웨어를 설치하는 경우 반면에, 당신이 하는 Cmake를 사용하여이 소프트웨어를 구축하려면 설치되어 있어야합니다.

대부분의 사용자는 상자에 autotools를 설치할 필요가 없습니다. 역사적으로 많은 개발자들이 조작 된 tarball을 배포하여 사용자가 autoconf를 실행하여 configure 스크립트를 다시 생성해야했기 때문에 많은 혼란이있었습니다. 이는 패키징 오류입니다. 대부분의 주요 Linux 배포판은 기본적으로 어떤 버전도 설치하지 않아야 할 때 여러 버전의 autotools를 설치한다는 사실로 인해 더 많은 혼란이 발생했습니다. tarball을 구축하는 대신 버전 제어 시스템 (예 : cvs, git, svn)을 사용하여 소프트웨어를 배포하려고 시도하는 개발자로 인해 더 많은 혼란이 발생합니다.


5
사실, VCS를 사용하여 소프트웨어를 배포하는 것이 좋지 않은 것처럼 들립니다. 체크 아웃 또는 클론의 내용이 타르볼의 내용과 동일하다면 왜 타르볼을 추천 하시겠습니까?
d -_- b

5
@Toor 나는 당신의 질문을 이해하지 못합니다. 내가 작업하는 모든 프로젝트는 VCS 체크 아웃과 다른 tarball을 생성합니다. 이 두 가지를 유지하면 안정적인 배포에 도움이됩니다.
William Pursell

13
많은 프로젝트가 사람들에게 VCS를 사용하여 최신 릴리스를 구하도록 요구하는 것은 사실이지만 개발자에게만 적합합니다. 불행히도 많은 사용자들이 릴리스 타르볼과 VCS의 차이점을 이해하지 못합니다. VCS에서 빌드를 시도하면 더 많은 종속성이 부과됩니다. 사용자가해야 할 수 있습니다 asciidoc하거나 help2man또는 doxygen, 중요한 것은 올바른 autotool 조합을하거나. 이것은 autotools에게 큰 마케팅 문제였습니다. 사용자는 tarball과 VCS의 차이점을 이해하지 못하기 때문에 autoconf를 설치해야한다고 잘못 생각합니다.
William Pursell

3
프로젝트가 Cmake의 출력, 프로젝트 파일 및 Makefile을 공통 플랫폼에 배포 할 수없는 이유는 무엇입니까? 예) Win, Linux 및 MacOSX? 이 같은 상황처럼 보인다와 같은 렉스 / Yacc에이 도구없이 플랫폼에 구축 할 수 있도록 도구, 당신은 genarated C 코드를 포함
Rob11311

3
이 토론에서 언급 한 내용이 맞다고 생각하지만이 토론에서 그 요점이 누락되었다고 생각합니다. 사용자는 다른 많은 것들을 설치해야하고 cmake를 추가로 설치해야하는지 여부는 큰 문제가되지 않아야합니다. 라이브러리, 컴파일러 툴 체인 및 소프트웨어를 빌드하는 데 필요한 기타 도구에 대해 더 걱정할 것입니다.
lanoxx

24

GNU 코딩 표준에 관한 것이 아닙니다.

autotools의 현재 장점, 특히 automake와 함께 사용하면 Linux 배포판 빌드와 매우 잘 통합된다는 것입니다.

예를 들어 cmake를 사용하면 항상 "DCMAKE_CFLAGS 또는 필요한 -DCMAKE_C_FLAGS입니까?" 아니요, "-DCMAKE_C_FLAGS_RELEASE"도 아닙니다. 또는 -DCMAKE_C_FLAGS_DEBUG. 혼동 스럽습니다-autoconf에서는 ./configure CFLAGS = "-O0 -ggdb3"에 있습니다.

빌드 인프라와의 통합에 SCons는 당신이 사용할 수 없다는 문제가있다 make %{?_smp_mflags}, _smp_mflags대략 시스템 전원을 (관리자가 설정할 수 있음)을 확장한다는 RPM 매크로되는이 경우입니다. 사람들은 -jNCPUS와 같은 것을 환경을 통해 여기에 넣습니다. scons가 작동하지 않으므로 scons를 사용하는 패키지는 일련의 배포판에만 직렬화 될 수 있습니다.


8
+1, 이것이 사실이라면 세상은 더 좋은 곳이 될 것입니다. 안타깝게도 ./configure CFLAGS=-O0makefile에서 CFLAGS를 덮어 쓰고 대신 사용자가 실행해야하는 패키지로는 실패합니다 ./configure --enable-debug. (예 :) tmux.
William Pursell

2
Autotools보다 더 혼란스럽지 않고 William이 올바르게 지적했듯이 makefile에서 잘못 프레임 된 CFLAGS = "<foo>"를 사용하여 지옥으로 파열되었습니다. 아주 간단하게 이것은 "오래된 톱"아이템 중 하나입니다. CMake 예제는 가짜입니다 ... 다시 ... RELEASE 또는 DEBUG를 지정하지 않으면 가장 먼저 할 수 있습니다. 불합격.
Svartalf

17

Autotools에 대해 알아야 할 중요한 것은 일반적인 빌드 시스템이 아니라 GNU 코딩 표준을 구현한다는 것입니다. 모든 GNU 표준을 준수하는 패키지를 만들려면 Autotools가 훌륭한 작업 도구입니다. 그렇지 않으면 Scon 또는 CMake를 사용해야합니다. (예를 들어, 이 질문을 참조하십시오 .)이 일반적인 오해는 Autotools에 대한 대부분의 좌절에서 비롯된 것입니다.


11
GNU 표준으로 Automake가 비활성화 할 수 있습니다 AUTOMAKE_OPTIONS = -foreign당신에 Makefile.am. (또는 -foreign당신의 autogen.sh. 나는 거의 모든 사람들이 이것을 사용한다고 생각합니다.)
Dietrich Epp

9
예. 그러나 Automake가 README 파일이 필요한지 여부와 같은 피상적 인 GNU 규칙을 적용할지 여부 만 제어합니다. installcheckand와 같은 규칙으로 GNU 스타일의 타르볼을 만드는 기본 전제는 바뀌지 않습니다 distclean. Autotools를 사용하는 동안 이러한 종류의 동작을 변경하려고하면 시간이 낭비됩니다.
ptomato

1
그것들은 (이론상) 모든 소프트웨어 패키지가 정확히 같은 방식으로 구축되고 설치 될 수있게합니다.
ptomato

이론 상으로는 다른 툴보다 BROKEN 컴파일러와 OS를 더 적절하게 다루고 거기에 강조된 @ptomato와 같은 피상적 인 규칙을 적용 할 수 있습니다. Linux 또는 현재 * BSD와 같이 구미가없는 최신 운영 체제 에서 최신 도구 (예 : GCC 또는 clang ...)를 사용하는 경우 "규칙"이 필요 하지 않습니다 . 실제로, 그들은 당신을 위해 훨씬 더 많은 일을하고 정직하게 크로스 컴파일을 위해 도울 수 없습니다. 요즘 모든 사용의 거의 절반이 임베디드 Linux 및 * BSD에 사용됩니다. 왜 당신을 도울 수없는 것들을 가지고 가고 있습니까?
Svartalf

귀하의 의견에서 답변을 인정한 것처럼 보이기 때문에 왜 답을 다운 투트했는지 잘 모르겠습니다 ...?
ptomato

9

개발자의 관점에서 볼 때 cmake는 현재 가장 사용하기 쉬운 반면 사용자 관점에서 autotools는 큰 장점이 있습니다.

autotools는 단일 파일 구성 스크립트를 생성하고이를 생성하는 모든 파일은 분배와 함께 제공됩니다. grep / sed / awk / vi의 도움으로 이해하고 수정하기 쉽습니다. 이 파일을 / usr / share / cmak * / Module에있는 Cmake와 비교하면 관리자 액세스 권한이 없으면 사용자가 수정할 수 없습니다.

따라서 무언가가 제대로 작동하지 않으면 일반적으로 빌드 시스템을 이해하지 않고도 표준 유닉스 도구 (grep / sed / awk / vi 등)를 망치로 사용하여 쉽게 "고정"할 수 있습니다.

cmake 빌드 디렉토리를 조사하여 무엇이 잘못되었는지 알아 본 적이 있습니까? 위에서 아래로 읽을 수있는 간단한 셸 스크립트와 비교할 때 생성 된 Cmake 파일을 따라 진행중인 작업을 찾는 것은 매우 어렵습니다. 또한 CMake를 사용하여 FindFoo.cmake 파일을 수정하려면 CMake 언어에 대한 지식이 있어야 할뿐만 아니라 수퍼 유저 권한이 필요할 수도 있습니다.


7
Autotools의 문제는 CMake와 비교하여 "쉽게 수정 된 것"이라고 생각하지 않습니다 ...
sleske

7
autotools는 복잡한 시스템이기 때문에 (CMake와 마찬가지로). Autotools가 "쉽게 수정되었다"고 생각하면 (이 생각할만한 이유가있을 수 있음), 문제를 해결하기 쉬운 방법으로 답변에 설명하는 것이 좋습니다.
sleske 2016 년

5
autotools는 단일 파일 구성 스크립트를 생성하고이를 생성하는 모든 파일은 분배와 함께 제공됩니다. grep / sed / awk / vi의 도움으로 이해하고 수정하기 쉽습니다. 이 파일을 / usr / share / cmak * / Module에있는 Cmake와 비교하면 관리자 액세스 권한이 없으면 사용자가 수정할 수 없습니다. cmake 빌드 디렉토리를 조사하여 무엇이 잘못되었는지 알아 본 적이 있습니까? 무슨 일이 일어나고 있는지 알아내는 생성 Cmake 파일 다음 위에서 아래로 읽을 수있는 간단한 쉘 스크립트에 비해 상당히 어렵다
ARVED

2
네, 감사합니다. 나는 당신의 대답에 그것을 추가하는 자유를 가져 왔습니다. 되 돌리십시오 :-).
sleske

1
항상 자신 만의 로컬 버전의 cmake를 사용할 수 있습니다. 시스템 레벨에 설치된 것을 사용할 이유가 없습니다. 크로스 플랫폼 작업을하는 사람에게는 이것이 정상입니다. 확실히 cmake를 사용하는 방식입니다.
James Moore
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.