Header Convertieren von libgit2

Zur Vorstellung von Komponenten und Units für Lazarus
Antworten
Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 7320
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Header Convertieren von libgit2

Beitrag von af0815 »

Ich méchte gerne verstehen wie man C-Headerdateien wie zB. hier https://github.com/libgit2/libgit2 im Verzeichnis include nach FreePascal őbersetzt und zwar so das etwas herauskommt wie bei https://github.com/todaysoftware/libgit2-delphi .
Die Struktur der include Header Dateien sollte erhalten bleiben, wie es auch libgit2-delphi zeigt.

Der/die haben dabei mit CHelper gearbeitet. So wie es aussieht wird der schon einige Zeit nicht für die aktuellen Lazarusversionen gepflegt. Zumindest geht es nicht mit aktuellen Lazarus Versionen. Und im OPM ist er ach nicht mehr vorhanden, vermutlich weil er nicht aktuell gewartet ist. (Ja auf der Kommandozeile funktioniert der, nur in der Lazarus Einbindung gehen ein paar kleinere Sachen nicht).

Es müsste doch mit h2pas, das bei jeder freepascal Installation dabei ist, ja auch möglich sein.

Und ja, ich könnte mit libgit2-delphi auch arbeiten (mache ich gerade) aber ich will die blöde Konvertierung einmal begreifen. Der Weg ist also das Ziel. Und nein, ich will keine Tipps von wegen LLMs.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
theo
Beiträge: 11325
Registriert: Mo 11. Sep 2006, 19:01

Re: Header Convertieren von libgit2

Beitrag von theo »

h2pas erspart dir etwas Arbeit, aber es liefert fast nie ein pfannenfertiges Resultat.
Ohne ein Fan davon zu sein oder es jemals ausprobiert zu haben denke ich, dass dies ein geeigneter Job für die "KI" sein könnte.
Natürlich lernt man etwas dabei, wenn man es selber macht (v.A. von C), aber am Ende ist es nur Fleissarbeit und nichts Kreatives.
Ich kann mir einfach vorstellen, dass die "KI" eine kompletteres (Teil-?)Resultat liefert als h2pas etc.
Am Schluss musst du den Code sowieso noch einmal selber durchschauen.

Mathias
Beiträge: 7313
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Header Convertieren von libgit2

Beitrag von Mathias »

Ich mache es immer mit h2pas, dabei hat sich folgendes am besten bewährt.

Code: Alles auswählen

h2pas -p -T -d -c -e blabla.h
Nur die meisten Header sind nicht pfannenfertig für h2pas, die muss man meistens vorher noch anpassen.

Ich habe mir gerade kurz die header von libgit2 angeguckt, das ist ein rech hartnäckiger Fall.
Die Zeilen der Functionen sind idiotisch in Klammern eingepackt.

Code: Alles auswählen

GIT_EXTERN(int) git_describe_options_init(git_describe_options *opts, unsigned int version);
Dies muss man auf so ändern.

Code: Alles auswählen

extern int git_describe_options_init(git_describe_options *opts, unsigned int version);
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 7320
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Header Convertieren von libgit2

Beitrag von af0815 »

Bin gerade dabei das mal durch den Präprozessor von C zu jagen

Code: Alles auswählen

gcc -E -P -nostdinc -I. -I../../fake_includes -I../ -I./sys/ ../../wrapper.h -o common_clean.h
Mit ein paar Fake Dateien. Ein grobes Gerüst steht dann bald mal. Weil ich will es soweit es geht automatisieren und nicht jedesmal mit der Hand was nachbessern.

Edit: Schaut mal für den ersten Run nicht so schlecht aus

Code: Alles auswählen

#!/bin/bash
# Pfad zu h2pas definieren
H2PAS="/home/xxx/yyy/zzz/fpc/bin/x86_64-linux/h2pas"
### Fakes erstellen start ###
# 1. Einen temporären, leeren Ordner für die "Fake-Header" erstellen
mkdir -p fake_includes

# 2. Eine komplett leere Datei namens time.h darin anlegen
touch fake_includes/time.h
touch fake_includes/stdlib.h
touch fake_includes/stdint.h
touch fake_includes/stddef.h
### Fakes erstellen ende ###

cd header

