Im alltäglichen Einsatz verwenden wir eine potentiell steigende Anzahl an immer größeren Bibliotheken. Diese helfen uns schneller und effizienter unsere Ziele zu erreichen, werden ständig gewartet und ersparen nebenbei auch jede Menge Fehlerlösungs- und Dokumentationsaufwand. Gleichzeitig bedeuten sie jedoch einen unmittelbar höheren Aufwand für das Build und Dependency Management. Wie bekommt man dieses Problem in den Griff?
In der letzten Dekade hat das BuildSystem CMake diesbezüglich große Fortschritte bei der schnellen und alltäglichen Wiederverwendbarkeit von C++ Code bewirkt. So fördert zum Beispiel die Unabhängigkeit von spezifischen BuildSystemen zusammen mit Git und innovativen Hostern wie GitHub insbesondere die Entstehung und Verwendung von OpenSource
Software. Wie sieht die Zukunft aus?
Dependency Manager wie biicode zeigen einen noch komfortableren Weg auf, mit eigenem oder Drittanbieter Code zu arbeiten. Download, Build und Einbindung von Dependencies wird damit so einfach wie das Installieren einer App aus dem AppShop. Doch welche Vor- und Nachteile hat dieses System? Welche Alternativen gibt es?
4. Veranstalter Gold-Partner
20
15
1. Verleugung
“Diese Bibliothek füge ich noch schnell hinzu.”
2. Wut
“Warum kompiliert es auf diesem Rechner nicht?”
3. Verhandlung
“Ach ich implementiere es einfach selbst.”
4. Depression
“Hätte ich es nur nicht selbst implementiert.”
5. Akzeptanz
“Gibt es eine Alternative?”
Die fünf Phasen des Dependency Managements
(nach Elisabeth Kübler-Ross)
5. Veranstalter Gold-Partner
20
15
Wir benutzen immer häufiger Open Source und
allgemein Bibliotheken.
“Gartner: 80% of commercial apps to use open source by 2012”
NeueVersionen kommen schneller.
Wir arbeiten immer verteilter und zu
verschiedenen Zeiten.
Sicherheitsrelevante Bugs werden ständig
gefunden (Heartbleed, etc.).
Updates sind essentiell!
Und es wird noch schlimmer
6. Veranstalter Gold-Partner
20
15
Das Individuum (der Entwickler)
profitiert vom Wissen anderer.
Alle sind voneinander abhängig und inspiriert.
siehe Clay Shirky on Love, Internet Style
https://www.youtube.com/watch?v=Xe1TZaElTAs
Softwareentwicklung wird zu einem
gewaltigen (Schwarm)-organismus.
Dieser erneuert sich ständig selbst.
Chancen sehen
7. Veranstalter Gold-Partner
20
15
Wir programmieren ein 3D-Spiel!
Benötigte Bibliotheken:
Algorithmen -> boost
Grafik -> OpenGL
Sound -> libogg
Scripting -> lua
Level-Storage -> tinyxml, zlib
Testing -> gtest
Ein Beispiel
8. Veranstalter Gold-Partner
20
15
Das Spiel soll portabel sein.
Deshalb:
CMake definiert Meta Build-Scripte.
Diese werden über sog. Generatoren in
Makefiles oderVS-Solutions umgewandelt.
CMake
10. Veranstalter Gold-Partner
20
15
CPack ist eine Komponente von CMake.
CPack kann:
“Installieren”
INSTALL(TARGETS Game DESTINATION bin)
INSTALL(DIRECTORY media DESTINATION . PATTERN "*.svn" EXCLUDE)
Pakete bauen
Debian, RedHat
NSIS-Installer (Windows)
Apple-Bundles
Deployment mit CPack
11. Veranstalter Gold-Partner
20
15
Das INSTALL-Target installiert nach
CMAKE_INSTALL_PREFIX.
Das PACKAGE-Target erstellt die Pakete.
Deployment mit CPack
12. Veranstalter Gold-Partner
20
15
1. Möglichkeit: Alle DLL-Pfade in die
PATH-Umgebungsvariable eintragen.
2. Möglichkeit: CMake Copy-Script
Was ist mit DLLs?
# copy DLLs
COPYINSTALL_DLLS("${Boost_INCLUDE_DIR}/../../lib" . boost_system
boost_filesystem boost_thread boost_asio)
COPYINSTALL_DLLS("${OGRE_HOME}/bin/release" . "*")
COPYINSTALL_DLLS("${OGRECSS_INCLUDE_DIR}/../../lib" . "*")
COPYINSTALL_DLLS("${OGREPAGED_INCLUDE_DIR}/../../lib" . "*")
COPYINSTALL_DLLS("${OGREAL_INCLUDE_DIR}/../../lib" . "*")
13. Veranstalter Gold-Partner
20
15
1. Möglichkeit: In-Source Build.
2. Möglichkeit:
Alle Ressourcen von der
Source- in die Build-Dir kopieren.
3. Möglichkeit:
Die Working-Directory beim Start wechseln.
Was ist mit Ressourcen?
std::ifstream pathIn("override_path");
std::string path_override;
pathIn >> path_override;
if (!path_override.empty()) {
std::cout << "override path: " << path_override << std::endl;
chdir(trim(path_override.c_str()).c_str());
}
14. Veranstalter Gold-Partner
20
15
Die Build Logik ist nun definiert.
Jetzt brauchen wir nur noch die Bibliotheken:
1. Downloaden
2. Kompilieren
3. In CMake konfigurieren
Welcome to Dependency Hell
15. Veranstalter Gold-Partner
20
15
Unter Ubuntu Linux:
1. Downloaden
2. Kompilieren -> Schon erledigt
3. CMake-Konfiguration
4. Fertig!
Welcome Dependency Hell
sudo apt-get install libboost-dev zlib1g-dev libogg-dev liblua50-dev libgtest-dev
cd game
cmake .
21. Veranstalter Gold-Partner
20
15
Fast alle Find-Scripte unterstützen x_ROOT Variablen.
Eine selbstgebaute CMake-Funktion sucht in einem
“Library Collection”-Pfad nach Bibliothek x
und setzt die entsprechende x_ROOTVariable.
Das Find-Script greift diese auf und
findet Includes und Libraries relativ dazu.
„Zu Hilfe“ CMake
# automated library discovery
AUTO_LIB_DISCOVERY(BOOST_ROOT "${LIBRARY_COLLECTION_ROOT_PATH}/boost*" "Boost root path")
AUTO_LIB_DISCOVERY(OGRE_HOME "${LIBRARY_COLLECTION_ROOT_PATH}/ogre*" "Ogre root path")
AUTO_LIB_DISCOVERY(OGREBULLET_ROOT "${LIBRARY_COLLECTION_ROOT_PATH}/libogrebullet*" "ogrebullet root
path")
AUTO_LIB_DISCOVERY(OGREAL_ROOT "${LIBRARY_COLLECTION_ROOT_PATH}/libogeral*" "OgreAL root path")
AUTO_LIB_DISCOVERY(OGRECCS_ROOT "${LIBRARY_COLLECTION_ROOT_PATH}/ogre-ccs*" "Ogre-CCS root path")
AUTO_LIB_DISCOVERY(OGREPAGED_ROOT "${LIBRARY_COLLECTION_ROOT_PATH}/ogre-paged*" "Ogre-paged root path")
AUTO_LIB_DISCOVERY(OgreProcedural_HOME "${LIBRARY_COLLECTION_ROOT_PATH}/ogre-procedural*" "Ogre-
Procedural root path")
AUTO_LIB_DISCOVERY(HYDRAX_ROOT "${LIBRARY_COLLECTION_ROOT_PATH}/libhydrax*" "hydrax root path")
AUTO_LIB_DISCOVERY(SKYX_ROOT "${LIBRARY_COLLECTION_ROOT_PATH}/libskyx*" "skyx root path")
22. Veranstalter Gold-Partner
20
15
Dear Mr Charrier,
I'm working on a project on geometric algebra
(implementation) and i would like to use Gaalop Precompiler
with C++.
I tried installing deb package and build Horizon example using
Gaalop but there are problems when I try to configure.
Variables GPC_INCLUDE_DIR, GPC_JAR and GPC_LIBRARY are
set NOT_FOUND.
Do you think there's a problem with installation?
Sincerely,
…
Welcome to Dependency Hell
23. Veranstalter Gold-Partner
20
15
Portabilität
Viele Bibliotheken
Integration mitVersionsverwaltungen (VCS)
(SVN, GIT, etc.)
Kleiner Overhead
Plug and Play
Durch Benutzerinhalt erweiterbar
(deshalb Dependency Management 2.0)
Anforderungen an ein modernes
Dependency Management
24. Veranstalter Gold-Partner
20
15
Mit Visual Studio ist downloaden und kompilieren
einfacher mit NuGet.
Fast alle Bibliotheken waren schon vorhanden.
Gute Arbeit!
NuGet
29. Veranstalter Gold-Partner
20
15
Vergleich
Open
Source
Libs Binär Fetch Erweiter
bar
OS Pures
CMake
NuGet Nein 36137 Ja Archiv Ja Windows Nein
hunter Ja 21 Nein Archiv Ja Alle Ja
cpm Ja 60+ Nein GIT, SVN,
HG
Ja Alle Ja
biicode Ja 30+ Nein Files Ja Alle Nein
cmake++ Ja 1+ Ja GIT, Archiv Ja Alle Ja
30. Veranstalter Gold-Partner
20
15
Windows Paket Manager
Basierend auf PowerShell
Steuerung über Command Line und GUI
Aber: Unterstützt keine Bibliotheken.
Jedoch:
chocolatey
C:Windowssystem32>choco install biicode
Chocolatey v0.9.9.5
Installing the following packages:
biicode
By installing you accept licenses for the packages.