Sự khác biệt giữa Autotools, Cmake và Scons là gì?


259

Sự khác biệt giữa Autotools, Cmake và Scons là gì?


Chủ đề này đã được thảo luận trong wiki Scons . Tôi khuyên bạn nên truy cập các liên kết sau: 1. scons.org/wiki/SconsVsOtherBuildTools Bạn đã truy cập một chủ đề thảo luận rất giống nhau trong Diễn đàn Ubuntu ?
bhadra

Bạn có thể kiểm tra pdf www-alt.gsi.de/document/DOC-2007-Sep-17-1.pdf này ; nó có ưu và nhược điểm và một số chi tiết về mỗi công cụ.
Adam

Câu trả lời:


190

Trên thực tế, Autotools 'chỉ có' ân huệ tiết kiệm 'thực sự là đó là những gì tất cả các dự án GNU đang sử dụng.

Các vấn đề với Autotools:

  • Cú pháp macro thực sự ARCane m4 kết hợp với dài dòng, kịch bản lệnh shell xoắn để kiểm tra tính "tương thích", v.v.
  • Nếu bạn không chú ý, bạn sẽ làm rối tung khả năng biên dịch chéo (Cần lưu ý rõ ràng rằng Nokia đã đưa ra Scratchbox / Scratchbox2 để thiết lập Autotools bị hỏng rất cao cho Maemo / Meego.) Nếu bạn, cho bất kỳ Lý do, đã cố định, các đường dẫn tĩnh trong các thử nghiệm của bạn, bạn sẽ phá vỡ hỗ trợ biên dịch chéo vì nó sẽ không tôn trọng đặc tả hệ thống của bạn và nó sẽ lấy nội dung ra khỏi hệ thống máy chủ của bạn. Nếu bạn phá vỡ hỗ trợ biên dịch chéo, nó sẽ khiến mã của bạn không thể sử dụng được cho những thứ như OpenEmbedded và làm cho nó "vui" cho các bản phân phối đang cố gắng xây dựng các bản phát hành của chúng trên trình biên dịch chéo thay vì trên mục tiêu.
  • Có một số lượng lớn thử nghiệm cho các vấn đề với các trình biên dịch bị hỏng, cổ xưa mà NOBODY hiện đang sử dụng với hầu hết mọi thứ sản xuất trong thời đại ngày nay. Trừ khi bạn xây dựng một cái gì đó như glibc, libstdc ++ hoặc GCC trên một phiên bản thực sự cổ xưa của Solaris, AIX, hoặc tương tự, các bài kiểm tra là một sự lãng phí thời gian và là nguồn gốc cho nhiều, nhiều sự phá vỡ tiềm năng của những điều như đã đề cập ở trên.
  • Đó là một kinh nghiệm đau đớn để có được một thiết lập Autotools để xây dựng mã có thể sử dụng cho một hệ thống Windows. (Mặc dù tôi ít sử dụng cho Windows, nhưng đây là một vấn đề nghiêm trọng nếu bạn đang phát triển mã đa nền tảng.)
  • Khi nó bị hỏng, bạn sẽ dành GIỜ để theo đuổi đuôi của mình khi cố gắng sắp xếp những thứ mà bất kỳ ai viết kịch bản đã sai để sắp xếp bản dựng của bạn (Thực tế, đây là điều tôi đang cố gắng thực hiện (hoặc, đúng hơn là, loại bỏ hoàn toàn Autotools - Tôi nghi ngờ có đủ thời gian trong phần còn lại của tháng này để sắp xếp mớ hỗn độn ...) cho công việc ngay bây giờ khi tôi đang gõ cái này. Apache Thrift có một trong những hệ thống xây dựng MÔI GIỚI không giao nhau -compile.)
  • Người dùng "bình thường" thực sự KHÔNG chỉ làm "./có hình; tạo" - đối với nhiều thứ, họ sẽ rút gói được cung cấp bởi ai đó, như từ PPA hoặc nhà cung cấp phân phối của họ. Người dùng "bình thường" không phải là nhà phát triển và không lấy tarball trong nhiều trường hợp. Đó là sự hợm hĩnh từ phía mọi người vì cho rằng đó sẽ là trường hợp ở đó. Người dùng thông thường cho tarball là các nhà phát triển đang làm mọi thứ, vì vậy họ sẽ bị đánh sập với sự đổ vỡ nếu nó ở đó.

Nó hoạt động ... hầu hết thời gian ... là tất cả những gì bạn có thể nói về Autotools. Đây là một hệ thống giải quyết một số vấn đề chỉ thực sự liên quan đến dự án GNU ... cho mã công cụ cơ bản, cốt lõi của họ. (Chỉnh sửa (24/05/2014): Cần lưu ý rằng loại mối quan tâm này là một điều BAD tiềm ẩn đáng lo ngại- Heartbleed một phần xuất phát từ suy nghĩ này và với các hệ thống hiện đại, chính xác, bạn thực sựkhông có bất kỳ hoạt động kinh doanh nào liên quan đến phần lớn những gì Autotools sửa chữa. GNU có thể cần phải thực hiện loại bỏ codebase, xem xét những gì đã xảy ra với Heartbleed) Bạn có thể sử dụng nó để thực hiện dự án của mình và nó có thể hoạt động tốt cho một dự án nhỏ mà bạn không muốn làm việc ở bất cứ đâu trừ Linux hoặc ở đâu GNU toolchain rõ ràng đang hoạt động chính xác. Tuyên bố rằng nó "tích hợp độc đáo với Linux" là một tuyên bố táo bạo và khá không chính xác . Nó tích hợp với bộ công cụ GNU một cách hợp lý và giải quyết các vấn đề mà CNTT gặp phải với các mục tiêu của nó.

Điều này không có nghĩa là không có vấn đề với các tùy chọn khác được thảo luận trong chuỗi ở đây.

SCons là một thay thế cho Make / GMake / vv. và trông khá đẹp, tất cả những thứ được xem xét Tuy nhiên ...

  • Nó vẫn thực sự là một công cụ chỉ dành cho POSIX. Bạn có thể dễ dàng nhờ MinGW xây dựng công cụ Windows hơn với Autotools, nhưng nó vẫn thực sự hướng đến việc thực hiện công cụ POSIX và bạn cần cài đặt Python SCons để sử dụng nó.
  • Nó có vấn đề khi thực hiện biên dịch chéo trừ khi bạn đang sử dụng một cái gì đó như Scratchbox2.
  • Phải thừa nhận là chậm hơn và kém ổn định hơn CMake từ so sánh của chính họ. Họ đưa ra một cách nửa vời (phía POSIX cần tạo / gmake để xây dựng ...) những tiêu cực cho CMake so với SCons. (Bên cạnh đó, nếu bạn cần RẤT NHIỀU khả năng mở rộng hơn các giải pháp khác, bạn nên tự hỏi liệu dự án của bạn có quá phức tạp không ...)

Các ví dụ đưa ra cho CMake trong chủ đề này là một chút không có thật.

Tuy nhiên...

  • Bạn sẽ cần học một ngôn ngữ mới.
  • Có những thứ phản trực giác nếu bạn đã sử dụng để Tạo, SCons hoặc Autotools.
  • Bạn sẽ cần cài đặt CMake trên hệ thống mà bạn đang xây dựng.
  • Bạn sẽ cần một trình biên dịch C ++ vững chắc nếu bạn không có các tệp nhị phân dựng sẵn cho nó.

