• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Gelöst Patches aus Source-RPM mitkompilieren?

abgdf

Guru
Hallo,

mir geht das "print()"-Problem von Python3 auf die Nerven. Daher möchte ich mir einen Fork des Python3-Interpreters bauen, der sowohl "print('Hallo')" als auch "print 'Hallo'" akzeptiert (was Python3 aus rein ideologischen Gründen nicht tut). Dazu wollte ich Python3 für meine Leap 15.4 aus dem Source-RPM bauen:
Code:
wget -c 'http://download.opensuse.org/source/distribution/leap/15.4/repo/oss/src/python3-3.6.15-150300.10.21.1.src.rpm'
In dem Source-RPM sind jedoch auch noch allerhand ".patch"-Dateien (26). Wie muß ich die in die Quellen einpflegen, so daß die mitkompiliert werden?
 
OP
A

abgdf

Guru
Also, ich gehe mit dem Midnight Commander in das Source-RPM und hole damit die darin befindlichen Quelldateien raus. Dann will ich sie kompilieren. Ob ich dann aus den ausführbaren Dateien noch ein RPM baue, weiß ich noch nicht. Hab' das bisher immer "checkinstall" tun lassen, aber das soll gewisse Risiken haben.
Also erstmal möchte ich kompilieren. Und da hab' ich diese 26 Patch-Dateien, von denen ich nicht recht weiß, wie ich sie mit den anderen Dateien verbinde.
Ich könnte sonst höchstens ohne die Patches kompilieren (denn das Standard "Python-3.6.16.tar.xz" ist ja auch dabei), aber die Patch-Dateien werden ja schon einen Sinn haben.
 

Sauerland

Ultimate Guru
Also erstmal möchte ich kompilieren. Und da hab' ich diese 26 Patch-Dateien, von denen ich nicht recht weiß, wie ich sie mit den anderen Dateien verbinde.
Nicht nur die.......
Zeile 129 listet die auf
Zeile 442 wendet die auf die Sourcen an.

Aber das wird so nicht funktionieren, ich würde einen patch erstellen, diesen einfügen, ausführen und dann alles wieder per rpmbuild als rpm erstellen lassen.

Denn da gibt es auch noch ein paar andere Dateien, deren Inhalt bzw. die eingebaut werden. (SourceX im spec)
 
Zuletzt bearbeitet:
OP
A

abgdf

Guru
Äh, ich müßte alle Patches applizieren.

Offenbar macht "rpmbuild" das für einen, also vom Source-RPM zum RPM mit ausführbaren Dateien kommen.
Wenn ich ein Verzeichnis "~/rpmbuild/SOURCES" erstelle, da die Quellen reinpacke und dieses ausführe:
Code:
rpmbuild -bb ./python36.spec
läuft was an, aber ich erhalte folgende Fehlermeldung:
Code:
error: Failed build dependencies:
        appstream-glib is needed by python3-3.6.15-150300.10.21.1.x86_64
        lzma-devel is needed by python3-3.6.15-150300.10.21.1.x86_64
        pkgconfig(libnsl) is needed by python3-3.6.15-150300.10.21.1.x86_64
        pkgconfig(libtirpc) is needed by python3-3.6.15-150300.10.21.1.x86_64
        pkgconfig(tk) is needed by python3-3.6.15-150300.10.21.1.x86_64
        readline-devel is needed by python3-3.6.15-150300.10.21.1.x86_64
        sqlite-devel is needed by python3-3.6.15-150300.10.21.1.x86_64
Wobei einige Pakete in Yast nicht zu finden sind.
Muß ich wohl noch etwas nachforschen. Aber ich denke, die Hauptrichtung hab' ich damit.
Wie gesagt, sonst hat "checkinstall" das Erstellen von RPMs für mich gemacht *, deshalb hatte ich mich mit spec-Dateien und RPM-Bau noch nicht so genau beschäftigt.
Trotzdem vielen Dank soweit erstmal!

* Dabei lädt man die Quellen z.B. als ".tar.gz" herunter, packt sie aus und macht "./configure", "make" und dann eben "checkinstall". Das baut einem dann automatisiert ein RPM, ohne daß man sich mit spec-files auseinandersetzen muß. Bei mir hat das sehr oft gut funktioniert, aber es soll manche System kompromittieren können. Es sind auch einige Bugs in checkinstall, und es wird nicht mehr weiterentwickelt. Vielleicht also Zeit, sich davon zu verabschieden. Obwohl ich es mochte, so lange es ging.
 
Zuletzt bearbeitet:

josef-wien

Ultimate Guru
1. Das Source-RPM ganz normal installieren.
2. Im Verzeichnis /usr/src/packages/SPECS (war es zumindest vor langer Zeit bei openSUSE) rpmbuild ausführen (um sicherzustellen, daß alles funktioniert).
3. Patch-Datei für Deine Änderungen erstellen, an die richtige Stelle kopieren und im specfile eintragen.
4. rpmbuild ausführen und das (oder die) erstellten RPM-Paket(e) installieren..
 

Sauerland

Ultimate Guru
1. Das Source-RPM ganz normal installieren.
2. Im Verzeichnis /usr/src/packages/SPECS (war es zumindest vor langer Zeit bei openSUSE) rpmbuild ausführen (um sicherzustellen, daß alles funktioniert).
3. Patch-Datei für Deine Änderungen erstellen, an die richtige Stelle kopieren und im specfile eintragen.
4. rpmbuild ausführen und das (oder die) erstellten RPM-Paket(e) installieren..


Macht man heute im /home.
Anschließend legen wir im Home-Verzeichnis unseres RPM-Maintainers die nötigen Unterverzeichnisse an.

