Paketbaurichtlinien für MinGW-Cross-Compiler

Einführung

Das Ziel des Fedora MinGW-Projekts ist es, Fedora-Nutzern, die ihre Programme für Windows kompilieren möchten, eine optimale Entwicklungsumgebung zu bieten und so die Notwendigkeit der Windows-Nutzung zu minimieren. Bisher mussten Entwickler alle benötigten Bibliotheken und Werkzeuge einzeln portieren und kompilieren – ein enormer Aufwand, der mehrfach unabhängig voneinander durchgeführt wurde. Wir möchten diese Doppelarbeit für Anwendungsentwickler vermeiden, indem wir eine Reihe von Bibliotheken und Entwicklungswerkzeugen bereitstellen, die bereits für die MinGW-Cross-Compiler-Umgebung portiert wurden. Dadurch müssen Entwickler den Anwendungsstack nicht selbst neu kompilieren, sondern können sich ausschließlich auf die notwendigen Änderungen an ihrer eigenen Anwendung konzentrieren.

Die Zielplattformen Win32 und Win64 werden durch die MSVCRT-Laufzeitumgebung unterstützt. Die Zielplattform Win64 wird durch die UCRT-Laufzeitumgebung ebenfalls unterstützt, jedoch nur für die Basis-Toolchain. Builds für UCRT sind derzeit für Pakete oberhalb der Toolchain nicht aktiviert.

Separate im Vergleich zu integierten MinGW-Quellpaketen

Es gibt zwei zulässige Wege, um MinGW-Builds von Software in Fedora bereitzustellen:

  • Separate Quellpakete: Es gibt separate RPM-Spec-Dateien für die nativen und MinGW-Builds, die als unabhängige Komponenten von Fedora verwaltet werden. Dies ist der traditionelle Ansatz für die MinGW-Paketierung in Fedora.

  • Integrierte Quellpakete: Es gibt eine einzige RPM-Spec-Datei für die nativen und MinGW-Builds, die als eine einzige Komponente von Fedora fungieren. Die MinGW-Builds werden als binäre Sub-RPMs ausgegeben. Dies ist der moderne und bevorzugte Ansatz für die MinGW-Paketierung in Fedora.

Der traditionelle Ansatz vollständig getrennter Quellpakete wurde ursprünglich aufgrund von Bedenken gewählt, dass Instabilitäten in der MinGW-Werkzeugkette oder in Windows-Builds zeitnahe Aktualisierungen des nativen Pakets verhindern könnten. Die Erfahrungen mit Fedora haben seitdem gezeigt, dass dies im Allgemeinen kein Problem darstellt, das die meisten Pakete betrifft, insbesondere wenn die Windows-Unterstützung ein explizit getestetes Ergebnis des Upstream-Projekts ist.

Die Methode der separaten Paketierung ist mit einem deutlich höheren Aufwand verbunden:

  • Die Hinzufügung von MinGW-Unterstützung muss den gesamten Fedora-Prüfprozess für neue Pakete durchlaufen, wodurch die bereits für das native Paket durchgeführte Prüfung weitgehend wiederholt wird.

  • Für den Betreuer besteht eine ständige Belastung, sicherzustellen, dass das MinGW-Quellpaket die Änderungen am entsprechenden nativen Quellpaket nachverfolgt, wenn es auf neue Versionen aktualisiert wird.

  • Die Bearbeitung von Patches/Aktualisierungen als Reaktion auf Fehlerberichte erfordert zusätzlichen Aufwand. Fehlerberichte beziehen sich häufig nur auf eine der beiden Komponenten, nicht auf beide. Bei Sicherheitslücken verdoppelt sich jedoch die Anzahl der erstellten Fehlerberichte. Zudem müssen mehrere Koji-Builds und -Aktualisierungen verwaltet werden.

Durch den integrierten Paketierungsansatz entsteht für den jeweiligen Paketbetreuer ein geringer Mehraufwand, um die Funktionsfähigkeit der MinGW-Builds sicherzustellen, sowie eine geringe zusätzliche Anzahl an MinGW-spezifischen Fehlerberichten. Dieser Aufwand ist jedoch im Vergleich zur Pflege separater Pakete in der Regel vernachlässigbar.

Vor diesem Hintergrund lautet die Empfehlung der MinGW SIG wie folgt:

  • Wenn ein Fedora-Mitwirkender sowohl die native als auch die MinGW-Version eines Pakets pflegen möchte, MUSS er den integrierten Paketierungsansatz verwenden.

  • Wenn das Upstream-Projekt die Windows-Plattform explizit als Build-Ziel unterstützt und über automatisierte CI verfügt, SOLLTEN Mitwirkende den integrierten MinGW-Paketierungsansatz bevorzugen. Betreuer eines nativen Pakets SOLLTEN die Hinzufügung von integrierter MinGW-Unterstützung in der Regel akzeptieren. Lehnt ein Betreuer eines nativen Pakets die Anfrage ab, sollte er seine Entscheidung begründen.

  • Sofern das UpstreamProjekt keine automatisierten Tests für Windows-Builds durchführt, KANN die MinGW-Paketunterstützung beide Paketierungsansätze verwenden. Der Betreuer des nativen Pakets kann die Anfrage für eine integrierte Paketierung nach eigenem Ermessen ablehnen.

  • Wenn das Upstream-Projekt ausschließlich Windows-Builds unterstützt, MUSS die separate Paketierungsmethode verwendet werden. Es wird kein entsprechendes natives Paket in Fedora geben. Dieser Fall ist sehr selten.

  • Wenn ein Mitwirkender ein neues natives Paket für Fedora vorschlägt, das Bibliotheken bereitstellt, die bekanntermaßen Windows unterstützen, SOLLTE der Reviewer nachfragen, ob der Mitwirkende gleichzeitig MinGW-Builds hinzufügen möchte. Der Mitwirkende kann diese Anfrage nach eigenem Ermessen ablehnen.

Hinzufügung von MinGW-Unterstützung mit einem neuen nativen Paket

Wenn noch kein entsprechendes natives Paket existiert, muss es stets den Standard-Paketreviewprozess von Fedora durchlaufen. Die geplante MinGW-Unterstützung MUSS dem integrierten Paketierungsansatz folgen, um – sofern technisch möglich – sowohl MinGW- als auch native Builds bereitzustellen. Wie bereits erwähnt, gibt es in seltenen Fällen kein entsprechendes natives Paket, sodass ein separater Paketierungsansatz erforderlich ist.

Hinzufügen von MinGW-Unterstützung zu einem bestehenden nativen Paket

Wenn in Fedora bereits ein entsprechendes natives Paket vorhanden ist, wird bevorzugt, die MinGW-Unterstützung zum nativen Quellpaket hinzuzufügen.

Bei einfachen Änderungen am Quellpaket SOLLTE der Mitwirkende Folgendes tun:

  • die erforderlichen Ergänzungen in der Spec-Datei im Fork des Pakets vornehmen

  • einen Koji-Scratch-Build einreichen, um nachzuweisen, dass die Änderungen den erwarteten Effekt haben

  • einen Merge-Request für das native Paket mit den Änderungen der Spec-Datei öffnen und als Kommentar einen Link zu den Ergebnissen des Koji-Scratch-Builds hinzufügen.

