This is part 3 of a three-part series on building and
packaging matplotlib as a multi-architecture, Solaris IPS package. In this
tutorial, I go through creating a multiple architecture (fat) IPS package.
Compiling matplotlib 1.1.0 for Solaris on SPARC and x86
Setting up Solaris IPS servers to host packages for SPARC and x86
Packaging matplotlib 1.1.0 for Solaris on SPARC and x86
I assume that the software has already been built and "installed" to a
prototype installation folder on x86 and SPARC machines (I go through this
for matplotlib in part 1). Second, I
assume that three IPS servers are running, which I go through in part 2.
Create the IPS package / manifest
Since the directions are exactly the same for both sparc and x86, I only
include one set of directions here. Where you see $ARCH, replace it with
sparc on a sparc machine and i386 on an Intel machine.
Generate initial list of actions based on the "prototype install" folder.
$ pkgsend generate ~/install_$ARCH > mypackage.$ARCH.pkgsend
Add metadata. For larger projects, one could use pkgmogrify to
automatically fill in $ARCH and other variables, but I just use a text file
to keep things simple for this example.
$ vim mypackage.$ARCH.metadata
set name=pkg.fmri value=pkg://mycompany/mypackage
set name=variant.arch value=$ARCH
set name=pkg.description value="my package example."
set name=pkg.summary value="my package example."
$ cat mypackage.$ARCH.metadata mypackage.$ARCH.pkgsend > mypackage.$ARCH.initial
When I created my package, the
/usr directory was listed as
bin. This conflicts with standard Solaris packages
which expect the group to be
sys, so this line needs to be
changed. If a
/usr/share line is present, it may need to be
$ vim mypackage.$ARCH.initial
# Change this line from:
dir group=bin mode=0755 owner=root path=usr
dir group=sys mode=0755 owner=root path=usr
Generate file dependencies.
% pkgdepend generate -d ./install_$ARCH mypackage.$ARCH.initial > mypackage.$ARCH.depend
Resolve to package dependencies. This creates a *.res file. The
justification for creating a file rather than outputting to stdout is that it
can resolve multiple files to save work this way.
% pkgdepend resolve mypackage.$ARCH.depend
Check out the resolution file and append it to the manifest.
% ls *.res
% cat mypackage.$ARCH.initial mypackage.$ARCH.depend.res > mypackage.$ARCH.manifest
Take care of cosmetic issues, like proper line wrapping at 80 characters.
% pkgfmt mypackage.$ARCH.manifest
As a final check, run pkglint. Be sure to fix any errors that appear.
% pkglint mypackage.$ARCH.manifest
Give manifest a *.p5m extension for publishing.
% cp mypackage.$ARCH.manifest mypackage.$ARCH.p5m
Finally, publish the packages to the appropriate server. In this example I
use http://myipsserver:8000 for sparc and http://myipsserver:8001 for x86.
% sudo pkgsend publish \
-d ./install_sparc \
-s http://myipsserver:8000 \
% sudo pkgsend publish \
-d ./install_i386 \
-s http://myipsserver:8001 \
Merge the packages
Finally, now that each architecture-specific package is published, we can
merge the two repositories into the multiple architecture repository.
$ pkgmerge -s arch=sparc,http://myipsserver:8000 \
-s arch=i386,http://myipsserver:8001 \
Test the package
The final step is to install the package and see if it worked. I recommend
testing on a sparc machine and an x86 machine. I assume that the IPS (pkg
command) publishers are setup correctly (pointing to the multiple
architecture repository and with the correct publisher name).
pkg install pkg://mycompany/mypackage