2010-07-08 43 views
106

Tôi đang xem xét việc chuyển đổi một dự án nền tảng chéo từ các hệ thống quản lý xây dựng riêng biệt trong Visual C++, XCode và makefiles thành CMake.CMake - Tự động thêm tất cả các tệp trong một thư mục vào một mục tiêu?

Một tính năng cần thiết là thêm tự động tất cả các tệp trong thư mục vào mục tiêu. Trong khi điều này là dễ dàng để làm với thực hiện, nó không phải là dễ dàng doable với Visual C++ và XCode (chính xác cho tôi nếu tôi sai). Có thể làm điều đó trực tiếp trong CMake không? Làm sao?

Hãy thoải mái thêm bất kỳ điều nào khác mà tôi cần biết trước khi học CMake, xem xét dự án hiện tại là trung bình (8 thư viện, 2 thực thi, 8 dự án thử nghiệm và tùy thuộc vào khoảng 8 thư viện bên ngoài)).

+0

Btw. trong Visual Studio, ít nhất là trong các dự án C#, có một nút thanh công cụ trong trình thám hiểm dự án, được đặt tên hiển thị tất cả các tệp. Nó làm cho tất cả các thư mục con của một dự án có thể nhìn thấy, chuyển sang màu xám nếu chúng không chứa bất kỳ tệp nào được bao gồm hợp lý trong dự án. Bạn có thể bao gồm các thư mục này thông qua menu ngữ cảnh, bao gồm tất cả các tệp nguồn bên trong chúng, đệ quy :) – yeoman

Trả lời

154

Có thể. Ví dụ. với file(GLOB:

cmake_minimum_required(VERSION 2.8) 

file(GLOB helloworld_SRC 
    "*.h" 
    "*.cpp" 
) 

add_executable(helloworld ${helloworld_SRC}) 

Lưu ý rằng điều này đòi hỏi thủ tái hoạt động của cmake nếu một tập tin nguồn được thêm vào hoặc gỡ bỏ, kể từ khi xây dựng hệ thống tạo ra không biết khi nào để hỏi CMake tái sinh, và làm việc đó tại mọi công trình sẽ tăng thời gian xây dựng.

+8

Một thay thế cho cmake chạy lại theo cách thủ công là chạm vào tệp CMakeLists.txt trước khi chạy. –

+1

Thay thế cho 'GLOB': [' tệp (biến GLOB_RECURSE [đường dẫn RELATIVE] [FOLLOW_SYMLINKS] [biểu thức toàn cục] ...) '] (https://cmake.org/cmake/help/v3.0/command/ file.html). – Hydro

+2

> "Chúng tôi khuyên bạn không nên sử dụng GLOB để thu thập danh sách các tệp nguồn từ cây nguồn của bạn. Nếu không có tệp CMakeLists.txt thay đổi khi nguồn được thêm hoặc xóa thì hệ thống xây dựng được tạo không thể biết khi nào yêu cầu CMake tạo lại." Điều này không còn được đề xuất trong tài liệu CMAKE3.7 được liên kết bởi Hand1Cloud – triple

27

Câu trả lời bởi Kleist chắc chắn hoạt động, nhưng có một caveat quan trọng:

Khi bạn viết một Makefile bằng tay, bạn có thể tạo ra một biến SRCS sử dụng một chức năng để chọn tất cả .cpp.h tập tin. Nếu tệp nguồn được thêm vào sau, hãy chạy lại make sẽ bao gồm tệp đó.

Tuy nhiên, CMake (với lệnh như file(GLOB ...)) sẽ tạo một danh sách tệp một cách rõ ràng và đặt nó trong tự động tạo Makefile. Nếu bạn có tệp nguồn mới, bạn sẽ cần phải tạo lại Makefile bằng cách chạy lại cmake.

chỉnh sửa: Không cần phải xóa Makefile.

+4

Không thể chỉ đơn giản là chạy lại, mà nên loại bỏ/sửa đổi Makefile lỗi thời? – Ethan

+1

Ethan: chỉ cần thử nó, bạn đã chính xác. –

+7

Đây không phải là câu trả lời, đó là nhận xét về câu trả lời của @ Kleist – Neowizard

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