$ mkdir -p ~/rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}

Zum Schluß setzen wir noch in der Konfigurationsdatei .rpmmacros im Homeverzeichnis des Nutzers das gearade angelegt Arbeitsverzeichnis.

$ echo '%_topdir %(echo $HOME)/rpmbuild' > ~/.rpmmacros
RPM Build-Umgebung aufsetzen und RPM selbst bauen [Linux - Wissensdatenbank]

Die Verzeichnisse werden auch angelegt, indem man
Code:
rpmbuild --rebuild xxxxxxx.src.rpm
im Verzeichnis des xxxx.src.rpms ausführt.
Das ausgepackte xxxxxx.src.rpm liegt dan in den entsprechenden Unterverzeichnissen.
 
Zuletzt bearbeitet:

Sauerland

Ultimate Guru
BUILD,RPMS,SOURCES,SPECS,SRPMSDas sind die Verzeichnisse.
BUILD: hierin werden die Sourcen entpackt, alle Patches und sonstiges auf die Sourcen angewendet.

BUILDROOT: hier entstehen die fertigen Dateien incl. des Verzeichnisbaumes, wohin sie nach Installation des rpms geschrieben werden,

RPMS: hier landen nach dem Bau die zu installierenden rpms in den entsprechenden Unterordnern, diesen Ordner per zypper als Installationsquelle hinzufügen und das Installieren gent ganz einfach über Yast, zypper, rpm usw.

SOURCES: hier werden alle zum Bau des rpms benütigten Sourcen, Patches, changelogs usw. gespeichert, damit man das rpm bauen kann

SPEC: hier landen die zum Bauen benötigten spec-Dateien.

SRPMS: hier landen die nach dem Bau entstehenden xxxxxx.src.rpms,
 

Sauerland

Ultimate Guru
Äh, ich müßte alle Patches applizieren.
Poste doch einfach nur den Patch, den du einfügen möchtest.

Das eigentliche Python3.6 baut hier auf Leap 15.5

Code:
rpmbuild --rebuild python3-3.6.15-150300.10.21.1.src.rpm
Installing python3-3.6.15-150300.10.21.1.src.rpm
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.rWKAJn
+ umask 022
+ cd /home/stephan/rpmbuild/BUILD
+ cd /home/stephan/rpmbuild/BUILD
+ rm -rf Python-3.6.15
+ /usr/bin/xz -dc /home/stephan/rpmbuild/SOURCES/Python-3.6.15.tar.xz
+ /usr/bin/tar -xof -
+ STATUS=0
+ '[' 0 -ne 0 ']'
+ cd Python-3.6.15
+ /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w .
+ echo 'Patch #1 (Python-3.0b1-record-rpm.patch):'
Patch #1 (Python-3.0b1-record-rpm.patch):
+ /usr/bin/patch --no-backup-if-mismatch -p1 --fuzz=0
patching file Lib/distutils/command/install.py
+ echo 'Patch #2 (python-3.6.0-multilib-new.patch):'
Patch #2 (python-3.6.0-multilib-new.patch):
+ /usr/bin/patch --no-backup-if-mismatch -p1 --fuzz=0
patching file configure.ac
patching file Makefile.pre.in
patching file Modules/getpath.c
patching file Lib/distutils/command/install.py
usw
usw
 
OP
A

abgdf

Guru
Sauerland schrieb:
Schalte auch noch als Suchfilter in "Suchen in" "rpm"bietet an"" ein
Ah, Danke! Wieder was gelernt. Ja, jetzt kompiliert es. Im Prinzip, denn irgendwie ist er mit den umfangreichen Tests nicht zufrieden. Aber das kriege ich wohl auch noch hin. Befehl war (stimmt, ist wie bei Dir):
Code:
rpmbuild --rebuild ./python3-3.6.15-150300.10.21.1.src.rpm
Sauerland schrieb:
Poste doch einfach nur den Patch, den du einfügen möchtest.
Ach so, jetzt verstehe ich erst, was Du meinst. :)
So einen Patch habe ich noch nicht. Ich wollte erstmal sehen, ob das SRPM ohne Änderungen kompiliert. An dem Schritt bin ich jetzt erst. Wenn das geht, wollte ich die Quellen ändern, und dann neu kompilieren.
Wie man bei einem großen Paket wie Python einen mehr oder weniger offiziellen Patch schreibt, muß ich erst noch lernen.

Die Änderung zu schreiben, dürfte auch eine Herausforderung werden. Weltweit haben sich Leute über das "print()"-Problem von Python3 aufgeregt, und es hat dazu geführt, daß sich die Python-"Community" in diejenigen gespalten hat, die Python3 akzeptiert haben, und diejenigen, die Python 2.7 weiterbenutzt haben (welches "print 'Hallo'" akzeptiert). Auch in Leap 15.4 werden immer noch Python 2.7 und Python 3.6 (oder neuer) nebeneinander angeboten.
Ob ich da einen neuen Impuls setzen kann, indem ich Python3 durch einen Hack beibringe, auch wieder "print 'Hallo'" neben der Version mit Klammern zu akzeptieren, muß sich erst zeigen.
Pythons "print"-Funktion wäre "builtin_print()" in der Datei "bltinmodule.c". Aber in dieser Funktion kann ich noch nicht die Verarbeitung der Klammern erkennen. Da muß man wohl noch tiefer im Code graben.
Komplexen C-Code zu verstehen, ist bei mir generell nur experimentell. :) Machmal ist es mir möglich, manchmal nicht. Schau'n wir mal.
 
Oben