2012-03-30 17 views
7

Tengo un proyecto C++ con un núcleo que es básicamente autónomo pero con muchas interfaces a códigos de terceros que un usuario puede o no querer compilar. Construimos el código usando CMake y ahora estoy tratando de organizar el código un poco mejor.Cómo organizar la jerarquía de archivos cmake con múltiples dependencias opcionales

La solución que se me ocurrió es agregar al archivo CMakeLists.txt superior un conjunto de opciones que determinan si un paquete dependiente debe ubicarse o no.

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) 

Luego, en los archivos de las CMakeLists.txt en los subdirectorios, habrá declaraciones tales como:

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

me gusta especialmente esta solución, en parte porque es muy prolijo y en parte porque creo que debería haber una forma más estandarizada de hacer esto. ¿Alguien conoce una solución mejor y más fácil de mantener?

Respuesta

7

Tener un vistazo a los siguientes módulos estándar CRealice:

  • FeatureSummary - Macros para generar un resumen de las funciones desactivadas habilitados/
  • CMakeDependentOption - Macro para proporcionar una opción depende de otras opciones

Ejemplos del uso de FeatureSummary (del manual):

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

¡Bonito! Creo que eso es más o menos lo que necesito. – Joel

Cuestiones relacionadas