2015-07-22 13 views
5

Hãy xem xét một dự án C++, được tổ chức trong kho lưu trữ git. Giả sử rằng kho git có một mô-đun con mà từ đó một thư viện được xây dựng trên đó dự án (siêu) phụ thuộc. Nếu dự án (super) không chỉ phụ thuộc vào thư viện mà còn trên thư viện được xây dựng với các thông số cụ thể (CMake), làm thế nào để đảm bảo rằng môđun con được xây dựng với các tham số này khi dự án (siêu) được xây dựng?C++ với git và CMake: Làm thế nào để xây dựng submodules với các tham số cụ thể?

+0

Tôi xin lỗi để có được một chút off topic ở đây, nhưng đây là lý do tôi cố gắng tránh CMake nếu tôi có thể. Cuối cùng tôi đã tìm thấy chính xác một cuốn sách viết các tập tin CMake. Có 5 bajillion trên Make và autotools. Nếu những cuốn sách bỏ qua chủ đề bạn là SOL. – TLOlczyk

+0

Mô-đun phụ của bạn có được xây dựng riêng hay là một phần của siêu dự án của bạn không? – nils

+0

Mô-đun con là một thư viện được xây dựng riêng và sau đó được liên kết với một tệp thực thi của dự án (siêu). –

Trả lời

-1

Tôi nghĩ câu trả lời đơn giản nhất là sử dụng tùy chọn -C như được mô tả trong số SO answer này.

+0

Tôi không hài lòng với giải pháp. Thứ nhất, nó được để lại cho người dùng gọi cmake với các tham số đúng. Thứ hai, đó là lời gọi CMake cho dự án chính, không phải là mô-đun con. –

+0

Tôi không chắc bạn đang cố gắng làm gì. Tùy chọn '' -C'' có vẻ hợp lý khi bạn có một số cài đặt tùy chỉnh bạn cần sử dụng. Các lựa chọn khác dường như đang sử dụng mô-đun ExternalProject cmake hoặc kịch bản lệnh với kịch bản lệnh '' -P''. – Phil

1

Tùy chọn xây dựng (như MYLIB_WITH_SQLITE) phải được thêm vào giao diện của thư viện, có nghĩa là, với biến số MYLIB_DEFINITIONS trong trường hợp mô-đun cấu hình trường học cũ hoặc thuộc tính INTERFACE_COMPILE_DEFINITIONS. config-mô-đun với lệnh install(EXPORT ...):

add_library(mylib ...) 
if(MYLIB_WITH_SQLITE) 
    target_compile_definitions(mylib PUBLIC MYLIB_WITH_SQLITE) 
endif() 
... 
install(TARGETS mylib EXPORT mylib-targets ...) 
install(EXPORT mylib-targets ...) 

Và trong thư viện tiêu thụ hoặc thực thi bạn có thể viết đơn giản kiểm tra thời gian biên dịch:

#ifndef MYLIB_WITH_SQLITE 
    #error mylib must be built with sqlite 
#endif 
-1

Một giải pháp tôi xem xét là ngã ba repo của submodule, chỉnh sửa CMakeLists.txt để cụ thể hơn, và sau đó bao gồm sửa đổi CHÍNH của repo được chia đôi thành một mô-đun con. Không thích hợp nhưng có thể chấp nhận được.

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