From Fedora Project Wiki

Revision as of 02:57, 9 September 2008 by Orion (talk | contribs) (Fix typos)

How to package Octave packages

What is Octave?

The definition from website says:

"GNU Octave is a high-level language, primarily intended for numerical computations. It provides a convenient command line interface for solving linear and nonlinear problems numerically, and for performing other numerical experiments using a language that is mostly compatible with Matlab. It may also be used as a batch-oriented language."

If you are interested in packaging Octave packages, you should check here for upstream sources:

Spec Templates for Octave packages

There are two types of Octave packages: arch-specific and noarch.

Arch specific Octave spec template

%define pkg foo
%{!?octave_api: %define octave_api %(octave-config -p API_VERSION || echo 0)}

Name:           octave-%{pkg}
Version:        1.2.1
Release:        1%{?dist}
Summary:        Foo Interface for Octave
Group:          Applications/Engineering
License:        GPLv2+
URL:            http://octave.sourceforge.net
Source0:        http://downloads.sourceforge.net/octave/%{pkg}-%{version}.tar.gz
BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)

Requires:       octave(api) = %{octave_api}
Obsoletes:      octave-forge < 20071015

BuildRequires:  octave-devel >= 2.9.14
BuildRequires:  gcc-c++ libstdc++-devel

%define octave_distpkg %{?_vendor:%_vendor}%{?!_vendor:distributions}

%description
Provides Foo interface for Octave.

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

%build
unset TERM
%configure
make TMPDIR=%{_tmppath} %{?_smp_mflags}

%install
unset TERM
rm -rf %{buildroot}
make install TMPDIR=%{_tmppath} DESTDIR=%{buildroot} DISTPKG=%{octave_distpkg}

%clean
rm -rf %{buildroot}

%post
%{_datadir}/octave/packages/%{pkg}-%{version}/packinfo/dist_admin install

%preun
%{_datadir}/octave/packages/%{pkg}-%{version}/packinfo/dist_admin uninstall

%postun
octave -q -H --no-site-file --eval "pkg('rebuild');"

%files
%defattr(-,root,root)
%{_libexecdir}/octave/packages/%{pkg}-%{version}
%dir %{_datadir}/octave/packages/%{pkg}-%{version}
%{_datadir}/octave/packages/%{pkg}-%{version}/*.m
%dir %{_datadir}/octave/packages/%{pkg}-%{version}/packinfo
%doc %{_datadir}/octave/packages/%{pkg}-%{version}/packinfo/COPYING
%doc %{_datadir}/octave/packages/%{pkg}-%{version}/packinfo/DESCRIPTION
%{_datadir}/octave/packages/%{pkg}-%{version}/packinfo/.autoload
%{_datadir}/octave/packages/%{pkg}-%{version}/packinfo/INDEX
%{_datadir}/octave/packages/%{pkg}-%{version}/packinfo/dist_admin
%{_datadir}/octave/packages/%{pkg}-%{version}/packinfo/on_uninstall.m

%changelog
* Tue Sep 25 2007 Orion Poplawski <orion@cora.nwra.com> 1.2.1-1
- Octave package template

Noarch Octave spec template

%define pkg foo

Name:           octave-%{pkg}
Version:        1.2.1
Release:        1%{?dist}
Summary:        Foo Interface for Octave
Group:          Applications/Engineering
License:        GPLv2+
URL:            http://octave.sourceforge.net
Source0:        http://downloads.sourceforge.net/octave/%{pkg}-%{version}.tar.gz
BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)

Requires:       octave
Obsoletes:      octave-forge < 20071015

BuildRequires:  octave-devel >= 2.9.14
BuildRequires:  gcc-c++ libstdc++-devel
BuildArch:      noarch

%define octave_distpkg %{?_vendor:%_vendor}%{?!_vendor:distributions}

%description
Provides Foo interface for Octave.

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

%build

%install
unset TERM
rm -rf %{buildroot}
make install PACKAGE=%SOURCE0 TMPDIR=%{_tmppath} \
DESTDIR=%{buildroot} DISTPKG=%{octave_distpkg}

%clean
rm -rf %{buildroot}

%post
%{_datadir}/octave/packages/%{pkg}-%{version}/packinfo/dist_admin install

%preun
%{_datadir}/octave/packages/%{pkg}-%{version}/packinfo/dist_admin uninstall

%postun
octave -q -H --no-site-file --eval "pkg('rebuild');"

%files
%defattr(-,root,root)
%dir %{_datadir}/octave/packages/%{pkg}-%{version}
%{_datadir}/octave/packages/%{pkg}-%{version}/*.m
%dir %{_datadir}/octave/packages/%{pkg}-%{version}/packinfo
%doc %{_datadir}/octave/packages/%{pkg}-%{version}/packinfo/COPYING
%doc %{_datadir}/octave/packages/%{pkg}-%{version}/packinfo/DESCRIPTION
%{_datadir}/octave/packages/%{pkg}-%{version}/packinfo/.autoload
%{_datadir}/octave/packages/%{pkg}-%{version}/packinfo/INDEX
%{_datadir}/octave/packages/%{pkg}-%{version}/packinfo/dist_admin
%{_datadir}/octave/packages/%{pkg}-%{version}/packinfo/on_uninstall.m

%changelog
* Tue Sep 25 2007 Orion Poplawski <orion@cora.nwra.com> 1.2.1-1
- Octave package template

Summary of differences between arch-specific and noarch octave packages

  • Noarch packages set BuildArch: noarch
  • Don't require a specific api version
  • No build step needed, just install from the source tar ball
  • Noarch packages don't install anything into %{_libexecdir}/octave/packages

Octave packaging tips

Naming of Octave packages

Packages of Octave packages have their own naming scheme. They should take into account the upstream name of the package. This makes a package name format of octave-$NAME. When in doubt, use the name of the module that you type to import it in octave.

Examples:

octave-java (Octave package named java)
octave-gsl (Octave package named gsl)

unset TERM

Due to an issue with octave emitting an escape sequence (due to readline library) on startup, you need to unset the TERM variable in the %build and %install sections.

Updating the octave package database

Octave maintains a list of installed packages in /usr/share/octave/octave_packages that needs to be updated on package install and removal. This is handled by the dist_admin script in each package.

Documentation files

All package files are installed into the octave directories. The COPYING and DESCRIPTION files are documentation and need to be marked as %doc. The others are not.