2013-07-08 66 views
80

Tôi không yêu cầu điều này chỉ 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 who like me, thấy nó hoàn toàn bối rối về những gì chính xác những gì đang diễn ra đằng sau hậu trường khi cho một tập tin CMakeLists.txt nhỏ như vậyCMake hoạt động như thế nào?

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

và như vậy một nhỏ tutorial.cpp

int main() { return 0; } 

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

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

và một thư mục CMakeFiles với s o nhiều tập tin 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 biết những gì đang xảy ra đằng sau hậu trường (tức là: tại sao như vậy có thể các file đã được tạo ra và mục đích của họ là gì), là trở ngại lớn nhất trong việc có thể để học CMake.

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

+0

Tôi biết 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 việc xây dựng nguồn và vẫn đang tìm cách dọn dẹp các tệp đã tạo, kỹ thuật này hoạt động tốt: http://stackoverflow.com/a/12055610/453673 – Nav

+3

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

+0

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

Trả lời

53

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

CMake giới thiệu rất nhiều phức tạp trong hệ thống xây dựng, hầu hết trong số đó chỉ trả tiền 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 thực hiện tốt công việc giữ rất nhiều sự lộn xộn này khỏi bạn: Sử dụng out-of-source builds và thậm chí bạn 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à như vậy, vì bạn đã viết cmake .), 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ự gây đau đớn với CMake và không phải là cách hệ thống được cho là đượ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 build bên trong thư mục nguồn của tôi làm thư mục xây dựng.

Để xoa dịu nỗi đau của bạn, hãy để tôi cung cấp cho một cái nhìn tổng quan nhanh chóng của các tập tin có liên quan mà CMake tạo:

  • file dự án/Makefiles - Những gì bạn đang thực sự quan tâm đến: Các tập tin cần thiết để xây dựng dự án của bạn dưới trình tạo đã chọn. Điều này có thể là bất cứ điều gì từ một Makefile Unix cho một giải pháp Visual Studio.
  • CMakeCache.txt - Đây là 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 cho dù một thành phần tùy chọn có được xây dựng ở tất cả hay không. Danh sách các biến chủ yếu giống với biến bạn thấy khi chạy ccmake hoặc cmake-gui. Điều này có thể hữu ích để xem xét theo thời gian, 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ể.
  • Tệp được tạo - Đây có thể là bất kỳ thứ gì từ các tệp nguồn được tạo tự động đến các macro xuất giúp bạn tích hợp lại dự án được tạo với các dự án CMake khác. Hầu hết chúng 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 luôn vui vẻ. Đặc biệt, tôi không bao giờ cần phải quan tâm đến bất cứ điều gì đang xảy ra bên trong thư mục con CMakeFiles.

Nói chung, bạn không nên gây rối 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.txt theo 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, bạn có lẽ tốt. Đừng lo lắng quá nhiều về các chi tiết đẫm máu - vì đây là những gì CMake đã cố gắng để phụ tùng bạn ở nơi đầu tiên.

+0

Cảm ơn. Đã nhận thức được về việc xây dựng nguồn, nhưng như bạn thấy, mục tiêu đặt 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 của câu hỏi của tôi: "* chính xác là cmake cấu hình và tạo ra trước khi nó xây dựng dự án *" – Nav

+0

'CMakeFiles' thư mục chứa' CMakeError.log' và 'CMakeOutput.log' quan trọng cho xử lý sự cố CMake xây dựng. –

8

Như đã trình bày trên website của mình:

CMake là cross-platform, mã nguồn mở xây dựng hệ thống quản lý quá trình xây dựng các phần mềm sử dụng một trình biên dịch độc lập phương pháp

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ó đã 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 nền tảng chéo để tạo dự án cụ thể cho nền tảng/tạo tệp cho máy tính/nền tảng cụ thể.

Ví dụ bạn có thể thử để biên dịch phần mềm của bạn trên Windows với Visual Studio sau đó với cú pháp thích hợp trong tập tin CMakeLists.txt của bạn, bạn có thể khởi chạy

cmake . 

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

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

Ở đây bạn có một số bài thuyết trình rất tốt về funcitonalities cmake chính http://www.elpauer.org/stuff/learning_cmake.pdf

EDIT

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

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

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

find_package(Boost 1.45.0 COMPONENTS filesystem regex) 

Sau khi kiểm tra xem nó sẽ tạo ra các makefiles cho hệ thống/trình biên dịch/IDE phù hợp.

+0

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

+0

@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

Các vấn đề liên quan