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?
¡Bonito! Creo que eso es más o menos lo que necesito. – Joel