C++ Dependency Management 2.0

32
Veranstalter Gold-Partner Patrick Charrier C++ Dependency Management 2.0

Transcript of C++ Dependency Management 2.0

Page 1: C++ Dependency Management 2.0

Veranstalter Gold-Partner

Patrick Charrier

C++ Dependency Management 2.0

Page 2: C++ Dependency Management 2.0

Veranstalter Gold-Partner 2015

Patrick CharrierDoktorand in Darmstadt

GraduiertenschuleComputational Engineering(TU Darmstadt)

BereichMedizinische Simulation

Vorstellung

Page 3: C++ Dependency Management 2.0

Veranstalter Gold-Partner 2015

Warum? Kleine Einführung in CMake

Tweaks Old-School Dependency Management Die Zukunft?

Inhalt

Page 4: C++ Dependency Management 2.0

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)

Patrick
Das Problem ist so schlimm, das einige Projekte schon Ihr eigenes Build System geschrieben haben, siehe ROS catkin.
Page 5: C++ Dependency Management 2.0

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

Patrick
Das Problem ist so schlimm, das einige Projekte schon Ihr eigenes Build System geschrieben haben, siehe ROS catkin.
Page 6: C++ Dependency Management 2.0

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

Page 7: C++ Dependency Management 2.0

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

Page 8: C++ Dependency Management 2.0

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

Page 9: C++ Dependency Management 2.0

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} …)

Page 10: C++ Dependency Management 2.0

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

Page 11: C++ Dependency Management 2.0

Veranstalter Gold-Partner 2015

Das INSTALL-Target installiert nach CMAKE_INSTALL_PREFIX.

Das PACKAGE-Target erstellt die Pakete.

Deployment mit CPack

Page 12: C++ Dependency Management 2.0

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" . "*")

Page 13: C++ Dependency Management 2.0

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());}

Page 14: C++ Dependency Management 2.0

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

Page 15: C++ Dependency Management 2.0

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 .

Patrick
Kaffee trinken
Page 16: C++ Dependency Management 2.0

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

Page 17: C++ Dependency Management 2.0

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

Page 18: C++ Dependency Management 2.0

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)

Page 19: C++ Dependency Management 2.0

Veranstalter Gold-Partner 2015

Die Bibliotheken Sammlung

Page 20: C++ Dependency Management 2.0

Veranstalter Gold-Partner 2015

Unter Microsoft Windows:3. CMake-Konfiguration

Welcome to Dependency Hell

Page 21: C++ Dependency Management 2.0

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")

Page 22: C++ Dependency Management 2.0

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

Page 23: C++ Dependency Management 2.0

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

Page 24: C++ Dependency Management 2.0

Veranstalter Gold-Partner 2015

Mit Visual Studio ist downloaden und kompilieren einfacher mit NuGet.

Fast alle Bibliotheken waren schon vorhanden. Gute Arbeit!

NuGet

Page 25: C++ Dependency Management 2.0

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")

Page 26: C++ Dependency Management 2.0

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})

Page 27: C++ Dependency Management 2.0

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.

Page 28: C++ Dependency Management 2.0

Veranstalter Gold-Partner 2015

“Pure” CMake-Erweiterung Erweitert CMake um:

Checksummen Collections Events Logging Maps String Functions uvm.

Auch: Dependency Management

Page 29: C++ Dependency Management 2.0

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

Page 30: C++ Dependency Management 2.0

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.

Page 31: C++ Dependency Management 2.0

Veranstalter Gold-Partner 2015

Fragen?

Partner:

Page 32: C++ Dependency Management 2.0

Veranstalter Gold-Partner 2015Partner:

Vielen Dank!Ich freue mich auf Ihr Feedback!