2012-03-30 13 views
7

Ho un progetto C++ con un nucleo che è sostanzialmente autonomo, ma con un sacco di interfacce verso codici di terze parti che un utente può o non può decidere di compilazione. Costruiamo il codice usando CMake e ora sto cercando di organizzare il codice un po 'meglio.Come organizzare gerarchia di file CMake con molteplici dipendenze opzionali

La soluzione che ho trovato è quella di aggiungere al file CMakeLists.txt in cima una serie di opzioni che determinano se un pacchetto dipendente deve essere posizionato o meno.

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) 

Poi nei file CMakeLists.txt nelle sottodirectory, ci saranno affermazioni quali:

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

non mi piace particolarmente questa soluzione, in parte perché è molto dettagliata e in parte perché sento che ci dovrebbe essere un modo più standardizzato di fare questo. C'è qualcuno che è a conoscenza di una soluzione migliore, più gestibile?

risposta

7

Date un'occhiata ai seguenti moduli standard CMake:

  • FeatureSummary - Macro per generare un riepilogo delle abilitati/funzionalità disattivate
  • CMakeDependentOption - Macro per fornire un'opzione dipendente da altre opzioni

Esempi di utilizzo FeatureSummary (da manuale):

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

Nice one! Penso che sia più o meno quello che mi serve. – Joel

Problemi correlati