C++ Dependency Management 2.0
-
Upload
patrick-charrier -
Category
Engineering
-
view
61 -
download
7
Transcript of C++ Dependency Management 2.0
Veranstalter Gold-Partner
Patrick Charrier
C++ Dependency Management 2.0
Veranstalter Gold-Partner 2015
Patrick CharrierDoktorand in Darmstadt
GraduiertenschuleComputational Engineering(TU Darmstadt)
BereichMedizinische Simulation
Vorstellung
Veranstalter Gold-Partner 2015
Warum? Kleine Einführung in CMake
Tweaks Old-School Dependency Management Die Zukunft?
Inhalt
Veranstalter Gold-Partner 2015
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)
Veranstalter Gold-Partner 2015
Wir benutzen immer häufiger Open Source und allgemein Bibliotheken.“Gartner: 80% of commercial apps to use open source by 2012”
Neue Versionen 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
Veranstalter Gold-Partner 2015
Das Individuum (der Entwickler)profitiert vom Wissen anderer.
Alle sind voneinander abhängig und inspiriert. siehe Clay Shirky on Love, Internet
Stylehttps://www.youtube.com/watch?v=Xe1TZaElTAs
Softwareentwicklung wird zu einemgewaltigen (Schwarm)-organismus.
Dieser erneuert sich ständig selbst.
Chancen sehen
Veranstalter Gold-Partner 2015
Wir programmieren ein 3D-Spiel! Benötigte Bibliotheken:
Algorithmen -> boost Grafik -> OpenGL Sound -> libogg Scripting -> lua Level-Storage -> tinyxml, zlib Testing -> gtest
Ein Beispiel
Veranstalter Gold-Partner 2015
Das Spiel soll portabel sein. Deshalb:
CMake definiert Meta Build-Scripte. Diese werden über sog. Generatoren
in Makefiles oder VS-Solutions umgewandelt.
CMake
Veranstalter Gold-Partner 2015
CMake Beispiel
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
PROJECT(Game)
FIND_PACKAGE(Boost COMPONENTS system thread REQUIRED)FIND_PACKAGE(OpenGL REQUIRED)FIND_PACKAGE(tinyxml REQUIRED)FIND_PACKAGE(zlib REQUIRED)
...
INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS} …)
ADD_EXECUTABLE(Game main.cpp)TARGET_LINK_LIBRARIES(Game ${Boost_LIBRARIES} …)
Veranstalter Gold-Partner 2015
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
Veranstalter Gold-Partner 2015
Das INSTALL-Target installiert nach CMAKE_INSTALL_PREFIX.
Das PACKAGE-Target erstellt die Pakete.
Deployment mit CPack
Veranstalter Gold-Partner 2015
1. Möglichkeit: Alle DLL-Pfade in diePATH-Umgebungsvariable eintragen.
2. Möglichkeit: CMake Copy-Script
Was ist mit DLLs?
# copy DLLsCOPYINSTALL_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" . "*")
Veranstalter Gold-Partner 2015
1. Möglichkeit: In-Source Build.2. Möglichkeit:
Alle Ressourcen von derSource- 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());}
Veranstalter Gold-Partner 2015
Die Build Logik ist nun definiert. Jetzt brauchen wir nur noch die
Bibliotheken:1. Downloaden2. Kompilieren3. In CMake konfigurieren
Welcome to Dependency Hell
Veranstalter Gold-Partner 2015
Unter Ubuntu Linux:1. Downloaden
2. Kompilieren -> Schon erledigt3. CMake-Konfiguration
4. Fertig!
Welcome Dependency Hell
sudo apt-get install libboost-dev zlib1g-dev libogg-dev liblua50-dev libgtest-dev
cd gamecmake .
Veranstalter Gold-Partner 2015
Unter Microsoft Windows:1. Downloaden
boost (Binaries)http://sourceforge.net/projects/boost/files/boost-binaries/1.57.0/
libogg (Sources) https://www.xiph.org/downloads/
lua (Binaries)https://code.google.com/p/luaforwindows/downloads/list
tinyxml (Sources)http://sourceforge.net/projects/tinyxml/files/tinyxml/2.6.2/tinyxml_2_6_2.zip/download
zlib (Binaries) http://gnuwin32.sourceforge.net/packages/zlib.htm
gtest (Sources) https://code.google.com/p/googletest/downloads/list
Welcome to Dependency Hell
Veranstalter Gold-Partner 2015
Unter Microsoft Windows:2. Kompilieren
libogg (Sources) https://www.xiph.org/downloads/
tinyxml (Sources)http://sourceforge.net/projects/tinyxml/files/tinyxml/2.6.2/tinyxml_2_6_2.zip/download
gtest (Sources) https://code.google.com/p/googletest/downloads/list
Welcome to Dependency Hell
Veranstalter Gold-Partner 2015
Welcome to Dependency Hell
Not bad enough? Try this!
find_package(SOFA REQUIRED)find_package(Boost COMPONENTS thread system REQUIRED)find_package(TBB REQUIRED)find_package(Eigen3 REQUIRED)find_package(GLEW REQUIRED)find_package(OGLPlus REQUIRED)find_package(PNG REQUIRED)find_package(OpenCL REQUIRED)find_package(assimp REQUIRED)find_package(CImg REQUIRED)find_package(ALGLIB REQUIRED)find_package(DEFCCD REQUIRED)find_package(VexCL REQUIRED)
Veranstalter Gold-Partner 2015
Die Bibliotheken Sammlung
Veranstalter Gold-Partner 2015
Unter Microsoft Windows:3. CMake-Konfiguration
Welcome to Dependency Hell
Veranstalter Gold-Partner 2015
Fast alle Find-Scripte unterstützen x_ROOT Variablen. Eine selbstgebaute CMake-Funktion sucht in einem
“Library Collection”-Pfad nach Bibliothek xund setzt die entsprechende x_ROOT Variable.
Das Find-Script greift diese auf undfindet Includes und Libraries relativ dazu.
„Zu Hilfe“ CMake
# automated library discoveryAUTO_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")
Veranstalter Gold-Partner 2015
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
Veranstalter Gold-Partner 2015
Portabilität Viele Bibliotheken Integration mit Versionsverwaltungen
(VCS)(SVN, GIT, etc.)
Kleiner Overhead Plug and Play Durch Benutzerinhalt erweiterbar
(deshalb Dependency Management 2.0)
Anforderungen an ein modernes Dependency Management
Veranstalter Gold-Partner 2015
Mit Visual Studio ist downloaden und kompilieren einfacher mit NuGet.
Fast alle Bibliotheken waren schon vorhanden. Gute Arbeit!
NuGet
Veranstalter Gold-Partner 2015
Initialisierung:
Paket downloaden und installieren:
Der Rest ist “alter Hut”:
hunter
include("cmake/HunterGate.cmake")
hunter_add_package(Boost COMPONENTS regex filesystem)
find_package(Boost REQUIRED regex filesystem)
include_directories(${Boost_INCLUDE_DIR})add_executable(foo foo.cpp)target_link_libraries(foo ${Boost_LIBRARIES})
HunterGate( URL "https://github.com/.../archive/v0.8.9.tar.gz" SHA1 "a63185bfe1235b42a4644e84ab121c7ac4a0db65")
Veranstalter Gold-Partner 2015
Erfordert Ersetzung von FIND_PACKAGE durch:
Alle Libraries werden gelinkt mit:
cpm
CPM_AddModule("aabb" GIT_REPOSITORY "https://github.com/iauns/cpm-glm-aabb" GIT_TAG "1.0.2")
target_link_libraries(${EXE_NAME} ${CPM_LIBRARIES})
Veranstalter Gold-Partner 2015
Ist plattformunabhängig. Kleiner Overhead (Konfigurationsdatei) Integriert mit VCS. Plug and Play
(Download, Abhängigkeitsauflösungund Kompilierung ist vollautomatisch.)
Benutzer können Pakete (“Blocks”) hochladen.
Veranstalter Gold-Partner 2015
“Pure” CMake-Erweiterung Erweitert CMake um:
Checksummen Collections Events Logging Maps String Functions uvm.
Auch: Dependency Management
Veranstalter Gold-Partner 2015
Vergleich
Open Source
Libs Binär Fetch Erweiterbar
OS PuresCMake
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
Veranstalter Gold-Partner 2015
Windows Paket Manager Basierend auf PowerShell Steuerung über Command Line und GUI
Aber: Unterstützt keine Bibliotheken. Jedoch:
chocolatey
C:\Windows\system32>choco install biicodeChocolatey v0.9.9.5Installing the following packages:biicodeBy installing you accept licenses for the packages.
Veranstalter Gold-Partner 2015
Fragen?
Partner:
Veranstalter Gold-Partner 2015Partner:
Vielen Dank!Ich freue mich auf Ihr Feedback!