Wie erhalte ich die Compiler-Flags, mit denen die Binärdateien in einem (.deb) -Paket erstellt werden?

7

Ich weiß, das apt-get source <package_name>gibt Ihnen das Quellpaket. Es enthält einen debianOrdner mit einer Datei namens rules. Wenn ich es richtig verstehe, beschreibt diese Datei, wie das Quellpaket in ein .debPaket umgewandelt werden kann, einschließlich der zu verwendenden Compiler-Flags.

Zwei Fragen:

  1. Wie erhalte ich die tatsächlich verwendeten Compiler-Flags? Muss es ausgeführt werden make -n(wenn dies überhaupt möglich ist) oder kann ich sie irgendwie durch Parsen der Dokumente erhalten?
  2. Im Fall eines Quellpakets aus einem offiziellen Repository. Werden die Compiler-Flags zu 100% von der rulesDatei bestimmt oder hängen sie von dem System ab, auf dem die .debErstellung durchgeführt wird? Muss ich das offizielle Build-System "spiegeln", um zu denselben Flags zu gelangen, die im offiziellen Build- .debProzess verwendet wurden? Wie kann ich das machen?

Ich habe hier erfahren , dass Debian keine offizielle Richtlinie hat, welche Compiler-Flags für die .deb-gepackten Binärdateien verwendet werden.

langlauf.io
quelle

Antworten:

5

Die verwendeten Compiler-Flags sind eine Funktion von

  • die debian/rulesDatei,
  • die Build-Dateien des Pakets (da der Upstream-Autor dort möglicherweise auch Flags angibt),
  • das Erstellungssystem ( dh, cdbsetc.),
  • die Standardeinstellungen des Compilers.

Um die verwendeten Flags zu sehen, müssen Sie mindestens das Paket kompilieren:

debian/rules build

Ich versuche Dinge wie

debian/rules -n

im Allgemeinen wird Sie nicht sehr weit bringen; Zum Beispiel wird auf einem dh-basierten Paket nur gesagt

dh build

oder etwas ähnliches; Fragen dh, um zu zeigen, was das (mit --no-act) bewirken würde

dh_testdir
dh_auto_configure
dh_auto_build

und so weiter.

Es gibt keine narrensichere und einfach zu erklärende Methode, um die Build-Flags durch Lesen zu bestimmen debian/rules. Sie können sich ein Bild machen, indem Sie nach dort gesetzten Flags suchen und gegebenenfalls nach Optionen für dpkg-buildflags(z. B. DEB_BUILD_MAINT_OPTIONS) suchen und diese ausführen. Bei vielen Paketen können Sie am einfachsten feststellen, welche Flags verwendet wurden, indem Sie die Build-Protokolle für die in den Archiven gelieferten Pakete ab https://buildd.debian.org einsehen . Zum Beispiel zeigen die Protokolle für coreutilsoni386 , dass die verwendeten Flags -Wdate-time -D_FORTIFY_SOURCE=2 -g -O2 -fstack-protector-strong -Wformat -Werror=format-securityzum Kompilieren und -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wl,--as-needed -Wl,-z,relrozum Verknüpfen verwendet wurden (danke an Faheem Mitha für den Hinweis auf Letzteres!).

Stephen Kitt
quelle
@StephenKitt Sie schreiben: "Um die verwendeten Flags zu sehen, müssen Sie mindestens das Paket kompilieren : debian/rules build." Kann ich irgendwie sicherstellen, dass die gleichen Flags wie im offiziellen Build verwendet werden? Verwenden Sie einen Vanille-Debian der gleichen Version?
langlauf.io
@StephenKitt: Ich mag Ihren Vorschlag, sich die Protokolle des offiziellen Build-Servers anzusehen. Sie sind jedoch nicht immer vorhanden, z. B. für openssl, siehe buildd.debian.org/status/package.php?p=openssl&suite=sid. Für den amd64-Build gibt es nur ein 'altes' Protokoll aus dem Jahr 2011. Ist das ein Fehler?
langlauf.io
@stackoverflowwww, in Bezug auf die Verfügbarkeit von Protokollen: Wenn der Betreuer Binärdateien direkt hochlädt, befinden sich leider keine Protokolle auf dem Server. Aber die Flags sollten in einer Reihe von Architekturen sicherlich amd64und i386in den allermeisten Fällen gleich sein. Wenn also eine fehlt, können Sie sich die andere ansehen.
Stephen Kitt
1
(Für die wirklich Neugierigen Dpkg/Vendor/Debian.pmgibt es die architekturbezogenen Variationen in Build-Flags.)
Stephen Kitt
2
@stackoverflowwww, es ist ziemlich schwierig sicherzustellen, dass Sie dieselben Build-Flags wie der offizielle Build verwenden, da das offizielle Paket unstablein den meisten Fällen, möglicherweise vor vielen Jahren , alle Flags verwendet hat, die zum Zeitpunkt der Erstellung bereitgestellt wurden. Wenn Sie unstablejetzt Vanille einbauen, können Sie sicher sein, dass Sie dieselben Flags erhalten, die für einen neuen offiziellen Build verwendet werden. ebenfalls in testingoder stablefür einen offiziellen Build in der entsprechenden Backports Suite. Sie können dies auch mit pbuilderDerivatverteilungen tun
Stephen Kitt