2012-04-04 12 views
6

Ich habe ein großes Cross-Plattform-Projekt, das an verschiedenen Orten bauen muss; An einigen Stellen sind u. U. verschiedene UI-Toolkits, Sound-APIs usw. verfügbar, und ich versuche herauszufinden, wie man am besten konfiguriert, welche Ziele basierend auf den vorhandenen Bibliotheken konfiguriert werden.CMake Bauziele bedingt auf Bibliothek Existenz

Der Code, den ich für das ich versuche, ist, zum Beispiel:

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() 

im Fall jedoch, dass ich dies auf einem System zu bauen, die nicht libGLESv2 zur Verfügung hat, habe ich den Fehler:

Die Dokumentation find_library impliziert, dass die Variable PC_EGL_NOTFOUND gesetzt werden sollte, aber nicht (CMake 2.8.5). Also, was ist der geeignete Weg, find_library zu verwenden, um zu bestimmen, ob ein Ziel überhaupt existieren sollte? Es scheint, wie mit

if (NOT PC_EGL MATCH "-NOTFOUND") 

ein bisschen zerbrechlich und fummelig ist, so gibt es einen besseren Mechanismus für einen CMake Befehlspfad zu bestimmen, basierend auf wheter eine Bibliothek überhaupt gefunden wurde?

Antwort

9

Es ist einfach

if(PC_EGL AND PC_GLESv2 AND PC_GLESv2) 

CMake behandelt 0, FALSE, OFF, ANYTHING-NOTFOUND als falsch.

+0

Danke! Es scheint, als hätte es leicht in der Dokumentation oder den Beispielen zu finden sein, was ein häufiges Problem mit CMake ist - sobald ich weiß, wie man etwas macht, ist es einfach, aber nicht so sehr, wie man es macht. – fluffy

Verwandte Themen