CMake hoạt động chính xác như thế nào?


157

Tôi không yêu cầu điều này cho bản thân mình. Tôi hy vọng câu hỏi này sẽ là một tài liệu tham khảo cho nhiều người mới thích tôi, đã tìm thấy nó hoàn toàn bối rối về chính xác những gì đang diễn ra đằng sau hậu trường khi cho một CMakeLists.txttập tin nhỏ như vậy

cmake_minimum_required (VERSION 2.6)
project(Tutorial)
add_executable(Tutorial tutorial.cpp)

và nhỏ như vậy tutorial.cpp

int main() { return 0; } 

có rất nhiều tập tin được tạo ra

CMakeCache.txt  cmake_install.cmake  Makefile
CMakeLists.txt  tutorial.cpp

và một CMakeFilesthư mục có rất nhiều tệp và thư mục

CMakeCCompiler.cmake               CMakeOutput.log    Makefile.cmake
cmake.check_cache                  CMakeSystem.cmake  progress.marks
CMakeCXXCompiler.cmake             CMakeTmp           TargetDirectories.txt
CMakeDetermineCompilerABI_C.bin    CompilerIdC        Tutorial.dir
CMakeDetermineCompilerABI_CXX.bin  CompilerIdCXX
CMakeDirectoryInformation.cmake    Makefile2

Không hiểu những gì đang diễn ra đằng sau hậu trường (ví dụ: tại sao các tệp phải được tạo ra và mục đích của chúng là gì), là trở ngại lớn nhất trong việc học CMake.

Nếu bất cứ ai biết, bạn có thể vui lòng giải thích nó cho hậu thế? Mục đích của các tệp này là gì và khi tôi nhập cmake ., chính xác thì cmake định cấu hình và tạo gì trước khi xây dựng dự án?


1
Tôi biết về các bản dựng ngoài nguồn. Trong trường hợp bất kỳ ai không thực hiện xây dựng nguồn và vẫn đang tìm cách để xóa các tệp được tạo, kỹ thuật này hoạt động tốt: stackoverflow.com/a/12055610/453673
Nav

3
Có mô tả tuyệt vời tại: aosabook.org/en/cmake.html và có thể trả lời sâu cho câu hỏi (không thể tóm tắt ngắn gọn ở đây).
ký sinh

@SebTu Liên kết bị hỏng. Trang cmake.html không tồn tại.
Nav

3
@Nav Yap, nhầm lẫn cú pháp đánh dấu, xin lỗi. Vì vậy, ở đây phiên bản đã sửa: Đối với những người mới sử dụng cmake, tôi thực sự khuyên bạn nên đọc kiến trúc của cmake . Nó cung cấp vừa đủ thông tin để có cảm giác cmake hoạt động như thế nào mà không mất chi tiết.
SabNag

Câu trả lời:


92

Bí mật là bạn không cần phải hiểu những gì các tệp được tạo ra.

CMake giới thiệu rất nhiều sự phức tạp vào hệ thống xây dựng, hầu hết chỉ trả hết nếu bạn sử dụng nó để xây dựng các dự án phần mềm phức tạp.

Tin tốt là CMake làm rất tốt việc tránh xa sự lộn xộn này khỏi bạn: Sử dụng các bản dựng ngoài nguồn và bạn thậm chí không phải xem các tệp được tạo. Nếu bạn đã không làm điều này cho đến nay (mà tôi đoán là trường hợp, vì bạn đã viết cmake .), xin vui lòng kiểm tra chúng trước khi tiếp tục . Trộn thư mục xây dựng và nguồn thực sự đau đớn với CMake và không phải là cách hệ thống được sử dụng.

Tóm lại: Thay vì

cd <source_dir>
cmake .

luôn luôn sử dụng

cd <build_dir_different_from_source_dir>
cmake <source_dir>

thay thế. Tôi thường sử dụng một thư mục con trống buildtrong thư mục nguồn của mình làm thư mục xây dựng.