Der bisherige Betreuer des nativen Pakets erhält dadurch einen klaren Überblick über die Auswirkungen der MinGW-Ergänzungen auf sein Paket und kann so die Machbarkeit des integrierten Paketierungsansatzes beurteilen.

Wenn Zweifel an der Durchführbarkeit des integrierten Paketansatzes bestehen, KANN ein Fehlerbericht für das Paket erstellt werden, bevor mit der Diskussion der beiden Paketierungsoptionen mit dem Betreuer des nativen Pakets begonnen wird.

Lehnt der ursprüngliche Paketbetreuer den Vorschlag ab, MinGW-Unterstützung in das bestehende Paket aufzunehmen, muss der reguläre Fedora-Prozess für neue Pakete befolgt werden, um MinGW-Unterstützung gemäß dem Ansatz der separaten Paketierung einzuführen.

Native Fedora-Paketversionen synchronisieren

Generell sollten cross-kompilierte MinGW-Versionen von Paketen, die bereits nativ in Fedora verfügbar sind, so genau wie möglich dem nativen Fedora-Paket entsprechen. Das bedeutet, sie sollten dieselbe Versionsnummer haben, alle Patches des nativen Fedora-Pakets enthalten und mit denselben Konfigurationsoptionen erstellt werden.

Um dieses Ziel zu erreichen, sollte die MinGW-Unterstützung vorzugsweise den integrierten Paketierungsansatz verwenden.

Den Fedora-Richtlinien folgen

Für MinGW-Pakete, die auf Fedora cross-kompiliert wurden, gelten die Fedora-Richtlinien, sofern in diesem Dokument nichts anderes angegeben ist. Diese Pakete durchlaufen denselben Reviewprozess, dieselben Git-Administrationsprozesse usw. wie andere Fedora-Pakete.

Benennung von Paketen

MinGW-Pakete benötigen eine spezielle Benennung, um die jeweilige CPU-Architektur anzugeben, für die die Binärdateien erstellt wurden. Während eines Build-Vorgangs sollte niemals ein Paket mit dem Präfix mingw- ausgegeben werden. Das Präfix mingw- ist ausschließlich für RPM-Spec-Dateien und den Source-RPM-Dateinamen vorgesehen. Die CPU-architekturspezifischen Pakete werden durch Abschnitte mit %files -n mingw32-foo, %files -n mingw64-foo oder %files -n ucrt64-foo erstellt.

mingw-

Wird für den Quellpaket- und RPM-Spec-Namen verwendet (nur wenn die separate Paketierungsmethode gewählt wird)

mingw32-

Wird für Pakete verwendet, die für Win32 mit der MSVCRT-Laufzeitumgebung erstellt wurden

mingw64-

Wird für Pakete verwendet, die für Win64 mit der MSVCRT-Laufzeitumgebung erstellt wurden

ucrt64-

Wird für Pakete verwendet, die für Win64 mit der UCRT-Laufzeitumgebung erstellt wurden

Basispakete

Die Basispakete stellen ein Root-Dateisystem, Basisbibliotheken, Binärprogramme (wie „strip“, „ld“ usw.), den Compiler (gcc) und die Win32/Win64-API bereit. Pakete benötigen möglicherweise eine oder mehrere dieser Abhängigkeiten. Insbesondere sollten fast alle Pakete die Abhängigkeiten mingw32-filesystem, mingw64-filesystem, mingw32-gcc und mingw64-gcc in ihre Baukonfiguration aufnehmen.

mingw32-filesystem / mingw64-filesystem / ucrt64-filesystem

Kern-Dateisystemverzeichnisstruktur und RPM-Makros für Spec-Dateien. Entspricht dem RPM-Paket „filesystem“

mingw32-binutils / mingw64-binutils / ucrt64-binutils

Cross-kompilierte Binärprogramme (Dienstprogramme wie „strip“, „as“, „ld“), die Windows-Executables und DLLs verstehen. Entspricht dem RPM-Paket „binutils“.

mingw32-gcc / mingw64-gcc / ucrt64-gcc

GNU-Compiler-Sammlung. Compiler für C und C++, die für Windows-Zielsysteme cross-kompiliert werden können. Entspricht dem gcc-RPM-Paket

mingw32-crt / mingw64-crt / ucrt64-crt

Basisbibliotheken für die MinGW-Laufzeitumgebung und -Entwicklungsumgebung. Entspricht dem 'glibc'-RPM-Paket

mingw32-headers / mingw64-headers / ucrt64-headers

Win32- und Win64-API. Eine freie (Public-Domain-)Reimplementierung der Header-Dateien, die zum Linken mit der Win32- und Win64-API benötigt werden. Kein direktes Äquivalent in Fedora – glibc-devel kommt dem am nächsten.

Bau für mehrere Ziele

Das Ziel des MinGW-Frameworks ist es, Paketbetreuern eine einfache Möglichkeit zu bieten, ihre Pakete für mehrere Zielplattformen mithilfe einer einzigen .spec-Datei zu erstellen. Um Entwickler dabei zu unterstützen, wurden mehrere RPM-Makros entwickelt, die Teil des Pakets mingw-filesystem sind. Diese RPM-Makros werden später in diesen Richtlinien erläutert.

Standardmäßig wird MinGW sowohl für Win32- als auch für Win64-Zielsysteme mit der MSVCRT-Laufzeitumgebung gebaut. Der Bau des Win64-Zielsystems mit der UCRT64-Laufzeitumgebung ist standardmäßig noch nicht aktiviert.

Wenn ein Paket nur für eine Teilmenge dieser Ziele erstellt werden kann, kann dies durch Festlegen einer oder mehrerer der folgenden Optionen angegeben werden:

%global mingw_build_win32 0

Nicht für das Win32-Ziel mit der MSVCRT-Laufzeitumgebung bauen

%global mingw_build_win64 0

Nicht für das Win64-Ziel mit der MSVCRT-Laufzeitumgebung bauen

%global mingw_build_ucrt64 0

Nicht für das Win64-Ziel mit der UCRT-Laufzeitumgebung bauen

Ein Source-RPM, separate binäre RPMs pro Ziel

Jedes MinGW-Paket, das für ein bestimmtes Zielsystem cross-kompiliert wird und Binärdateien erstellt, sollte diese Binärdateien in einem separaten Teilpaket ablegen. Wenn also ein Paket mingw-foo oder foo Binärdateien für Win32 und Win64 mit der MSVCRT-Laufzeitumgebung erstellt, sollten aus dem Source-RPM-Paket zwei Teilpakete mit den Namen mingw32-foo und mingw64-foo entstehen. Wenn ein Paket für die UCRT-Laufzeitumgebung erstellt wird, enthält es zusätzlich ein Teilpaket ucrt64-foo.

Dies bedeutet, dass eine Spec-Datei für alle Ziele die Abschnitte %package und %files enthalten muss.

Bei Verwendung des separaten Paketierungsansatzes müssen Pakete, die Übersetzungen enthalten, %mingw_find_lang anstelle von %find_lang verwenden.

