Paketbaurichtlinien für D

ldc

Alle D-Pakete benötigen ldc zum Bauen, daher muss jedes Paket ldc als BuildRequires angeben. Darüber hinaus enthält das ldc-Paket einige nützliche Makros für D-Pakete.

Compiler-Optionen

%{_d_optflags} muss mit ldc verwendet werden (normale %{optflags} gelten nicht für ldc, sondern nur für gcc).

%{_d_optflags} ist wie folgt definiert:

-release -w -g -O2

-release disables asserts, invariants, contracts and boundscheck + -w enables warnings + -g generates debug information + -O2 is the optimisation level

Manche D-Pakete verwenden Makefiles, die üblicherweise die Variable $DFLAGS analog zu $CFLAGS in C-Paketen mit Makefiles nutzen. In diesem Fall ist export DFLAGS="%{_d_optflags}" meist ausreichend. In anderen Fällen bietet das Bauskript des D-Pakets die Option, %{_d_optflags} zu übergeben. Der Paketierer ist dafür verantwortlich, dass %{_d_optflags} beim Erstellen des Pakets mit ldc verwendet wird.

Header-Dateien

D-Pakete enthalten Header-Dateien, die auf .d oder .di enden. Diese Header-Dateien müssen in %{_d_includedir}/%{name} installiert werden.

%{_d_includedir} ist wie folgt definiert:

/usr/include/d/

Bibliotheken

Derzeit unterstützt Linux keine gemeinsam genutzten Bibliotheken für D-Code (dies wird nur von macOS unterstützt). Daher sind D-Pakete explizit von den Einschränkungen für das Paketieren statischer Bibliotheken ausgenommen.

Um statische Bibliotheken in D zu erstellen, verwenden Sie die gleichen Werkzeuge wie in C, nämlich ar, ranlib und strip.

Wenn Ihr D-Paket statische Bibliotheken enthält, müssen Sie die Debuginfo-Erzeugung deaktivieren, indem Sie diese Zeile am Anfang Ihrer Spec-Datei hinzufügen:

%global debug_package %{nil}

Anderenfalls würde ein leeres Debuginfo-Paket erstellt werden.

Alle statischen Bibliotheken müssen im Teilpaket *-devel abgelegt werden. Dabei muss in der Definition des *-devel-Pakets außerdem Provides: %{name}-static = %{version}-%{release} enthalten sein.

Es ist möglich, dass dadurch das Hauptpaket leer bleibt. In diesem Fall sollte der Abschnitt %files nur für das -devel-Paket, nicht aber für das Hauptpaket aufgeführt werden. Dies wird im folgenden Beispiel veranschaulicht.

Vorlage

%global debug_package %{nil}

Name:           foo
Version:        1.2.3
Release:        1%{?dist}
Summary:        Does foo in D
Group:          Development/Libraries
License:        LGPL-2.1-or-later
URL:            https://anywhere.com/
Source:         https://anywhere.com/%{name}-%{version}.tar.bz2
BuildRequires:  ldc
Requires:       tango

%description
Foo and bar.

%package devel
Provides:       %{name}-static =  %{version}-%{release}
Summary:        Support for developing D application
Group:          Development/Libraries

%prep
%setup -q


%build
export DFLAGS="%{_d_optflags}"
%configure
make %{?_smp_mflags}

%install
mkdir -p %{buildroot}%{_libdir}
mkdir -p %{buildroot}%{_d_includedir}/%{name}/

make install DESTDIR=%{buildroot}

install -m 0644 lib/*     %{buildroot}%{_libdir}
install -m 0644 include/* %{buildroot}%{_d_includedir}/%{name}/

%clean
rm -rf %{buildroot}

%files devel
%doc README.txt
%license LICENSE.txt
%{_d_includedir}/%{name}/
%{_libdir}/*.a

%changelog
* Wed Aug 25 2010 John Doe <jdoe@anywhere.com> 1.2.3-1
- initial package