Hệ thống xây dựng C ++ - Sử dụng cái gì? [đóng cửa]


136

Tôi đang xem xét bắt đầu một dự án mới trong C ++ - chỉ trong thời gian ban đầu của riêng tôi - và tôi đang điều tra các hệ thống xây dựng có sẵn. Có vẻ như câu trả lời là "Nhiều, và tất cả đều khủng khiếp".

Các tính năng mà tôi đặc biệt cần cho việc này là:

  1. Hỗ trợ C ++ 11
  2. Đa nền tảng (Linux là mục tiêu chính, nhưng cũng có thể xây dựng trên ít nhất Windows)
  3. Hỗ trợ thử nghiệm đơn vị Decent
  4. Hỗ trợ nhiều mô-đun để tách mã
  5. Hỗ trợ tạo mã (Sử dụng asn1c hoặc protobuf - chưa chắc chắn 100%)
  6. Dễ bảo trì

Bây giờ, tôi biết tôi có thể thực hiện 1-4 trong số đó bằng CMake và Autotools một cách dễ dàng. Có lẽ cũng với SCons và Waf và một vài người khác nữa. Vấn đề là tôi chưa bao giờ tìm ra cách tạo mã chính xác bằng cách sử dụng chúng - đó là các tệp nguồn không tồn tại cho đến khi quá trình xây dựng được chạy lần đầu tiên, vì vậy các tệp nguồn mà hệ thống xây dựng phải có thể chuyển đổi thành mã thực thi nhưng thực sự không biết cho đến khi quá trình xây dựng bắt đầu ... (cụ thể là ASN1C tạo ra hàng tá tệp nguồn và tiêu đề phải có thể hoạt động cùng nhau và tập hợp tệp thực sự tạo ra phụ thuộc vào nội dung của tệp asn của bạn) Ngoài ra, thực tế là không ai trong số này đặc biệt dễ bảo trì - CMake và Autotools có bộ tập lệnh khổng lồ của riêng bạn mà bạn cần quản lý để chúng hoạt động,

Vì vậy - những hệ thống xây dựng nào được khuyến nghị cho những thứ như thế này? Hoặc bây giờ tôi sẽ bị mắc kẹt với tạo tập tin và shell script?


11
"Có vẻ như câu trả lời là 'Nhiều, và tất cả đều khủng khiếp'" cũng là ấn tượng của tôi (với việc thêm 'khủng khiếp theo quan điểm của tôi'; Tôi không muốn khái quát quá nhiều với các thuật ngữ như thế này ). Tôi thực sự thiết lập riêng của mình vì lý do đó, và nó hoạt động tốt hơn mong đợi vì nó làm những gì tôi muốn, và làm thế nào tôi luôn muốn mọi thứ hoạt động. Đối với một cái gì đó ít tốn thời gian hơn, có lẽ bạn sẽ phải thông qua các công cụ hiện có và chọn một công cụ mang lại cho bạn ít đau đầu hơn các công cụ khác.
Christian Stieber

4
Hãy thử tup .
Kerrek SB


8
Bạn mong đợi loại hỗ trợ C ++ 11 nào từ hệ thống xây dựng? Đây là thứ bạn nhận được từ trình biên dịch, hệ thống xây dựng không phân tích hoặc thậm chí đọc các tệp nguồn thực tế, chỉ chuyển chúng cho bất kỳ ai cần chúng, phải không?
Baruch

5
Đúng, nhưng làm cho nó dễ dàng bảo trình biên dịch sử dụng hỗ trợ C ++ 11 sẽ tốt. g ++ cần một cờ, bấm một bộ khác, msvc dường như không cần bất kỳ và cứ thế. Ngoài ra, hỗ trợ phát hiện các tính năng c ++ 11 có sẵn sẽ hữu ích vì nó cũng khác nhau giữa các trình biên dịch ...
Graham

Câu trả lời:


117

+1 cho "Nhiều người và họ thật kinh khủng."

Nhưng, "giàu nhất" và "có khả năng mở rộng nhất" có lẽ là CMake , đây là trình tạo Makefile (cũng tạo ra MSVC ++ *.proj/ *.sln) bản địa . Cú pháp kỳ lạ, nhưng một khi bạn học nó, nó có thể cho phép bạn tạo các bản dựng độc đáo cho các nền tảng khác nhau. Nếu tôi "bắt đầu làm mới", có lẽ tôi sẽ sử dụng CMake. Nó sẽ xử lý danh sách của bạn, mặc dù "thế hệ mã" của bạn có thể đảm nhận "một cuộc sống của chính nó" ngoài hệ thống xây dựng tùy thuộc vào những gì bạn muốn làm. (Xem bên dưới.)

