Câu trả lời:
Make (hay đúng hơn là Makefile) là một hệ thống xây dựng - nó điều khiển trình biên dịch và các công cụ xây dựng khác để xây dựng mã của bạn.
CMake là một trình tạo các hệ thống xây dựng. Nó có thể tạo Makefiles, nó có thể tạo các tệp xây dựng Ninja, nó có thể tạo các dự án KDEvelop hoặc Xcode, nó có thể tạo ra các giải pháp Visual Studio. Từ cùng một điểm bắt đầu, cùng một tệp CMakeLists.txt. Vì vậy, nếu bạn có một dự án độc lập với nền tảng, CMake là một cách để làm cho nó xây dựng độc lập với hệ thống.
Nếu bạn có các nhà phát triển Windows đã sử dụng cho Visual Studio và các nhà phát triển Unix, những người thề bằng GNU Make, CMake sẽ là một trong những cách để đi.
Tôi luôn khuyên bạn nên sử dụng CMake (hoặc một trình tạo hệ thống xây dựng khác, nhưng CMake là sở thích cá nhân của tôi) nếu bạn dự định dự án của bạn là đa nền tảng hoặc có thể sử dụng rộng rãi. Bản thân CMake cũng cung cấp một số tính năng hay như phát hiện phụ thuộc, quản lý giao diện thư viện hoặc tích hợp với CTest, CDash và CPack.
Sử dụng một trình tạo hệ thống xây dựng làm cho dự án của bạn có nhiều bằng chứng trong tương lai. Ngay cả khi bây giờ bạn chỉ là GNU-Make, điều gì sẽ xảy ra nếu sau này bạn quyết định mở rộng sang các nền tảng khác (có thể là Windows hoặc một cái gì đó được nhúng) hoặc chỉ muốn sử dụng IDE?
find_package()
) hoặc hỗ trợ thử nghiệm / đóng gói.
Tuyên bố về CMake là một "trình tạo xây dựng" là một quan niệm sai lầm phổ biến.
Nó không sai về mặt kỹ thuật; nó chỉ mô tả làm thế nào nó hoạt động, nhưng không phải nó làm gì.
Trong bối cảnh của câu hỏi, họ làm điều tương tự: lấy một loạt các tệp C / C ++ và biến chúng thành một tệp nhị phân.
Vì vậy, sự khác biệt thực sự là gì?
CMake cao cấp hơn nhiều. Nó được thiết kế để biên dịch C ++, mà bạn viết mã xây dựng ít hơn nhiều, nhưng cũng có thể được sử dụng để xây dựng cho mục đích chung. make
cũng có một số quy tắc C / C ++ tích hợp sẵn, nhưng chúng hầu như vô dụng.
CMake
hiện một hai bước xây dựng: nó tạo ra một mức độ thấp xây dựng kịch bản trong ninja
hoặc make
hay nhiều máy phát điện khác, và sau đó bạn chạy nó. Tất cả các đoạn script shell thường được xếp chồng lên nhau Makefile
chỉ được thực hiện ở giai đoạn tạo. Do đó, CMake
xây dựng có thể là đơn đặt hàng cường độ nhanh hơn.
Ngữ pháp của CMake
việc hỗ trợ các công cụ bên ngoài dễ dàng hơn nhiều so với thực hiện .
Sau khi make
xây dựng một vật phẩm, nó quên đi cách nó được xây dựng. Những nguồn nó được xây dựng từ, những gì trình biên dịch cờ? CMake
theo dõi nó, make
để lại cho bạn Nếu một trong các nguồn thư viện bị xóa kể từ phiên bản trước Makefile
, make
sẽ không xây dựng lại.
Hiện đại CMake
(bắt đầu với phiên bản 3. một cái gì đó) hoạt động về mặt phụ thuộc giữa "mục tiêu". Một mục tiêu vẫn là một tệp otput duy nhất (đáng buồn), nhưng có thể có các phụ thuộc bắc cầu ("công khai" / "trong các điều khoản CMake). Những phụ thuộc quá độ này có thể được tiếp xúc hoặc ẩn khỏi các gói phụ thuộc. CMake
sẽ quản lý thư mục cho bạn quá. Với make
, bạn bị mắc kẹt ở cấp độ từng tệp và quản lý thư mục.
Bạn có thể mã hóa một cái gì đó make
bằng cách sử dụng các tệp cờ để che hai khoảng trống cuối cùng, nhưng bạn chỉ có một mình. make
không chứa một ngôn ngữ hoàn chỉnh Turing (thậm chí hai, đôi khi ba Guile đếm ), và tất cả chúng đều kinh khủng.
Thành thật mà nói, đây là những gì CMake
và make
có điểm chung - ngôn ngữ của họ khá kinh khủng:
để bắt đầu với.
Nhưng trong CMake
bạn viết ít dòng mã hơn nhiều.