Bei Verwendung des integrierten Paketierungsansatzes müssen Pakete, die Übersetzungen enthalten, %find_lang` gefolgt von `%mingw_find_lang+ verwenden.

Dies führt dazu, dass alle Übersetzungsdateilisten in zielspezifische Dateilisten aufgeteilt werden. Eine Spec-Datei enthält beispielsweise Folgendes:

 %install
 <snip>
 %mingw_find_lang foo

Dann wird für jedes MinGW-Ziel eine Datei mit den Namen mingw32-foo.lang, mingw64-foo.lang und ucrt64-foo.lang erstellt. Diese Dateilisten können im Abschnitt %files für die Ziele angegeben werden:

 %files -n mingw32-foo -f mingw32-foo.lang
 <snip>
 %files -n mingw64-foo -f mingw64-foo.lang
 <snip>
 %files -n ucrt64-foo -f ucrt64-foo.lang

Dateisystem-Layout

Die Integration in das Haupt-Root-Dateisystemlayout erfolgt wie folgt:

[root]
  |
  +- etc
  |   |
  |   +- rpm
  |       |
  |       +- macros.mingw
  |       +- macros.mingw32
  |       +- macros.mingw64
  |
  +- usr
      |
      +- bin   - Links zur MinGW-Cross-Compiler-Werkzeugkette
      |   |
      |   +- i686-w64-mingw32-cpp
      |   +- i686-w64-mingw32-gcc
      |   +- i686-w64-mingw32-g++
      |   +- x86_64-w64-mingw32-cpp
      |   +- x86_64-w64-mingw32-gcc
      |   +- x86_64-w64-mingw32-g++
      |   +- x86_64-w64-mingw32ucrt-cpp
      |   +- x86_64-w64-mingw32ucrt-gcc
      |   +- x86_64-w64-mingw32ucrt-g++
      |   +- ... etc..
      |
      +- lib
      |   |
      |   +- rpm
      |       |
      |       +- mingw-find-debuginfo.sh - extrahiert Debug-Informationen aus Win32- und Win64-Binärdateien
      |       +- mingw-find-lang.sh - erzeugt zielspezifische Dateilisten mit Übersetzungen
      |       +- mingw-find-provides.sh - extra DLL-Namen
      |       +- mingw-find-requires.sh - ermittelt benötigte DLL-Namen
      |
      +- i686-w64-mingw32 – Wurzelverzeichnis der MinGW-Werkzeugkette und Binärdateien für das Win32-Zielsystem mit MSVCRT-Laufzeitumgebung – siehe nächstes Diagramm
      +- x86_64-w64-mingw32 – Wurzelverzeichnis der MinGW-Werkzeugkette und Binärdateien für das Win64-Zielsystem mit MSVCRT-Laufzeitumgebung – siehe nächstes Diagramm
      +- x86_64-w64-mingw32urt – Wurzelverzeichnis der MinGW-Werkzeugkette und Binärdateien für das Win64-Zielsystem mit UCRT-Laufzeitumgebung – siehe nächstes Diagramm

Der Großteil des Paketinhalts befindet sich unter dem jeweiligen MinGW-Wurzelverzeichnis, einem der folgenden: /usr/i686-w64-mingw32, /usr/x86_64-w64-mingw32 und /usr/x86_64-w64-mingw32ucrt:

[mingw-root]
  |
  +- bin  – Binutils-Werkzeugketten-Binärdateien für das Ziel
  |   |
  |   +- ar
  |   +- as
  |   +- dlltool
  |   +- ld
  |   +- ... etc ...
  |
  +- lib  – Binutils-Werkzeugketten--Supportbibliotheken/-dateien für das Ziel
  |
  +- sys-root  – Wurzelverzeichnis für cross-kompilierte MinGW-Binärdateien
      |
      +- mingw
          |
          +- bin     – cross-kompilierte MinGW-Binärdateien und Laufzeit-DLL-Teile
          +- etc     – Konfigurationsdateien
          +- include – include-Dateien für cross-kompilierte MinGW-Bibliotheken
          +- lib     – cross-kompilierte statische MinGW-Bibliotheken und Linkzeit-DLL-Teile
          |   |
          |   +- pkgconfig  - pkg-config-Definitionen für Bibliotheken
          |
          +- share
              |
              +- man

Dateinamen der Cross-Compiler und Binutils

Die MinGW-Cross-Compiler und Binutils sind Fedora-Binärdateien und werden daher gemäß den FHS- und Fedora-Richtlinien in %{_bindir} (d.h. /usr/bin) abgelegt.

Die MinGW-Cross-Compiler und Binutils, die i686-Binärdateien für Windows mit der MSVCRT-Laufzeitumgebung generieren, heißen:

 %{_bindir}/i686-w64-mingw32-gcc
 %{_bindir}/i686-w64-mingw32-g++
 %{_bindir}/i686-w64-mingw32-ld
 %{_bindir}/i686-w64-mingw32-as
 %{_bindir}/i686-w64-mingw32-strip
 etc.

Die gleichen Binärdateien sind in %{_prefix}/i686-w64-mingw32/bin ohne Präfix im Namen vorhanden, d.h.

 %{_prefix}/i686-w64-mingw32/bin/gcc
 %{_prefix}/i686-w64-mingw32/bin/g++
 %{_prefix}/i686-w64-mingw32/bin/ld
 %{_prefix}/i686-w64-mingw32/bin/as
 %{_prefix}/i686-w64-mingw32/bin/strip
 etc.

Dasselbe gilt auch für das x86_64-Zielsystem mit den Laufzeitumgebungen MSVCRT und UCRT. Das Zielsystem mit MSVCRT verwendet das Präfix „x86_64-w64-mingw32“ anstelle von „i686-w64-mingw32“, während UCRT das Präfix „x86_64-w64-mingw32ucrt“ verwendet.

Benennung des Wurzeldateisystems

Das Wurzeldateisystem enthält Windows-Programme, DLLs und alle anderen Windows-spezifischen Dateien. Es ist notwendig, da wir Windows-Bibliotheken speichern müssen, um weitere, von ihnen abhängige Bibliotheken einzubinden, und da MinGW einen Speicherort im Wurzelverzeichnis des Dateisystems benötigt.

Der Speicherort für das Win32-Ziel mit MSVCRT-Laufzeitumgebung wird durch das Makro bereitgestellt:

 %{mingw32_sysroot}   %{_prefix}/i686-w64-mingw32/sys-root

Das Win64-Ziel mit MSVCRT-Laufzeitumgebung wird durch das Makro bereitgestellt:

 %{mingw64_sysroot}   %{_prefix}/x86_64-w64-mingw32/sys-root

Das Win64-Ziel mit UCRT-Laufzeitumgebung wird durch das Makro bereitgestellt:

 %{ucrt64_sysroot}   %{_prefix}/x86_64-w64-mingw32ucrt/sys-root

Standard-RPM-Makros für Mingw

Das Paket mingw-filesystem stellt eine Reihe praktischer Makros für die Cross-Kompilierung der Sysroot-Verzeichnisse und der Werkzeugkette bereit. Die Verwendung dieser Makros ist in allen MinGW-Cross-Kompilierungspaketen, die in Fedora eingebunden werden sollen, obligatorisch.

Werkzeugketten-Makros

Die folgenden Makros sind für den %build- und %install-Abschnitt der Spec-Datei vorgesehen.

Generische Makros:

Makro

Verfügbar in mingw-filesystem

Erklärung

mingw_cmake

>= 95

Ausführbare 'cmake'-Datei für alle konfigurierten Ziele aufrufen

mingw_cmake_kde4

>= 95

Ausführbare 'cmake'-Datei für alle konfigurierten Ziele mit gesetzten KDE4-spezifischen Parametern

mingw_configure

>= 95

Konfigurierte Befehle für alle konfigurierten Ziele aufrufen

mingw_make

>= 95

Befehl 'make' für alle konfigurierten Ziele aufrufen

mingw_make_build

>= 113

Befehl 'make -O -j<nprocs> V=1 VERBOSE=1' für alle konfigurierten Ziele aufrufen

mingw_make_install

>= 113

Befehl 'make install DESTDIR=$RPM_BUILD_ROOT 'INSTALL=/usr/bin/install -p' für alle konfigurierten Ziele aufrufen

mingw_meson

>= 104

'meson'-Binärdatei für alle konfigurierten Ziele aufrufen

mingw_ninja

>= 104

'ninja'-Binärdatei für alle konfigurierten Ziele aufrufen

mingw_objcopy

>= 95

'objcopy'-Binärdatei des Cross-Compilers aufrufen (der Win32- und Win64-Binärdateien unterstützt)

mingw_objdump

>= 95

'objdump'-Binärdatei des Cross-Compilers aufrufen (der Win32- und Win64-Binärdateien unterstützt)

mingw_qmake_qt4

>= 95

Qt4-qmake-Binärdatei für alle konfigurierten Ziele aufrufen (benötigt die Installation von mingw32-qt-qmake und/oder mingw64-qt-qmake)

mingw_qmake_qt5

>= 96

Qt5-qmake-Binärdatei für alle konfigurierten Ziele aufrufen (benötigt die Installation von mingw32-qt5-qmake und/oder mingw64-qt5-qmake)

mingw_strip

>= 95

'strip'-Binärdatei des Cross-Compilers aufrufen (der Win32- und Win64-Binärdateien unterstützt)

Laufzeit-spezifische Makros für Win32 mit MSVCRT:

Makro

Verfügbar in mingw32-filesystem

Wert

Erklärung

mingw32_ar

>= 95

i686-w64-mingw32-ar

'ar'-Binärdatei des Cross-Compilers

mingw32_cc

>= 95

i686-w64-mingw32-gcc

'gcc'-Binärdatei des Cross-Compilers

mingw32_cflags

>= 95

-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions --param=ssp-buffer-size=4

Standard-Compiler-Schalter für C/C++-Binärdateien

mingw32_cmake

>= 95

'cmake'-Binärdatei für das Win32-Ziel aufrufen

mingw32_configure

>= 95

Standardaufrufe für 'configure'-Skripte der Autotools

mingw32_cpp

>= 95

i686-w64-mingw32-gcc -E

'cpp'-Binärdatei des Cross-Compilers

mingw32_env

>= 95

Korrekte Umgebungsvariablen für das Win32-Ziel setzen

mingw32_host

>= 95

i686-w64-mingw32

Host-Plattform für den Bau

mingw32_meson

>= 104

'meson'-Binärdatei für das Win32-Ziel aufrufen

mingw32_ninja

>= 104

'ninja'-Binärdatei für das Win32-Ziel aufrufen

mingw32_objcopy

>= 95

i686-w64-mingw32-objcopy

'objcopy'-Binärdatei des Cross-Compilers

mingw32_objdump

>= 95

i686-w64-mingw32-objdump

'objdump'-Binärdatei des Cross-Compilers

mingw32_pkg_config

>= 95

i686-w64-mingw32-pkg-config

pkg-config-Befehl für das Win32-Ziel aufrufen

mingw32_qmake_qt4

>= 95

mingw32-qmake-qt4

Qt4-qmake-Befehl für das Win32-Ziel aufrufen

mingw32_qmake_qt5

>= 96

mingw32-qmake-qt5

Qt5-qmake-Befehl für das Win32-Ziel aufrufen

mingw32_ranlib

>= 95

i686-w64-mingw32-ranlib

'ranlib'-Binärdatei des Cros-Compilers

mingw32_strip

>= 95

i686-w64-mingw32-strip

'strip'-Befehl für das Win32-Ziel aufrufen

mingw32_target

>= 95

i686-w64-mingw32

Zielplattform für den Bau

Laufzeit-spezifische Makros für Win64 mit MSVCRT:

Makro

Verfügbar in mingw64-filesystem

Wert

Erklärung

mingw64_ar

>= 95

x86_64-w64-mingw32-ar

'ar'-Binärdatei des Cross-Compilers

mingw64_cc

>= 95

x86_64-w64-mingw32-gcc

'gcc'-Binärdatei des Cross-Compilers

mingw64_cflags

>= 95

-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions --param=ssp-buffer-size=4

Standard-Compiler-Flags für C/C++-Binärdateien

mingw64_cmake

>= 95

'cmake'-Binärdatei für das Win64-Ziel aufrufen

mingw64_configure

>= 95

Standardaufrufe für 'configure'-Skripte der Autotools

mingw64_cpp

>= 95

x86_64-w64-mingw32-gcc -E

'cpp'-Binärdatei des Cross-Compilers

mingw64_env

>= 95

Korrekte Umgebungsvariablen für das Win64-Ziel setzen

mingw64_host

>= 95

x86_64-w64-mingw32

Host-Plattform für den Bau

mingw64_meson

>= 104

'meson'-Binärdatei für das Win64-Ziel aufrufen

mingw64_ninja

>= 104

'ninja'-Binärdatei für das Win64-Ziel aufrufen

mingw64_objcopy

>= 95

x86_64-w64-mingw32-objcopy

'objcopy'-Binärdatei des Cross-Compilers

mingw64_objdump

>= 95

x86_64-w64-mingw32-objdump

'objdump'-Binärdatei des Cross-Compilers

mingw64_pkg_config

>= 95

x86_64-w64-mingw32-pkg-config

pkg-config-Befehl für das Win64-Ziel aufrufen

mingw64_qmake_qt4

>= 95

mingw64-qmake-qt4

Qt4-qmake-Befehl für das Win64-Ziel aufrufen

mingw64_qmake_qt5

>= 96

mingw64-qmake-qt5

Qt5-qmake-Befehl für das Win64-Ziel aufrufen

mingw64_ranlib

>= 95

x86_64-w64-mingw32-ranlib

'ranlib'-Binärdatei des Cross-Compilers

mingw64_strip

>= 95

x86_64-w64-mingw32-strip

'strip'-Befehl für das Win64-Ziel aufrufen

mingw64_target

>= 95

x86_64-w64-mingw32

Zielplattform für den Bau

Laufzeit-spezifische Makros für Win32 mit UCRT:

Makro

Verfügbar in ucrt64-filesystem

Wert

Erklärung

ucrt64_ar

>= 95

x86_64-w64-mingw32-ar

'ar'-Binärdatei des Cross-Compilers

ucrt64_cc

>= 95

x86_64-w64-mingw32-gcc

'gcc'-Binärdatei des Cross-Compilers

ucrt64_cflags

>= 95

-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions --param=ssp-buffer-size=4

Standard-Compiler-Flags für C/C++-Binärdateien

ucrt64_cmake

>= 95

'cmake'-Binärdatei für das Win64-Ziel aufrufen

ucrt64_configure

>= 95

Standardaufrufe für 'configure'-Skripte der Autotools

ucrt64_cpp

>= 95

x86_64-w64-mingw32-gcc -E

'cpp'-Binärdatei des Cross-Compilers

ucrt64_env

>= 95

Korrekte Umgebungsvariablen für das Win64-Ziel setzen

ucrt64_host

>= 95

x86_64-w64-mingw32

Host-Plattform für den Bau

ucrt64_meson

>= 104

'meson'-Binärdatei für das Win64-Ziel aufrufen

ucrt64_ninja

>= 104

'ninja'-Binärdatei für das Win64-Ziel aufrufen

ucrt64_objcopy

>= 95

x86_64-w64-mingw32-objcopy

'objcopy'-Binärdatei des Cross-Compilers

ucrt64_objdump

>= 95

x86_64-w64-mingw32-objdump

'objdump'-Binärdatei des Cross-Compilers

ucrt64_pkg_config

>= 95

x86_64-w64-mingw32-pkg-config

pkg-config-Befehl für das Win64-Ziel aufrufen

ucrt64_qmake_qt4

>= 95

ucrt64-qmake-qt4

Qt4-qmake-Befehl für das Win64-Ziel aufrufen

ucrt64_qmake_qt5

>= 96

ucrt64-qmake-qt5

Qt5-qmake-Befehl für das Win64-Ziel aufrufen

ucrt64_ranlib

>= 95

x86_64-w64-mingw32-ranlib

'ranlib'-Binärdatei des Cross-Compilers

ucrt64_strip

>= 95

x86_64-w64-mingw32-strip

'strip'-Befehl für das Win64-Ziel aufrufen

ucrt64_target

>= 95

x86_64-w64-mingw32

Zielplattform für den Bau

Makros für Speicherorte im Dateisystem

Die folgenden Makros sind für die Verwendung in den Abschnitten %build, %install und %files der RPM-Spec-Datei vorgesehen.

Für das Win32-Zielsystem mit MSVCRT-Laufzeitumgebung:

mingw32_bindir

%{mingw32_prefix}/bin

Ort der ausführbaren Windows-Dateien.

mingw32_datadir

%{mingw32_prefix}/share

Unter Windows gemeinsam genutzte Daten.

mingw32_docdir

%{mingw32_prefix}/share/doc

Dokumentation.

mingw32_infodir

%{mingw32_prefix}/share/info

Info-Dateien (siehe Anmerkung unten).

mingw32_includedir

%{mingw32_prefix}/include

Beim Cross-Kompilieren für Windows verwendete Header-Dateien.

mingw32_libdir

%{mingw32_prefix}/lib

Windows-Bibliotheken (siehe Abschnitte unten).

mingw32_libexecdir

%{mingw32_prefix}/libexec

mingw32_mandir

%{mingw32_prefix}/share/man

Handbuchseiten (siehe Anmerkung unten).

mingw32_prefix

%{mingw32_sysroot}/mingw

Windows-Äquivalent von %{_prefix}; wird von MinGW benötigt.

mingw32_sbindir

%{mingw32_prefix}/sbin

mingw32_sysconfdir

%{mingw32_prefix}/etc

Bei der Ausführung unter Windows benötigte Konfigurationsdateien.

mingw32_sysroot

%{_prefix}/i686-w64-mingw32/sys-root

Windows-Systemwurzel.

Für das Win64-Zielsystem mit MSVCRT-Laufzeitumgebung:

mingw64_bindir

%{mingw64_prefix}/bin

Ort der ausführbaren Windows-Dateien.

mingw64_datadir

%{mingw64_prefix}/share

Unter Windows gemeinsam genutzte Daten.

mingw64_docdir

%{mingw64_prefix}/share/doc

Dokumentation.

mingw64_infodir

%{mingw64_prefix}/share/info

Info-Dateien (siehe Anmerkung unten).

mingw64_includedir

%{mingw64_prefix}/include

Beim Cross-Kompilieren für Windows verwendete Header-Dateien.

mingw64_libdir

%{mingw64_prefix}/lib

Windows-Bibliotheken (siehe Abschnitte unten).

mingw64_libexecdir

%{mingw64_prefix}/libexec

mingw64_mandir

%{mingw64_prefix}/share/man

Handbuchseiten (siehe Anmerkung unten).

mingw64_prefix

%{mingw64_sysroot}/mingw

Windows-Äquivalent von %{_prefix}; wird von MinGW benötigt.

mingw64_sbindir

%{mingw64_prefix}/sbin

mingw64_sysconfdir

%{mingw64_prefix}/etc

Bei der Ausführung unter Windows benötigte Konfigurationsdateien.

mingw64_sysroot

%{_prefix}/x86_64-w64-mingw32/sys-root

Windows-Systemwurzel.

Für das Win64-Zielsystem mit UCRT-Laufzeitumgebung:

ucrt64_bindir

%{ucrt64_prefix}/bin

Ort der ausführbaren Windows-Dateien.

ucrt64_datadir

%{ucrt64_prefix}/share

Unter Windows gemeinsam genutzte Daten.

ucrt64_docdir

%{ucrt64_prefix}/share/doc

Dokumentation.

ucrt64_infodir

%{ucrt64_prefix}/share/info

Info-Dateien (siehe Anmerkung unten).

ucrt64_includedir

%{ucrt64_prefix}/include

Beim Cross-Kompilieren für Windows verwendete Header-Dateien.

ucrt64_libdir

%{ucrt64_prefix}/lib

Windows-Bibliotheken (siehe Abschnitte unten).

ucrt64_libexecdir

%{ucrt64_prefix}/libexec

ucrt64_mandir

%{ucrt64_prefix}/share/man

Handbuchseiten (siehe Anmerkung unten).

ucrt64_prefix

%{ucrt64_sysroot}/mingw

Windows-Äquivalent von %{_prefix}; wird von MinGW benötigt.

ucrt64_sbindir

%{ucrt64_prefix}/sbin

ucrt64_sysconfdir

%{ucrt64_prefix}/etc

Bei der Ausführung unter Windows benötigte Konfigurationsdateien.

ucrt64_sysroot

%{_prefix}/x86_64-w64-mingw32ucrt/sys-root

Windows-Systemwurzel.

Kompilierung von Binärdateien

Um Binärdateien für mehrere Zielplattformen zu erstellen, müssen Befehle wie ./configure und make mehrfach aufgerufen werden (einmal für jede Zielplattform). Würde man dies alles in eine Spec-Datei schreiben, entstünde doppelter Code. Um dies zu vermeiden, wurden mehrere RPM-Makros eingeführt, die die Kompilierung vereinfachen. Diese Makros sind %mingw_configure, %mingw_cmake, %mingw_cmake_kde4, %mingw_qmake_qt4, %mingw_qmake_qt5 und %mingw_make.

