Difference between revisions of "Package Management"

From GlueXWiki
Jump to: navigation, search
Line 18: Line 18:
 
===Creating an RPM===
 
===Creating an RPM===
  
Here are instructions on how I created an RPM. There are other ways, but this one seemed to work easily enough so I'm documenting it here for myself and others. This was done on a Fedora Core 6 system running on a virtual machine on my MacBook Pro using Parallels.
+
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''.
  
# Prerequisites:
+
# Create a file named ''.rpmmacros'' in your home directory with these "magic" lines:
#* You must have ''root'' access on the machine you are building the RPM on. This is because the rpmbuild tools like to write things into /usr/src which usually only ''root'' has access to. I believe there are ways around this, but I have not explored them as of yet.
+
#* The rpm tools must be 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''
+
#* Install the [http://www.kde-apps.org/content/show.php?content=33228 "RPM Package Maker""] program. This provides a nice graphical interface to creating the RPM and it's what the instructions below refer to.
+
 
#:
 
#:
 +
#: %_topdir      %(echo $HOME)/rpmbuild
 +
#: %_smp_mflags  -j3
 
#:
 
#:
# Preparing the files for the package:
+
# Create a directory named ''rpmbuild'' in your home directory and inside it create directories named: BUILD  RPMS  SOURCES  SPECS  SRPMS like so:
## Create a directory to hold the files you wish to be included in the RPM. The directory name should be the base name and version number of the RPM package. e.g. "''xerces-c-2.7.0''". This can be anywhere you want and does not need to be owned by ''root''.
+
## 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 xerces-c-2.7.0 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.
+
 
#:
 
#:
 +
#: > mkdir ~/rpmbuild
 +
#: > cd ~/rpmbuild
 +
#: > mkdir BUILD  RPMS  SOURCES  SPECS  SRPMS
 
#:
 
#:
# Run the ''/opt/kde/bin/rpmpm'' program as ''root''.
+
# Prepare the files for the package:
## Click the "Dir..." button and select the directory that holds your files.
+
#* 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".
## Click the "New Spec File" button on the top left. (If you already tried creating an RPM, a spec file may already exist. In this case select it from the list on the left hand side and click the "Edit" button. If you want to get rid of the old spec file and start fresh, delete it from ''/usr/src/packages/SPECS/mini'').
+
#* 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.
## Fill in the fields. Note that:
+
#* 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.
##* The "Release" field should contain the target platform for the RPM. For example, for Fedora Core 6, I put "fc6".
+
#:
##* The "Distribution" field should contain something about the home repository where this RPM will be kept. I put "JLab".  
+
# 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.
##* The summary field is required to be filled out as well.
+
#:
##:
+
# Run ''rpmbuild'' to create your rpm.  
## In the main window, deselect the "Autodetect" checkbox and select the "RPM" radiobutton.
+
#: > rpmbuild -bb --target=i386-jlab-fc6 --buildroot=${HOME}/rpmbuild jana.spec
## Click "Start". The output window should appear and after several seconds it should complete with numerous informational messages.
+
#:
## Copy the new RPM file from where it was built to somewhere more convienient. For my system, it was left in ''/usr/src/redhat/RPMS/i386''.
+
#: where the target argument has the form ''arch''-''vendor''-''os'' and you should give it the name of your spec file.
 +
#:
 +
# 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
 
You can check the contents of your new rpm file with
rpm -qlp ''file.rpm''
+
> rpm -qlp ''file.rpm''
  
 
You can test installation and removal of you new RPM with:
 
You can test installation and removal of you new RPM with:
  
rpm -i ''file.rpm''
+
>rpm -i ''file.rpm''
rpm -e ''file.rpm''
+
>rpm -e ''file.rpm''
  
 
===Creating a '''yum''' repository===
 
===Creating a '''yum''' repository===

Revision as of 17:10, 25 June 2007

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).