2012-03-30 22 views
7

Tôi có một dự án C++ với lõi cơ bản là tự chứa nhưng có nhiều giao diện cho mã của bên thứ ba mà người dùng có thể hoặc không muốn biên dịch. Chúng tôi xây dựng mã bằng CMake và bây giờ tôi đang cố gắng tổ chức mã tốt hơn một chút.Làm thế nào để tổ chức hệ thống phân cấp tệp cmake với nhiều phụ thuộc tùy chọn

Giải pháp mà tôi đưa ra là thêm vào tệp CMakeLists.txt trên cùng một tập hợp các tùy chọn xác định liệu gói phụ thuộc có được đặt hay không.

option(WITH_FOO "Compile the interface to Foo, if found" ON) 
option(REQUIRE_FOO "Require that the Foo interface to be compiled" OFF) 
option(WITH_BAR "Compile the interface to Bar, if found" ON) 
option(REQUIRE_BAR "Require that the Bar interface to be compiled" OFF) 
... 
if(WITH_FOO) 
    if(REQUIRE_FOO) 
    find_package(Foo REQUIRED) 
    else(REQUIRE_FOO) 
    find_package(Foo) 
    endif(REQUIRE_FOO) 
else(WITH_FOO) 
    set(FOO_FOUND FALSE) 
endif(WITH_FOO) 

if(WITH_BAR) 
    if(REQUIRE_BAR) 
    find_package(Bar REQUIRED) 
    else(REQUIRE_BAR) 
    find_package(Bar) 
    endif(REQUIRE_BAR) 
else(WITH_BAR) 
    set(BAR_FOUND FALSE) 
endif(WITH_BAR) 

Sau đó, trong các tập tin CMakeLists.txt trong các thư mục con, sẽ có những câu như:

if(BAR_FOUND) 
    add_subdirectory(bar_interface) 
endif(BAR_FOUND) 

tôi không đặc biệt như giải pháp này, một phần vì nó rất dài dòng và một phần bởi vì tôi cảm thấy rằng phải có một số cách chuẩn hóa hơn để làm điều này. Có ai biết về một giải pháp tốt hơn, dễ bảo trì hơn không?

Trả lời

7

Hãy nhìn vào các module CMake tiêu chuẩn sau đây:

  • FeatureSummary - Macro để tạo ra một bản tóm tắt các tính năng tàn tật bật/
  • CMakeDependentOption - Macro để cung cấp một tùy chọn phụ thuộc vào lựa chọn khác

Ví dụ về cách sử dụng FeatureSummary (từ hướng dẫn sử dụng):

option(WITH_FOO "Help for foo" ON) 
add_feature_info(Foo WITH_FOO "The Foo feature provides very cool stuff.") 

find_package(LibXml2) 
set_package_properties(LibXml2 PROPERTIES DESCRIPTION "A XML processing library." URL "http://xmlsoft.org/") 
set_package_properties(LibXml2 PROPERTIES TYPE RECOMMENDED PURPOSE "Enables HTML-import in MyWordProcessor") 
set_package_properties(LibXml2 PROPERTIES TYPE OPTIONAL PURPOSE "Enables odt-export in MyWordProcessor") 

feature_summary(WHAT ALL) 
+0

Đẹp nhất! Tôi nghĩ rằng đó là nhiều hơn hoặc ít hơn những gì tôi cần. – Joel

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