Ich verwende CMake seit Jahren. Nicht weil ich so prufund in CMake bin, sondern weil es mMn am besten Abhängigkeiten auflösen kann, wenn man sich mal eine entsprechende Entwicklungsumgebung definiert hat (z.B. Verzeichnis mit ext. Abhängigkeiten und ENV-Varaibale, *.cmake-Tragets importieren etc.), was ich auch durch Erfahrungen mit zahlreiche Projekte in C++ bestätigen kann.
Wenn ich dann Postings lese, die einfach irgendwelche Behauptungen wie "inkonsistenter Müll" und "...ist doof..." in den Raum werfen, ist das für eine objektive Diskussion nicht nützlich.
Mal konkret zu Beispiel-Problemen, die der eine oder andere haben könnte, ohne diese genau zu kennen, da sie ja nicht benannt werden:
1. Abhängigkeiten finden:
- Dafür gibt es FindModule. CMake bringt dafür einen erheblichen Satz an Modulen für Bibliotheken mit sich.
Beispiel: Qt5
FIND_PACKAGE(Qt5 REQUIRED Core Sql Gui Widgets Network)
Das entsprechende Modul bringt CMake schon mit.
Mit ein bißchen Recherche im Qt-Forum bekommt man dann auch noch die fehlenden den Optionen
gesetzt. Dieses Skript schreibe ich genau einmal. Und dann nie wieder, sondern verwende es nur noch.
Beispiel: Eigene Abhängigkeit aus meinem Dev-Verzeichnisbaum
include("${PROJECT_SOURCE_DIR}/../iomessages/installed/lib/iomessages.cmake")
INCLUDE_DIRECTORIES(${IOMESSAGES_INC_DIR})
Fertig. Ich verwende das CMake Library-Export-Skript meiner C++ Bibliothek "iomessages", um es in meiner EXE
einzubinden. Zwei Zeilen.
2. Install-Target
Ich halte es für unerlässich, nach einem Kompiliervorgang auf Basis von CMake auch das Installtarget zu bauen. Sprich
also eine saubere Verz-Struktur mit includes, libs und bins erstellen zu lassen, die man durch einfaches kopieren
dort nutzen kann, wo man es braucht, bzw. in eigenen Find-Modulen wieder entsprechend in weiteren Projekten einbinden
kann.
Beispiel:
# install
INSTALL(TARGETS iomessages
EXPORT iomessages
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib)
INSTALL(FILES ${PROTO_H} DESTINATION "include")
INSTALL(EXPORT iomessages DESTINATION "lib")
Von dieser Basis ausgehend, kann man ganz gut CMake-basierte C++Projekte auch wieder in andere Projekte einbinden. Und die Verzeichnisstruktur des Installtargets ist so ordentlich, dass mMn auch andere Buildsysteme damit klarkommen sollten.
Vielleicht hilft dass hier ja dem einen oder anderen weiter zu kommen und er gibt CMake nochmal ne Chance.
Aber nicht falsch verstehen, ich bin kein Verfechter von Tools die jeder benutzen muss, sondern ich versuche hier eine Hilfestellung zu geben. Was ihr letzten Endes verwendet ist mir wurscht, ihr könnt das meinetwegen auch mit cl.exe von Hand kompilieren. Nur vermittelt hier keinen Eindruck ein Tool wäre schlecht, nur weil eventuell mangelnde Information zum nicht sachgemäßen Umgang mit dem Tool geführt hat.
In diesem Sinne.
Thoran