QVINTVS · SCRIBET

Ruby kompilieren

Ich bin jetzt zum geschätzt 3.435sten mal gefragt worden, wie man eigentlich Ruby kompiliert. Also schreibe ich hier eine Anleitung für alle, die es gerne wissen möchten, keine Grundlagen in Kompilation vorausgesetzt (aber ein Terminal solltet ihr schon öffnen und bedienen können). RVM ist nicht im Spiel.

Grundwissen zur Ruby-Entwicklung

Ruby ist komplett in der Programmiersprache C geschrieben und wird über das Versionskontrollsystem Subversion verwaltet, das URL des Repositories lautet http://svn.ruby-lang.org/repos/ruby; als Build-Systen kommen die GNU Autotools zum Einsatz. Rubys Bugtracker (ein angepasstes Redmine) ist unter http://redmine.ruby-lang.org einsehbar.

Rubys offizielle Webpräsenz ist http://ruby-lang.org.

Schritt I: Abhängigkeiten

Obwohl es möglich ist, Ruby nahezu ohne Abhängigkeiten zu kompilieren, ist das Resultat in einem solchen Falle sehr mager, ein typisches Anzeichen für ein zu marginal kompiliertes Ruby ist die Fehlermeldung:

No such file to load — zlib (LoadError)

bei der Verwendung von RubyGems. Konnte Ruby nämlich die ZLib-Header-Dateien nicht finden, werden die in Rubys Standardbibliothek enthaltenen Bindings für ZLib einfach nicht kompiliert. RubyGems benötigt ZLib jedoch (bei den .gem-Dateien handelt es sich in Wirklichkeit um GZIP-komprimierte Tarballs).

Die folgende Liste ist sicherlich nicht vollständig, doch entspricht sie allen Abhängigkeiten, die Ruby für meinen Alltag nutzbar machen (und ich verwende Ruby sehr häufig!). Wer mag, kann in den Kommentaren noch auf weitere nützliche Abhängigkeiten hinweisen, die man für Ruby gebrauchen könnte.

Benutzer von Distributionen wie Ubuntu, die zwischen den binären Bibliotheksdateien und dem Quellcode trennen und verschiedene Pakete anbieten (etwa libssl-dev bei Ubuntu für die OpenSSL-Header), müssen darauf achten, auchd die Pakete zu installieren, die ihnen nicht nur die vorkompilierte Programmbibliothek, sondern auch die sog. “Development headers” installieren!

Da Ruby außerdem in wie schon beschrieben in C geschrieben ist, benötigen wir einen C-Compiler; die unter Linux übliche Wahl ist hier der GCC, der in der Regel schon vorinstalliert sei sollte.

Eine etwas ominöse Abhängigkeit, die immer mal wieder in den Raum geworfen wird, ist, dass Ruby ab Version 1.9 ein bereits vorhandenes Ruby zum kompilieren benötige. Ich kann das aus meinen eigenen Versuchen nur teils bestätigen — unter meinem Arch Linux kompilerte Ruby 1.9.2 ohne vorher installiertes Ruby vor einigen Monaten problemlos; unter MinGW/MSYS unter Windows aber nicht (Vorsicht: zuletzt getestet mit 1.9.1). Es bleibt also zu hoffen, dass im Laufe der voranschreitenden Ruby-Entwicklung diese Abhängigkeiten eliminiert wird.

Schritt II: Download des Quellcodes

Ich gehe in diesem Artikel nur auf die Installation von Matz’ offiziellem Ruby Interpreter (MRI) ein. Dessen Quellcode wird für jedes Release aus dem aktuellen Subversion-Status generiert und kann (theoretisch) über ein SVN-Tag abgerufen werden. In der Praxis ist dies in der Regel unnötig, da die fertigen Releases auch ganz “normal” über die offizielle Website zum Download angeboten werden (Abschnitt “Ruby-Quellcode”). Zudem werden (wie man auf derselben Seite sieht) zusätzliche “Snapshots” erstellt: Der “Stable Snapshot”, der alle Fixes seit dem Release der letzen Version enthält (d.h. “Patchlevel-Releases”, die (noch) nicht veröffentlicht wurden, weil ungetestet) und ein jede Nacht neu ersteller “Nightly Snapshot”, der die aktuelle Entwicklerversion (“trunk”) enthält. Der “Stable Snapshot” enthält momentan Ruby 1.9.2-p290 (das heißt dieselbe Version wie das aktuelle Release) und im “Nightly Snapshot” findet sich Ruby 1.9.4-dev1.