Đối với các dự án đơn giản, trình tạo QMake vẫn ổn (bạn không cần sử dụng các thư viện Qt để sử dụng QMake). Nhưng, bạn không mô tả "đơn giản" - tạo mã và "giai đoạn thêm" có nghĩa là bạn có thể muốn CMakehoặc một cái gì đó có API phong phú cho các tiện ích mở rộng của riêng bạn, như Scons(hoặc Waf).

Chúng tôi sử dụng Scons tại nơi làm việc. Nó tạo ra "đạn chống đạn", nhưng nó rất chậm. Không có hệ thống nào khác sẽ chống đạn như Scons. Nhưng, nó chậm. Nó được viết bằng Python và chúng tôi đã mở rộng giao diện cho "tổ chức không gian làm việc" của chúng tôi (nơi chúng tôi chỉ xác định các phụ thuộc mô-đun) và đó là một phần của Sconsý định thiết kế (loại tiện ích mở rộng này thông qua Python). Thuận tiện, nhưng xây dựng là chậm. Bạn có các bản dựng chống đạn (bất kỳ hộp nhà phát triển nào cũng có thể tạo bản phát hành cuối cùng), nhưng nó chậm. Và, nó chậm. Đừng quên rằng nếu bạn sử dụng Scons, tuy nhiên, nó chậm. Và, nó chậm.

Tôi cảm thấy khó chịu khi nghĩ rằng một thập kỷ sau năm 2000, chúng ta vẫn không có ô tô bay. Có lẽ chúng ta sẽ phải đợi một trăm năm nữa hoặc một cái gì đó để có được chúng. Và, sau đó tất cả chúng ta có thể sẽ bay xung quanh trong những chiếc ô tô bay của chúng ta vẫn đang được chế tạo với hệ thống xây dựng tào lao.

Vâng, tất cả họ đều khủng khiếp.

[GIỚI THIỆU VỀ MÃ SỐ]

Sconshoạt động trên "các pha" và chúng "hơi tĩnh". Nó có thể xây dựng mã được tạo như một phần của bản dựng (mọi người đang thực hiện việc này theo một số cách khác nhau), nhưng điều này đã được mô tả là "một cái gì đó rất không giống Scons".

