Cmake: Abhängig auf ExternalProject richtig setzen.



  • Hallo,

    ich schreibe gerade an einem Programm, für das ich Abhängigkeiten auf externe Bibliotheken habe. Da das ganze in möglichst vielen Umgebungen laufen soll, habe ich die wichtigsten Bibliotheken per ExternalProject_Add eingebunden, so daß diese automatisch mit kompiliert werden können.

    Das ganze sieht beispielsweise so aus:

    ExternalProject_Add(
    		libTinyXML2
    		PREFIX				libTinyXML2
    		GIT_REPOSITORY		${BUILD_TINYXML2_GIT_CHECKOUT_URL}
    		GIT_TAG				${BUILD_TINYXML2_GIT_CHECKOUT_TAG}
    
    		# cmake config
    		CMAKE_GENERATOR		"${CMAKE_GENERATOR}"
    		CMAKE_ARGS			${BUILD_TINYXML2_CMAKE_ARGS}
    
    		# disable update
    		UPDATE_COMMAND		""
    	)
    

    Woran ich jetzt noch hänge ist der Punkt, wie ich am geschicktesten festlege, daß die erzeugte Bibliothek auch zu meinem Projekt gelinkt wird.

    Mein erster Versuch war es, die Bibliothek einfach ins aktuelle Build-Verzeichnis zu kopieren und meine Abhängigkeit per target_link_libraries darauf zu setzen:

    ExternalProject_Get_Property(libTinyXML2 SOURCE_DIR)
    		ExternalProject_Get_Property(libTinyXML2 BINARY_DIR)
    
    		set(TINYXML2_LIBRARY_NAME	${CMAKE_SHARED_LIBRARY_PREFIX}tinyxml2${CMAKE_SHARED_LIBRARY_SUFFIX})
    
    		add_custom_command(
    					TARGET			libTinyXML2		POST_BUILD
    					COMMAND			${CMAKE_COMMAND} -E copy_if_different ${BINARY_DIR}/${TINYXML2_LIBRARY_NAME} ${CMAKE_CURRENT_BINARY_DIR}/${TINYXML2_LIBRARY_NAME}
    					MAIN_DEPENDENCY	${BINARY_DIR}/${TINYXML2_LIBRARY_NAME}
    		)
    

    Das funktionierte wunderbar mit Makefiles und gcc, scheitert aber bei Visual Studio, da die DLLs dort in einem anderen Unterverzeichnis liegen, das zudem noch je nach Konfiguration unterschiedlich ist.

    Inzwischen versuche ich es damit, dem ExternalProject ein INSTALL_PREFIX mitzugeben, und von dort die Libraries zu nehmen, bin mir aber nicht sicher ob das wirklich der bessere Weg ist.

    Gibt es nicht eine einfachere Möglichkeit, direkt eine Abhängigkeit auf ein Target aus dem ExternalProject zu verweisen? Wenn ich innerhalb meines eigenen Buildscripts auf ein library-Target verweise, weiß CMake ja auch, wo die Dateien am Ende liegen, und ich muss keine Pfade von Hand setzen.


Log in to reply