CMake und relative Pfade



  • Hallo,

    ich baue ein größeres Projekt und nutze Bibliotheken wie cURL und XercesC von Apache. Nun geht es darum den Build-Prozess via CI Server zu automatisieren. Hier komme ich ins Schleudern.

    Die VS Projekte für cURL und XercesC erzeuge ich mit der grafischen Oberfläche von CMake, d.h. ich mache alle Einstellungen, anschließend lasse ich die Projektmappen generieren und kann die Projekte schließlich bauen. Das Problem ist, dass ich das mit Jenkins nicht machen kann, da der Arbeitspfad natürlich anders ist, als mein Pfad während des Programmierens, ergo gibt es Probleme / Fehler beim Bauen.

    CMake unterstützt von Hause aus keine relativen Pfade, die Gründe dafür sind plausibel. Nun stellt sich aber die Frage, wie kann ich mein Problem der Automatisierung lösen. Eine Möglichkeite wäre, die gebauten Quellen von cURL und XercesC mit einzuchecken. Finde ich persönlich aber nicht so prickelnd. Ich muss dazu sagen, dass ich mit CMake noch nicht viel gemacht habe.

    Kann von euch jemand weiter helfen?

    Vielen Dank im voraus

    VG Torsten



  • So ganz verstehe ich dein Problem nicht.
    Du kannst immer "${CMAKE_CURRENT_SOURCE_DIR}" benutzen, um relative Pfade anzugeben, d.h. z.B.

    ${CMAKE_CURRENT_SOURCE_DIR}/Libs/curl.lib
    


  • Hallo,

    ah das hätte ich erwähnen sollen, sorry. CMake erzeugt die VS Projektdateien MIT absoluten Pfaden. Ich kann jetzt nicht einfach relative Pfade eintragen, das würde nur temporär funktionieren. Sobald ich eine neuere Version von cURL nutze, müsste ich das erneut tun.

    VG Torsten



  • Dann wird wohl das beste sein, du installierst das Jenkins CMake plugin und gibst nur die CMake-Datei weiter (d.h. checkst diese ein).

    In Building CMake Project with Jenkins on Windows gibt es eine genaue Anleitung dazu.



  • Das klingt erstmal vielversprechend, schaue ich mir an.

    Danke dir,

    VG Torsten



  • Ich denke es ist CMake "best practice" es so zu machen. Also ins Repo gehören die CMake Files, sowie die Skripte die man braucht um daraus die Project/Make/Ninja Files zu bauen und den Build durchzuführen. Aber halt nicht die Project/Make/Ninja Files selbst.



  • G' Morgen,

    also das CMake Plugin sieht vielversprechend aus, das Bauen von cURL funktioniert - prinizipiell. Nun steht mir noch eine Kleinigkeit im Weg. Ich muss cURL als statische Bibliothek bauen und (vorerst) ohne SSL Unterstützung. Gehe ich über die grafische Oberfläche von CMake (bzw. baue ich cURL via ./configure auf Linux), weiß ich wo ich die beiden Flags

    --disable-shared
    --without-ssl
    

    angeben muss. Im CMake Plugin des Jenkins? Keine Ahnung. Ich habe es versucht bei "Other CMake Arguments", da erzeugen die Einträge aber Fehler beim Bauvorgang.

    Zwei Felder habe ich noch zur Auswahl:

    • Script Generator
    • Preload Script

    Beide erscheinen mir nicht plausibel, aber vielleicht funktioniert es über "Umwege"? Im Netz sind die Suchergebnisse leider sehr rar. Hat jemand einen Tipp oder eine Idee?

    VG Torsten



  • Die beiden Argumente müßten doch dann in der CMake-Datei enthalten sein.

    Aber warum baust du denn die curl lib immer wieder neu?



  • Hallo,

    ich habe nun noch einmal ein bisschen geguckt und getan. Ja, die beiden Argumente sind in den Dateien enthalten, also habe ich sie angepasst und siehe da - it works fine.

    Was ich in den CMakeLists-Dateien nicht ausfindig machen konnte, ist die Entscheidung, auf welcher Platform gebaut werden soll - also x64 und/oder x86. Im Moment kann ich nur auf x64 bauen. Ich brauche (derzeit) noch die x86-Variante. Wie lässt sich das via Jenkins bzw. Textdatei einstellen? Eine Suche in den Dateien ergab wie gesagt nichts.

    @Th69 Zu deiner Frage, warum ich libcurl immer wieder neu bauen will. Im Grunde genommen will ich das nicht. Was ich aber will, ist ein CleanBuild via Jenkins, unter Umständen auch mal auf einem neuen Knoten. Und dafür brauche ich diese Einstellungen - ich will ja (wie oben geschrieben) die Quellen nichts ins Respository packen.

    VG Torsten



  • @TorDev sagte in CMake und relative Pfade:

    Was ich in den CMakeLists-Dateien nicht ausfindig machen konnte, ist die Entscheidung, auf welcher Platform gebaut werden soll

    Die sollen das ja auch gerade eben nicht entscheiden, höchstens ggf Anpassungen vornehmen, je nachdem für welche Platttform gebaut wird. Die CMake-variable für die Plattform ist CMAKE_GENERATOR_PLATFORM und an CMake übergeben kannst du das mit -A.

    Wenn du im Jenkins beides bauen willst brauchst du halt 2 stages (im Jenkins-file), die CMake halt unterschiedlich aufrufen.



  • Hallo,

    nach einigem Probieren kann ich nun doch schreiben "it works fine".

    Vielen, vielen Dank für eure Hilfe. Ohne dieses Forum und ohne euch wäre ich (vermutlich auch viele andere) aufgeschmissen.

    Danke und schöne Woche euch allen noch

    VG Torsten


Anmelden zum Antworten