Open Source im professionellen Einsatz

Workshop: Plattform-Portierung für C++ zwischen Borland Delphi und Kylix 3

Weltenbummler

Die Component Library for Cross-platform (CLX) überbrückt für C++-Projekte die Welten Windows/Delphi und Linux/Kylix. Dieser Artikel zeigt die Praxis: die Portierung eines Delphi- und C++Builder-Programms nach Linux, eines Delphi-Programms nach Kylix für C++ sowie die eines Delphi-VCL-Programms in CLX.

Viele große Open-Source-Projekte wie Apache, Open Office oder Mozilla beschränken sich nicht auf eine Plattform oder einen Prozessortyp. Den Entwicklern ist es wichtig, ihr Programm für viele Betriebssysteme lauffähig zu gestalten. Auch kommerziellen Programmen erschließt sich durch eine Portierung ein neuer Markt. Ein Mittel kann das Gespann Delphi/Kylix sein.

Mit Kylix 3 ist es endlich möglich, Delphi-6/7- und C++Builder-6-Projekte (die C++-IDE von Borland) von Windows auf Linux zu portieren. Mehr noch: Man kann neue Projekte gleich so entwickeln, dass deren Portierung zügig abläuft. Die längste dem Autor dieses Beitrags bekannte Zeit, ein sauberes Delphi-CLX-Projekt unter Linux zum Kompilieren zu überreden, ist die Colliers-Case-Study[2] - die Portierung dauerte gerade mal zwei Stunden.

Dieser Workshop beschreibt, wie man vorhandene Delphi/VCL-Projekte (Visual Component Library) in CLX-Projekte (Component Library for Cross-platform) umwandelt und wie CLX-Projekte auf der jeweils anderen Plattform kompilieren. Der erste Abschnitt - Portierung des Thread-Beispiels - wird zunächst ein kleines Delphi-VCL-Projekt in Kylix für Delphi laden.

Der zweite, sehr kurze Teil - Portierung eines Delphi-CLX-Projekts in Kylix - kompiliert ein einfaches Delphi-CLX-Programm mit Kylix. Am Ende stehen das Schreiben eines VCL-Programms im C++Builder, das Konvertieren in ein CLX-Programm und schließlich das Einbinden in das portierte Delphi-CLX-Programm.

Welche Entwicklungsplattform verwenden?

Es ist empfehlenswerter, Projekte mit Linux CLX zu entwickeln und später für Windows zu kompilieren als umgekehrt: Nicht nur ist Kylix billiger als Delphi oder C++Builder - hier müsste man korrekterweise sogar mit der Summe aus Delphi und C++Builder vergleichen -, unter Kylix ist auch die Gefahr geringer, versehentlich plattformabhängigen Code zu schreiben. Die aktuellen Versionen von Delphi und C++Builder enthalten eine Lizenz für den entsprechenden Kylix-Teil: Delphi für die Delphi-IDE unter Kylix sowie C++Builder für die C++Builder-IDE. Das Produkt Kylix und die kostenlose Kylix Open Edition zum Einsatz in Open-Source-Projekten enthalten sogar beide IDEs.

Es gibt ein Tool, um Projektdateien des C++Builders in Kylix zu importieren, aber es gibt wohl kein Tool, das eine Umwandlung von VCL- in CLX-Quelldateien durchführt. Abhängig vom Projekt kann die Umwandlung nämlich vom Hinzufügen einiger »Q«-s in Unit-Namen bis zum kompletten Wechsel der Datenbank- und Intra- und Interprozesskommunikation reichen (CLX unterstützt weder die Borland Database Engine BDE noch Windows-proprietäre Messages).

Wie eine manuelle Umwandlung abläuft, beschreiben etwa Dr. Bob unter[1] und selbstverständlich die Handbücher ("Delphi 7", Kapitel 15.2 und folgende, "C++Builder 6", Band 1, Kapitel 14.2 und folgende). Nach dieser Umwandlung liegt keine "native Linux-Version" des Quelltextes vor, sondern eine CLX-Version, deren Quelldateien im Idealfall plattformunabhängig sind.

Beachtenswert ist, dass unter Windows die scheinbar unwichtige Umbenennung der »dfm«-Dateien in »xfm«-Dateien darüber entscheidet, welchen Code die IDE aus den in den entsprechenden Dateien enthaltenen Formulardefinitionen generiert: CLX-Code bei »xfm« und VCL-Code bei »dfm«-Dateien. Diese Umbenennung ist beim Portieren immer der erste Schritt, gefolgt von der Anpassung von »{$R *.dfm}« in »{$R *.xfm}« in der entsprechenden Quelldatei.

Benennt man diese Dateien nicht um und nimmt scheinbar korrekte Anpassungen in den Quelldateien vor, zum Beispiel die Verwendung von »QForms« statt »Forms«, fügen Delphi und C++Builder beim nächsten Speichern automatisch die jetzt "fehlende" Forms-Unit beziehungsweise -Headerdatei wieder in den Quelltext ein.