Để giảm bớt nỗi đau của bạn, hãy để tôi cung cấp tổng quan nhanh về các tệp có liên quan mà CMake tạo ra:

  • Tệp dự án / Makefiles - Điều bạn thực sự quan tâm: Các tệp cần thiết để xây dựng dự án của bạn dưới trình tạo đã chọn. Đây có thể là bất cứ thứ gì từ Unix Makefile đến giải pháp Visual Studio.
  • CMakeCache.txt - Đây là bộ lưu trữ chuỗi khóa / giá trị liên tục được sử dụng để lưu trữ giá trị giữa các lần chạy. Các giá trị được lưu trữ ở đây có thể là đường dẫn đến các phụ thuộc thư viện hoặc liệu một thành phần tùy chọn sẽ được xây dựng hay không. Danh sách các biến hầu như giống hệt với biến bạn thấy khi chạy ccmakehoặc cmake-gui. Điều này có thể hữu ích để thỉnh thoảng xem xét, nhưng tôi khuyên bạn nên sử dụng các công cụ đã nói ở trên để thay đổi bất kỳ giá trị nào nếu có thể.
  • Các tệp được tạo - Đây có thể là bất cứ thứ gì từ các tệp nguồn được tạo tự động để xuất các macro giúp bạn tích hợp lại dự án đã xây dựng của bạn với các dự án CMake khác. Hầu hết trong số này chỉ được tạo theo yêu cầu và sẽ không xuất hiện trong một dự án đơn giản như dự án từ câu hỏi của bạn.
  • Bất cứ điều gì khác là khá nhiều tiếng ồn để giữ cho hệ thống xây dựng hạnh phúc. Đặc biệt, tôi không bao giờ cần quan tâm đến bất cứ điều gì đang diễn ra bên trong CMakeFilesthư mục con.

Nói chung, bạn không nên lộn xộn với bất kỳ tệp nào mà CMake tạo cho bạn. Tất cả các vấn đề có thể được giải quyết từ bên trong CMakeLists.txtbằng cách này hay cách khác. Miễn là kết quả xây dựng dự án của bạn như mong đợi, có lẽ bạn vẫn ổn. Đừng lo lắng quá nhiều về các chi tiết đẫm máu - vì đây là điều mà CMake đã cố gắng dành cho bạn ngay từ đầu.


Cảm ơn. Đã nhận thức được các bản dựng ngoài nguồn, nhưng như bạn thấy, mục tiêu của câu hỏi này là để hiểu thêm. Phần CMakeCache.txt trong câu trả lời của bạn thực sự hữu ích. Đó là loại giải thích mà tôi đang tìm kiếm. Ngoài ra, câu cuối cùng trong câu hỏi của tôi: " chính xác thì cmake định cấu hình và tạo gì trước khi nó xây dựng dự án "
Nav

1
CMakeFilesthư mục chứa CMakeError.logCMakeOutput.logquan trọng để khắc phục sự cố các bản dựng CMake.
Serge Rogatch

1
Hai thứ mà đôi khi bạn cần kiểm tra trong CMakeFiles/target_name.dirthư mục là flags.makelink.txttệp. Tôi đã phải kiểm tra những thứ này trong dự án phức tạp, kế thừa cờ / công cụ được liên kết từ các dự án thượng nguồn. Ví dụ :: Tôi có một số lỗi vì TPL A có sự phụ thuộc vào TPL B. Ngoài ra, dự án của tôi có sự phụ thuộc vào B, mà tôi đã cài đặt cục bộ; nhưng A đã sử dụng phiên bản B từ hệ thống của tôi (chứ không phải cài đặt cục bộ của tôi) có các tùy chọn kích hoạt khác nhau và nó xuất hiện trước, gây ra lỗi trong dự án của tôi. Chỉ cần nhìn vào link.txt tôi đã có thể biết điều này đã xảy ra.
bartgol

13

Như đã nêu trên trang web của mình:

Cmake là hệ thống xây dựng mã nguồn mở, đa nền tảng để quản lý quá trình xây dựng phần mềm bằng phương pháp độc lập với trình biên dịch

Trong hầu hết các trường hợp, nó được sử dụng để tạo dự án / tạo tệp - trong ví dụ của bạn, nó đã được tạo ra Makefileđược sử dụng để xây dựng phần mềm của bạn (chủ yếu trên nền tảng Linux / Unix).

Cmake cho phép cung cấp các tệp xây dựng đa nền tảng sẽ tạo dự án cụ thể cho nền tảng / tạo các tệp cho việc biên dịch / nền tảng cụ thể.

Chẳng hạn, bạn có thể cố gắng biên dịch phần mềm của mình trên Windows bằng Visual Studio sau đó với cú pháp thích hợp trong CMakeLists.txttệp của bạn, bạn có thể khởi chạy

cmake .

trong thư mục dự án của bạn trên nền tảng Windows, Cmake sẽ tạo tất cả các tệp dự án / giải pháp cần thiết ( .slnv.v.).

Nếu bạn muốn xây dựng phần mềm của mình trên nền tảng Linux / Unix, bạn chỉ cần vào thư mục nguồn nơi bạn có CMakeLists.txttệp của mình và kích hoạt tương tự cmake .và nó sẽ tạo ra tất cả các tệp cần thiết để bạn xây dựng phần mềm thông qua đơn giản makehoặc make all.

Ở đây bạn có một số bài trình bày rất hay về các chức năng chính của Cmake http://www.elpauer.org/ ware / learning_cmake.pdf

