openSUSE:Build Service cross distribution howto

Μετάβαση σε: πλοήγηση, αναζήτηση

Επισκόπηση

Αυτός ο οδηγός αριθμεί διάφορα κόλπα για να δουλέψετε με ένα αρχείο 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.

Μακροεντολές RPM διανομών και Τεκμηρίωση

openSUSE Packaging Conventions

Fedora Packager's Guide

Mandriva Packaging

Comparison of RHEL,Mandriva,Suse RPM Macros