version 1.12, 2002/01/05 00:48:05
|
version 1.13, 2002/01/09 02:24:14
|
Line 1
|
Line 1
|
#!/usr/bin/perl |
#!/usr/bin/perl |
|
|
# The LearningOnline Network with CAPA |
# The LearningOnline Network with CAPA |
# make_rpm.pl - make RedHat package manager file |
# make_rpm.pl - make RedHat package manager file (A CLEAN AND CONFIGURABLE WAY) |
# |
# |
# $Id$ |
# $Id$ |
# |
# |
Line 25
|
Line 25
|
# along with LON-CAPA; if not, write to the Free Software |
# along with LON-CAPA; if not, write to the Free Software |
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
# |
# |
# /home/httpd/html/adm/gpl.txt |
|
# |
|
# http://www.lon-capa.org/ |
# http://www.lon-capa.org/ |
# |
# |
# YEAR=2000 |
# YEAR=2000 |
Line 34
|
Line 32
|
# YEAR=2001 |
# YEAR=2001 |
# 1/8,1/10,1/13,1/23,5/16 - Scott Harrison |
# 1/8,1/10,1/13,1/23,5/16 - Scott Harrison |
# YEAR=2002 |
# YEAR=2002 |
# 1/4 - Scott Harrison |
# 1/4,1/8 - Scott Harrison |
# |
# |
### |
### |
|
|
# Automatically generate RPM files |
# Automatically generate RPM files |
# from file listing. |
# from file listing. |
|
|
# This script does actually "build" the RPM. |
# This script builds the RPM. |
|
|
# This script also generates and then deletes temporary |
# This script also generates and then deletes temporary |
# files (and binary root directory tree) to build an RPM with. |
# files (and binary root directory tree) to build an RPM with. |
|
# It is designed to work cleanly and independently from pre-existing |
|
# directory trees such as /usr/src/redhat/*. |
|
|
# I still need to implement the CONFIGURATION_FILES and |
# I still need to implement the CONFIGURATION_FILES and |
# DOCUMENTATION_FILES portion of the command line interface to this |
# DOCUMENTATION_FILES portion of the command line interface to this |
Line 59
|
Line 59
|
|
|
# A resulting .rpm file is generated. |
# A resulting .rpm file is generated. |
|
|
unless (-e "/usr/lib/rpm/rpmrc") { |
############################################################################### |
|
## ## |
|
## ORGANIZATION OF THIS PERL SCRIPT ## |
|
## ## |
|
## 1. Check to see if RPM builder application is available ## |
|
## 2. Read in arguments ## |
|
## 3. Generate temporary directories ## |
|
## 4. Initialize some variables ## |
|
## 5. Create a standalone rpm building environment ## |
|
## 6. Perform variable initializations and customizations ## |
|
## 7. Print header information for .spec file ## |
|
## 8. Process file list and generate information ## |
|
## 9. Generate SRPM and BinaryRoot Makefiles ## |
|
## 10. mirror copy (BinaryRoot) files under a temporary directory ## |
|
## 11. roll everything into an rpm ## |
|
## 12. clean everything up ## |
|
## 13. find_info - recursively gather information from a directory ## |
|
## 14. Plain Old Documentation ## |
|
## ## |
|
############################################################################### |
|
|
|
use strict; |
|
|
|
# ------------------------ Check to see if RPM builder application is available |
|
|
|
unless (-e '/usr/lib/rpm/rpmrc') { |
print <<END; |
print <<END; |
ERROR: This script only works with a properly installed RPM builder |
ERROR: This script only works with a properly installed RPM builder |
application. |
application. |
Line 68 Script aborting.
|
Line 93 Script aborting.
|
END |
END |
} |
} |
|
|
my ($tag,$version,$configuration_files,$documentation_files,$pathprefix)=@ARGV; |
# ----------------------------------------------------------- Read in arguments |
|
|
|
my ($tag,$version,$configuration_files,$documentation_files, |
|
$pathprefix,$customize)=@ARGV; |
@ARGV=(); |
@ARGV=(); |
|
|
if (!$version) { |
if (!$version) { |
print "Usage: <TAG> <VERSION> [CONFIGURATION_FILES] [DOCUMENTATION] ". |
print <<END; |
"[PATHPREFIX]\n"; |
See "perldoc make_rpm.pl" for more information. |
print "Standard input provides the list of files to work with.\n"; |
|
print "TAG, required descriptive tag. For example, a kerberos software ". |
Usage: <TAG> <VERSION> [CONFIGURATION_FILES] |
"package might be tagged as \"krb4\".\n"; |
[DOCUMENTATION_FILES] [PATHPREFIX] [CUSTOMIZATION_XML] |
print "VERSION, required version. Needed to generate version information". |
Standard input provides the list of files to work with. |
" for the RPM. This should be in the format N.M where N and M are ". |
TAG, required descriptive tag. For example, a kerberos software |
"integers.\n"; |
package might be tagged as "krb4". |
print "CONFIGURATION_FILES, optional comma-separated listing of files to ". |
VERSION, required version. Needed to generate version information |
"be treated as configuration files by RPM (and thus subject to saving". |
for the RPM. This should be in the format N.M where N and M are |
" during RPM upgrades).\n"; |
integers. |
print "DOCUMENTATION, optional comma-separated listing of files to be ". |
CONFIGURATION_FILES, optional comma-separated listing of files to |
"treated as documentation files by RPM (and thus subject to being ". |
be treated as configuration files by RPM (and thus subject to saving |
"placed in the /usr/doc/RPM-NAME directory during RPM installation).". |
during RPM upgrades). |
"\n"; |
DOCUMENTATION_FILES, optional comma-separated listing of files to be |
print "PATHPREFIX, optional path to be removed from file listing. This ". |
treated as documentation files by RPM (and thus subject to being |
"is in case you are building an RPM from files elsewhere than ". |
placed in the /usr/doc/RPM-NAME directory during RPM installation). |
"root-level. Note, this still depends on a root directory hierarchy ". |
PATHPREFIX, optional path to be removed from file listing. This |
"after PATHPREFIX.\n"; |
is in case you are building an RPM from files elsewhere than |
|
root-level. Note, this still depends on a root directory hierarchy |
|
after PATHPREFIX. |
|
CUSTOMIZATION_XML, allows for customizing various pieces of information such |
|
as vendor, summary, name, copyright, group, autoreqprov, requires, prereq, |
|
description, and pre-installation scripts (see more in the POD; |
|
perldoc make_rpml.pl). |
|
END |
exit; |
exit; |
} |
} |
|
|
mkdir $tag,0755; |
mkdir $tag,0755; |
mkdir "$tag/BuildRoot",0755; |
mkdir "$tag/BuildRoot",0755; |
mkdir "$tag/SOURCES",0755; |
mkdir "$tag/SOURCES",0755; |
mkdir "$tag/SOURCES/LON-CAPA-$tag-$version",0755; |
|
mkdir "$tag/SPECS",0755; |
mkdir "$tag/SPECS",0755; |
mkdir "$tag/BUILD",0755; |
mkdir "$tag/BUILD",0755; |
mkdir "$tag/SRPMS",0755; |
mkdir "$tag/SRPMS",0755; |
mkdir "$tag/RPMS",0755; |
mkdir "$tag/RPMS",0755; |
mkdir "$tag/RPMS/i386",0755; |
mkdir "$tag/RPMS/i386",0755; |
|
|
|
# -------------------------------------------------------- Initialize variables |
|
|
my $file; |
my $file; |
my $binaryroot="$tag/BinaryRoot"; |
my $binaryroot="$tag/BinaryRoot"; |
my ($type,$size,$octalmode,$user,$group); |
my ($type,$size,$octalmode,$user,$group); |
|
|
$currentdir=`pwd`; chop $currentdir; $invokingdir=$currentdir; |
my $currentdir=`pwd`; chop $currentdir; my $invokingdir=$currentdir; |
$currentdir.="/$tag"; |
$currentdir.="/$tag"; |
|
|
open (IN,"</usr/lib/rpm/rpmrc") or die("Can't open /usr/lib/rpm/rpmrc"); |
# -------------------------------- Create a standalone rpm building environment |
@lines=<IN>; |
|
|
open (IN,'</usr/lib/rpm/rpmrc') or die('Cannot open /usr/lib/rpm/rpmrc'); |
|
my @lines=<IN>; |
close IN; |
close IN; |
|
|
open (RPMRC,">$tag/SPECS/rpmrc"); |
open (RPMRC,">$tag/SPECS/rpmrc"); |
foreach $line (@lines) { |
foreach my $line (@lines) { |
if ($line=~/^macrofiles/) { |
if ($line=~/^macrofiles/) { |
chop $line; |
chop $line; |
$line.=":$currentdir/SPECS/rpmmacros\n"; |
$line.=":$currentdir/SPECS/rpmmacros\n"; |
Line 135 print RPMMACROS <<END;
|
Line 173 print RPMMACROS <<END;
|
END |
END |
close RPMMACROS; |
close RPMMACROS; |
|
|
# This needs to be dynamically based upon doc/otherfiles/rpm_list.txt |
# ------------------------- Perform variable initializations and customizations |
# at some point. |
|
my $requires=""; |
my $cu; |
if ($tag eq "setup") { |
if ($customize) { |
$requires=<<END; |
open (IN,"<$customize") or die("Cannot open $customize"); |
PreReq: setup |
my @clines=(<IN>); |
PreReq: passwd |
$cu=join('',@clines); |
PreReq: util-linux |
close IN; |
END |
|
} |
|
elsif ($tag eq "base") { |
|
$requires=<<END; |
|
PreReq: LON-CAPA-setup |
|
PreReq: apache |
|
PreReq: /etc/httpd/conf/access.conf |
|
END |
|
$requires2=<<END; |
|
Requires: LON-CAPA-setup |
|
Requires: raidtools |
|
Requires: ncurses |
|
Requires: popt |
|
Requires: tcsh |
|
Requires: redhat-release |
|
Requires: diffutils |
|
Requires: ed |
|
Requires: dialog |
|
Requires: rmt |
|
Requires: sed |
|
Requires: which |
|
Requires: gawk |
|
Requires: mingetty |
|
Requires: info |
|
Requires: portmap |
|
Requires: openssh-clients |
|
Requires: openssh |
|
Requires: openssh-server |
|
Requires: openssl |
|
Requires: basesystem |
|
Requires: ldconfig |
|
Requires: filesystem |
|
Requires: mktemp |
|
Requires: termcap |
|
Requires: shadow-utils |
|
Requires: libtermcap |
|
Requires: MAKEDEV |
|
Requires: utempter |
|
Requires: bash |
|
Requires: logrotate |
|
Requires: SysVinit |
|
Requires: chkconfig |
|
Requires: textutils |
|
Requires: pwdb |
|
Requires: vixie-cron |
|
Requires: procps |
|
Requires: modutils |
|
Requires: psmisc |
|
Requires: sysklogd |
|
Requires: authconfig |
|
Requires: zlib |
|
Requires: sh-utils |
|
Requires: mailcap |
|
Requires: anacron |
|
Requires: bc |
|
Requires: bdflush |
|
Requires: bind-utils |
|
Requires: cpio |
|
Requires: crontabs |
|
Requires: etcskel |
|
Requires: e2fsprogs |
|
Requires: samba-client |
|
Requires: apache-devel |
|
Requires: autofs |
|
Requires: findutils |
|
Requires: gdbm |
|
Requires: getty_ps |
|
Requires: readline |
|
Requires: glib10 |
|
Requires: inetd |
|
Requires: losetup |
|
Requires: gnupg |
|
Requires: gpgp |
|
Requires: urw-fonts |
|
Requires: mailx |
|
Requires: gzip |
|
Requires: ld.so |
|
Requires: less |
|
Requires: passwd |
|
Requires: sysreport |
|
Requires: ncompress |
|
Requires: mount |
|
Requires: lilo |
|
Requires: bzip2 |
|
Requires: grep |
|
Requires: memprof |
|
Requires: mars-nwe |
|
Requires: pidentd |
|
Requires: procinfo |
|
Requires: units |
|
Requires: routed |
|
Requires: quota |
|
Requires: pam |
|
Requires: stat |
|
Requires: setserial |
|
Requires: mod_perl |
|
Requires: rootfiles |
|
Requires: nfs-utils |
|
Requires: sendmail |
|
Requires: sharutils |
|
Requires: tmpwatch |
|
Requires: shapecfg |
|
Requires: tcp_wrappers |
|
Requires: unzip |
|
Requires: tetex-dvips |
|
Requires: tetex-afm |
|
Requires: tetex-latex |
|
Requires: xntp3 |
|
Requires: rpm |
|
Requires: wu-ftpd |
|
Requires: setup |
|
Requires: glibc |
|
Requires: fileutils |
|
Requires: initscripts |
|
Requires: netatalk |
|
Requires: apache |
|
Requires: bash2 |
|
Requires: dev |
|
Requires: samba |
|
Requires: ghostscript |
|
Requires: kernel-headers |
|
Requires: kernel |
|
Requires: linuxconf |
|
Requires: tetex |
|
Requires: tetex-fonts |
|
Requires: util-linux |
|
Requires: vim-common |
|
Requires: perl |
|
Requires: cracklib |
|
Requires: cracklib-dicts |
|
Requires: cdrecord |
|
Requires: ghostscript-fonts |
|
Requires: libgr |
|
Requires: libjpeg |
|
Requires: libpng |
|
Requires: libungif-progs |
|
Requires: libtiff |
|
Requires: libungif |
|
Requires: samba-common |
|
Requires: ImageMagick |
|
Requires: libgr-progs |
|
Requires: man-pages |
|
Requires: tar |
|
Requires: vim-minimal |
|
END |
|
} |
|
else { |
|
$requires=<<END; |
|
Requires: LON-CAPA-base |
|
END |
|
} |
} |
open (SPEC,">$tag/SPECS/LON-CAPA-$tag-$version.spec"); |
my $tv; # tag value variable for storing retrievals from $cu |
|
|
|
# (Sure. We could use HTML::TokeParser here.. but that wouldn't be fun now, |
|
# would it?) |
|
my $name=$tag; |
|
# read in name from customization if available |
|
$tv=grabtag('name',$cu,1); $name=$tv if $tv; |
|
$name=~s/\<tag \/\>/$tag/g; |
|
|
|
# okay.. now we can generate this needed directory |
|
mkdir "$tag/SOURCES/$name-$version",0755; |
|
|
|
my $requires=""; |
|
# read in relevant requires info from customization file (if applicable) |
|
# note that "PreReq: item" controls order of CD-ROM installation (if you |
|
# are making a customized CD-ROM) |
|
# "Requires: item" just enforces dependencies from the command-line invocation |
|
$tv=grabtag('requires',$cu,1); $requires=$tv if $tv; |
|
# do more require processing here |
|
$requires=~s/\s*\<\/item\>\s*//g; |
|
$requires=~s/\s*\<item\>\s*/\n/g; |
|
$requires=~s/^\s+//s; |
|
|
|
my $summary="Files for the $name software package."; |
|
# read in summary from customization if available |
|
$tv=grabtag('summary',$cu,1); $summary=$tv if $tv; |
|
$summary=~s/\<tag \/\>/$tag/g; |
|
|
|
my $copyright="not specified here"; |
|
# read in copyright from customization if available |
|
$tv=grabtag('copyright',$cu,1); $copyright=$tv if $tv; |
|
$copyright=~s/\<tag \/\>/$tag/g; |
|
|
|
open (SPEC,">$tag/SPECS/$name-$version.spec"); |
|
|
|
my $vendor='Me'; |
|
# read in vendor from customization if available |
|
$tv=grabtag('vendor',$cu,1); $vendor=$tv if $tv; |
|
$vendor=~s/\<tag \/\>/$tag/g; |
|
|
|
my $description="$name software package"; |
|
# read in description from customization if available |
|
$tv=grabtag('description',$cu,0); $description=$tv if $tv; |
|
$description=~s/\<tag \/\>/$tag/g; |
|
|
|
my $pre=""; |
|
# read in pre-installation script if available |
|
$tv=grabtag('pre',$cu,0); $pre=$tv if $tv; |
|
$pre=~s/\<tag \/\>/$tag/g; |
|
|
my $vendor='Laboratory for Instructional Technology Education, Division of '. |
# ------------------------------------- Print header information for .spec file |
'Science and Mathematics Education, Michigan State University.'; |
|
|
|
print SPEC <<END; |
print SPEC <<END; |
Summary: Files for the $tag component of LON-CAPA. |
Summary: $summary |
Name: LON-CAPA-$tag |
Name: $name |
Version: $version |
Version: $version |
Release: 1 |
Release: 1 |
Vendor: $vendor |
Vendor: $vendor |
BuildRoot: $currentdir/BuildRoot |
BuildRoot: $currentdir/BuildRoot |
Copyright: Michigan State University patents may apply. |
Copyright: $copyright |
Group: Utilities/System |
Group: Utilities/System |
Source: LON-CAPA-$tag-$version.tar.gz |
Source: $name-$version.tar.gz |
AutoReqProv: no |
AutoReqProv: no |
$requires |
$requires |
# requires: filesystem |
# requires: filesystem |
\%description |
\%description |
This package is automatically generated by the make_rpm.pl perl |
$description |
script (written by the LON-CAPA development team, www.lon-capa.org, |
|
Scott Harrison). This implements the $tag component for LON-CAPA. |
|
For more on the LON-CAPA project, visit http://www.lon-capa.org/. |
|
|
|
\%prep |
\%prep |
\%setup |
\%setup |
Line 330 make ROOT="\$RPM_BUILD_ROOT" SOURCE="$cu
|
Line 262 make ROOT="\$RPM_BUILD_ROOT" SOURCE="$cu
|
make ROOT="\$RPM_BUILD_ROOT" SOURCE="$currentdir/BinaryRoot" links |
make ROOT="\$RPM_BUILD_ROOT" SOURCE="$currentdir/BinaryRoot" links |
|
|
\%pre |
\%pre |
echo "***********************************************************************" |
$pre |
echo "LON-CAPA LearningOnline with CAPA" |
|
echo "http://www.lon-capa.org/" |
|
echo "Gerd Kortemeyer, et al" |
|
echo "Laboratory for Instructional Technology Education" |
|
echo "Michigan State University" |
|
echo " " |
|
echo "** Michigan State University patents may apply **" |
|
echo " " |
|
echo "This installation assumes an installation of Redhat 6.2" |
|
echo " " |
|
echo "The server computer should be currently connected to the ethernet" |
|
echo " " |
|
echo "The files in this package are only those for the $tag component." |
|
echo "Configuration files are sometimes part of the LON-CAPA-base RPM." |
|
echo "***********************************************************************" |
|
|
|
\%post |
\%post |
\%postun |
\%postun |
Line 353 echo "**********************************
|
Line 270 echo "**********************************
|
\%files |
\%files |
END |
END |
|
|
|
# ------------------------------------ Process file list and gather information |
|
|
|
my %BinaryRootMakefile; |
|
my %Makefile; |
|
my %dotspecfile; |
|
|
foreach $file (<>) { |
foreach $file (<>) { |
chop $file; |
chop $file; |
my $comment=""; |
my $comment=""; |
Line 360 foreach $file (<>) {
|
Line 283 foreach $file (<>) {
|
$file=~s/\s+\#(.*)$//; |
$file=~s/\s+\#(.*)$//; |
$comment=$1; |
$comment=$1; |
} |
} |
my $config=""; |
my $directive=""; |
if ($comment=~/config/i) { |
if ($comment=~/config\(noreplace\)/) { |
$config="\%config "; |
$directive="\%config(noreplace) "; |
|
} |
|
elsif ($comment=~/config/) { |
|
$directive="\%config "; |
|
} |
|
elsif ($comment=~/doc/) { |
|
$directive="\%doc"; |
} |
} |
if (($type,$size,$octalmode,$user,$group)=find_info($file)) { |
if (($type,$size,$octalmode,$user,$group)=find_info($file)) { |
$octalmode="0" . $octalmode if length($octalmode)<4; |
$octalmode="0" . $octalmode if length($octalmode)<4; |
Line 374 foreach $file (<>) {
|
Line 303 foreach $file (<>) {
|
"$pathprefix$file $binaryroot$file\n"; |
"$pathprefix$file $binaryroot$file\n"; |
push @{$Makefile{$type}},"\tinstall -D -m $octalmode ". |
push @{$Makefile{$type}},"\tinstall -D -m $octalmode ". |
"\$(SOURCE)$file \$(ROOT)$file\n"; |
"\$(SOURCE)$file \$(ROOT)$file\n"; |
push @{$dotspecfile{$type}},"$config\%attr($octalmode,$user,". |
push @{$dotspecfile{$type}},"$directive\%attr($octalmode,$user,". |
"$group) $file\n"; |
"$group) $file\n"; |
} |
} |
elsif ($type eq "directories") { |
elsif ($type eq "directories") { |
Line 397 foreach $file (<>) {
|
Line 326 foreach $file (<>) {
|
} |
} |
} |
} |
|
|
open OUT, ">$tag/SOURCES/LON-CAPA-$tag-$version/Makefile"; |
# -------------------------------------- Generate SRPM and BinaryRoot Makefiles |
open OUT2, ">$tag/BinaryRootMakefile"; |
|
|
open OUTS, ">$tag/SOURCES/$name-$version/Makefile"; |
|
open OUTB, ">$tag/BinaryRootMakefile"; |
foreach $type ("directories","files","links") { |
foreach $type ("directories","files","links") { |
print OUT "$type\:\n"; |
print OUTS "$type\:\n"; |
print OUT join("",@{$Makefile{$type}}); |
print OUTS join("",@{$Makefile{$type}}) if $Makefile{$type}; |
print OUT "\n"; |
print OUTS "\n"; |
print OUT2 "$type\:\n"; |
print OUTB "$type\:\n"; |
print OUT2 join("",@{$BinaryRootMakefile{$type}}); |
print OUTB join("",@{$BinaryRootMakefile{$type}}) |
print OUT2 "\n"; |
if $BinaryRootMakefile{$type}; |
print SPEC join("",@{$dotspecfile{$type}}); |
print OUTB "\n"; |
|
print SPEC join("",@{$dotspecfile{$type}}) if $dotspecfile{$type}; |
} |
} |
close OUT2; |
close OUTB; |
close OUT; |
close OUTS; |
|
|
|
|
close SPEC; |
close SPEC; |
|
|
|
# ------------------ mirror copy (BinaryRoot) files under a temporary directory |
|
|
`make -f $tag/BinaryRootMakefile directories`; |
`make -f $tag/BinaryRootMakefile directories`; |
`make -f $tag/BinaryRootMakefile files`; |
`make -f $tag/BinaryRootMakefile files`; |
`make -f $tag/BinaryRootMakefile links`; |
`make -f $tag/BinaryRootMakefile links`; |
|
|
my $command="cd $currentdir/SOURCES; tar czvf LON-CAPA-$tag-$version.tar.gz ". |
# ------------------------------------------------- roll everything into an RPM |
"LON-CAPA-$tag-$version"; |
|
|
my $command="cd $currentdir/SOURCES; tar czvf $name-$version.tar.gz ". |
|
"$name-$version"; |
print `$command`; |
print `$command`; |
$command="cd $currentdir/SPECS; rpm --rcfile=./rpmrc -ba ". |
$command="cd $currentdir/SPECS; rpm --rcfile=./rpmrc -ba ". |
"LON-CAPA-$tag-$version.spec; cd ../RPMS/i386; cp ". |
"$name-$version.spec; cd ../RPMS/i386; cp ". |
"LON-CAPA-$tag-$version-1.i386.rpm $invokingdir/."; |
"$name-$version-1.i386.rpm $invokingdir/."; |
print `$command`; |
print `$command`; |
|
|
|
# --------------------------------------------------------- clean everything up |
|
|
print `cd $invokingdir; rm -Rf $tag`; |
print `cd $invokingdir; rm -Rf $tag`; |
|
|
|
# ----- Subroutine: find_info - recursively gather information from a directory |
sub find_info { |
sub find_info { |
# only look for |
# only look for |
my ($file)=@_; |
my ($file)=@_; |
Line 445 sub find_info {
|
Line 384 sub find_info {
|
} |
} |
|
|
} |
} |
|
|
|
# ------------------------- Subroutine: grabtag - grab a tag from an xml string |
|
sub grabtag { |
|
my ($tag,$text,$clean)=@_; |
|
# meant to be quick and dirty as opposed to a formal state machine parser |
|
my $value; |
|
$cu=~/\<$tag\>(.*?)\<\/$tag\>/s; |
|
$value=$1; $value=~s/^\s+//; |
|
if ($clean) { |
|
$value=~s/\n\s/ /g; |
|
$value=~s/\s\n/ /g; |
|
$value=~s/\n/ /g; |
|
$value=~s/\s+$//; |
|
} |
|
return $value; |
|
} |
|
|
|
# ----------------------------------------------------- Plain Old Documentation |
|
|
|
=head1 NAME |
|
|
|
make_rpm.pl - automatically generate an RPM software package |
|
|
|
=head1 SYNOPSIS |
|
|
|
Usage: <TAG> <VERSION> [CONFIGURATION_FILES] |
|
[DOCUMENTATION_FILES] [PATHPREFIX] [CUSTOMIZATION_XML] |
|
|
|
Standard input provides the list of files to work with. |
|
|
|
TAG, required descriptive tag. For example, a kerberos software |
|
package might be tagged as "krb4". |
|
|
|
VERSION, required version. Needed to generate version information |
|
for the RPM. This should be in the format N.M where N and M are |
|
integers. |
|
|
|
CONFIGURATION_FILES, optional comma-separated listing of files to |
|
be treated as configuration files by RPM (and thus subject to saving |
|
during RPM upgrades). |
|
|
|
DOCUMENTATION_FILES, optional comma-separated listing of files to be |
|
treated as documentation files by RPM (and thus subject to being |
|
placed in the /usr/doc/RPM-NAME directory during RPM installation). |
|
|
|
PATHPREFIX, optional path to be removed from file listing. This |
|
is in case you are building an RPM from files elsewhere than |
|
root-level. Note, this still depends on a root directory hierarchy |
|
after PATHPREFIX. |
|
|
|
CUSTOMIZATION_XML, allows for customizing various pieces of information such |
|
as vendor, summary, name, copyright, group, autoreqprov, requires, prereq, |
|
description, and pre-installation scripts (see more in the POD; |
|
perldoc make_rpml.pl). |
|
|
|
Examples: |
|
|
|
[prompt] find notreallyrootdir | perl make_rpm.pl makemoney 3.1 '' \ |
|
'/usr/doc/man/man3/makemoney.3' notreallyrootdir |
|
would generate makemoney-3.1-1.i386.rpm |
|
|
|
[prompt] find /usr/local/bin | perl make_rpm.pl mybinfiles 1.0 |
|
would generate mybinfiles-1.0-1.i386.rpm |
|
|
|
[prompt] find romeo | perl make_rpm.pl romeo 1.0 '' '' '' customize.xml |
|
would generate romeo with customizations from customize.xml. |
|
|
|
The CUSTOMIZATION_XML argument represents a way to customize the |
|
numerous variables associated with RPMs. This argument represents |
|
a file name. (Parsing is done in an unsophisticated fashion using |
|
regular expressions.) Here are example contents of such a file: |
|
|
|
<vendor> |
|
Laboratory for Instructional Technology Education, Division of |
|
Science and Mathematics Education, Michigan State University. |
|
</vendor> |
|
<summary>Files for the <tag /> component of LON-CAPA</summary> |
|
<name>LON-CAPA-<tag /></name> |
|
<copyright>Michigan State University patents may apply.</copyright> |
|
<group>Utilities/System</group> |
|
<AutoReqProv>no</AutoReqProv> |
|
<requires tag='setup'> |
|
<item>PreReq: setup</item> |
|
<item>PreReq: passwd</item> |
|
<item>PreReq: util-linux</item> |
|
</requires> |
|
<requires tag='base'> |
|
<item>PreReq: LON-CAPA-setup</item> |
|
<item>PreReq: apache</item> |
|
<item>PreReq: /etc/httpd/conf/access.conf</item> |
|
</requires> |
|
<requires> |
|
<item>Requires: LON-CAPA-base</item> |
|
</requires> |
|
<description> |
|
This package is automatically generated by the make_rpm.pl perl |
|
script (written by the LON-CAPA development team, www.lon-capa.org, |
|
Scott Harrison). This implements the <tag /> component for LON-CAPA. |
|
For more on the LON-CAPA project, visit http://www.lon-capa.org/. |
|
</description> |
|
<pre> |
|
echo "***********************************************************************" |
|
echo "LON-CAPA LearningOnline with CAPA" |
|
echo "http://www.lon-capa.org/" |
|
echo " " |
|
echo "Laboratory for Instructional Technology Education" |
|
echo "Michigan State University" |
|
echo " " |
|
echo "** Michigan State University patents may apply **" |
|
echo " " |
|
echo "This installation assumes an installation of Redhat 6.2" |
|
echo " " |
|
echo "The server computer should be currently connected to the ethernet" |
|
echo " " |
|
echo "The files in this package are only those for the <tag /> component." |
|
echo "Configuration files are sometimes part of the LON-CAPA-base RPM." |
|
echo "***********************************************************************" |
|
</pre> |
|
|
|
=head1 DESCRIPTION |
|
|
|
Automatically generate an RPM software package from a list of files. |
|
|
|
This script builds the RPM in a very clean and configurable fashion. |
|
(Finally! Making RPMs the simple way!) |
|
|
|
This script generates and then deletes temporary |
|
files (and binary root directory tree) to build an RPM with. |
|
It is designed to work cleanly and independently from pre-existing |
|
directory trees such as /usr/src/redhat/*. |
|
|
|
Take in a file list (from standard input), |
|
a description tag and version tag from command line argument |
|
and temporarily generate a: |
|
RPM .spec file |
|
RPM Makefile |
|
SourceRoot |
|
|
|
A resulting .rpm file is generated. |
|
|
|
=head1 README |
|
|
|
Automatically generate an RPM software package from a list of files. |
|
|
|
This script builds the RPM in a very clean and configurable fashion. |
|
(Finally! Making RPMs the simple way!) |
|
|
|
This script generates and then deletes temporary |
|
files (and binary root directory tree) to build an RPM with. |
|
It is designed to work cleanly and independently from pre-existing |
|
directory trees such as /usr/src/redhat/*. |
|
|
|
=head1 PREREQUISITES |
|
|
|
This script requires the C<strict> module. |
|
|
|
=pod OSNAMES |
|
|
|
any |
|
|
|
=pod SCRIPT CATEGORIES |
|
|
|
UNIX/System Administration |
|
|
|
=cut |