BIÊN TẬP

Nếu bạn muốn tạo thư viện phụ thuộc nền tảng bao gồm / định nghĩa biến, v.v. bạn có thể sử dụng cú pháp này trong CMakeLists.txttệp

IF(WIN32)
   ...do something...
 ELSE(WIN32)
   ...do something else...
 ENDIF(WIN32)

Ngoài ra còn có rất nhiều lệnh sử dụng mà bạn có thể ngăn việc xây dựng không thành công và tại chỗ, Cmake sẽ thông báo cho bạn rằng, ví dụ bạn không có thư viện boost filesystemregexđược cài đặt trên hệ thống. Để làm điều đó bạn có thể sử dụng cú pháp sau:

find_package(Boost 1.45.0 COMPONENTS filesystem regex)

Đã kiểm tra rằng nó sẽ tạo ra các tệp tạo tệp cho hệ thống / IDE / trình biên dịch thích hợp.


1
Cảm ơn Patryk. Câu trả lời hữu ích, nhưng pdf bạn liên kết đến, giải thích chủ yếu là giai đoạn thứ hai của việc học CMake, về cơ bản là triển khai CMake. Tôi đang hỏi về lời giải thích về giai đoạn đầu tiên, nơi một người phải hiểu những gì trên trái đất đang diễn ra trong CMake!
Nav

@Nav Tôi đã mở rộng câu trả lời của mình một chút. Bạn vẫn có thể tìm kiếm trên web để biết thêm thông tin.
Patryk

Điều này là khá xa để trả lời câu hỏi.
SenhorLucas

1

Chính xác làm thế nào CMake hoạt động là một câu hỏi cho các nhà phát triển, vì vậy câu hỏi này không thể được trả lời ở đây.

Tuy nhiên, chúng tôi có thể cung cấp một liên lạc hướng dẫn hữu ích cho đến khi nào bạn nên sử dụng CMake và khi nào bạn cần phải lo lắng về cách thức hoạt động của nó. Tôi cũng không phải là người hâm mộ câu trả lời "oh nó chỉ hoạt động" - bởi vì, đặc biệt là trong phần mềm, KHÔNG BAO GIỜ "chỉ hoạt động" và bạn LUÔN LUÔN phải đi sâu vào các chi tiết khó chịu.

CMake là một công cụ mạnh về công nghiệp. Nó tự động hóa một số quy trình RẤT phức tạp và tính đến nhiều biến số mà bạn có thể không biết, đặc biệt là một nhà phát triển khá mới, có thể làm việc với kiến ​​thức hạn chế về tất cả các hệ điều hành và công cụ xây dựng mà CMake có thể xử lý. Lý do rất nhiều tệp được tạo ra và tại sao mọi thứ dường như quá phức tạp là bởi vì tất cả các hệ thống khác đó đều phức tạp và phải được tính toán và tự động hóa. Ngoài ra, còn có các vấn đề về "bộ nhớ đệm" và các tính năng tiết kiệm thời gian khác của công cụ Để hiểu mọi thứ trong CMake có nghĩa là hiểu mọi thứ trong các công cụ xây dựng và hệ điều hành này và tất cả các kết hợp có thể có của các biến này, như bạn có thể tưởng tượng là không thể.

Điều quan trọng cần lưu ý là nếu bạn không chịu trách nhiệm quản lý một hệ thống xây dựng đa nền tảng lớn và cơ sở mã của bạn là một vài KLOC, có thể lên tới 100KLOG, sử dụng CMake có vẻ hơi giống như sử dụng loại bỏ cây lâm nghiệp 100.000 đô la máy để loại bỏ cỏ dại từ vườn hoa 2 feet của bạn. (Nhân tiện, nếu bạn chưa bao giờ thấy một chiếc máy như vậy, bạn nên tìm một cái trên youtube, chúng thật tuyệt vời)

Nếu hệ thống xây dựng của bạn nhỏ và đơn giản, có thể tốt hơn là chỉ viết các tệp tạo tệp của riêng bạn bằng tay hoặc tự viết kịch bản cho chúng. Khi tệp tạo tệp của bạn trở nên khó sử dụng hoặc bạn cần xây dựng một phiên bản hệ thống của mình trên nền tảng khác, thì bạn có thể chuyển sang CMake. Tại thời điểm đó, bạn sẽ có rất nhiều vấn đề cần giải quyết và bạn có thể hỏi những câu hỏi tập trung hơn về nó. Trong lúc này, hãy xem một số cuốn sách tuyệt vời đã được viết về CMake, hoặc thậm chí tốt hơn, hãy tự viết một cuốn sách! số 8)

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.