Trong thực tế, mục tiêu của bạn nên quyết định những gì bạn chọn ở đây.

  • Bạn có cần phải đối phó với RẤT NHIỀU công cụ bị hỏng để tạo ra một nhị phân làm việc hợp lệ không? Nếu có, bạn có thể muốn xem xét Autotools, nhận thức được những nhược điểm tôi đã đề cập ở trên. CMake có thể đối phó với rất nhiều điều này, nhưng nó ít lo lắng hơn so với Autotools. SCons có thể được mở rộng để lo lắng về điều đó, nhưng đó không phải là câu trả lời ngoài lề.
  • Bạn có cần phải lo lắng về các mục tiêu Windows? Nếu vậy, Autotools sẽ hoàn toàn không hoạt động. Nếu vậy, SCons có thể / có thể không phải là một lựa chọn tốt. Nếu vậy, CMake là một lựa chọn vững chắc.
  • Bạn có cần phải lo lắng về việc biên dịch chéo (các ứng dụng / thư viện phổ quát, những thứ như Google Protobufs, Apache Thrift, v.v. NÊN quan tâm đến điều này ...)? Nếu vậy, Autotools có thểlàm việc cho bạn miễn là bạn không cần phải lo lắng về Windows, nhưng bạn sẽ dành nhiều thời gian để duy trì hệ thống cấu hình của mình khi mọi thứ thay đổi theo bạn. SCons gần như không hoạt động ngay lúc này trừ khi bạn đang sử dụng Scratchbox2 - nó thực sự không có khả năng biên dịch chéo và bạn sẽ cần sử dụng khả năng mở rộng đó và duy trì nó theo cách tương tự như bạn sẽ làm với Automake. Nếu vậy, bạn có thể muốn xem xét CMake vì nó hỗ trợ biên dịch chéo mà không có nhiều lo lắng về việc rò rỉ ra khỏi hộp cát và sẽ hoạt động với / không có thứ gì đó như Scratchbox2 và tích hợp độc đáo với những thứ như OpenEmbedded.

Có một lý do rất nhiều, nhiều dự án đang bỏ qua qmake, Autotools, v.v. và chuyển sang CMake. Cho đến nay, tôi có thể hoàn toàn mong đợi một dự án dựa trên CMake sẽ rơi vào tình huống biên dịch chéo hoặc vào một thiết lập VisualStudio hoặc chỉ cần một số lượng nhỏ để dọn dẹp vì dự án không dành cho các bộ phận chỉ dành cho Windows hoặc OSX đến cơ sở mã. Tôi thực sự không thể mong đợi rằng trong một dự án dựa trên SCons - và tôi hoàn toàn mong đợi các dự án Autotools 1/3 trở lên sẽ nhận được SOMETHING sai khi loại trừ nó xây dựng ngay trên bất kỳ bối cảnh nào ngoại trừ một máy chủ xây dựng một hoặc một Scratchbox2.


12
Phần đề cập đến Heartbleed làm mất đi sự giận dữ thất vọng này. Vấn đề là OpenSSL KHÔNG sử dụng gói loại cấu hình để phát hiện các thư viện hệ thống bị hỏng nhưng đang triển khai lại và đánh bại các nhà phát triển nền tảng đã tạo ra các thư viện sẽ phát hiện ra lỗ hổng sớm hơn nhiều. Một lý do cho các chương trình cổng là chúng trở nên chất lượng cao hơn vì chúng ít phụ thuộc vào những giả định nhỏ mà bạn không nhận ra mình đang thực hiện
Rob11311

9
Vấn đề là nó hoàn toàn không làm mất giá trị của nó. Với Autotools, bạn lo lắng về việc bù đắp cho những thứ như thế - những lần triển khai lại đó là một MỞ RỘNG của chính suy nghĩ đó. Đưa nó lên cấp độ tiếp theo như nó đã được. Bạn nên xem điều đó từ bối cảnh đó ... tại thời điểm đó nó không làm mất giá trị của nó. Bạn đã không hiểu nguyên nhân sâu xa trong lý luận của mình - chỉ những gì đã xảy ra. Tôi đang tìm hiểu chính xác điều đó đã mang nó đến cùng với Shellshock và một vài người khác thích nó. Nếu nó bị hỏng, bạn nên CỐ ĐỊNH nó. Nếu bạn không thể- bạn nên hỏi tại sao cứ tiếp tục như vậy.
Svartalf

5
Tôi không nghi ngờ rằng autotools và scons hút, nhưng câu trả lời này làm rất kém khi chú ý đến nhược điểm của CMake (hệ thống xây dựng ưa thích của tôi, chỉ vì trạng thái xây dựng hệ thống rất, rất buồn). Về cơ bản, CMake là một phần nhỏ của sự không nhất quán với sự hỗ trợ tích hợp cho các trường hợp cạnh riêng lẻ hơn là một số trừu tượng cốt lõi xử lý hầu hết mọi thứ. Đó chắc chắn là băng keo và dây điện lập trình. Tôi chắc chắn mình đang làm gì đó sai, nhưng nó không hỗ trợ VisualStudio trừ khi bạn thấy một dự án VS trên mỗi CMakeLists.txt có thể chấp nhận được (Tôi không phải là người dùng VS, nhưng Bạn bè của tôi nói với tôi rằng nó rất tệ).
weberc2