# 1. Alle Include-Zeilen aus git2.h filtern und säubern
grep '^#include "git2/' git2.h | sed 's/#include "//' | sed 's/"//' | while read -r FULL_PATH; do
    
    # 2. Reintext-Namen extrahieren (z.B. annotated_commit)
    FILE_NAME=${FULL_PATH#*/}
    HEADER_NAME=${FILE_NAME%.h}
    
    echo "Verarbeite: $HEADER_NAME..."
    
    # 3. Temporären Wrapper für diesen spezifischen Header bauen
    cat << EOF > temp_wrapper.h
// 1. Die Guard-Makros der System-Header simulieren
#define _INC_TIME          // Windows/MSVC Zeit-Header
#define _TIME_H_           // Linux/GCC Zeit-Header
#define _TIME_H            // Allgemeine Variante
#define _STDLIB_H_         // Standard-Bibliothek
#define _STDLIB_H

// 2. Unverzichtbare Basis-Datentypen bereitstellen
typedef long time_t;
typedef unsigned long size_t;

// 3. Die h2pas-Ersetzungen für libgit2
#define GIT_EXTERN(type) type
#define GIT_BEGIN_DECL
#define GIT_END_DECL
// Blendet die GNU-Sichtbarkeitsattribute für h2pas aus
#define __attribute__(x)
// Blendet das Wort 'extern' aus, damit h2pas die Funktionen erkennt
#define extern

// 4. Jetzt die eigentliche Datei einbinden
#include "$FULL_PATH"
EOF

    # 4. GCC-Präprozessor ausführen
    gcc -E -P -nostdinc -I. -I../fake_includes -I../ -I./sys/ temp_wrapper.h -o temp_clean.h
    
    # 5. h2pas ausführen und die .inc-Datei erzeugen
    $H2PAS -d -i -w temp_clean.h -o "${HEADER_NAME}.inc"
    
done

# Aufräumen
rm -f temp_wrapper.h temp_clean.h
cd ..
echo "Fertig! Alle .inc-Dateien wurden erstellt."
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Mathias
Beiträge: 7313
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Header Convertieren von libgit2

Beitrag von Mathias »

Dies kann man noch durchjagen, dann sind die extern und das mit den Klammern richtig.

Code: Alles auswählen

sed -i 's/GIT_EXTERN\s*(\([^)]*\))/extern \1/g' *.h
Dann noch GIT_BEGIN_DECL und GIT_END_DECL entfernen, dann läuft h2pas schon mal ohne Fehler durch.

Code: Alles auswählen

h2pas -p -T -d -c -e commit.h
Mit gcc habe ich auch schon Versuche, da bin ich aber nie auf dem grünen Zweig gekommen.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 7320
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Header Convertieren von libgit2

Beitrag von af0815 »

Mathias hat geschrieben: Mo 25. Mai 2026, 14:28 Dies kann man noch durchjagen, dann sind die extern und das mit den Klammern richtig.
Mit oder ohne gcc Präprozessor ?
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Mathias
Beiträge: 7313
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Header Convertieren von libgit2

Beitrag von Mathias »

af0815 hat geschrieben: Mo 25. Mai 2026, 14:49
Mathias hat geschrieben: Mo 25. Mai 2026, 14:28 Dies kann man noch durchjagen, dann sind die extern und das mit den Klammern richtig.
Mit oder ohne gcc Präprozessor ?
Direkt die Header Dateien, aber bitte an einer Kopien in einem separaten Ordner.
Unter Linux geht dies sowieso kaum anders, da die Header durch root Schreibgeschützt sind.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 7320
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Header Convertieren von libgit2

Beitrag von af0815 »

Mathias hat geschrieben: Mo 25. Mai 2026, 15:33
af0815 hat geschrieben: Mo 25. Mai 2026, 14:49
Mathias hat geschrieben: Mo 25. Mai 2026, 14:28 Dies kann man noch durchjagen, dann sind die extern und das mit den Klammern richtig.
Mit oder ohne gcc Präprozessor ?
Direkt die Header Dateien, aber bitte an einer Kopien in einem separaten Ordner.
Unter Linux geht dies sowieso kaum anders, da die Header durch root Schreibgeschützt sind.
Ich arbeite da als user, nix root. Die Header lade ich direkt aus dem Github des Projektes. Damit ist nichts schreibgeschützt. Und mit Git kommst du ja immer zurück.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten