From Fedora Project Wiki
(Added an example of spec-file)
Line 14: Line 14:
  
 
Erlang package should not install its original sources. Instead packages should ensure that it's built with +debug_info flag. It does NOT impact the runtime performance of the application at all (beam loader disregards debug symbols before loading to VM). Dialyzer requires either this debug info or original sources.
 
Erlang package should not install its original sources. Instead packages should ensure that it's built with +debug_info flag. It does NOT impact the runtime performance of the application at all (beam loader disregards debug symbols before loading to VM). Dialyzer requires either this debug info or original sources.
 +
 +
If Erlang package doesn't contain any NIF-libraries, port-applications, or driver libraries, it must contain "%global debug_package %{nil}" directive to suppres building an empty debuginfo sub-package. Unfortunately this adds two additional rpmlint messages:
 +
 +
<nowiki>Auriga ~: rpmlint ~/rpmbuild/RPMS/x86_64/erlang-cowboy-2.0.0-0.1.pre.3.fc24.x86_64.rpm
 +
erlang-cowboy.x86_64: E: no-binary
 +
erlang-cowboy.x86_64: W: only-non-binary-in-usr-lib
 +
1 packages and 0 specfiles checked; 1 errors, 1 warnings.
 +
Auriga ~:</nowiki>
 +
 +
What rpmlint it trying to say here is that we're installing arch-independent data into arch-dependent library. That's expected. Just ignore these messages for now.
  
 
= Header files =
 
= Header files =

Revision as of 16:42, 16 March 2016

THIS DOCUMENT IS WIP

This document seeks to document the conventions and customs surrounding the proper packaging of Erlang modules and applications in Fedora and EPEL. It does not intend to cover all situations, but to codify those practices which have served the Fedora Erlang community well.

Naming

erlang-%{realname}

File Locations

Erlang packages should install theirselves to %{_erllibdir}/%{realname}-%{version}. Big applications, such as Package-x-generic-16.pngejabberd, Package-x-generic-16.pngrabbitmq-server, Package-x-generic-16.pngriak install their content somewhere else due to historical reasons.

Debug symbols / source installation / dialyzer

Erlang package should not install its original sources. Instead packages should ensure that it's built with +debug_info flag. It does NOT impact the runtime performance of the application at all (beam loader disregards debug symbols before loading to VM). Dialyzer requires either this debug info or original sources.

If Erlang package doesn't contain any NIF-libraries, port-applications, or driver libraries, it must contain "%global debug_package %{nil}" directive to suppres building an empty debuginfo sub-package. Unfortunately this adds two additional rpmlint messages:

Auriga ~: rpmlint ~/rpmbuild/RPMS/x86_64/erlang-cowboy-2.0.0-0.1.pre.3.fc24.x86_64.rpm 
erlang-cowboy.x86_64: E: no-binary
erlang-cowboy.x86_64: W: only-non-binary-in-usr-lib
1 packages and 0 specfiles checked; 1 errors, 1 warnings.
Auriga ~: 

What rpmlint it trying to say here is that we're installing arch-independent data into arch-dependent library. That's expected. Just ignore these messages for now.

Header files

Header files for erlang modules stored in ./include directory must be bundled with main package (not in *-devel). They are very often used by system administrators right from the REPL console. Headers from ./src directory normally shouldn't be packaged.

An example of spec-file

%global realname foo
%global upstream bar
# Technically, we're noarch; but erlang whose directories we install into is not.
# This should be removed if a package contains NIF, or driver.
%global debug_package %{nil}


Name:		erlang-%{realname}
Version:	1.2.3
Release:	1%{?dist}
Summary:	Erlang library for doing cool things
Group:		Development/Libraries
License:	ASL 2.0
URL:		https://github.com/%{upstream}/%{realname}
Source0:	https://github.com/%{upstream}/%{realname}/archive/%{version}/%{realname}-%{version}.tar.gz
BuildRequires:	erlang-rebar


%description
Erlang library for doing cool things.


%prep
%setup -q -n %{realname}-%{version}


%build
%{erlang_compile}


%install
%{erlang_install}

# Additionally install some cool stuff required to run application properly
cp -arv priv/ %{buildroot}%{erlang_appdir}/


%check
%{erlang_test}


%files
%license LICENSE.txt
%doc doc/ examples/ README.md
%{erlang_appdir}/


* Wed Mar 16 2016 Peter Lemenkov <lemenkov@gmail.com> - 1.2.3-1
- Initial build