2016-07-29 8 views
3

Ich habe Pakete mit Conan für alle Bibliotheken erstellt eines der Projekte, die ich arbeite verwendet. Ich habe eine conanfile.py für jeden erstellt und alles ist gut. Ich habe eine conanfile.txt für einen Dummy-Code erstellt, um sicherzustellen, dass alles wie erwartet funktioniert. Ich habeWie kann Conan ein FindXXX.cmake erzeugen?

conan instal .. --build =

fehlt laufen Und das hat alle Pakete zusammengestellt. Ich kann $ {CONAN_INCLUDE_DIRS} und $ {CONAN_LIBS} in meinen CMake-Dateien verwenden. Allerdings möchte ich Conan als eine optionale Möglichkeit haben, Dinge zu tun, mit Find_package (...) als eine Möglichkeit, Bibliotheksstandorte zu erhalten, verknüpfen und Details einfügen.

So war ich fasziniert

Neu in Conan 0,6 zu sehen! Conan bietet jetzt automatische Unterstützung für CMake find_package, ohne eine eigene Datei FindXXX.cmake für jedes Paket zu erstellen (conan 0.5).

Also ich dachte, es sollte funktionieren. Es wird jedoch keine FindXXX.cmake-Datei generiert.

Hier ist eine meiner conanfile.py als Beispiel für OpenMPI:

from conans import ConanFile 
import os 
from conans.tools import download 
from conans.tools import unzip 
from conans import CMake 
from conans import ConfigureEnvironment 

class OpenMPIConan(ConanFile): 
    name = "OpenMPI" 
    version = "2.0.0" 
    generators = "cmake" 
    settings = "os", "arch", "compiler", "build_type" 
    url="https://www.open-mpi.org/software/ompi/v2.0/" 
    license="https://www.open-mpi.org/community/license.php" 
    source_url = "https://www.open-mpi.org/software/ompi/v2.0/downloads/openmpi-2.0.0.tar.bz2" 
    unzipped_path = "openmpi-2.0.0/" 


    def source(self): 
     self.zip_name = os.path.basename(self.source_url) 
     download(self.source_url, self.zip_name) 
     unzip(self.zip_name) 
     os.unlink(self.zip_name) 

    def build(self): 
     self.run("%s/%s/configure --enable-mpi-thread-multiple --enable-mpi-cxx --prefix=%s CC=clang CXX=clang++" % (self.conanfile_directory, self.unzipped_path, self.package_folder)) 
     self.run("%s make -j 8 install" % env.command_line) 

    def package(self): 
     self.copy("*.h", dst="include", src="install/include") 
     self.copy("*.lib", dst="lib", src="install/lib") 
     self.copy("*.a", dst="lib", src="install/lib") 

    def package_info(self): 
     self.cpp_info.libs = ["mpi", "mpi_cxx"] 

Warum gibt es kein FineOpenMPI.cmake Datei erstellt? Wie kann ich sicherstellen, dass es erstellt wird?

PS: Wenn ich richtig verstehe, gibt es keine Notwendigkeit für die Paketmethode.

Antwort

3

Conan erstellt nicht FindXXX.cmake automatisch. Die Meldung "neu in 0.6" bedeutet, dass für gängige Pakete die von CMake-Installation (Kitware) bereitgestellte FindXXX.cmake funktionieren sollte.

Das ist, weil von conan 0,6 wir die CONAN_CMAKE_MODULE_PATH und CMAKE_PREFIX_PATH Variablen in den Stammordner der Pakete festgelegt, so dass die CMake find_library Funktion der Lage sein sollte, die Bibliotheken zu finden.

Aber leider funktioniert es nicht immer und wir haben diesen Vorgang nicht korrekt dokumentiert. Ich werde die Dokumente bald aktualisieren. Es funktioniert nur automatisch, wenn es einen "offiziellen" findXXX gibt, und nicht in allen Fällen, weil manchmal die offizielle Datei findXXX.cmake nach Bibliotheken mit anderen Dateinamen sucht als das Build-System erstellt (nicht bereit, nach Dateinamen für alle Einstellungen zu suchen) Conan kann Bibliotheksbibliotheken mit unterschiedlichen Namen behandeln oder Bibliotheken oder manchmal findXXX in festen Pfaden wie c: \ OpenSSL und ähnlichen Dingen suchen.

