[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: apt-ftparchive - getrennte Packages-Dateien für amd64 und i386



Tobi:
>Hallo!

>apt-ftparchive bringt mich noch zur Verzweiflung. Ich möchte damit eine
>Repository-Struktur verwenden, die aussieht, wie im unten stehenden
>Beispiel.
>Leider klappt das so nicht.

>Folgendes habe ich versucht:


>[...]

>Tree "dists/etch" {
>    Sections "base addons";
>    Architectures "amd64 i386";
>};

>BinDirectory "pool-etch/binary/base" {
>    Packages "dists/etch/base/binary-i386/Packages";
>    Contents "dists/etch/Contents-i386"
>    SrcPackages ""dists/etch/base/source/Sources";"
>};

>BinDirectory "pool-etch/binary/base" {
>    Packages "dists/etch/base/binary-amd64/Packages";
>    Contents "dists/etch/Contents-amd64"
>};

>[...]

Und diese Struktur soll sich ergeben:

>dists/
>    etch/
>        addons/
>            binary-i386/
>                Packages
>            binary-amd64/
>                Packages
>            source/
>                Sources
>        base/
>            binary-i386/
>                Packages
>            binary-amd64/
>                Packages
>            source/
>                Sources
>    sid/
>        addons/
>            binary-i386/
>                Packages
>            binary-amd64/
>                Packages
>            source/
>                Sources
>        base/
>            binary-i386/
>                Packages
>            binary-amd64/
>                Packages
>            source/
>                Sources
>pool-etch/
>    binary/
>        addons/
>            *._i386.deb
>            *._amd.deb
>        base
>            *._i386.deb
>            *._amd.deb
>    source/
>        addons/
>            *.dsc
>        base/
>            *.dsc
>pool-sid/
>    binary/
>        addons/
>            *._i386.deb
>            *._amd.deb
>        base/
>            *._i386.deb
>            *._amd.deb
>    source/
>        addons/
>            *.dsc
>        base/
>            *.dsc

>Hat jemand eine Idee, wie ich apt-ftparchive dazu bringe, amd64 und
>i386-Pakete in getrennte Packages-Dateien pro Sektion zu schreiben,
>obwohl diese im selben pool-Verzeichnis liegen?

Ich fürchte, das geht nur auf folgende, etwas umständliche Weise:
Du musst apt-ftparchive für jedes einzelne Paket mitteilen, zu
welcher Kombinationen (Distribution, Section, Architecture) es
gehört.  (Ich schreibe mit Absicht »Kombination/en/«, also
Mehrzahl, weil Pakete mit Architecture = all zu allen
Architectures gehören, und weil Pakete auch zu mehreren
Distributions gehören können.)

Jedenfalls geht das so:

apt-ftparchive erwartet dann zu jeder Kombination (Distribution,
Section, Architecture) eine Filelist- bzw. Sourcefilelist-Datei,
in der die Pfade zu den Paketdateien im Repository stehen, also
in Deinem Falle beispielsweise

./pool-etch/binary/base/c/clamav/libclamav-dev_0.90.1-3etch3_i386.deb

Für Sourcefilelists sieht das dann ähnlich aus, nur dass die in
ihnen aufgelisteten Dateien dann nicht *.deb sondern *.dsc
heißen.

Desweiteren muss Du apt-ftparchive natürlich mitteilen, wie die
einzelnen Filelist- bzw. Sourcefilelist-Dateien heißen und in
welchem Verzeichnis sie stehen:

In welchem Verzeichnis?

Dir::FileListDir "/Pfad/zu/Filelists/";

Wie wird aus (Distribution, Section, Architecture) der Name der
Filelist- bzw. Sourcefilelist-Datei bestimmt?

TreeDefault
{
	FileList "binary $(DIST) $(SECTION) $(ARCH)";
	SourceFileList "source $(DIST) $(SECTION)";
};

Daraus setzt apt-ftparchive dann für etch die Pfade

/Pfad/zu/Filelists/binary dists/etch base amd64
/Pfad/zu/Filelists/binary dists/etch addons amd64
/Pfad/zu/Filelists/binary dists/etch base i386
/Pfad/zu/Filelists/binary dists/etch addons i386

und

/Pfad/zu/Filelists/source dists/etch base
/Pfad/zu/Filelists/source dists/etch addons

und für sid die Pfade

/Pfad/zu/Filelists/binary dists/sid base amd64
/Pfad/zu/Filelists/binary dists/sid addons amd64
/Pfad/zu/Filelists/binary dists/sid base i386
/Pfad/zu/Filelists/binary dists/sid addons i386

und

/Pfad/zu/Filelists/source dists/sid base
/Pfad/zu/Filelists/source dists/sid addons

zusammen.

Ich würde Dir empfehlen, bei Deinem Tree nicht

>Tree "dists/etch" {
>    ...
>};

zu schreiben sondern

>Tree "etch" {
>    ...
>};

damit Du in

/Pfad/zu/Filelists/binary dists/etch base amd64
/Pfad/zu/Filelists/binary dists/etch addons amd64
/Pfad/zu/Filelists/binary dists/etch base i386
/Pfad/zu/Filelists/binary dists/etch addons i386
/Pfad/zu/Filelists/source dists/etch base
/Pfad/zu/Filelists/source dists/etch addons
                               ^
diese Schrägstriche loswirst --+
so dass die Filelist-Dateien dann so heißen:

/Pfad/zu/Filelists/binary etch base amd64
/Pfad/zu/Filelists/binary etch addons amd64
/Pfad/zu/Filelists/binary etch base i386
/Pfad/zu/Filelists/binary etch addons i386
/Pfad/zu/Filelists/source etch base
/Pfad/zu/Filelists/source etch addons

(Analog für sid.)

Also könnte Deine Generate-Konfiguration dann so aussehen:

Dir
{
	// Hinweis: apt-ftparchive aus Sarge schreibt offenbar
	// nur dann relative "filename:"-Attribute in die Dateien
	// Packages, wenn Dir::ArchiveDir ein relativer Pfad ist.
	ArchiveDir ".";
	
	FileListDir "/Pfad/zu/Filelists/";
};

TreeDefault
{
	Directory "pool-$(DIST)/";
	SrcDirectory "pool-$(DIST)/";
	Packages "dists/$(DIST)/$(SECTION)/binary-$(ARCH)/Packages";
	Sources "dists/$(DIST)/$(SECTION)/source/Sources";
	Contents "dists/$(DIST)/Contents-$(ARCH)";
	
	FileList "binary $(DIST) $(SECTION) $(ARCH)";
	SourceFileList "source $(DIST) $(SECTION)";
};

Tree "etch"
{
    Sections "base addons";
    Architectures "amd64 i386 source";
    // Beachte, dass das Architecture source speziell behandelt
    // wird:  Es wird kein Verzeichnis binary-source neben
    // binary-amd64 und binary-i386 erzeugt, sondern
    // apt-ftparchive erkennt, dass Du hier auch Source-Pakete
    // einordnen willst.
};

Tree "sid"
{
    Sections "base addons";
    Architectures "amd64 i386 source";
    // Beachte, dass das Architecture source speziell behandelt
    // wird:  Es wird kein Verzeichnis binary-source neben
    // binary-amd64 und binary-i386 erzeugt, sondern
    // apt-ftparchive erkennt, dass Du hier auch Source-Pakete
    // einordnen willst.
};

Was jetzt noch umständlich ist, ist, dass Du die diese Filelist-
und Sourcefilelist-Dateien selbst füllen musst.  Beispielsweise
so (sh-Skript):

Für die Binärpakete:

Durchsuche die Paketpools nach Binärdateien:

for distribution in etch sid
do
   for section in addons base
   do
      apt-ftparchive packages pool-"$distribution"/binary/"$section" \
	 >"$distribution $section".Packages
   done
done

In den so erzeugten Paket-Index-Dateien
{etch,sid}" "{addons,base}.Packages
findet sich dann zu jedem Paket ein Datensatz (mit einer leeren
Zeile vom folgenden abgetrennt (siehe Debian-Policy)), der u.a.
die Datenfelder

Package: clamav-base
Version: 0.90.1-3etch3
Architecture: all
Filename: ./pool/c/clamav/clamav-base_0.90.1-3etch3_all.deb

(Beipiel eines architecture-unabhängigen Pakets) oder

Package: clamav
Version: 0.90.1-3etch3
Architecture: i386
Filename: ./pool/c/clamav/clamav_0.90.1-3etch3_i386.deb

(Beipiel eines I386-Pakets) enthält.

Jeden dieser Datensätze in der Datei "etch addons.Packages" musst Du nun
folgendermaßen auswerten:

Füge den Filename-Wert der entsprechenden Filelist-Datei hinzu,
und zwar,

falls Architecture = i386,
   der Datei /Pfad/zu/Filelists/binary etch addons i386,
falls Architecture = amd64,
   der Datei /Pfad/zu/Filelists/binary etch addons amd64,
falls Architecture = all,
   der Datei /Pfad/zu/Filelists/binary etch addons i386
   *und* der Datei /Pfad/zu/Filelists/binary etch addons amd64,
   also *beiden* Filelist-Dateien.

Entsprechend musst Du dann auch die Datei "etch base.Packages"
und die entsprechenden für sid durcharbeiten, indem Du die
Filename-Werte den Dateien /Pfad/zu/Filelists/binary * * *
hinzufügst.

Für die Source-Pakete sieht die Sache nochmal anders aus:

mit

$ apt-ftparchive sources pool-"$distribution"/source/"$section" \
   > "$distribution $section.Sources"

kannst Du die Source-Index-Dateien erzeugen.  Allerdings haben
die Datensätze kein Datenfeld Filename sondern Directory und
Files.  Diese beiden geben an, in welchem Verzeichnis und wie
benannt die Paketdateien *.dsc, *.orig.tar.gz und *.diff.gz
liegen.  Setze daraus den Pfad für die Datei *.dsc zusammen und
schreibe den in die Sourcefilelist-Datei
"source $distribution $section".

Jetzt sieht man auch, dass es für Source-Repositories keine gute
Idee ist, die verschiedenen Distributions auseinander zuhalten:
Es kann durchaus sein, dass zwei Distributions dieselbe
Upstream-Version eines Paketes verwenden, d.h. die Datei
*.orig.tar.gz ist dieselbe.  Damit man sie nur einmal speichern
muss, empfiehlt es sich, nur *einen gemeinsamen* Source-Pool zu
halten.

Fazit von dem Ganzen:  Es ist leider nicht einfach.  Vielleicht
ist es besser, Du schaust Dir mal das Paket debian-cd an.  Es
enthält ein Skript-Programm, das mit apt-ftparchive generate
arbeitet.



-- 
Bitte in die Adressierung auch meinen |Please put my full name also into
Vor- u. Nachnamen stellen z.B.        |the recipient like
Friedhelm Waitzmann <xxx@example>, (Friedhelm Waitzmann) xxx@example,
"Waitzmann, Friedhelm" <xxx@example>



Reply to: