Package Management

From GlueXWiki
Revision as of 17:10, 25 June 2007 by Davidl (Talk | contribs)

Jump to: navigation, search

HOWTO install and/or create Hall-D software packages

This page gives information on accessing as well as adding to the Hall-D pre-compiled binary repository. This is not where we keep the source code written for Hall-D. Rather, this is where we will place support packages needed to compile and/or run the Hall-D specific code. The intent is to make it easier to setup new systems or update old ones without having to track down and install numerous other 3rd party packages.

Inter-package dependancies should be handled by the package manager your system uses. For Fedora, Red Hat EL (>=5), and SuSE it is YUM and for Mac OS X, Ubuntu Linux and OpenSolaris, it's APT.

Note that YUM systems use RPM as the underlying package management engine, while APT uses th Debian package manager (dpkg). Both systems are similar in that rpm and deb files contain the install files and dependencies. The YUM and APT parts add an extra layer that can automatically grab additional packages needed to satisfy those dependencies from the web.

If you're just trying to install existing packages, go to the appropriate section on "Accessing the * Repository" below.


Accessing the YUM repository

If you already have yum installed (if you're using fedora then you do) you can just install the rpm that adds the JLab Physics repository to your yum configuration. You can get it from here:

http://www.jlab.org/12gev_phys/yum/linux/jlab-phys-0.0-0.i386.rpm

Adding to the repository

Creating an RPM

Here is the "easy" way to create an RPM in your user account without needing root privilege. Before you get started, note that you will need the rpmbuild program installed on your system. I believe this is done by default on FC6 if you install the developer tools. Otherwise, you can get them with yum install rpm-build.

  1. Create a file named .rpmmacros in your home directory with these "magic" lines:
     %_topdir  %(echo $HOME)/rpmbuild
     %_smp_mflags -j3
  2. Create a directory named rpmbuild in your home directory and inside it create directories named: BUILD RPMS SOURCES SPECS SRPMS like so:
    > mkdir ~/rpmbuild
    > cd ~/rpmbuild
    > mkdir BUILD RPMS SOURCES SPECS SRPMS
  3. Prepare the files for the package:
    • Create a directory to hold the files you wish to be included in the RPM. The directory name can be anything and can be anywhere you want. For me, I just used "jana".
    • Copy the files into this directory. Subdirectories should be created as necessary to include the full path of the final destination directory where the file(s) should be installed. For example, to get the include and lib directories to install into /usr/local, I created a usr/local directory inside my jana directory.
    • Create any README, INSTALL, Changelog, or TODO files that you want to include in your package. Put them in the topmost directory and they will be found automatically.
  4. Create a spec file. It seems there are tools to help do this from templates. See mine for jana below. Modify the fields as appropriate.
  5. Run rpmbuild to create your rpm.
    > rpmbuild -bb --target=i386-jlab-fc6 --buildroot=${HOME}/rpmbuild jana.spec
    where the target argument has the form arch-vendor-os and you should give it the name of your spec file.
  6. The new rpm file should be left in the directory ~/rpmbuilds/RPMS/arch where arch is the value passed to --target in the build command above.


Example: jana.spec

Name: jana
Summary: JLab Reconstruction Framework
Version: 1.0
Release: fc6
License: GPL
URL: http://www.jlab.org/JANA
Group: Misc
Packager: JLab
Distribution: JLAB
BuildRoot: /usr/src/packages/SOURCES/%{name}-%{version}

%description


Framework for doing threaded event reconstruction in Nuclear Physics experiments. 

%files
%defattr(-,root,root,0755)
/


You can check the contents of your new rpm file with

> rpm -qlp file.rpm

You can test installation and removal of you new RPM with:

>rpm -i file.rpm

>rpm -e file.rpm

Creating a yum repository

yum is a package management system built on top of RPM. It is used by several Linux distributions, most notably Fedora. Creating a yum repository is pretty easy. Since I have done this already, you probably don't need to. You just need to get the RPMs in the right place and re-run the "createrepo" program to rebuild the database. I document how I set up the repository here anyway.

  1. Prerequisites:
    • Install the createrepo package (if not already). I did this using
      yum install createrepo
  2. Create a directory to hold the yum repository. I did this in /group/12gev_phys/www/yum on the JLab CUE. This is because I wanted the repository to be accessible via http. Note that in order for this to work, directory listing must be enabled. I did this by creating a .htaccess file in the /group/12gev_phys/www directory that contained the following:
    Options +Indexes
    LayoutHeaderOff
  3. Put all of your RPMs in the yum repository directory. I believe they can be placed inside subdirectories if you desire. The directory tree will be traversed when the repository database is created.
  4. Run the createrepo program giving the name of the directory holding the yum repository. This will generate a few files and place them in a directory called "repodata" at the top of your repository.
  5. Create a configuration file with the location of you repository. Here's the one I set up called jlab-phys.repo":
    [jlab-phys]
    name=JLab - Physics
    baseurl=http://www.jlab.org/12gev_phys/yum/linux
    enabled=1
    gpgcheck=0
  6. Now you have a choice, you can just post this file with instructions to install it into /etc/yum/yum.repos.d or you can put it in an RPM that installs it there automatically. I did the latter and created a file jlab-phys-0.0-0.i386.rpm.

Now you should be all set. You can use your favorite yum client to look at the repository (once you've installed the configuration file in /etc/yum/yum.repos.d). I've use kyum which provides a nice graphical interface that allows me to check that my repository is being recognized by yum as well as temporarily disable other repositories while testing.

Creating a DEB file (fink)

The Mac OS X package fink uses debian package files and the apt-get program to manage the interpackage dependancies. The debian package management system is also used by a number of other Unix-like OSes including Debian Linux, Ubuntu Linux, and OpenSolaris. Creating a package is fairly straightforward and unlike RPMs, it seems to not require root access. Here is how I was able to create a debian package on Mac OS X.

  1. Prerequisites:
    • If you're on Mac OS X, you should have fink installed.
    • The dpkg program must be installed. Any system based on debian packages, including fink on Mac OS X, will already have this.
  2. Setup a directory to hold your package contents and control file. This can be anywhere and any name you want. Inside this should be a subdirectory called "DEBIAN". This directory will hold information used by dpkg when building the package, but will not be included in the files the package installs.
  3. Inside the DEBIAN directory, create a file called "control". This is where the configuration info about the package is supplied. Here is what mine looked like:
    Package: xerces-c
    Version: 2.7.0
    Section: libs
    Architecture: darwin-i386
    Essential: no
    Depends:
    Installed-Size: 10916
    Maintainer: David Lawrence <davidl@jlab.org>
    Provides: xerces-c
    Description: Binary package of xerces-c 2.7.0
    There are more options than listed here and one should check the web for an up-to-date list with descriptions.
  4. Two other files must exist in the DEBIAN directory. These are scripts called postinst and prerm wich are run before installation and after package removal repsectively. For my package, I did not have any special tasks that I needed these for so I just made them trivial scripts that did nothing:
    #!/bin/sh
  5. Copy all of your files into the directory that hold the DEBIAN directory (not the DEBIAN directory itself!). This should be considered the root of the install files system so if you want a file to end up in /usr/local/lib, you need to create a usr/local/lib directory here to put the file in. NOTE: if you are making a package to be installed with fink on Mac OS X, then you should place everything in the /sw directory path. This will keep all fink-installed packages consistent and contained.
  6. Run the dpkg program to create your package. The first argument is the directory with all of your files and the second is the name of the final package file. Naming conventions dictate they follow this format:
    package-version_os-arch.deb
    For example, my package was named xerces-c-2.7.0_darwin-i386.deb

You can check the contents of your new package with:

dpkg -c file.deb

To test installation and removal do:

dpkg -i file.deb 
dpkg -r file.deb

Creating a APT Repository

Install apt-ftparchive to handle multiple architectures when generating Packages file(s).