Nếu đơn giản là "tiền xử lý một số tệp và tạo tệp nguồn", thì không có vấn đề gì (bạn có rất nhiều tùy chọn và đây là lý do qmakeđược viết - cho quá trình moctiền xử lý*.hpp/*.cpp tệp).

Tuy nhiên, nếu bạn đang thực hiện việc này theo cách "nặng nề", bạn sẽ cần phải tự viết kịch bản. Ví dụ, chúng tôi đã có các tập lệnh xây dựng một phần để truy vấn cơ sở dữ liệu và tạo các lớp C ++ để giao tiếp giữa các "lớp" (trong phát triển ứng dụng 3 tầng truyền thống). Tương tự, chúng tôi đã tạo mã nguồn máy chủ / máy khách thông qua IDL và thông tin phiên bản nhúng để cho phép nhiều máy khách / máy chủ chạy đồng thời với các phiên bản khác nhau (cho cùng một "máy khách" hoặc "máy chủ"). Rất nhiều mã nguồn được tạo ra. Chúng ta có thể "giả vờ" đó là "hệ thống xây dựng", nhưng thực sự, đó là một cơ sở hạ tầng không tầm thường cho "quản lý cấu hình", trong đó một phần của nó là "hệ thống xây dựng". Ví dụ, hệ thống này phải "gỡ xuống" và "


37
Tôi cũng thích Scons - nhưng tôi nghĩ nó chậm.
Lothar

1
Bạn có thể nhận CMake để xử lý việc tạo mã bằng trình bao bọc Makefile để thực hiện giai đoạn thứ hai tùy chọn khi mã được tạo. Tôi đã có thể hỗ trợ theo dõi phụ thuộc đầy đủ, thoát sớm sau khi tạo mã để kích hoạt lại cmake, v.v. Xem: javaglue.com/javaglue.html#tag:JavaGluecode.google.com/p/javaglue
sdw

3
Gần 2 năm trôi qua, bạn vẫn coi SCons là chậm? Khi tôi đang chọn một hệ thống xây dựng, tôi đã bắt gặp điều này và nó đã góp phần vào quyết định của tôi với SCons.
JBentley

2
@Ben, điều đó đúng, nhưng cũng chậm.
charley

2
Bất cứ ai nhìn vào điều này nên xem xét Meson (sử dụng ninja).
Matthew D. Scholefield

33

Bạn có thể sử dụng Gradle ngay bây giờ: https://docs.gradle.org/civerse/userguide/native_software.html

Điều này dường như đã trưởng thành hơn một chút trong những năm kể từ khi tôi đăng bài này. Trang nói rằng dự án "đang ủ" đã biến mất, nhưng tôi không thể tìm thấy bất kỳ thông báo chính thức nào loại bỏ trạng thái này.


Tôi đồng ý với Gradle. Gradle được thiết kế để có thể mở rộng. Tuy nhiên, nó phụ thuộc vào việc thực hiện plugin nhanh như thế nào. Ngoài ra còn có một số chi phí cho lớp. Cũng cần lưu ý rằng một số plugin có thể cần được tùy chỉnh cho các trường hợp sử dụng của bạn.
JE42

Thật thú vị khi thấy sự quan tâm của gradle trong việc hỗ trợ C ++. Hy vọng họ tạo ra một hệ thống xây dựng đẹp và vững chắc cho các dự án c ++ mà tất cả chúng ta đang thiếu.
hbobenermo

@squid cảm ơn, cập nhật.
Nate Glenn

1
Gradle mạnh mẽ nhưng đơn giản. Không có cú pháp kỳ lạ, một tệp gradle.build duy nhất thường đủ để xây dựng toàn bộ dự án với nhiều đầu ra thực thi (chính, kiểm tra, v.v.). Không có tập tin bán phá giá trên tất cả các thư mục nguồn. Siêu thân thiện cho phiên bản.
Overdrivr

1
Tôi đã dành hai ngày qua để chiến đấu với Gradle, chỉ cố gắng tạo ra một thư viện, ứng dụng và ứng dụng "thế giới xin chào" và tôi không thể nói rằng tôi có thể giới thiệu nó cho một dự án mới. Các công cụ có thể đều ở đó, nhưng tài liệu thì không (mang lại lợi ích cho sự nghi ngờ). Có lẽ những người bạn thấy nó khả thi có thể chỉ ra tài nguyên yêu thích của bạn?
jwm

16

Tôi đã tìm thấy những thứ này, cá nhân tôi chưa sử dụng tất cả chúng:

Ninja , một hệ thống xây dựng nhỏ tập trung vào tốc độ. Google hiện sử dụng Ninja để xây dựng Android thay vì liên kết Make : .

Lắc , một hệ thống xây dựng mạnh mẽ và nhanh chóng.

Tup , một hệ thống xây dựng hiệu suất cao. Thuật toán dựa trên thiết kế. Phân tích Tup .

Tất cả bây giờ là đa nền tảng và hỗ trợ Windows. Tôi vẫn chưa chắc chắn về các yêu cầu còn lại của bạn vì một lần nữa, tôi vẫn chưa tự mình kiểm tra chúng. Chúng đang được sử dụng trong phát triển thương mại, CIG đã chọn Ninja. Tôi đã sử dụng và yêu thích sự dễ dàng và tốc độ của Ninja với trình tạo dự án. Hai cái đầu giống với Scons, Ant, v.v.


1
Tup sẽ làm rối tung các tra cứu biểu tượng, không chơi tốt với bất kỳ hệ thống xây dựng nào khác (thực sự), không chơi độc đáo với các đầu ra ngẫu nhiên (chẳng hạn như các lớp được tạo bởi javaccác lớp bên trong, được phân tách thành class$1.classcác tệp), là viết kém và sử dụng hack hệ thống để đạt được những gì nó làm. Thật tuyệt vời cho các hệ thống nhỏ; không thể nhầm lẫn cho các dự án lớn hơn.
Qix - MONICA ĐƯỢC PHÂN PHỐI

@Qix: Bạn có thể không tách đầu ra khỏi kho lưu trữ của mình không?
Kerrek SB

1
@KerrekSB Bạn có thể, nhưng đó không phải là vấn đề với tra cứu biểu tượng. Tup sử dụng FUSE và gắn phần mềm trung gian của riêng mình vào .tup/mnt. Sau đó, nó chạy tất cả các chương trình xây dựng trong một thư mục (tức là .tup/mnt/@tupjob-XXXXX) dưới dạng thư mục làm việc để theo dõi đọc / ghi, thực thi cấu hình xây dựng. Nó hoạt động tốt, trừ khi đường dẫn được lưu trữ tuyệt đối (tức là có ký hiệu). Khi bạn biên dịch nhị phân, đường dẫn biểu tượng được lưu trữ trong chính nhị phân. Điều đó có nghĩa là khi GDB cố gắng tải các ký hiệu, nó sẽ tìm tupjobđường dẫn đó, không tồn tại gây ra lỗi.
Qix - MONICA ĐƯỢC PHÂN PHỐI

Cả Tup và Ninja đều là những công cụ cấp thấp, thấp hoặc thấp hơn Make. Chúng không phù hợp với C ++. Tôi thậm chí sẽ không gọi các công cụ này tự xây dựng các hệ thống vì chúng thiếu rất nhiều tính năng quan trọng ở cấp độ cao hơn mà các hệ thống xây dựng thực sự cung cấp để đối phó với các dự án thực tế phức tạp. Một số hệ thống này có thể sử dụng Ninja làm back-end.
Johan Boulé

11

Scons là hệ thống rất thân thiện và linh hoạt, nhưng bạn nói đúng, Lothar, nó thực sự rất chậm.

Nhưng có một cách để tăng hiệu suất của các chương trình được viết bằng Python. Việc sử dụng JIT này. Trong tất cả các dự án đã biết, PyPy là một triển khai JIT được hỗ trợ rất mạnh mẽ, phát triển nhanh và có động lực. Khả năng tương thích PyPy với Python 2.7 đơn giản là tuyệt vời. Tuy nhiên, Scons tuyên bố là dự án không được hỗ trợ trên wiki tương thích PyPy . Waf , mặt khác, được mô hình hóa như là máy phát tự động dựa trên python, được hỗ trợ đầy đủ bởi cơ sở hạ tầng PyPy. Trong các dự án của tôi, tốc độ lắp ráp đã tăng gấp 5 - 7 lần khi chuyển sang PyPy. Bạn có thể xem các báo cáo hiệu suất từ ​​PyPy .

Đối với hệ thống xây dựng hiện đại và tương đối nhanh, Waf là lựa chọn tốt.


Điều đáng chú ý là các scons hiện được đánh dấu là "Tương thích" trên trang wiki được liên kết, vì vậy rõ ràng giờ đây nó hoạt động rất tốt với PyPy.
Tên giả

8

Hệ thống xây dựng của Google là một lựa chọn tốt: http://bazel.io/


3
"Đa nền tảng (Linux là mục tiêu chính, nhưng cũng có thể xây dựng trên ít nhất Windows)". Câu hỏi thường gặp của Bazel cho biết "Chúng tôi hiện đang tích cực cải thiện hỗ trợ Windows, nhưng vẫn không thể sử dụng được."
Michael Mrozek

3
Tôi không chắc liệu đó là chính hệ thống hay anh chàng đã thiết lập dự án, nhưng tôi bị đau ở lưng khi sử dụng nó @ work. Điều đó rất không linh hoạt (theo nghĩa là nó chỉ hỗ trợ một cách làm công cụ, thường không tối ưu, nếu không đáng sợ), không đủ mạnh mẽ, tài liệu kém (các trường hợp cơ bản), có rất ít cộng đồng vì vậy đừng hy vọng stackoverflow sẽ cứu bạn , khá phụ thuộc vào chính nó, không chơi tốt với hầu hết các IDE trên hầu hết các hệ thống, v.v., v.v. Vì vậy, trừ khi bạn là một fan hâm mộ của google - hãy tránh xa nó (btw có một phiên bản facebook của cái này, được gọi là Buck - dành cho người hâm mộ facebook)
Slava

Này, tôi thấy nó rất dễ sử dụng sau 6 tuần cố gắng để CMake hoạt động. Tôi muốn nó tải xuống các phụ thuộc của bên thứ 3 và biên dịch chúng (vì tôi đã quen với các công cụ xây dựng đẹp từ python và JavaScript). Điều này làm cho nó dễ dàng nhưng có một nhược điểm là bạn có thể phải viết các tệp bazel của riêng mình cho các bên thứ 3 không hỗ trợ. Họ cần một repo trung tâm để lưu trữ những thứ này trong i'ze reckon.
CpILL

6

Tôi đã sử dụng SCons và rất ấn tượng bởi hệ thống xây dựng này. SCons có thể mở rộng bằng chính python và python - thật tuyệt vời, vì Python có tất cả những gì bạn cần, chỉ cần mã logic, tất cả các chức năng cấp thấp đã được triển khai trong SCons và Python và là nền tảng chéo. Nếu có kỹ năng lập trình tốt thì tập lệnh xây dựng của bạn sẽ trông hoàn hảo và dễ dàng.

Tạo, CMake và các hệ thống xây dựng tương tự có vẻ như là rác của macro. Waf là SCons tương tự. Tôi đang thử Waf nhưng SCons sẽ thân thiện hơn và vì vậy tôi đã ở lại với SCons.

Theo ý kiến ​​của đám đông, SCons quá chậm, nhưng ở giữa một dự án, tôi không thấy bất kỳ sự khác biệt nào giữa chế tạo và SCons bởi tốc độ xây dựng. Thay vào đó, SCons đã làm việc tốt với các bản dựng song song, trong khi tạo ra những rắc rối lớn với nó.

Ngoài ra, SCons cho phép bạn nhận - cấu hình, xây dựng, triển khai, tạo cấu hình từ các mẫu, chạy thử nghiệm và thực hiện bất kỳ tác vụ nào khác có thể được thực hiện có thể mã hóa bằng python và SCons - tất cả trong một. Đó là một lợi thế rất lớn.

Đối với một dự án đơn giản, CMake cũng là một lựa chọn tốt.


3
Vấn đề của tôi ở đây là tôi hư hỏng. Tôi là một nhà phát triển Java chuyên nghiệp và các công cụ như Gradle trong thế giới Java là loại công cụ mà tôi thực sự muốn có để phát triển C ++. Tôi có thể thiết lập một dự án lớp, không có phụ thuộc bên ngoài, sử dụng tệp xây dựng một dòng. Đó là nó. Các dự án đa mô-đun có nhiều phụ thuộc vẫn dễ dàng thực hiện và thực sự cân nhắc với cấu hình ít hơn nhiều so với một dự án C ++ đơn giản ...
Graham

Tôi gặp vấn đề khi xây dựng các gói khác sử dụng Scons vì nó không trừu tượng các cờ cấu hình hệ thống như -I bao gồm các thư mục và thư mục thư viện -L. Sẽ không mất CFLAGS, bạn thường phải sửa đổi từng tập lệnh scons để khiến nó tìm đúng chỗ.
ACyclic

5

chỉ để thêm xu của tôi: tiền

http://industriousone.com/premake

cũng có một trang web chuyên dụng trên wiki.


2
Thật không may, Premake không hỗ trợ tạo mã theo yêu cầu của OP. Và tôi sẽ không gọi hỗ trợ của nó để kiểm tra đơn vị là "đàng hoàng", mặc dù có một vài điều bạn có thể làm.
ergosys

@ergosys Tôi nhận thấy rằng kiến ​​không được đề cập, antcũng hỗ trợ C / C ++, hãy xem điều này có tốt cho bạn không, đó là tên cuối cùng tôi có, tôi chỉ sử dụng Makefiles và Cmake cho việc này.
dùng827992

2

Bạn có thể sử dụng Ceedling . Lưu ý, tuy nhiên, nó chỉ hỗ trợ C vào lúc này và nó được kết hợp chặt chẽ với các khung thử nghiệm Unity và CMock của tác giả.

Nó có thể được rẽ nhánh và sửa đổi để làm việc với trình biên dịch C ++ và khung thử nghiệm / mô phỏng đơn vị khá dễ dàng.

Ngoài ra Tup là một đề cập xứng đáng. Nó cực kỳ nhanh nhưng không biết gì về các khung kiểm tra, v.v. điều đó có nghĩa là bạn sẽ phải viết hệ thống xây dựng của riêng mình bằng Tup. Nếu bạn có kế hoạch thực hiện TDD, Tup có lẽ là con đường để đi.

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.