in Ihrem speziellen Fall also mit OpenMPI gibt es keine offizielle FindOpenMPI.cmake Datei von CMake Installation geliefert, so dass Sie sie schaffen müssen und es in Ihrem conan Paket hinzufügen. Nehmen wir ein Beispiel mit dem ZLIB library conan's package sehen:

  1. eine Datei namens FindOpenMPI.cmake erstellen und es in Ihrem conan Paketstammordner speichern. Normalerweise empfehle ich, die originale Datei FindXXX.cmake von Kitware zu kopieren (falls vorhanden) (Ordner Module/Find ***. Cmake). Und modifiziere es ein wenig, damit du unsere Bibliotheksdateien finden kannst.Wenn nicht (Ihr Fall ist), vorausgesetzt, es ist kein Problem, werfen Sie einen Blick auf dieses Beispiel:
find_path(ZLIB_INCLUDE_DIR NAMES zlib.h PATHS ${CONAN_INCLUDE_DIRS_ZLIB}) 
find_library(ZLIB_LIBRARY NAMES ${CONAN_LIBS_ZLIB} PATHS ${CONAN_LIB_DIRS_ZLIB}) 

set(ZLIB_FOUND TRUE) 
set(ZLIB_INCLUDE_DIRS ${ZLIB_INCLUDE_DIR}) 
set(ZLIB_LIBRARIES ${ZLIB_LIBRARY}) 
mark_as_advanced(ZLIB_LIBRARY ZLIB_INCLUDE_DIR) 

In der ersten Zeile wir CMake sind, die den Pfad, in dem unsere Header CONAN_INCLUDE_DIRS_XXX gefunden werden sollte, dann die gleiche für die Bibliotheksnamen mit CONAN_LIBS_XXX und die Pfade, in denen die Bibliotheken CONAN_LIB_DIRS_XXX sind.

  1. In Ihrer conanfile.py Datei auf die Exporte der FindOpenMPI.cmake hinzu:

    exports = ["FindOpenMPI.cmake"]

  2. Im Paket Methode, kopieren Sie die Datei FindOpenMPI.cmake auf die root:

    self.copy("FindOpenMPI.cmake", ".", ".")

I schlage vor, eine saubere FindOpenMP.cmake-Datei zu erstellen, die dem ZLIB-Beispiel, das wir oben gesehen haben, sehr ähnlich ist, und zu versuchen, ob es funktioniert.

Ihre CMakeLists.txt könnte wie folgt aussehen:

include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake) 
CONAN_BASIC_SETUP() 

find_package("OpenMPI") 

IF(OpenMPI_FOUND) 
    ADD_EXECUTABLE(xxxxxx source1.c) 
    include_directories(${OpenMPI_INCLUDE_DIRS}) 
    TARGET_LINK_LIBRARIES(xxxxxx ${OpenMPI_LIBRARIES}) 
ELSE() 
    MESSAGE(FATAL_ERROR "OpenMPI not found") 
ENDIF() 
+0

Vielen Dank für Ihre Antwort. Das klärt die Dinge. OpenMPI ist eine MPI-Implementierung. Es ist in gewissem Sinne das schlechteste Beispiel unter den Bibliotheken, die ich hätte auswählen können, weil es von FIndPackage (MPI) gefunden werden sollte. Ich denke, ich könnte erklären, dass es MPI anstelle von OpenMPI ist und die Tatsache, dass es OpenMPI ist, entweder durch den Versionsnamen oder durch Erstellen einer Einstellung, um die Implementierung (MPIch oder OpenMPI) auszuwählen. Andere Bibliotheken (z.B. Lua) sollten gefunden werden. – Michel

+0

Zurück zum Thema MPI ... (Ich kann eine andere Stackoverflow-Frage dafür stellen) Wenn ich eine andere Bibliothek habe, die ich bereitstellen möchte und die MPI verwendet, damit sie mit der gleichen MPI-Implementierung wie das komplette Projekt kompiliert werden soll , was ist der beste Weg, um es zu verpacken und Verweis auf die richtige MPI, so dass, wenn es von der Quelle kompiliert wird, die richtigen enthalten sind gefunden? Soll ich einfach das 'requires'-Attribut verwenden? Wie werden die Einstellungen weitergegeben, wenn das so ist? – Michel

Verwandte Themen