2012-04-04 6 views
6

Tengo un gran proyecto multiplataforma que debe construirse en varios lugares; en algunos lugares, diferentes juegos de herramientas de interfaz de usuario, API de sonido, etc. pueden estar disponibles, y estoy tratando de encontrar la mejor manera de configurar automáticamente qué objetivos se configuran en función de qué bibliotecas están presentes.Objetivos de construcción de CMake condicionalmente según la existencia de la biblioteca

El código que estoy tratando de ello es, por ejemplo:

find_library(PC_EGL EGL) 
find_library(PC_GLESv2 GLESv2) 
find_library(PC_Xxf86vm Xxf86vm) 
if (DEFINED PC_EGL AND DEFINED PC_GLESv2 AND DEFINED PC_Xxf86vm) 
    add_executable(foo foo.cpp) 
    target_link_libraries(foo ${PC_EGL} ${PC_GLESv2} ${PC_Xxf86vm}) 
endif() 

Sin embargo, en el caso de que voy a construir esto en un sistema que no tiene libGLESv2 disponible, me sale el error:

CMake Error: The following variables are used in this project, but they are set to NOTFOUND. 
Please set them or make sure they are set and tested correctly in the CMake files: 
PC_GLESv2 
    linked by target "foo" in directory /path/to/platform 

La documentación de find_library implica que la variable PC_EGL_NOTFOUND se debe establecer, pero no es (CMake 2.8.5). Entonces, ¿cuál es la forma apropiada de usar find_library para determinar si un objetivo debe hacerse existir? Parece como usar

if (NOT PC_EGL MATCH "-NOTFOUND") 

es un poco frágil y más incómoda, por lo que hay una mejor mecanismo para determinar una ruta de comandos basada en CMake wheter una biblioteca se encontró en absoluto?

Respuesta

9

Es simplemente

if(PC_EGL AND PC_GLESv2 AND PC_GLESv2) 

CMake trata 0, FALSE, OFF, ANYTHING-NOTFOUND como falso.

+0

Gracias! Parece que debería haber sido fácil de encontrar en la documentación o en los ejemplos, que es un problema común que tengo con CMake: una vez que sé cómo hacer algo es fácil, pero descubro cómo hacerlo, no tanto. – fluffy

Cuestiones relacionadas