5
Không giống như các công cụ lập trình bị ghét khác , không có đủ tài liệu để tạo ra một cuốn sách có tên là "CMake, những phần hay" (có thể là một cuốn sách nhỏ hoặc một bài đăng trên blog), và đó là một phần nhỏ của thiết kế tồi hơn PHP .
weberc2

2
@JAB Tôi được người dùng VS nói rằng đây không phải là thành ngữ. Trên thực tế, CMake đã được thay thế làm hệ thống xây dựng cho dự án của chúng tôi vì không ai có thể tìm ra cách sản xuất các tệp VS Project "thành ngữ".
weberc2

73

Một phân biệt quan trọng phải được thực hiện giữa những người sử dụng các công cụ. Cmake là một công cụ phải được người dùng sử dụng khi xây dựng phần mềm. Các autotools được sử dụng để tạo tarball phân phối có thể được sử dụng để xây dựng phần mềm chỉ bằng các công cụ tiêu chuẩn có sẵn trên bất kỳ hệ thống tuân thủ SuS nào. Nói cách khác, nếu bạn đang cài đặt phần mềm từ tarball được xây dựng bằng autotools, thì bạn không sử dụng autotools . Mặt khác, nếu bạn đang cài đặt phần mềm sử dụng Cmake, thì bạn đang sử dụng Cmake và phải cài đặt phần mềm để xây dựng phần mềm.

Phần lớn người dùng không cần cài đặt autotools trên hộp của họ. Trong lịch sử, nhiều sự nhầm lẫn đã được gây ra bởi vì nhiều nhà phát triển phân phối tarball không đúng định dạng buộc người dùng phải chạy autoconf để tạo lại tập lệnh cấu hình và đây là lỗi đóng gói. Nhiều sự nhầm lẫn đã được gây ra bởi thực tế là hầu hết các bản phân phối linux chính đều cài đặt nhiều phiên bản của autotools, khi chúng không nên cài đặt bất kỳ phiên bản nào trong số chúng theo mặc định. Thậm chí nhiều sự nhầm lẫn còn xảy ra do các nhà phát triển cố gắng sử dụng hệ thống kiểm soát phiên bản (ví dụ: cvs, git, svn) để phân phối phần mềm của họ thay vì xây dựng tarball.


5
Đúng, mặc dù bạn thấy nó có vẻ tệ khi sử dụng VCS để phân phối phần mềm. Nếu nội dung của thanh toán hoặc bản sao giống như nội dung của tarball, tại sao bạn lại đề xuất tarball?
d -_- b

5
@Toor Tôi không hiểu câu hỏi của bạn. Tất cả các dự án tôi làm để sản xuất một tarball khác với thanh toán VCS. Giữ hai sự khác biệt giúp phân phối đáng tin cậy.
William Pursell

13
Đúng là rất nhiều dự án yêu cầu mọi người sử dụng VCS để có bản phát hành mới nhất, nhưng điều đó chỉ phù hợp với các nhà phát triển. Thật không may, nhiều người dùng không hiểu được sự khác biệt giữa tarball phát hành và VCS. Cố gắng xây dựng từ VCS áp đặt nhiều phụ thuộc hơn. Người dùng có thể cần asciidochoặc help2manhoặc doxygenhoặc, quan trọng, sự kết hợp Autotool đúng. Đây là một vấn đề tiếp thị lớn đối với các autotools. Người dùng nghĩ sai rằng họ cần cài đặt autoconf vì họ không hiểu sự khác biệt giữa tarball và VCS.
William Pursell

3
Tại sao dự án không thể phân phối đầu ra, tệp dự án và Makefiles của Cmake cho các nền tảng phổ biến, ví dụ: Win, Linux và MacOSX? Có vẻ như tình huống tương tự như với các công cụ lex / yacc, bạn bao gồm mã C đã được chỉnh sửa để có thể được xây dựng trên nền tảng mà không cần các công cụ
Rob11311

