Annotation of loncom/build/make_rpm.pl, revision 1.2

1.1       harris41    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: 
1.2     ! harris41   10: # This script does actually "build" the RPM.
1.1       harris41   11: 
1.2     ! harris41   12: # This script also generates and then deletes temporary
1.1       harris41   13: # files (and binary root directory tree) to build an RPM with.
                     14: 
                     15: # I still need to implement the CONFIGURATION_FILES and
                     16: # DOCUMENTATION_FILES portion of the command line interface to this
                     17: # script.
                     18: 
                     19: # Take in a file list (from standard input), 
                     20: # a description tag and version tag from command line argument
1.2     ! harris41   21: # and temporarily generate a:
1.1       harris41   22: #      RPM .spec file
                     23: #      RPM Makefile
                     24: #      SourceRoot
1.2     ! harris41   25: 
        !            26: # A resulting .rpm file is generated.
1.1       harris41   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>