openSUSE:Build Service cross distribution howto
Περιεχόμενα
- 1 Επισκόπηση
- 2 Εντοπίστε μια διανομή για ειδικευμένο κώδικα
- 2.1 Εγκαταστήστε τα αρχεία info
- 2.2 Χειρισμός εξαρτήσεων
- 2.3 Suggests: υπάρχει μόνο στο suse και μόνο από την 10.0
- 2.4 Εύρεση του Qt 3.x σε Fedora/RHEL
- 2.5 Εύρεση του Qt4 στο Mandriva
- 2.6 Χειρισμός των Provides/Obsoletes στο Mandriva
- 2.7 Κατασκευάζοντας για Παλιότερες Διανομές
- 2.8 Debian και xUbuntu πακέτα
- 2.9 Μακροεντολές RPM διανομών και Τεκμηρίωση
Επισκόπηση
Αυτός ο οδηγός αριθμεί διάφορα κόλπα για να δουλέψετε με ένα αρχείο spec για διαφορετικές διανομές. Προσοχή, δεν είναι οδηγός για αρχάριους πακετάδες. Παρακαλώ για αυτή τη δουλειά, επισκεφθείτε το σύνδεσμο Build Service Tutorial. Επιπλέον, αυτό το έγγραφο δεν καλύπτει διανομές που χρησιμοποιούν Debian πακέτα.
Το Build Service μπορεί να πακετάρει αξιόπιστα rpm όχι μόνο για το openSUSE, αλλά και για πρόσφατες εκδόσεις SLES, CentOS, Fedora, Red Hat Enterprise Linux, Ubuntu, Debian και Mandriva διανομών.
Ποιοι είναι οι περιορισμοί; Ο μόνος πρακτικός περιορισμός είναι να μην ικανοποιούνται κάποιοι περιορισμοί για το Fedora ή το Mandriva, την ίδια ώρα που οι ίδιες εξαρτήσεις μπορούν πολύ εύκολα να ικανοποιηθούν για τις Suse διανομές συνδέοντας μονομερώς ή εξολοκλήρου κάποιο άλλο έργο στο Build Service. Ένα παράδειγμα: Είναι εύκολη η κατασκευή πακέτων που απαιτούν τις τελευταίες εκδόσεις του Qt4 ή του GTK2 για Suse, καθώς οι εξαρτήσεις αυτές μπορούν εύκολα να ικανοποιηθούν από άλλα αποθετήρια στο Build Service που παρέχουν backports νεώτερων πακέτων Qt4 για παλιότερες εκδόσεις Suse, καθώς και για SLES. Αυτό μπορεί να ξεπεραστεί μόνο πακετάροντας τις απαιτούμενες εξαρτήσεις εντός του δικού σας έργου. Ακόμα και τότε, αυτό είναι μόνο ένα μικρό θεματάκι αν θέλετε να υποστηρίξετε όσο το δυνατόν περισσότερες διανομές.
Μερικές 'πιασάρικες' διαφορές μεταξύ διανομών που πρέπει να προσέξετε:
- Εγκατάσταση αρχείων επιφάνειας εργασίας. Κάθε μια από τις πέντε διανομές χρησιμοποιεί διαφορετικούς μηχανισμούς για την εγκατάσταση αρχείων στην επιφάνεια εργασίας και τη δημιουργία συστατικών στο μενού. Το Mandriva έχει μια ειδική rpm μακροεντολή %update_menus για να το επιτύχει αυτό, χρησιμοποιώντας ένα Debian-οειδές setup, διαφορετικό από το Suse ή το Fedora. Παράδειγμα:
%post %update_menus %postun %clean_menus
- Ονομασία πακέτων εξαρτήσεων. Δείτε παρακάτω για περισσότερα κόλπα και έξυπνες λύσεις για να το κάνετε να δουλέψει στο δικό σας αρχείο spec.
- Λεπτές διαφορές στις rpm μακροεντολές. Σύνδεσμος με πίνακα ποικιλομορφίας παρακάτω.
Μπορείτε να μου δείξετε ένα καλό παράδειγμα ενός δια-πλατφορμικού πακέτου;
Το πακέτο KDevelop του Amilcar
Εντοπίστε μια διανομή για ειδικευμένο κώδικα
Μπορείτε να προσθέσετε
%if %{defined suse_version} %if %{undefined suse_version}
ή ακόμα πιο φορητό:
%if 0%{?suse_version} <suse stuff here> %else <other distros> %endif
για να ελέγξετε αν η παρούσα κατασκευή είναι για μια suse διανομή ή όχι. Προσέξτε ότι δεν υπάρχει '%elseif' για να περάσετε αλυσωτούς ελέγχους στο ίδιο επίπεδο. Σημειώστε επίσης ότι η Fedora χρησιμοποιεί "%{fedora}" χωρίς το "_version". Μπορείτε επίσης να ελέγξετε για ποια SUSE διανομή χρησιμοποιώντας
%if 0%{?suse_version} > 1130
π.χ. Για να εκτελέσετε κάτι για οτιδήποτε μετά το SUSE Linux 9.3. Παρόμοιοι έλεγχοι και για άλλες διανομές.
%if %{defined fedora} %if %{defined mdkversion} %if 0%{?fedora} < 5 %if 0%{?mdkversion} > 2006
Σημειώστε ότι το rpm προτιμά:
>=
σε σχέση με το
=>
Μπορείτε επίσης να εξαιρέσετε μια ειδική έκδοση:
%if 0%{?rhel_version} != 406
Μπορείτε να συνδυάσετε πολλαπλές διανομές σε ένα μόνο if κάπως έτσι:
%if 0%{?fedora} || 0%{?rhel_version} || 0%{?centos_version} <yourstuff> %endif
Για να ομαδοποιήσετε υποθέσεις, χωρίστε την υπόθεση σε πολλές γραμμές, όπως εδώ:
# mono: only on suse, sle only from sle10 %if 0%{?suse_version} %if 0%{?sles_version} == 0 || 0%{?sles_version} >= 1000 BuildRequires: mono-core %endif %endif
Ομαδοποίηση με παρενθέσεις θα αποτύχει στα fedora/rhel/centos:
# mono: only on suse, sle only from sle10 # FAIL on fedora RHEL centos: %if 0%{?suse_version} && ( 0%{?sles_version} == 0 || 0%{?sles_version} >= 1000 ) BuildRequires: mono-core %endif
Μπορείτε επιπλέον να επιλέξετε μια ιδιαίτερη αρχιτεκτονική χρησιμοποιώντας π.χ.:
%if 0%{?suse_version} == 1030 %ifarch x86_64 <yourstuff> %endif %endif
Warning: Η ακόλουθη έκδοση μπορεί να αλλάξει ! για να ελέγξετε για την πιο πρόσφατη έκδοση πηγαίνετε στη σελίδα του έργου, και δείτε το αρχείο ρυθμίσεων. Για παράδειγμα με το redhat 5 πηγαίνετε στο: https://build.opensuse.org/project/prjconf?project=RedHat%3ARHEL-5 και ψάξτε το περιεχόμενο "%rhel_version 505" για να λάβετε την πιο πρόσφατη έκδοση. Ενημερώστε αυτή τη σελίδα αν οι εκδόσεις δεν ταιριάζουν.
Η ακόλουθη επισκόπηση βοηθά στην επιλογή των σωστών ρυθμίσεων:
Distribution | Variable | Comment |
---|---|---|
openSUSE Factory | %if 0%{?suse_version} > 1210 | current upcoming release (changing) |
openSUSE 12.1 | %if 0%{?suse_version} == 1210 | |
openSUSE 11.4 | %if 0%{?suse_version} == 1140 | |
openSUSE 11.3 | %if 0%{?suse_version} == 1130 | |
openSUSE 11.2 | %if 0%{?suse_version} == 1120 | |
openSUSE 11.1 | %if 0%{?suse_version} == 1110 | could also be SLE11 |
openSUSE 11.0 | %if 0%{?suse_version} == 1100 | |
openSUSE 10.3 | %if 0%{?suse_version} == 1030 | |
openSUSE 10.2 | %if 0%{?suse_version} == 1020 | |
SUSE Linux 10.1 | %if 0%{?suse_version} == 1010 | could also be SLE10 |
SUSE Linux 10.0 | %if 0%{?suse_version} == 1000 | |
SUSE Linux 9.3 | %if 0%{?suse_version} == 930 | |
SLES 9 | %if 0%{?sles_version} == 9 | also set: %if 0%{?suse_version} == 910 |
SLE 10 | %if 0%{?sles_version} == 10 | also set: %if 0%{?suse_version} == 1010 |
SLE 11 | %if 0%{?sles_version} == 11 | also set: %if 0%{?suse_version} == 1110 |
CentOS 5 | %if 0%{?centos_version} == 505 | |
CentOS 6 | %if 0%{?centos_version} == 600 | |
RHEL 4 | %if 0%{?rhel_version} == 406 | |
RHEL 5 | %if 0%{?rhel_version} == 505 | |
RHEL 6 | %if 0%{?rhel_version} == 600 | |
Fedora 6 with Extras | %if 0%{?fedora} == 6 | |
Fedora 7 with Extras | %if 0%{?fedora} == 7 | |
Fedora 8 with Extras | %if 0%{?fedora} == 8 | |
Fedora 9 with Extras | %if 0%{?fedora} == 9 | |
Fedora 10 with Extras | %if 0%{?fedora} == 10 | |
Fedora 11 with Extras | %if 0%{?fedora} == 11 | |
Fedora 15 | %if 0%{?fedora} == 15 | |
Fedora 16 | %if 0%{?fedora} == 16 | |
Fedora 17 | %if 0%{?fedora} == 17 | |
Mandriva 2006 | %if 0%{?mdkversion} == 2006 | |
Mandriva 2007 | %if 0%{?mdkversion} == 2007 | |
Mandriva 2008 | %if 0%{?mdkversion} == 2008 | |
Mandriva 2009.0 | %if 0%{?mdkversion} == 2009 | |
Mandriva 2009.1 | %if 0%{?mdkversion} == 200910 | |
Mandriva 2010.0 | %if 0%{?mdkversion} == 201000 |
Τα ServicePacks δεν μπορούν να διαχωριστούν. Το SLES11 SP1 θέτει ακριβώς τις ίδιες μεταβλητές με το SLES11.
Εγκαταστήστε τα αρχεία info
Τα αρχεία info θα πρέπει να εγκατασταθούν χρησιμοποιώντας τις μακροεντολές %info_add και %info_del. Για παράδειγμα
%post %info_add %{name}.info
%preun %info_del %{name}.info
Παρακαλώ προσέξτε ότι τα αρχεία info συμπιέζονται σε μερικές διανομές ως .gz και ως .bz2 ή ακόμα και ως .lzma (πρόσφατα Mandriva) σε μερικές άλλες. Μπορείτε να χρησιμοποιήσετε %ext_info για το επίθεμα στη λίστα αρχείων.
Χειρισμός εξαρτήσεων
Διαφορετικές διανομές συχνά χρησιμοποιούν διαφορετικά ονόματα για πακέτα, έτσι οι ετικέτες Requires: και BuildRequires: μπορεί να πρέπει να διαφέρουν από αποθετήριο σε αποθετήριο. Υπάρχει η δυνατότητα να ορίσετε υποκατάστατα ονομάτων στη ρύθμιση κάποιου έργου πχ
%if 0%{?fedora} Substitute: libnetcdf-devel netcdf %endif
Για να αλλάξετε τη ρύθμιση του έργου σας, χρησιμοποιήστε το osc meta prjconf <project-name> -e, που ξεκινά τον $EDITOR. Στον web client αυτό είναι κρυμμένο στον τομέα Advanced του κεντρικού μενού του έργου.
Σε περίπτωση που το κάνετε στο build.opensuse.org και πιστεύετε ότι η υποκατάστασή σας θα είναι ενδιαφέρουσα και σε άλλους (και πιθανόν να προστεθεί στην κεντρική ρύθμιση) αφήστε ένα μήνυμα στην opensuse-buildservice@opensuse.org.
Αν θέλετε να ρίξετε μια ματιά πια Substitutes για ειδικές διανομές υπάρχουν ήδη, ρίξτε μια ματιά στη ρύθμιση του έργου αυτής της διανομής, π.χ. https://build.opensuse.org/project/prjconf?project=CentOS%3ACentOS-6
Suggests: υπάρχει μόνο στο suse και μόνο από την 10.0
# 'Suggests:' είναι ένα χαρακτηριστικό του SUSE. Μην το κάνετε, όμως, "Requires:" # το πακέτο δε χρειάζεται το vi ή το graphviz για να τρέξει. %if 0%{?suse_version} > 1000 # πιθανόν η 920 ή η 930 να είναι επίσης εντάξει. Το sle9 910 σίγουρα δεν είναι. Suggests: vim graphviz %endif
Εύρεση του Qt 3.x σε Fedora/RHEL
Η Redhat/Fedora χρησιμοποιούν ένα διαφορετικό σχήμα ονοματολογίας και ρύθμισης όσον αφορά τη χρήση του Qt για την κατασκευή άλλων εφαρμογών. Ορίστε ένα παράδειγμα αρχείου spec για την κατασκευή εφαρμογών βασισμένων στο Qt σε Suse και Fedora σε ένα αρχείο spec:
BuildRequires: cups cups-devel python-devel shared-mime-info libart_lgpl-devel libtiff-devel libxml2-devel BuildRequires: fontconfig-devel openssl-devel pkgconfig desktop-file-utils qt-devel %if 0%{?fedora} >= 5 BuildRequires: libstdc++-devel gcc-c++ lcms-devel >= 1.12 qt %endif %if 0%{?suse_version} > 910 BuildRequires: update-desktop-files %endif
Τότε:
%if 0%{?fedora} >= 5 source "%{_sysconfdir}/profile.d/qt.sh" %endif %configure \ %if 0%{?fedora} >= 5 --with-xinerama \ --with-extra-libs=%{_libdir} \ %endif %if 0%{?suse_version} > 910 --with-qt-libraries=/usr/%_lib/qt3/%_lib \ --with-docdir=%{prefix}/share/doc/packages/scribus \ %ifarch x86_64 ppc64 s390x --enable-libsuffix=64 \ %endif %endif <programoptions>
Εύρεση του Qt4 στο Mandriva
Εξ ορισμού, το Qt3 θα βρεθεί πριν το Qt4, έτσι απλά προσθέστε αυτό στο τμήμα %build του αρχείου spec σας:
%build %if 0%{?mandriva_version} > 2006 export PATH=/usr/lib/qt4/bin:$PATH export QTDIR=%{_prefix}/lib/qt4/ %endif
- Αυτό μπορεί να άλλαξε στο Mdv 2008
Χειρισμός των Provides/Obsoletes στο Mandriva
Ιδιαίτερη προσοχή χρειάζεται όσον αφορά το Mandriva, σε αντίθεση με τα CentOS, RHEL, Fedora ή Suse, συχνά φτιάχνουν ξεχωριστά rpm βιβλιοθηκών για πλήθος εφαρμογών που τις χρησιμοποιούν ιδιωτικά. Η εφαρμογή foo μπορεί επίσης να εξαρτάται από τη libfoo ή τη libfoo-0. Έτσι, πρέπει να ελέγξετε το αρχικό αρχείο spec του Mandriva αν έχει ρητά Provides και Obsoletes για την πρόληψη διενέξεων κατά την εγκατάσταση. Αν και το RPM χειρίζεται τις εξαρτήσεις αυτόματα αν προσθέσετε Autoreqprov: on στο αρχείο spec (γενικά καλή ιδέα) μπορεί ακόμα ενδεχομένως ρητά να προσθέσετε όπως παρακάτω:
%if 0%{?mandriva_version} Provides: foo libfoo-0 Obsoletes: foo libfoo-0 %endif
Κατασκευάζοντας για Παλιότερες Διανομές
While sources in a package can build on older distros, the way packages are built sometimes evolve in an incompatible way.
Για παράδειγμα, καλώντας autoreconf -fi (όπως συνήθως συμβαίνει σε αρχεία spec), συμβαίνει (λόγω του -i για εγκατάσταση) οι εκδόσεις των config.sub, config.guess και ltmain.sh της αρχειοθήκης tar να αντικαθίστανται με τις εκδόσεις από το πακέτο autoconf της πλατφόρμας του στόχου κατασκευής. Αυτό μπορεί να σημαίνει ότι αρχεία του έτους 2007 αντικαθίστανται με τις εκδόσεις τους το 2005 κατασκευάζοντας για SLE10, για παράδειγμα, κάτι που μπορεί τελικά να μη δουλέψει σωστά. Αυτό μπορεί να έχει αρνητικές συνέπειες, και ακόμα να οδηγήσει σε κακή μεταγλώττιση, όταν για παράδειγμα κατασκευάζετε την libapr1 για το SLE10.
Έτσι, ίσως είναι καλύτερα, ή μάλλον απαιτείται, να καλέσετε autoheader, autoconf ή οτιδήποτε χρειάζεται χεράτα αντί του autoreconf σε στόχους παλιότερους από το Factory. Ένα παράδειγμα θα ήταν:
%if 0%{?suse_version} > 1010 autoreconf -fi %else autoheader autoconf %endif
Debian και xUbuntu πακέτα
Για αυτού του είδους τα πακέτα, παρακαλώ διαβάστε τη σελίδα debian builds.