3
Mặc dù tôi nghĩ rằng những điểm được đề cập trong cuộc thảo luận này là chính xác, tôi tin rằng cuộc thảo luận này đang thiếu điểm. Người dùng cần cài đặt toàn bộ những thứ khác và liệu anh ta có cần cài đặt thêm hay không không phải là một vấn đề lớn. Tôi sẽ lo lắng nhiều hơn về các thư viện, chuỗi công cụ trình biên dịch và các công cụ khác cần thiết để xây dựng phần mềm.
lanoxx

24

Đây không phải là về các tiêu chuẩn mã hóa GNU.

Những lợi ích hiện tại của autotools - cụ thể là khi được sử dụng với automake - là chúng tích hợp rất tốt với việc xây dựng phân phối Linux.

Ví dụ với cmake, nó luôn luôn "là -DCMAKE_CFLAGS hoặc -DCMAKE_C_FLAGS mà tôi cần?" Không, không phải, đó là "-DCMAKE_C_FLAGS_RELEASE". Hoặc -DCMAKE_C_FLAGS_DEBUG. Thật khó hiểu - trong autoconf, nó chỉ là ./mình CFLAGS = "- O0 -ggdb3" và bạn có nó.

Khi tích hợp với cơ sở hạ tầng xây dựng, scons có vấn đề mà bạn không thể sử dụng make %{?_smp_mflags}, _smp_mflagstrong trường hợp này là macro RPM mở rộng gần như (quản trị viên có thể đặt nó) sức mạnh hệ thống. Mọi người đặt những thứ như -jNCPUS ở đây thông qua môi trường của họ. Với các scons không hoạt động, vì vậy các gói sử dụng scons chỉ có thể được tạo nối tiếp trong các bản phát hành.


8
+1 và thế giới sẽ là một nơi tốt hơn nếu điều này là đúng. Đáng buồn thay, ./configure CFLAGS=-O0thường thất bại với các gói ghi đè CFLAGS trong tệp thực hiện và thay vào đó yêu cầu người dùng chạy ./configure --enable-debug. (ví dụ tmux).
William Pursell

2
Nó không khó hiểu hơn Autotools và như William chỉ ra một cách chính xác, nó bị đánh bại tất cả xuống địa ngục với một CFLAGS đóng khung không đúng cách = "<foo>" trong tệp tạo tệp. Rất đơn giản, đây là một trong những mặt hàng "cưa cũ". Và các ví dụ CMake là không có thật ... một lần nữa ... Bạn có thể làm điều đầu tiên nếu bạn không chỉ định ĐÁNG TIN CẬY hoặc DEBUG. THẤT ​​BẠI.
Svartalf

17

Điều quan trọng cần biết về Autotools là chúng không phải là một hệ thống xây dựng chung - chúng thực hiện các tiêu chuẩn mã hóa GNU và không có gì khác. Nếu bạn muốn tạo một gói tuân theo tất cả các tiêu chuẩn GNU, thì Autotools là một công cụ tuyệt vời cho công việc. Nếu bạn không, thì bạn nên sử dụng Scons hoặc CMake. (Ví dụ, xem câu hỏi này .) Sự hiểu lầm phổ biến này là nơi mà hầu hết sự thất vọng với Autotools đến từ.


11
Các tiêu chuẩn GNU có thể bị vô hiệu hóa trong Automake với AUTOMAKE_OPTIONS = -foreigntrong của bạn Makefile.am. (Hoặc -foreigntrong của bạn autogen.sh. Tôi nghĩ rằng hầu hết mọi người đều sử dụng điều này.)
Dietrich Epp

9
Có, nhưng điều đó chỉ kiểm soát liệu Automake có thực thi các quy tắc GNU hời hợt như liệu tệp README có được yêu cầu hay không. Nó không thay đổi tiền đề cơ bản của việc xây dựng một tarball kiểu GNU với các quy tắc như installcheckdistclean. Nếu bạn cố gắng thay đổi loại hành vi đó trong khi vẫn sử dụng Autotools, thì bạn chỉ đang lãng phí thời gian của mình.
ptomato

1
Chúng (về lý thuyết) cho phép tất cả các gói phần mềm được xây dựng và cài đặt theo cùng một cách chính xác.
ptomato