Diese Makros verwenden die Kompilierung außerhalb des Quellcodes, um Binärdateien für alle Zielplattformen zu erstellen. Fast alle Pakete unterstützen die Kompilierung außerhalb des Quellcodes oder benötigen nur geringfügige Anpassungen. Die einzigen bisher bekannten Ausnahmen sind zlib und openssl. Pakete, die die Kompilierung außerhalb des Quellcodes nicht unterstützen, erfordern möglicherweise einen anderen Ansatz, z. B. die vollständige Ausführung aller Schritte in der %install-Phase. Sollten Sie auf ein Paket stoßen, das einen anderen Ansatz erfordert, kontaktieren Sie uns bitte über die Fedora MinGW-Mailingliste.

Manche Pakete müssen für jedes Zielsystem mehrfach kompiliert werden. Beispiele hierfür sind Pakete, die einmal für eine statische und einmal für eine dynamische Version erstellt werden müssen. Solche Pakete können dem verwendeten Bauverzeichnis ein benutzerdefiniertes Suffix hinzufügen. Angenommen, Sie haben beispielsweise Folgendes:

 mkdir build_shared
 pushd build_shared
 %{mingw32_configure} --enable-shared
 popd
 mkdir build_static
 pushd build_static
 %{mingw32_configure} --enable-static
 popd

Das kann man etwa so umschreiben:

 MINGW_BUILDDIR_SUFFIX=shared %mingw_configure --enable-shared
 MINGW_BUILDDIR_SUFFIX=static %mingw_configure --enable-static

Die meisten Pakete wurden mit dem Befehl make %{?_smp_mflags} erstellt. Im MinGW-Cross-Compiler-Framework muss für alle konfigurierten Ziele %mingw_make %{?_smp_mflags} verwendet werden. Wie beim Makro %mingw_configure kann auch die Umgebungsvariable MINGW_BUILDDIR_SUFFIX verwendet werden, um ein benutzerdefiniertes Suffix für das Bauverzeichnis anzugeben.

Zur Installation des Pakets wurde in fast allen Fällen der Befehl make install DESTDIR=$RPM_BUILD_ROOT verwendet. Dieser kann zu %mingw_make install DESTDIR=$RPM_BUILD_ROOT umgeschrieben werden, um das Paket für alle konfigurierten Ziele zu installieren. Die Umgebungsvariable MINGW_BUILDDIR_SUFFIX kann hier ebenfalls verwendet werden.

Manche Pakete erfordern zusätzliche Anweisungen, bevor die Dateien paketiert werden können. Dieser Code kann unverändert bleiben. Allerdings müssen Sie diese Anweisungen möglicherweise mehrfach duplizieren (für alle konfigurierten Ziele).

Abhängigkeiten

Wenn ein Paket Binärdateien enthält, die von einer DLL eines anderen Pakets abhängen, sollten diese Abhängigkeiten in folgender Form ausgedrückt werden:

 mingw32(foo.dll)

Dabei ist foo.dll der Name der DLL. Der Name muss in Kleinbuchstaben umgewandelt werden, da Windows-Binärdateien Abhängigkeiten enthalten, die nicht zwischen Groß- und Kleinschreibung unterscheiden. Verwenden Sie für Win32-Binärdateien die Form 'mingw32(foo.dll)' und für Win64-Binärdateien die Form 'mingw64(foo.dll)'.

Die Generierung korrekter Abhängigkeiten erfolgt automatisch. Paketierer sollten ihre Spec-Dateien mit dieser Zeile beginnen:

 %{?mingw_package_header}

Alle Binärpakete sollten von mingw32-filesystem oder mingw64-filesystem abhängen (abhängig von den im Paket enthaltenen Dateien).

Alle Spec-Dateien sollten mindestens eine der folgenden Abhängigkeiten in „BuildRequires“ enthalten (abhängig von den Zielen, für die Sie kompilieren möchten):

 BuildRequires:  mingw32-filesystem
 BuildRequires:  mingw64-filesystem

und alle anderen BuildRequires, die sie benötigen.

Die meisten MinGW-RPM-Makros sind in allen Fedora-Versionen außer denen, die das Ende des Supports erreicht haben, vorhanden. Falls ein Paket jedoch auf ein neu eingeführtes Makro angewiesen ist, sollte eine versionierte Abhängigkeit von den mingw-XX-filesystem-Paketen verwendet werden.

Bauarchitektur

Alle Pakete sollten Folgendes enthalten:

 BuildArch: noarch

Es sei denn, sie enthalten native Fedora-Programme. Bei Verwendung des separaten Paketierungsansatzes muss das Tag BuildArch im Header der gemeinsamen Spec-Datei vorhanden sein. Bei Verwendung des integrierten Paketierungsansatzes muss das Tag BuildArch im %package-Header für jedes vorhandene MinGW-Teilpaket vorhanden sein.

Bibliotheken (DLLs)

Alle Bibliotheken müssen als DLLs erstellt werden.

Aufgrund der Besonderheit von Windows werden DLLs im Verzeichnis %{mingw32_bindir} gespeichert, zusammen mit einer Steuerdatei im Verzeichnis %{mingw32_libdir}. Für eine Bibliothek namens foo sähe das beispielsweise so aus:

 %{mingw32_bindir}/foo.dll
 %{mingw32_libdir}/foo.dll.a

Die Datei foo.dll ist die Hauptbibliothek, foo.dll.a ist ein Platzhalter, der mit Anwendungen verlinkt wird, damit diese die Bibliothek zur Laufzeit finden können. Alle diese Dateien müssen sich an den angegebenen Speicherorten befinden, damit die Verlinkung erfolgreich hergestellt werden kann. Die Datei .dll kann eine Versionsnummer enthalten, muss dies aber nicht (z.B. foo-0.dll).

