File:  [LON-CAPA] / loncom / build / make_rpm.pl
Revision 1.1: download - view: text, annotated - select for diffs
Mon Oct 2 14:07:53 2000 UTC (23 years, 8 months ago) by harris41
Branches: MAIN
CVS tags: HEAD
A script for automatically generating an RPM.  Pass it a list of existing
file names (optionally stored under a nonroot (not '/') directory), and
an RPM is magically produced.  Has successfully worked now (and been debugged)
under several fairly diverse circumstances. -Scott

    1: #!/usr/bin/perl
    2: 
    3: # Scott Harrison, September 30
    4: # Automatically generate RPM listing files
    5: # from file listing.
    6: 
    7: # GNU General Public License, Version 2, June 1991
    8: # See http://www.gnu.org/copyleft/gpl.html.
    9: 
   10: # This file currently does not actually "build" the RPM.
   11: # This has to be done with an RPM build environment and
   12: # commands like 'rpm -ba'.
   13: 
   14: # What this file DOES do is generate all the needed
   15: # files (and binary root directory tree) to build an RPM with.
   16: 
   17: # I still need to implement the CONFIGURATION_FILES and
   18: # DOCUMENTATION_FILES portion of the command line interface to this
   19: # script.
   20: 
   21: # Take in a file list (from standard input), 
   22: # a description tag and version tag from command line argument
   23: # and generate a:
   24: #      RPM .spec file
   25: #      RPM Makefile
   26: #      SourceRoot
   27: 
   28: unless (-e "/usr/lib/rpm/rpmrc") {
   29:     print <<END;
   30: ERROR: This script only works with a properly installed RPM builder application.  
   31: Cannot find /usr/lib/rpm/rpmrc, so cannot generate customized rpmrc file.
   32: Script aborting.
   33: END
   34: }
   35: 
   36: my ($tag,$version,$configuration_files,$documentation_files,$pathprefix)=@ARGV;
   37: @ARGV=();
   38: if (!$version) {
   39:     print "Usage: <TAG> <VERSION> [CONFIGURATION_FILES] [DOCUMENTATION] [PATHPREFIX]\n";
   40:     print "Standard input provides the list of files to work with.\n";
   41:     print "TAG, required descriptive tag.  For example, a kerberos software package might be tagged as \"krb4\".\n";
   42:     print "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.\n";
   43:     print "CONFIGURATION_FILES, optional comma-separated listing of files to be treated as configuration files by RPM (and thus subject to saving during RPM upgrades).\n";
   44:     print "DOCUMENTATION, 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).\n";
   45:     print "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.\n";
   46:     exit;
   47: }
   48: 
   49: mkdir $tag,0755;
   50: mkdir "$tag/BuildRoot",0755;
   51: mkdir "$tag/SOURCES",0755;
   52: mkdir "$tag/SOURCES/LON-CAPA-$tag-$version",0755;
   53: mkdir "$tag/SPECS",0755;
   54: mkdir "$tag/BUILD",0755;
   55: mkdir "$tag/SRPMS",0755;
   56: mkdir "$tag/RPMS",0755;
   57: mkdir "$tag/RPMS/i386",0755;
   58: 
   59: my $file;
   60: my $binaryroot="$tag/BinaryRoot";
   61: my ($type,$size,$octalmode,$user,$group);
   62: 
   63: $currentdir=`pwd`; chop $currentdir; $invokingdir=$currentdir; $currentdir.="/$tag";
   64: 
   65: open (IN,"</usr/lib/rpm/rpmrc") or die("Can't open /usr/lib/rpm/rpmrc");
   66: @lines=<IN>;
   67: close IN;
   68: 
   69: open (RPMRC,">$tag/SPECS/rpmrc");
   70: foreach $line (@lines) {
   71:     if ($line=~/^macrofiles/) {
   72: 	chop $line;
   73: 	$line.=":./rpmmacros\n";
   74:     }
   75:     print RPMRC $line;
   76: }
   77: close RPMRC;
   78: 
   79: open (RPMMACROS,">$tag/SPECS/rpmmacros");
   80: print RPMMACROS <<END;
   81: \%_topdir $currentdir
   82: \%__spec_install_post    \\
   83:     /usr/lib/rpm/brp-strip \\
   84:     /usr/lib/rpm/brp-strip-comment-note \\
   85: \%{nil}
   86: END
   87: close RPMMACROS;
   88: 
   89: open (SPEC,">$tag/SPECS/LON-CAPA-$tag-$version.spec");
   90: 
   91: print SPEC <<END;
   92: Summary: Files for the $tag component of LON-CAPA.
   93: Name: LON-CAPA-$tag
   94: Version: $version
   95: Release: 1
   96: Vendor: Laboratory for Instructional Technology Education, Division of Science and Mathematics Education, Michigan State University.
   97: BuildRoot: $currentdir/BuildRoot
   98: Copyright: GNU General Public License. Version 2, June 1991.  Michigan State University patents may apply.
   99: Group: Utilities/System
  100: Source: LON-CAPA-$tag-$version.tar.gz
  101: AutoReqProv: no
  102: # requires: filesystem
  103: \%description
  104: This package is automatically generated by the make_rpm.pl perl
  105: script (written by the LON-CAPA development team, www.lon-capa.org,
  106: Scott Harrison). This implements the $tag component for LON-CAPA.
  107: For more on the LON-CAPA project, visit http://www.lon-capa.org/.
  108: 
  109: \%prep
  110: \%setup
  111: 
  112: \%build
  113: rm -Rf "$currentdir/BuildRoot"
  114: 
  115: \%install
  116: make ROOT="\$RPM_BUILD_ROOT" SOURCE="$currentdir/BinaryRoot" directories
  117: make ROOT="\$RPM_BUILD_ROOT" SOURCE="$currentdir/BinaryRoot" files
  118: make ROOT="\$RPM_BUILD_ROOT" SOURCE="$currentdir/BinaryRoot" links
  119: 
  120: \%pre
  121: echo "***********************************************************************"
  122: echo "LON-CAPA  LearningOnline with CAPA"
  123: echo "http://www.lon-capa.org/"
  124: echo "Gerd Kortemeyer, et al"
  125: echo "Laboratory for Instructional Technology Education"
  126: echo "Michigan State University"
  127: echo "General Public License, Version 2, June 1991"
  128: echo "** Michigan State University patents may apply **"
  129: echo " "
  130: echo "This installation assumes an installation of Redhat 6.2"
  131: echo " "
  132: echo "The server computer should be currently connected to the ethernet"
  133: echo " "
  134: echo "The files in this package are only those for the $tag component."
  135: echo "Configuration files are sometimes part of the LON-CAPA-base RPM."
  136: echo "***********************************************************************"
  137: 
  138: \%post
  139: \%postun
  140: 
  141: \%files
  142: END
  143: 
  144: foreach $file (<>) {
  145:     chop $file;
  146:     if (($type,$size,$octalmode,$user,$group)=find_info($file)) {
  147: 	$octalmode="0" . $octalmode if length($octalmode)<4;
  148: 	if ($pathprefix) {
  149: 	    $file=~s/^$pathprefix//;
  150: 	}
  151: 	if ($type eq "files") {
  152: 	    push @{$BinaryRootMakefile{$type}},"\tinstall -D -m $octalmode $pathprefix$file $binaryroot$file\n";
  153: 	    push @{$Makefile{$type}},"\tinstall -D -m $octalmode \$(SOURCE)$file \$(ROOT)$file\n";
  154: 	    push @{$dotspecfile{$type}},"\%attr($octalmode,$user,$group) $file\n";
  155: 	}
  156: 	elsif ($type eq "directories") {
  157: 	    push @{$BinaryRootMakefile{$type}},"\tinstall -m $octalmode -d $binaryroot$file\n";
  158: 	    push @{$Makefile{$type}},"\tinstall -m $octalmode -d \$(SOURCE)$file \$(ROOT)$file\n";
  159: 	    push @{$dotspecfile{$type}},"\%dir \%attr($octalmode,$user,$group) $file\n";
  160: 	}
  161: 	elsif ($type eq "links") {
  162: 	    my $link=$size; # I use the size variable to pass the link value from the subroutine find_info
  163: 	    $link=~s/^$pathprefix//;
  164: 	    push @{$BinaryRootMakefile{$type}},"\tln -s $link $binaryroot$file\n";
  165: 	    push @{$Makefile{$type}},"\tln -s $link \$(ROOT)$file\n";
  166: 	    push @{$dotspecfile{$type}},"\%attr(-,$user,$group) $file\n";
  167: 	}
  168:     }
  169: }
  170: 
  171: open OUT, ">$tag/SOURCES/LON-CAPA-$tag-$version/Makefile";
  172: open OUT2, ">$tag/BinaryRootMakefile";
  173: foreach $type ("directories","files","links") {
  174:     print OUT "$type\:\n";
  175:     print OUT join("",@{$Makefile{$type}});
  176:     print OUT "\n";
  177:     print OUT2 "$type\:\n";
  178:     print OUT2 join("",@{$BinaryRootMakefile{$type}});
  179:     print OUT2 "\n";
  180:     print SPEC join("",@{$dotspecfile{$type}});
  181: }
  182: close OUT2;
  183: close OUT;
  184: 
  185: 
  186: close SPEC;
  187: 
  188: `make -f $tag/BinaryRootMakefile directories`;
  189: `make -f $tag/BinaryRootMakefile files`;
  190: `make -f $tag/BinaryRootMakefile links`;
  191: 
  192: print `cd $currentdir/SOURCES; tar czvf LON-CAPA-$tag-$version.tar.gz LON-CAPA-$tag-$version`;
  193: print `cd $currentdir/SPECS; rpm --rcfile=./rpmrc -ba LON-CAPA-$tag-$version.spec; cd ../RPMS/i386; cp LON-CAPA-$tag-$version-1.i386.rpm $invokingdir/.`;
  194: print `cd $invokingdir; rm -Rf $tag`;
  195: 
  196: sub find_info {
  197:     # only look for
  198:     my ($file)=@_;
  199:     my $line;
  200:     if (($line=`find $file -type f -prune`)=~/^$file\n/) {
  201: 	$line=`find $file -type f -prune -printf "\%s\t\%m\t\%u\t\%g"`;
  202: 	return ("files",split(/\t/,$line));
  203:     }
  204:     elsif (($line=`find $file -type d -prune`)=~/^$file\n/) {
  205: 	$line=`find $file -type d -prune -printf "\%s\t\%m\t\%u\t\%g"`;
  206: 	return ("directories",split(/\t/,$line));
  207:     }
  208:     elsif (($line=`find $file -type l -prune`)=~/^$file\n/) {
  209: 	$line=`find $file -type l -prune -printf "\%h/\%l\t\%m\t\%u\t\%g"`;
  210: 	return ("links",split(/\t/,$line));
  211:     }
  212: 
  213: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>