(Update to new specs) |
(Add macros) |
||
Line 10: | Line 10: | ||
If you are interested in packaging Octave packages, you should check here for upstream sources: | If you are interested in packaging Octave packages, you should check here for upstream sources: | ||
* [http://octave.sourceforge.net/ The Octave Forge website] | * [http://octave.sourceforge.net/ The Octave Forge website] | ||
== RPM macros == | |||
The following macros are defined in /etc/rpm/macros.octave in the octave package for help in packaging: | |||
<pre> | |||
%octave_api %(octave-config -p API_VERSION || echo 0)} | |||
%_octshareprefix %{buildroot}%{_datadir}/octave | |||
%_octprefix %{_octshareprefix}/packages | |||
%_octarchprefix %{buildroot}%{_libexecdir}/octave/packages | |||
%octave_cmd() octave -H -q --no-site-file --eval "%*"; | |||
%octave_pkg_build %octave_cmd pkg build '-verbose' %{_tmppath}/%{name}-%{version}-%{release}.%{_arch} %SOURCE0 | |||
%octave_pkg_install \ | |||
mkdir -p %{_octprefix} \ | |||
mkdir -p %{_octarchprefix} \ | |||
%octave_cmd warning('off','all');pkg('prefix','%{_octprefix}','%{_octarchprefix}');pkg('global_list',fullfile('%{_octshareprefix}','octave_packages'));pkg('local_list',fullfile('%{_octshareprefix}','octave_packages'));pkg('install','-nodeps','-verbose','%{_tmppath}/%{name}-%{version}-%{release}.%{_arch}/%{octpkg}-%{version}.tar.gz');unlink(pkg('local_list'));unlink(pkg('global_list')); \ | |||
if [ -e %{buildroot}%{octpkgdir}/packinfo/on_uninstall.m ] \ | |||
then \ | |||
mv %{buildroot}%{octpkgdir}/packinfo/on_uninstall.m %{buildroot}%{octpkgdir}/packinfo/on_uninstall.m.orig \ | |||
fi \ | |||
echo "function on_uninstall (desc)" > %{buildroot}%{octpkgdir}/packinfo/on_uninstall.m \ | |||
echo " error ('Can not uninstall %s installed by the redhat package manager', desc.name);" >> %{buildroot}%{octpkgdir}/packinfo/on_uninstall.m \ | |||
echo "endfunction" >> %{buildroot}%{octpkgdir}/packinfo/on_uninstall.m \ | |||
%{nil} | |||
%_octave_pkg_preun \ | |||
rm %{octpkgdir}/packinfo/on_uninstall.m \ | |||
if [ -e %{octpkgdir}/packinfo/on_uninstall.m.orig ]; then \ | |||
mv %{octpkgdir}/packinfo/on_uninstall.m.orig %{octpkgdir}/packinfo/on_uninstall.m \ | |||
cd %{octpkgdir}/packinfo \ | |||
%octave_cmd l=pkg('list');on_uninstall(l{cellfun(@(x)strcmp(x.name,'%{octpkg}'),l)}); \ | |||
fi \ | |||
%{nil} | |||
%octpkgdir %{_datadir}/octave/packages/%{octpkg}-%{version} | |||
%octpkglibdir %{_libexecdir}/octave/packages/%{octpkg}-%{version} | |||
</pre> | |||
== Spec Templates for Octave packages == | == Spec Templates for Octave packages == |
Revision as of 19:15, 12 February 2011
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:
RPM macros
The following macros are defined in /etc/rpm/macros.octave in the octave package for help in packaging:
%octave_api %(octave-config -p API_VERSION || echo 0)} %_octshareprefix %{buildroot}%{_datadir}/octave %_octprefix %{_octshareprefix}/packages %_octarchprefix %{buildroot}%{_libexecdir}/octave/packages %octave_cmd() octave -H -q --no-site-file --eval "%*"; %octave_pkg_build %octave_cmd pkg build '-verbose' %{_tmppath}/%{name}-%{version}-%{release}.%{_arch} %SOURCE0 %octave_pkg_install \ mkdir -p %{_octprefix} \ mkdir -p %{_octarchprefix} \ %octave_cmd warning('off','all');pkg('prefix','%{_octprefix}','%{_octarchprefix}');pkg('global_list',fullfile('%{_octshareprefix}','octave_packages'));pkg('local_list',fullfile('%{_octshareprefix}','octave_packages'));pkg('install','-nodeps','-verbose','%{_tmppath}/%{name}-%{version}-%{release}.%{_arch}/%{octpkg}-%{version}.tar.gz');unlink(pkg('local_list'));unlink(pkg('global_list')); \ if [ -e %{buildroot}%{octpkgdir}/packinfo/on_uninstall.m ] \ then \ mv %{buildroot}%{octpkgdir}/packinfo/on_uninstall.m %{buildroot}%{octpkgdir}/packinfo/on_uninstall.m.orig \ fi \ echo "function on_uninstall (desc)" > %{buildroot}%{octpkgdir}/packinfo/on_uninstall.m \ echo " error ('Can not uninstall %s installed by the redhat package manager', desc.name);" >> %{buildroot}%{octpkgdir}/packinfo/on_uninstall.m \ echo "endfunction" >> %{buildroot}%{octpkgdir}/packinfo/on_uninstall.m \ %{nil} %_octave_pkg_preun \ rm %{octpkgdir}/packinfo/on_uninstall.m \ if [ -e %{octpkgdir}/packinfo/on_uninstall.m.orig ]; then \ mv %{octpkgdir}/packinfo/on_uninstall.m.orig %{octpkgdir}/packinfo/on_uninstall.m \ cd %{octpkgdir}/packinfo \ %octave_cmd l=pkg('list');on_uninstall(l{cellfun(@(x)strcmp(x.name,'%{octpkg}'),l)}); \ fi \ %{nil} %octpkgdir %{_datadir}/octave/packages/%{octpkg}-%{version} %octpkglibdir %{_libexecdir}/octave/packages/%{octpkg}-%{version}
Spec Templates for Octave packages
There are two types of Octave packages: arch-specific and noarch.
Arch specific Octave spec template
%global octpkg image Name: octave-%{octpkg} Version: 1.0.13 Release: 1%{?dist} Summary: Image processing for Octave Group: Applications/Engineering License: GPLv2+ URL: http://octave.sourceforge.net Source0: http://downloads.sourceforge.net/octave/%{octpkg}-%{version}.tar.gz Requires: octave(api) = %{octave_api} BuildRequires: octave-devel BuildRequires: gcc-c++ %description The Octave-forge Image package provides functions for processing images. The package also provides functions for feature extraction, image statistics, spatial and geometric transformations, morphological operations, linear filtering, and much more. %prep %setup -q -n %{octpkg}-%{version} %build pushd src %octave_pkg_build %install rm -rf %{buildroot} %octave_pkg_install %clean rm -rf %{buildroot} %post %octave_cmd pkg rebuild %preun %octave_pkg_preun %postun %octave_cmd pkg rebuild %files %defattr(-,root,root) %{octpkglibdir} %dir %{octpkgdir} %{octpkgdir}/*.m %doc %{octpkgdir}/doc-cache %dir %{octpkgdir}/packinfo %doc %{octpkgdir}/packinfo/COPYING %doc %{octpkgdir}/packinfo/DESCRIPTION %{octpkgdir}/packinfo/.autoload %{octpkgdir}/packinfo/INDEX %{octpkgdir}/packinfo/on_uninstall.m %changelog * Sat Feb 12 2011 Orion Poplawski <orion@cora.nwra.com> 1.0.13-1 - Initial Fedora package
Noarch Octave spec template
%global octpkg image Name: octave-%{octpkg} Version: 1.0.13 Release: 1%{?dist} Summary: Image processing for Octave Group: Applications/Engineering License: GPLv2+ URL: http://octave.sourceforge.net Source0: http://downloads.sourceforge.net/octave/%{octpkg}-%{version}.tar.gz BuildArch: noarch Requires: octave BuildRequires: octave-devel BuildRequires: gcc-c++ %description The Octave-forge Image package provides functions for processing images. The package also provides functions for feature extraction, image statistics, spatial and geometric transformations, morphological operations, linear filtering, and much more. %prep %setup -q -n %{octpkg}-%{version} %build %install rm -rf %{buildroot} %octave_pkg_install %clean rm -rf %{buildroot} %post %octave_cmd pkg rebuild %preun %octave_pkg_preun %postun %octave_cmd pkg rebuild %files %defattr(-,root,root) %dir %{octpkgdir} %{octpkgdir}/*.m %doc %{octpkgdir}/doc-cache %dir %{octpkgdir}/packinfo %doc %{octpkgdir}/packinfo/COPYING %doc %{octpkgdir}/packinfo/DESCRIPTION %{octpkgdir}/packinfo/.autoload %{octpkgdir}/packinfo/INDEX %{octpkgdir}/packinfo/on_uninstall.m %changelog * Sat Feb 12 2011 Orion Poplawski <orion@cora.nwra.com> 1.0.13-1 - Initial Fedora package
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 %{octpkglibdir}
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)
Limitations in the pkg function of octave (pkg.m) means that versioning of octave packages requires that the package version must have a MAJOR.MINOR.MICRO format. Failing to use this format results in octave not recognising binary package components in %prefix/libexec.
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 file is in an octave plain-text format.
The contents of the /usr/share/octave/packages/ directory are scanned for the follwing files when performing a pkg('rebuild') from within octave.
- /usr/share/octave/packages/NAMEOFPACKAGE/packinfo/COPYING
- /usr/share/octave/packages/NAMEOFPACKAGE/packinfo/DESCRIPTION
If these files are not present in any given NAMEOFPACKAGE directory, then octave will silently skip the folder and fail to index it correctly.
Octave will use the contents of octave_packages to modify its path at startup, allowing octave to find plugins.
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.