Ich konzentriere mich in diesem Artikel auf stabile und veröffentlichte Releases von Ruby, aber die Anweisungen sollten mit leichten Anpassungen auch auf Entwicklerversionen anwendbar sein. Die aktuelle Version von Ruby (zum Zeitpunkt dieses Artikels) ist Ruby 1.9.2-p290, also sollte diese Version heruntergeladen werden.

Schritt III: Konfiguration

Nachdem also Rubys Quellcode heruntergeladen und irgendwo entpackt wurde (ich nehme in diesem Beispiel einfach mal ganz frech /home/quintus/Downloads/ruby-1.9.2-p290 an :-p ), ist es an der Zeit, die Konsole zu öffnen (natürlich kann man auch mit der Konsole Ruby herunterladen und entpacken):

$ cd Downloads/ruby-1.9.2-p290
$ ./configure --help

(Trunk-Nutzer müssen vor configure noch autoconf ausführen). Dieser Befehl gibt eine Liste von allen möglichen Einstellungen, die man Ruby beim Kompilieren so mitgebe kann. Ich gehe hier nur auf die (für mich) wichtigsten ein:

--prefix=PATH
Der Installationspfad für Ruby, z.B. /opt/rubies/my_ruby oder C:/Rubies/my_ruby. Wird es ausgelassen, wird /usr/local angenommen.
--program-suffix=STRING
Ein an alle Ruby-verwandten Dinge anzuhängender String, zur besseren Unterscheidung von verschiedenen installierten Ruby-Versionen, wenn sie alle im PATH, der Umgebungsvariablen für die automatische Programmfindung, sind. Ein --program-suffix=18 etwa würde das die Programme ruby und erb als ruby18 und erb18 installieren. Standardmäßig wird kein Suffix vergeben.
--enable-shared
Weist Ruby an, eine Shared Library für Ruby selbst zu bauen. Habe ich bislang nur für die Kompilierung von wxRuby gebraucht. Standardmäßig deaktiviert.
--disable-install-capi
Erst ab 1.9.3 verfügbar. Wenn Doxygen” installierst ist, möchte Ruby standardmäßig seine gesamte C-API-Dokumentation generieren. Das ist sehr nervig und dauert auch sehr lange. Bis 1.9.2 konnte man das leider nicht komfortabel abschalten2, aber seit 1.9.3 gibt es diesen glorreichen Kommandozeilenschalter.

Wenn man also seine Entscheidung getroffen hat (diese Optionen können nach der Kompilierung nicht mehr verändert werden), ruft man configure auf:

$ ./configure --prefix=/opt/rubies/ruby-1.9.2-p290 --enable-shared

Das läuft recht lange und prüft recht viele Dinge, und irgendwann ist es hoffentlich ohne “configure error” fertig.

Schritt IV: Kompilieren

Die Kompilation von Ruby benötigt GNU Make (oder ein funktionsähnliches Make), was bei den meisten Linux-Distributionen vorinstalliert sein dürfte. Hier braucht es dann nur noch ein

$ make

Schritt V: Installation

Ein mit Root/Administratorrechten ausgeführtes

# make install

installiert Ruby in das mit --prefix angegebene Verzeichnis. Danach muss nur noch sichergestellt werden, dass sich das Unterverzeichnis bin/ der Ruby-Installation in der Umgebugsvariablen PATH befindet; etwa durch ein Skript in /etc/profile.d, das so aussehen könnte:

#!/bin/sh
export PATH=$PATH:/opt/ruby/my_ruby/bin

Achtet bitte darauf, dass dieses Skript ausführbar sein muss. Windows-Nutzer können ihren “Path” unter Systemsteuerung → System → Erweitert → Umgebungsvariablen → Path anpassen.

Fertig, nach einem Neustart der Kommandozeile sollte ein

$ ruby -v
ruby 1.9.2p290 (2011-07-09 revision 32553) [x86_64-linux]

das gewünschte Ergebnis bringen.

Ruby unter Windows kompilieren

Wie man schon sieht, ist die obige Anleitung ein wenig Linux-zentriert. Für die Kompilierung unter Windows empfehle ich, eine MinGW/MSYS -Umgebung aufzusetzen (dies ist auch der Weg, den das RubyInstaller-Team geht) und in der MSYS-Shell den obigen Kommandos zu folgen. Die Kompilierung von Ruby mit Microsofts Visual C++ Compiler ist nicht mehr empfehlenswert, auch wenn es einen Ruby-Entwickler gibt, der das unermüdlich tut.


1 Mancher mag sich fragen, wo denn 1.9.3 geblieben ist. Nun, entweder ihr ladet euch die Preview herunter, oder ihr müsst euch doch durchs SVN-Repository graben.

2 Man konnte nur die von ./configure generierte Makefile bearbeiten und die Definition des doxygen-Kommandos entfernen. Oder doxygen deinstallieren. Oder…