Boost unter Linux selbst installieren

Dies soll eine kleine Anleitung sein, wie man die aktuellste (und stabile) Boost Version unabhängig von den Distributionspaketen installiert. Zum Zeitpunkt dieses Artikels war das Boost 1.52.0. Installiert auf einem 64bit openSUSE 12.2 (funktioniert ebenso mit 12.1).

## Voraussetzungen und Abhängigkeiten ### Compiler Natürlich ist ein aktueller C/C++-Compiler notwendig. Für diese Anleitung habe ich sowohl den GNU GCC in Version 4.7.2 als auch den LLVM Clang in Version 3.1 genutzt, die ich über die offiziellen openSUSE Repositories (genaue gesagt: gcc47 und llvm-clang) installiert habe.

Unicode-Unterstützung

Um vollständige Unicode-Unterstützung zu haben, sind zudem die International Components for Unicode (kurz: ICU) notwendig. Hier nutze ich libicu in Version 49.1. Im Falle von openSUSE heißt das Entwicklungs-Paket libicu-devel (die eigentliche Bibliothek, libicu49, wird automatisch ebenfalls installiert). Nicht notwendig aber durchaus nicht schädlich sind noch die Pakete icu sowie icu-data.

OpenMPI

Einige Boost-Bibliotheken haben die Möglichkeit OpenMPI zu nutzen, um eine bessere Parallelisierung zu ermöglichen. Dafür sind jedoch die Header-Dateien für OpenMPI nötig, die sich openmpi_devel nennen. Ich nutze hier Version 1.5.4.

Boost-Sourcen vorbereiten

### Downloaden Jetzt fehlen nur noch die Boost-Sourcen. Diese sind auf Sourceforge: http://sourceforge.net/projects/boost/files/boost/1.52.0/. Ich bevorzuge die Bzip2 komprimierte Variante – aber das sei jedem selbst überlassen.

Entpacken

Ich persönlich habe diese nach $HOME/src/boost_1_52_0 entpackt, da ich die Quellen von selbstkompilierten Programmen und Bibliotheken in $HOME/src sammel, um sie dann nach $HOME zu installieren. Wer mag kann es aber auch systemweit nach /opt (dann aber wohl als root installieren) oder sonstwohin entpacken.

Boost kompilieren

Bevor Boost kompiliert werden kann, muss zunächst das Boost.Build-System vorbereitet werden. Boost kommt mit einem eigenen Build-Programm (früher bjam, heute b2 genannt), so dass man kein ./configure && make && make install machen kann. CMake ist zwar möglich aber nur experimentell unterstützt. Ich bevorzuge hier Boost.Build.

Von nun gehe ich davon aus, dass alle Befehle in $HOME/src/boost_1_52_0 (bzw. entsprechend) ausgeführt werden.

Konfigurieren (‘Bootstrappen’)

Der erste Schritt ist die Vorbereitung von Boost.Build, das mit den Boost-Sourcen mitgeliefert wird. Ein ./boostrap --help liefert ein paar Hinweise, wie man es installieren kann. Ich will alle Boost-Bibliotheken, mit vollständiger Unicode-Unterstützung, in mein Benutzerverzeichnis (also nach $HOME/lib und $HOME/include) installieren:

./bootstrap --with-icu --prefix=$HOME

Der Output sollte folgende Zeilen enthalten:

Building Boost.Build engine with toolset gcc... tools/build/v2/engine/bin/linux86_64/b2
Unicode/ICU support for Boost.Regex?... /usr
Generating Boost.Build configuration in project-config.jam...

Vermutlich wird noch ein Hinweis auf ein (nicht) vorhandenes Python auftauchen. Diesen ignoriere ich jetzt hier. Wer Boost auch für Python verfügbar haben möchte, sollte sicher stellen, dass sowohl die von einem selbst bevorzugte Python Version sowie dessen Installationspfad richtig erkannt wird.

Da OpenMPI genutzt werden soll, das aber scheinbar nicht automatisch erkannt wird, muss es manuell der Konfiguration hinzugefügt werden. Dazu muss in der Datei tools/build/v2/user-config.jam die Zeile

using mpi ;

hinzugefügt werden (wo ist egal, am einfachsten ans Ende: echo "using mpi ;" >> tools/build/v2/user-config.jam).
WICHTIG: Unbedingt auf das Leerzeichen vor dem Semikolon achten!

Kompilieren – The long run…

Ein ./b2 --help gibt eine ganze Menge an Optionen aus, wie die Art der Boost-Installation kontrolliert werden kann. Die vollständige Liste an Optionen findet sich in der Dokumentation von Boost.Build2.

Also setze ich mal die einzelnen Parameter zusammen, denn ich möchte,

  • dass der GCC genutzt wird: toolset=gcc
  • dass die Namen der Bibliotheken den verwendeten Compiler, Version und Typ enthalten: --layout=versioned
  • dass nur die dynamisch linkbaren Bibliotheken verfügbar werden: link=shared
  • dass alle Compiler-Optimierungen genutzt werden sollen: variant=release
  • dass ich dennoch Debug-Symbole nutzen kann: debug-symbols=on
  • dass sowohl multi- als auch single-Threading möglich ist: threading=multi,single
  • dass immer gegen dynamische C/C++-Systembibliotheken gelinkt wird: runtime-link=shared
  • dass evtl. frühere Builds verworfen werden: -a
  • dass drei Compiler-Instanzen parallel laufen sollen (ich habe nicht so viel Zeit aber leider nur zwei CPU-Cores): -j3
  • dass beim ersten Fehler abgebrochen wird, damit ich sicher gehen kann, dass alles in Ordnung ist: -q
  • dass erst einmal alles kompiliert wird (installieren später): stage

Das macht dann also:

./b2 link=shared runtime-link=shared threading=multi,single variant=release debug-symbols=on toolset=gcc -a -q -j3 --layout=versioned stage

Die Installation nach $HOME wird dann mit dem gleichen Befehl angestoßen, allerdings statt stage wählt man install als Kommando. Und man sollte -a entfernen.

Um das gleiche mit dem Clang Compiler zu machen, ersetzt man toolset=gcc durch toolset=clang.

Endnotiz

Möchte man nun das frische Boost in einem CMake-basierten Projekt verwenden, sollte man beim Aufruf von CMake noch den Parameter -DBOOST_ROOT=$HOME hinzufügen. Kompiliert man das CMake-Projekt mit Clang, so ist auf Grund eines Bugs (oder fehlendem Feature, wie man’s nimmt) im CMake-Module FindBoost unter Linux, zusätzlich noch der Paramter -DBoost_COMPILER="-clang31" notwendig.

Happy Boosting!

Neue Artikel / Recent Posts

GitHub Repos

Status updating...