Packaging:D

From FedoraProject

(Difference between revisions)
Jump to: navigation, search
(Include directories)
m (Remove references to %defattr as it is no longer required.)
(23 intermediate revisions by 2 users not shown)
Line 1: Line 1:
'''Revision:''' 0.1<BR>
+
== ldc ==
'''Last Revised:''' Wednesday Jul 28, 2010<BR>
+
All D packages depend on ldc to build, so every package must have ldc as BuildRequires. In addition, the ldc package includes some useful macros for D packages.
  
== Packaging Tips ==
+
=== Compiler options ===
 +
<code>%{_d_optflags}</code> must be used with ldc (normal <code>%{optflags}</code> do not apply to ldc, only to gcc).
  
=== File Locations ===
+
<code>%{_d_optflags}</code> is defined as:
 +
<pre>
 +
-release -w -g -O2
 +
</pre>
  
==== Libraries ====
+
-release ''disables asserts, invariants, contracts and boundscheck''<BR>
D packages must install assemblies to %{_libdir} rather than /usr/lib or %{_datadir}.
+
-w ''enables warnings''<BR>
 +
-g ''generates debug information''<BR>
 +
-O2 ''is the optimisation level''
  
===== Header =====
+
Some D packages use Makefiles, which usually use the $DFLAGS variable in the same way that C packages with Makefiles use $CFLAGS. In this case, <code>export DFLAGS="%{_d_optflags}"</code> is usually appropriate. In other cases, the build script in the D package has an option to pass in <code>%{_d_optflags}</code>. It is the responsibility of the packager to ensure that <code>%{_d_optflags}</code> are used with ldc when the package is built.
D package must install header file like .d or .di to %{_d_includedir}/%{name}
+
  
=== Libraries ===
+
=== Header Files ===
At this time in D programming only OS X support shared lirbraries. So wait this feature or help ldc project. Feel free.<BR>
+
D packages contain header files, which end with .d or .di. These header files must be installed into <code>%{_d_includedir}/%{name}</code>.
For build static librarie in D you need use ar and ranlib tools. ldc compiler support GNU strip.<BR>
+
 
short example from makefile:<BR>
+
<code>%{_d_includedir}</code> is defined as:
 
<pre>
 
<pre>
DC=ldc
+
/usr/include/d/
HD=-Hd $(IMPORT_DEST)
+
</pre>
DFLAGS_REQ=-c -I ../DerelictUtil
+
AL_SRC= \
+
    derelict/openal/al.d \
+
    derelict/openal/alfuncs.d \
+
    derelict/openal/altypes.d 
+
   
+
PACKAGE_PATH=derelict/openal
+
  
all : DerelictAL
+
== Libraries ==
 +
At this time, Linux does not support shared libraries for D code (only OSX does).
 +
As a result, D packages are explicitly excluded from the restrictions against packaging static libraries.
  
$(LIB_PRE)DerelictAL.$(LIB_EXT) :
+
To build static libraries in D, you use the same tools that you would for C, specifically, ar, ranlib, and strip.
$(DC) $(DFLAGS) $(DFLAGS_REQ) $(AL_SRC) $(HD)/$(PACKAGE_PATH)
+
 
$(AR) rcs $@ $^
+
If your D package contains static libraries, you must disable debuginfo generation, by adding this line to the top of your spec file:
$(RANLIB) $@
+
<pre>
$(CP) $@ $(LIB_DEST)
+
%global debug_package %{nil}
$(RM) $@
+
 
</pre>
 
</pre>
 +
Otherwise, it would generate an empty debuginfo package.
  
=== Macros ===
+
All static libraries must be placed in the *-devel subpackage. When doing this, you must also have  
All D package need ldc for build and macro file is in ldc package, every package must have ldc in BuildRequire
+
<code>Provides: %{name}-static = %{version}-%{release}</code> in the devel package definition.
  
==== Include directories ====
+
It is possible that this will leave the root package empty, if this is the case, do not list a %files section for the root package, only for the -devel package. This is illustrated in the example template below.
%{_d_includedir} need be used for devel file<BR>
+
%{_d_includedir} define ''/usr/include/d/'' directory
+
  
==== Compiler options ====
+
== Template ==
%{_d_optflags} need be used for ldc options<BR>
+
<pre>
%{_d_optflags} define options -release -w -g<BR>
+
%global debug_package %{nil}
-release disables asserts, invariants, contracts and boundscheck<BR>
+
-w enable warnings<BR>
+
-g generate debug information<BR>
+
  
[[Category:Packaging guidelines]]
+
Name:           foo
 +
Version:        1.2.3
 +
Release:        1%{?dist}
 +
Summary:        Does foo in D
 +
Group:          Development/Libraries
 +
License:        LGPLv2+
 +
URL:            http://anywhere.com/
 +
Source0:        http://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.txt
 +
%{_d_includedir}/%{name}/
 +
%{_libdir}/*.a
 +
 
 +
%changelog
 +
* Wed Aug 25 2010 John Doe <jdoe@anywhere.com> 1.2.3-1
 +
- initial package
 +
</pre>

Revision as of 19:18, 11 May 2011

Contents

ldc

All D packages depend on ldc to build, so every package must have ldc as BuildRequires. In addition, the ldc package includes some useful macros for D packages.

Compiler options

%{_d_optflags} must be used with ldc (normal %{optflags} do not apply to ldc, only to gcc).

%{_d_optflags} is defined as:

-release -w -g -O2

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

Some D packages use Makefiles, which usually use the $DFLAGS variable in the same way that C packages with Makefiles use $CFLAGS. In this case, export DFLAGS="%{_d_optflags}" is usually appropriate. In other cases, the build script in the D package has an option to pass in %{_d_optflags}. It is the responsibility of the packager to ensure that %{_d_optflags} are used with ldc when the package is built.

Header Files

D packages contain header files, which end with .d or .di. These header files must be installed into %{_d_includedir}/%{name}.

%{_d_includedir} is defined as:

/usr/include/d/

Libraries

At this time, Linux does not support shared libraries for D code (only OSX does). As a result, D packages are explicitly excluded from the restrictions against packaging static libraries.

To build static libraries in D, you use the same tools that you would for C, specifically, ar, ranlib, and strip.

If your D package contains static libraries, you must disable debuginfo generation, by adding this line to the top of your spec file:

%global debug_package %{nil}

Otherwise, it would generate an empty debuginfo package.

All static libraries must be placed in the *-devel subpackage. When doing this, you must also have Provides: %{name}-static = %{version}-%{release} in the devel package definition.

It is possible that this will leave the root package empty, if this is the case, do not list a %files section for the root package, only for the -devel package. This is illustrated in the example template below.

Template

%global debug_package %{nil}

Name:           foo
Version:        1.2.3
Release:        1%{?dist}
Summary:        Does foo in D
Group:          Development/Libraries
License:        LGPLv2+
URL:            http://anywhere.com/
Source0:        http://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.txt
%{_d_includedir}/%{name}/
%{_libdir}/*.a

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