Verwenden Sie %{mingw32_bindir}/* oder %{mingw32_libdir}/* nicht im %files-Abschnitt

Der Abschnitt %files muss DLLs und Importbibliotheken separat auflisten. Pakete dürfen NICHT %{mingw32_bindir}/* oder %{mingw32_libdir}/* verwenden.

Der Grund dafür ist, dass libtool sehr fehleranfällig ist und die Erstellung einer DLL sehr schnell abbricht. Daher erzwingen wir die explizite Angabe des DLL-Namens im Abschnitt %files, um dies während der RPM-Erstellung abzufangen.

Strippen

Bibliotheken und ausführbare Dateien sollten gestrippt werden. Dies geschieht korrekt und automatisch, wenn die Spec-Datei mit dieser Zeile beginnt:

 %{?mingw_package_header}

Debuginfo-Teilpaket

Die meisten Binärdateien enthalten beim Erstellen des Pakets Debug-Symbole. Um die Debug-Symbole in ein separates debuginfo-Paket auszulagern (wie es bei nativen Fedora-Paketen üblich ist), muss die Spec-Datei folgende Zeilen enthalten:

 %{?mingw_package_header}
 [...]
 %{?mingw_debug_package}

Die Zeile %{?mingw_debug_package} muss nach %description stehen. Andernfalls funktionieren spectool und andere RPM-Werkzeuge möglicherweise nicht.

Bei Verwendung des integrierten Paketierungsansatzes muss der Abschnitt %install nach der Installation aller Binärdateien im virtuellen Wurzelverzeichnis auch einen Aufruf des Makros %{mingw_debug_install_post} enthalten:

 %install
 [...]
 %{?mingw_debug_install_post}

Dateilisten

Die MinGW-Pakete ermöglichen es Entwicklern, die Windows-Unterstützung ihrer Anwendungen zu kompilieren und zu testen. Darüber hinaus wird erwartet, dass Entwickler mithilfe der MinGW-Paketinhalte Windows-Installationsprogramme (MSIs) für ihre Anwendungen erstellen.

Daher muss die Auflistung der Fedora MinGW-Paketdateien etwas enthalten, das entweder für die Verwendung beim Erstellen/Testen oder für die Erstellung von Windows-Installationsprogrammen erforderlich ist.

Ausführbare Dateien (EXEs)

Die meisten Bibliotheken stellen auch ausführbare Dateien bereit. Dazu gehören beispielsweise Programme, die zum Testen oder Vorführen der jeweiligen Bibliothek verwendet werden können (z.B. gtk3-demo.exe in mingw-gtk3). Weitere Beispiele sind Hilfsprogramme, die intern von der Bibliothek selbst verwendet werden (z.B. gspawn-win32-helper.exe in mingw-glib2).

Ausführbare Dateien, die für die korrekte Funktion der Bibliotheken erforderlich sind, müssen in das entsprechende MinGW32/MinGW64-Teilpaket ausgelagert werden. Weitere optionale, für Endbenutzer bestimmte ausführbare Dateien sollten ebenfalls paketiert werden (z.B. certtool.exe in GNUTLS). Ausführbare Dateien für Entwickler werden nicht empfohlen, können aber nach Ermessen des Paketierers in optionale (abhängige) Teilpakete ausgelagert werden.

Dateien, die bereits Teil nativer Pakete sind

Es gibt verschiedene Dateitypen, die lediglich Duplikate von entsprechenden Dateien in den nativen Fedora-Paketen sind. Diese Dateien sollten nicht im MinGW-Paket enthalten sein. Die folgenden Dateien müssen nicht im MinGW-Paket enthalten sein, da sie bereits in ihren nativen Pendants vorhanden sind:

  • Handbuchseiten (%{mingw32_mandir} / %{mingw64_mandir} / %{ucrt64_mandir})

  • Info-Dateien (%{mingw32_infodir} / %{mingw64_infodir} / %{ucrt64_infodir})

  • Allgemeine Dokumentation (%{mingw32_docdir} / %{mingw64_docdir} / %{ucrt64_docdir})

  • Autoconf-Dateien (%{mingw32_datadir}/aclocal / %{mingw64_datadir}/aclocal / %{ucrt64_datadir}/aclocal)

  • gtk-doc-Dateien (%{mingw32_datadir}/gtk-doc / %{mingw64_datadir}/gtk-doc / %{ucrt64_datadir}/gtk-doc)

Hinweis: Allgemeine Dokumentation, die sich an Endbenutzer und nicht an Entwickler richtet, sollte dort beigefügt werden, wo Anwendungsentwickler sie voraussichtlich mit ihren Windows-Installationsprogrammen bündeln möchten.

Umstellung von separater auf integrierte Paketierung

Grundsätzlich ist eine Konvertierung zwischen den Ansätzen der separaten und der integrierten Paketierung in beide Richtungen möglich. Beide Ansätze erzeugen exakt dieselben binären RPM-Dateien für MinGW-Inhalte; sie unterscheiden sich lediglich in der Spec-Datei ihres Source-RPMs.

Übergang vom separaten zum integrierten Paketierungsansatz

  • Stellen Sie sicher, dass das vorhandene native Softwarepaket die gleiche (oder eine neuere) Versionsnummer wie das vorhandene MinGW-Paket aufweist.

  • Fügen Sie einer bestehenden Spec-Datei für native Pakete MinGW-Unterstützung hinzu.

  • Falls sowohl das native Paket als auch das bestehende MinGW-Paket die gleiche Version aufweisen, muss sichergestellt werden, dass die Versionsnummer des nativen Pakets neuer ist als jede vorherige Version des MinGW-Pakets.

  • Bauen Sie das neue nativen Paket mit MinGW-Unterstützung

  • Legen Sie das separate MinGW-Paket still

Übergang vom integrierten zum separaten Paketierungsansatz

  • Durchlaufen Sie den neuen Reviewprozess für neue Pakete für das separate MinGW-Paket und stellen Sie sicher, dass es die gleiche Versionsnummer wie das bestehende integrierte Paket hat.

  • Importieren Sie das separate MinGW-Paket in dist-git, aber bauen Sie es nicht.

  • Entfernen Sie die MinGW-Unterstützung aus der bestehenden Spec-Datei des nativen Pakets.

  • Bauen Sie das native Paket ohne MinGW-Unterstützung.

  • Stellen Sie sicher, dass das separate MinGW-Paket eine neuere Versionsnummer hat als alle vorhandenen MinGW-Binär-Teil-RPMs, die aus dem nativen Paket erstellt wurden.

  • Bauen Sie das separate MinGW-Paket.

In beiden Fällen sollte der Aktualisierungsprozess für Benutzer, die Fedora-Installationen durchführen und aktualisieren, transparent sein.

Es wird empfohlen, solche Konvertierungen ausschließlich in Rawhide durchzuführen. Sollte in einem stabilen Release-Stream eine Umstellung von integrierter auf separate Paketierung erforderlich sein, muss eine einzelne Bohdi-Aktualisierung sowohl die nativen als auch die MinGW-Paketversionen enthalten.

MinGW-Pakete deaktivieren

Bei Verwendung des integrierten Paketierungsansatzes MUSS die Erstellung von MinGW-Sub-RPMs deaktiviert werden können, und die Erstellung MUSS standardmäßig deaktiviert sein, außer für die Fedora-Distribution. Dadurch wird sichergestellt, dass das native Paket weiterhin in abgeleiteten Distributionen wie RHEL erstellt werden kann, in denen die MinGW-Werkzeugketten nicht enthalten sind. Dies wird durch eine Bedingung im oberen Bereich der Spec-Datei erreicht:

%if 0%{?fedora}
%bcond_without mingw
%else
%bcond_with mingw
%endif

Anschließend werden alle MinGW-bezogenen %package / %files`-Definitionen und relevanten `%build+- oder %install-Befehle in eine Bedingungsprüfung einbezogen:

%if %{with mingw}
%package -n mingw32-example
Summary: %{summary}
BuildArch: noarch
[...]
%endif

Beispiel für eine Spec-Datei eines Pakets nach dem integrierten Ansatz

%if 0%{?fedora}
%bcond_without mingw
%else
%bcond_with mingw
%endif

Name: example
Version: 1.0.0
Release: 1%{?dist}
Summary: Example library

License: LGPL-2.1-or-later
URL: https://fedoraproject.org
Source: https://fedoraproject.org/example-%{version}.tar.bz2

BuildRequires: gcc
BuildRequires: binutils
BuildRequires: gettext
BuildRequires: zlib

%if %{with mingw}
BuildRequires: mingw32-filesystem
BuildRequires: mingw32-gcc
BuildRequires: mingw32-binutils
BuildRequires: mingw32-gettext
BuildRequires: mingw32-win-iconv
BuildRequires: mingw32-zlib

BuildRequires: mingw64-filesystem
BuildRequires: mingw64-gcc
BuildRequires: mingw64-binutils
BuildRequires: mingw64-gettext
BuildRequires: mingw64-win-iconv
BuildRequires: mingw64-zlib
%endif

%description
Example library.

%package devel
Summary: Example library development package
...

%description devel
Example library development headers and library.

%if %{with mingw}
# Wenn ein Paketbetreuer statische Bibliotheken bündeln möchte, können
# diese in -static-Teilpaketen abgelegt werden. Anderenfalls
# können die -static-Teilpakete entfernt werden.

# Win32
%package -n mingw32-example
Summary: MinGW compiled example library for the Win32 target
BuildArch: noarch

%description -n mingw32-example
MinGW compiled example library for the Win32 target.

%package -n mingw32-example-static
Summary: Static version of the MinGW Win32 compiled example library
Requires: mingw32-example = %{version}-%{release}

%description -n mingw32-example-static
Static version of the MinGW Win32 compiled example library.

# Win64
%package -n mingw64-example
Summary: MinGW compiled example library for the Win64 target

%description -n mingw64-example
MinGW compiled example library for the Win64 target.
BuildArch: noarch

%package -n mingw64-example-static
Summary: Static version of the MinGW Win64 compiled example library
Requires: mingw64-example = %{version}-%{release}

%description -n mingw64-example-static
Static version of the MinGW Win64 compiled example library.

%{?mingw_debug_package}
%endif


%prep
%autosetup -p1 -n example-%{version}


%build

%define _configure ../../configure

mkdir -p build/native
cd build/native
%configure ...
%make_build
cd ../..

%if %{with mingw}
%mingw_configure --enable-static --enable-shared --enable-foo
%mingw_make_build
%endif

%install
cd build/native
%make_install

%find_lang example
cd ../..

%if %{with mingw}
%mingw_make_install

%mingw_find_lang example
%endif

%files
%{_libdir}/libexample.so.*

%files devel
%{_libdir}/libexample.so
%{_libdir}/pkgconfig/example.pc
%{_includedir}/example/

# Statische Teilpakete sind optional (wie bereits erwähnt)

%if %{with mingw}
# Win32
%files -n mingw32-example -f mingw32-example.lang
%{mingw32_bindir}/libexample-0.dll
%{mingw32_includedir}/example/
%{mingw32_libdir}/libexample.dll.a
%{mingw32_libdir}/pkgconfig/example.pc

%files -n mingw32-example-static
%{mingw32_libdir}/libexample.a

# Win64
%files -n mingw64-example -f mingw64-example.lang
%{mingw64_bindir}/libexample-0.dll
%{mingw64_includedir}/example/
%{mingw64_libdir}/libexample.dll.a
%{mingw64_libdir}/pkgconfig/example.pc

%files -n mingw64-example-static
%{mingw64_libdir}/libexample-0.a
%endif

%changelog
* Sun Apr 15 2012 Erik van Pienbroek <epienbro@fedoraproject.org> - 1.0.0-1
- Initial release

Beispiel für eine Spec-Datei eines Pakets nach dem separaten Ansatz

Die separate Paket-Spec-Datei extrahiert im Wesentlichen den gesamten Inhalt innerhalb der %{with mingw}-Bedingungen aus dem vorherigen Beispiel und fügt ihn in eine eigenständige Spec-Datei ein.

%{?mingw_package_header}

Name: mingw-example
Version: 1.0.0
Release: 1%{?dist}
Summary: MinGW compiled example library

License: LGPL-2.1-or-later
URL: https://fedoraproject.org
Source: https://fedoraproject.org/example-%{version}.tar.bz2

BuildArch: noarch

BuildRequires: mingw32-filesystem
BuildRequires: mingw32-gcc
BuildRequires: mingw32-binutils
BuildRequires: mingw32-gettext
BuildRequires: mingw32-win-iconv
BuildRequires: mingw32-zlib

BuildRequires: mingw64-filesystem
BuildRequires: mingw64-gcc
BuildRequires: mingw64-binutils
BuildRequires: mingw64-gettext
BuildRequires: mingw64-win-iconv
BuildRequires: mingw64-zlib


%description
MinGW compiled example library.


# Wenn ein Paketbetreuer statische Bibliotheken bündeln möchte, können
# diese in -static-Teilpaketen abgelegt werden. Anderenfalls
# können die -static-Teilpakete entfernt werden.

# Win32
%package -n mingw32-example
Summary: MinGW compiled example library for the Win32 target

%description -n mingw32-example
MinGW compiled example library for the Win32 target.

%package -n mingw32-example-static
Summary: Static version of the MinGW Win32 compiled example library
Requires: mingw32-example = %{version}-%{release}

%description -n mingw32-example-static
Static version of the MinGW Win32 compiled example library.

# Win64
%package -n mingw64-example
Summary: MinGW compiled example library for the Win64 target

%description -n mingw64-example
MinGW compiled example library for the Win64 target.

%package -n mingw64-example-static
Summary: Static version of the MinGW Win64 compiled example library
Requires: mingw64-example = %{version}-%{release}

%description -n mingw64-example-static
Static version of the MinGW Win64 compiled example library.


%{?mingw_debug_package}


%prep
%autosetup -p1 -n example-%{version}


%build
%mingw_configure --enable-static --enable-shared --enable-foo
%mingw_make_build


%install
%mingw_make_install

# Libtool-Dateien müssen nicht gebündelt werden
find %{buildroot} -name "*.la" -delete

%mingw_find_lang example


# Hinweis: Im Hauptpaket sollte kein Abschnitt %%files vorhanden sein!

# Statische Teilpakete sind optional (wie bereits erwähnt)

# Win32
%files -n mingw32-example -f mingw32-example.lang
%{mingw32_bindir}/libexample-0.dll
%{mingw32_includedir}/example/
%{mingw32_libdir}/libexample.dll.a
%{mingw32_libdir}/pkgconfig/example.pc

%files -n mingw32-example-static
%{mingw32_libdir}/libexample.a

# Win64
%files -n mingw64-example -f mingw64-example.lang
%{mingw64_bindir}/libexample-0.dll
%{mingw64_includedir}/example/
%{mingw64_libdir}/libexample.dll.a
%{mingw64_libdir}/pkgconfig/example.pc

%files -n mingw64-example-static
%{mingw64_libdir}/libexample-0.a


%changelog
* Sun Apr 15 2012 Erik van Pienbroek <epienbro@fedoraproject.org> - 1.0.0-1
- Initial release