Về mặt lý thuyết, chúng cho phép bạn đối phó với các trình biên dịch và hệ điều hành BROKEN phù hợp hơn so với các công cụ khác và áp dụng các quy tắc hời hợt như @ptomato được nêu bật ở đó. Nếu bạn đang sử dụng một công cụ hiện đại (ví dụ GCC hoặc clang ... chẳng hạn) trên một hệ điều hành hiện đại không có gì thực sự ngớ ngẩn, hãy nói Linux hoặc * BSD hiện tại, bạn không CẦN "quy tắc" ở đó. Họ, thực sự, làm rất nhiều, nhiều công việc hơn cho bạn và không thể giúp đỡ, thành thật để biên dịch chéo. Gần một nửa số lần sử dụng hiện nay là dành cho Linux nhúng và * BSD. TẠI SAO bạn đi với những thứ không thể giúp bạn ở đó?
Svartalf

Không chắc chắn lý do tại sao bạn đánh giá thấp câu trả lời, vì bạn dường như thừa nhận nó trong bình luận của bạn ...?
ptomato

9

Mặc dù theo quan điểm của các nhà phát triển, cmake hiện dễ sử dụng nhất, từ góc độ người dùng tự động có một lợi thế lớn

autotools tạo một tập lệnh cấu hình tập tin duy nhất và tất cả các tập tin để tạo nó được phân phối cùng với bản phân phối. thật dễ hiểu và khắc phục với sự trợ giúp của grep / sed / awk / vi. So sánh điều này với Cmake nơi có rất nhiều tệp được tìm thấy trong / usr / share / cmak * / Mô-đun mà người dùng không thể sửa được trừ khi anh ta có quyền truy cập quản trị viên.

Vì vậy, nếu một cái gì đó không hoàn toàn hoạt động, nó thường có thể dễ dàng được "sửa" bằng cách sử dụng các công cụ Unix tiêu chuẩn (grep / sed / awk / vi, v.v.) theo cách búa tạ mà không cần phải hiểu hệ thống xây dựng.

Bạn đã bao giờ đào qua thư mục xây dựng cmake của bạn để tìm hiểu những gì sai? So với shellscript đơn giản có thể đọc từ trên xuống dưới, theo các tệp Cmake được tạo để tìm hiểu những gì đang diễn ra là khá khó khăn. Ngoài ra, với CMake, việc điều chỉnh các tệp FindFoo.cmake không chỉ đòi hỏi kiến ​​thức về ngôn ngữ CMake mà còn có thể yêu cầu các đặc quyền siêu người dùng.


7
Tôi không nghĩ các vấn đề với Autotools là "dễ dàng sửa chữa" so với CMake ...
sleske

7
Bởi vì autotools là một hệ thống phức tạp (giống như CMake). Nếu bạn nghĩ Autotools là "dễ dàng sửa chữa" (có thể có những suy nghĩ để nghĩ về điều này), thì IMHO sẽ tốt để giải thích trong câu trả lời về cách giải quyết vấn đề dễ dàng hơn.
sleske

5
autotools tạo một tập lệnh cấu hình tập tin duy nhất và tất cả các tập tin để tạo nó được phân phối cùng với bản phân phối. thật dễ hiểu và khắc phục với sự trợ giúp của grep / sed / awk / vi. So sánh điều này với Cmake nơi có rất nhiều tệp được tìm thấy trong / usr / share / cmak * / Mô-đun mà người dùng không thể sửa được trừ khi anh ta có quyền truy cập quản trị viên. Bạn đã bao giờ đào qua thư mục xây dựng cmake của bạn để tìm hiểu những gì sai? So với shellscript đơn giản mà có thể được đọc từ trên xuống dưới, sau các tập tin cmake tạo ra để tìm hiểu những gì đang xảy ra là khá khó khăn
arved

2
Vâng, điều đó làm cho cảm giác, cảm ơn. Tôi đã tự do thêm nó vào câu trả lời của bạn. Vui lòng hoàn nguyên :-).
sleske

1
Bạn luôn có thể sử dụng phiên bản địa phương của cmake; không có lý do để sử dụng những gì được cài đặt ở cấp hệ thống. Đối với bất kỳ ai làm công việc đa nền tảng, điều đó hoàn toàn bình thường; Đó chắc chắn là cách tôi sử dụng cmake hầu hết thời gian.
James Moore
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.