Grund: Beide schließen aus der Dateiendung der »dfm«-Datei auf ein VCL-Projekt mit einem Formular, das die Unit »Forms« erfordert. Ist die aber umbenannt, werden Delphi und C++Builder auch unter Windows schon beim Laden einen Teil der entsprechend benötigten CLX-Units verwenden. Kylix verwendet immer CLX-Units.

Abbildung 1: Eine ehemalige VCL-Thread-Anwendung als CLX-Anwendung unter Linux. Sie klassifiziert unterschiedliche Algorithmen anhand des Sortierungsgrads des Feldes. Alle Threads beziehungsweise Algorithmen starteten zum selben Zeitpunkt mit gleichen Linienlängen.

Abbildung 1: Eine ehemalige VCL-Thread-Anwendung als CLX-Anwendung unter Linux. Sie klassifiziert unterschiedliche Algorithmen anhand des Sortierungsgrads des Feldes. Alle Threads beziehungsweise Algorithmen starteten zum selben Zeitpunkt mit gleichen Linienlängen.

Portierung des Thread-Beispiels

Auf der CeBIT 2003 wurde der Autor mehrfach gefragt, ob das Multithreading des C++Builders portabel oder durch spezielle Forks oder Ähnliches unter Linux für jede Anwendung neu zu schreiben sei. Die Antwort: Entwickler können zwar unter Kylix auf Glibc-Funktionen zurückgreifen und speziell auch »fork« nutzen (es versteht sich, dass solche Dinge in einem »#ifdef«-Block eben nur für diese Plattform geschehen sollten), allerdings sind auch die CLX-Thread-Klassen unter Kylix für Delphi und Kylix für C++ nutzbar.

Hier der Beweis mit einer gleichzeitigen Umwandlung von VCL in CLX: Kopie-ren Sie »Delphi7DemosThreads« auf Ihre Linux-Partition und benennen Sie »thsort.dfm« in »thsort.xfm« um. Öffnen Sie »ThSort .pas« in einem Editor und ändern »{$R *.dfm}« in »{$R *.xfm}«. Benennen Sie außerdem »thrddemo. res« in »ThrdDemo .RES« um. Dem Öffnen in Kylix für Delphi steht nun nichts mehr im Wege. Die darauf folgende Borderstyle-Meldung beruht auf einer Eigenschaft, die in CLX-Forms fehlt, und darf ignoriert werden.

Wenn Sie das Programm zu starten versuchen, stoßen Sie zunächst auf die nicht auffindbare Unit »Forms« in »thrddemo«. Ändern Sie diese in »QForms«. Unter CLX bleiben in diesem Fall zwar Eigenschaften, Methoden und Klassennamen gleich, jedoch sind sie teilweise in anderen Units abgelegt.

Unter dem Reiter »ThSort« löschen Sie jetzt die nicht portablen Units »Windows« und »Messages«. »Controls«, »StdCtrls« und »ExtCtrls« wurden durch »QControls«, »QStdCtrls« und »QExtCtrls« ergänzt - sind also in der Version ohne »Q« überflüssig. Ersetzen Sie »Graphics« durch »QGraphics«, »Forms« durch »QForms« und »Dialogs« durch »QDialogs«. Diese Ergänzung wurde in »SortThds« mangels Formulardefinitions-Datei nicht automatisch vorgenommen, daher müssen hier »Graphics« und »ExtCtrls« ihr »Q« manuell verpasst bekommen.

Sie sollten jetzt eine funktionsfähige CLX-Version der ehemaligen VCL-Anwendung haben. Wenn Sie sich diesen Spaß in Kylix für C++Builder nicht entgehen lassen wollen, liegt das Beispiel dort im Verzeichnis »Examples/Apps/ Threads«. Lassen Sie zunächst das Project Conversion Utility (siehe Kasten "Project Conversion Utility") über die Projektdatei laufen.

Project Conversion
Utility

Das Utility ist erhältlich in der »eToys«-Sektion von[3]. Es installiert sich in der Kylix-C++-IDE beziehungsweise in C++Builder unter »Tools | Project Conversion Utility«. Diese Projektkonvertierung betrifft nur die Projektdatei von C++Builder- respektive Kylix-für-C++-Projekten und ändert die Quelldateien nicht, übernimmt also auch keine Konvertierung von VCL in CLX.

Die Windows-Version kann Kylix für C++-Projektdateien in C++Builder-6-Projektdateien umwandeln, die Linux-Version C++Builder-6-Projektdateien in Kylix für C++-Projektdateien. Notwendig ist dies derzeit noch wegen unterschiedlicher Switches beider Compiler.

Diesen Artikel als PDF kaufen

Als digitales Abo

Als PDF im Abo bestellen

comments powered by Disqus

Ausgabe 07/2013

Preis € 6,40

Insecurity Bulletin

Insecurity Bulletin

Im Insecurity Bulletin widmet sich Mark Vogelsberger aktuellen Sicherheitslücken sowie Hintergründen und Security-Grundlagen. mehr...

Linux-Magazin auf Facebook