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

1.1       harris41    1: #!/usr/bin/perl
                      2: 
1.12    ! harris41    3: # The LearningOnline Network with CAPA
        !             4: # make_rpm.pl - make RedHat package manager file
        !             5: #
        !             6: # $Id$
        !             7: #
        !             8: # Written by Scott Harrison, harris41@msu.edu
        !             9: #
        !            10: # Copyright Michigan State University Board of Trustees
        !            11: #
        !            12: # This file is part of the LearningOnline Network with CAPA (LON-CAPA).
        !            13: #
        !            14: # LON-CAPA is free software; you can redistribute it and/or modify
        !            15: # it under the terms of the GNU General Public License as published by
        !            16: # the Free Software Foundation; either version 2 of the License, or
        !            17: # (at your option) any later version.
        !            18: #
        !            19: # LON-CAPA is distributed in the hope that it will be useful,
        !            20: # but WITHOUT ANY WARRANTY; without even the implied warranty of
        !            21: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        !            22: # GNU General Public License for more details.
        !            23: #
        !            24: # You should have received a copy of the GNU General Public License
        !            25: # along with LON-CAPA; if not, write to the Free Software
        !            26: # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
        !            27: #
        !            28: # /home/httpd/html/adm/gpl.txt
        !            29: #
        !            30: # http://www.lon-capa.org/
        !            31: #
        !            32: # YEAR=2000
        !            33: # 9/30,10/2,12/11,12/12,12/21 - Scott Harrison
        !            34: # YEAR=2001
        !            35: # 1/8,1/10,1/13,1/23,5/16 - Scott Harrison
        !            36: # YEAR=2002
        !            37: # 1/4 - Scott Harrison
        !            38: #
        !            39: ###
        !            40: 
        !            41: # Automatically generate RPM files
1.1       harris41   42: # from file listing.
                     43: 
1.2       harris41   44: # This script does actually "build" the RPM.
1.1       harris41   45: 
1.2       harris41   46: # This script also generates and then deletes temporary
1.1       harris41   47: # files (and binary root directory tree) to build an RPM with.
                     48: 
                     49: # I still need to implement the CONFIGURATION_FILES and
                     50: # DOCUMENTATION_FILES portion of the command line interface to this
                     51: # script.
                     52: 
                     53: # Take in a file list (from standard input), 
                     54: # a description tag and version tag from command line argument
1.2       harris41   55: # and temporarily generate a:
1.1       harris41   56: #      RPM .spec file
                     57: #      RPM Makefile
                     58: #      SourceRoot
1.2       harris41   59: 
                     60: # A resulting .rpm file is generated.
1.1       harris41   61: 
                     62: unless (-e "/usr/lib/rpm/rpmrc") {
                     63:     print <<END;
1.12    ! harris41   64: ERROR: This script only works with a properly installed RPM builder
        !            65: application.  
1.1       harris41   66: Cannot find /usr/lib/rpm/rpmrc, so cannot generate customized rpmrc file.
                     67: Script aborting.
                     68: END
                     69: }
                     70: 
                     71: my ($tag,$version,$configuration_files,$documentation_files,$pathprefix)=@ARGV;
                     72: @ARGV=();
1.3       harris41   73: 
1.1       harris41   74: if (!$version) {
1.12    ! harris41   75:     print "Usage: <TAG> <VERSION> [CONFIGURATION_FILES] [DOCUMENTATION] ".
        !            76: 	"[PATHPREFIX]\n";
1.1       harris41   77:     print "Standard input provides the list of files to work with.\n";
1.12    ! harris41   78:     print "TAG, required descriptive tag.  For example, a kerberos software ".
        !            79: 	"package might be tagged as \"krb4\".\n";
        !            80:     print "VERSION, required version.  Needed to generate version information".
        !            81: 	" for the RPM.  This should be in the format N.M where N and M are ".
        !            82: 	"integers.\n";
        !            83:     print "CONFIGURATION_FILES, optional comma-separated listing of files to ".
        !            84: 	"be treated as configuration files by RPM (and thus subject to saving".
        !            85: 	" during RPM upgrades).\n";
        !            86:     print "DOCUMENTATION, optional comma-separated listing of files to be ".
        !            87: 	"treated as documentation files by RPM (and thus subject to being ".
        !            88: 	"placed in the /usr/doc/RPM-NAME directory during RPM installation).".
        !            89: 	"\n";
        !            90:     print "PATHPREFIX, optional path to be removed from file listing.  This ".
        !            91: 	"is in case you are building an RPM from files elsewhere than ".
        !            92: 	"root-level.  Note, this still depends on a root directory hierarchy ".
        !            93: 	"after PATHPREFIX.\n";
1.1       harris41   94:     exit;
                     95: }
                     96: 
                     97: mkdir $tag,0755;
                     98: mkdir "$tag/BuildRoot",0755;
                     99: mkdir "$tag/SOURCES",0755;
                    100: mkdir "$tag/SOURCES/LON-CAPA-$tag-$version",0755;
                    101: mkdir "$tag/SPECS",0755;
                    102: mkdir "$tag/BUILD",0755;
                    103: mkdir "$tag/SRPMS",0755;
                    104: mkdir "$tag/RPMS",0755;
                    105: mkdir "$tag/RPMS/i386",0755;
                    106: 
                    107: my $file;
                    108: my $binaryroot="$tag/BinaryRoot";
                    109: my ($type,$size,$octalmode,$user,$group);
                    110: 
1.12    ! harris41  111: $currentdir=`pwd`; chop $currentdir; $invokingdir=$currentdir;
        !           112: $currentdir.="/$tag";
1.1       harris41  113: 
                    114: open (IN,"</usr/lib/rpm/rpmrc") or die("Can't open /usr/lib/rpm/rpmrc");
                    115: @lines=<IN>;
                    116: close IN;
                    117: 
                    118: open (RPMRC,">$tag/SPECS/rpmrc");
                    119: foreach $line (@lines) {
                    120:     if ($line=~/^macrofiles/) {
                    121: 	chop $line;
1.11      harris41  122: 	$line.=":$currentdir/SPECS/rpmmacros\n";
1.1       harris41  123:     }
                    124:     print RPMRC $line;
                    125: }
                    126: close RPMRC;
                    127: 
                    128: open (RPMMACROS,">$tag/SPECS/rpmmacros");
                    129: print RPMMACROS <<END;
                    130: \%_topdir $currentdir
                    131: \%__spec_install_post    \\
                    132:     /usr/lib/rpm/brp-strip \\
                    133:     /usr/lib/rpm/brp-strip-comment-note \\
                    134: \%{nil}
                    135: END
                    136: close RPMMACROS;
                    137: 
1.7       harris41  138: # This needs to be dynamically based upon doc/otherfiles/rpm_list.txt
                    139: # at some point.
                    140: my $requires="";
                    141: if ($tag eq "setup") {
                    142:     $requires=<<END;
1.8       harris41  143: PreReq: setup
1.9       harris41  144: PreReq: passwd
                    145: PreReq: util-linux
1.7       harris41  146: END
                    147: }
                    148: elsif ($tag eq "base") {
                    149:     $requires=<<END;
1.8       harris41  150: PreReq: LON-CAPA-setup
                    151: PreReq: apache
                    152: PreReq: /etc/httpd/conf/access.conf
                    153: END
                    154:     $requires2=<<END;
                    155: Requires: LON-CAPA-setup
1.7       harris41  156: Requires: raidtools
                    157: Requires: ncurses
                    158: Requires: popt
                    159: Requires: tcsh
                    160: Requires: redhat-release
                    161: Requires: diffutils
                    162: Requires: ed
                    163: Requires: dialog
                    164: Requires: rmt
                    165: Requires: sed
                    166: Requires: which
                    167: Requires: gawk
                    168: Requires: mingetty
                    169: Requires: info
                    170: Requires: portmap
                    171: Requires: openssh-clients
                    172: Requires: openssh
                    173: Requires: openssh-server
                    174: Requires: openssl
                    175: Requires: basesystem
                    176: Requires: ldconfig
                    177: Requires: filesystem
                    178: Requires: mktemp
                    179: Requires: termcap
                    180: Requires: shadow-utils
                    181: Requires: libtermcap
                    182: Requires: MAKEDEV
                    183: Requires: utempter
                    184: Requires: bash
                    185: Requires: logrotate
                    186: Requires: SysVinit
                    187: Requires: chkconfig
                    188: Requires: textutils
                    189: Requires: pwdb
                    190: Requires: vixie-cron
                    191: Requires: procps
                    192: Requires: modutils
                    193: Requires: psmisc
                    194: Requires: sysklogd
                    195: Requires: authconfig
                    196: Requires: zlib
                    197: Requires: sh-utils
                    198: Requires: mailcap
                    199: Requires: anacron
                    200: Requires: bc
                    201: Requires: bdflush
                    202: Requires: bind-utils
                    203: Requires: cpio
                    204: Requires: crontabs
                    205: Requires: etcskel
                    206: Requires: e2fsprogs
                    207: Requires: samba-client
                    208: Requires: apache-devel
                    209: Requires: autofs
                    210: Requires: findutils
                    211: Requires: gdbm
                    212: Requires: getty_ps
                    213: Requires: readline
                    214: Requires: glib10
                    215: Requires: inetd
                    216: Requires: losetup
                    217: Requires: gnupg
                    218: Requires: gpgp
                    219: Requires: urw-fonts
                    220: Requires: mailx
                    221: Requires: gzip
                    222: Requires: ld.so
                    223: Requires: less
                    224: Requires: passwd
                    225: Requires: sysreport
                    226: Requires: ncompress
                    227: Requires: mount
                    228: Requires: lilo
                    229: Requires: bzip2
                    230: Requires: grep
                    231: Requires: memprof
                    232: Requires: mars-nwe
                    233: Requires: pidentd
                    234: Requires: procinfo
                    235: Requires: units
                    236: Requires: routed
                    237: Requires: quota
                    238: Requires: pam
                    239: Requires: stat
                    240: Requires: setserial
                    241: Requires: mod_perl
                    242: Requires: rootfiles
                    243: Requires: nfs-utils
                    244: Requires: sendmail
                    245: Requires: sharutils
                    246: Requires: tmpwatch
                    247: Requires: shapecfg
                    248: Requires: tcp_wrappers
                    249: Requires: unzip
                    250: Requires: tetex-dvips
                    251: Requires: tetex-afm
                    252: Requires: tetex-latex
                    253: Requires: xntp3
                    254: Requires: rpm
                    255: Requires: wu-ftpd
                    256: Requires: setup
                    257: Requires: glibc
                    258: Requires: fileutils
                    259: Requires: initscripts
                    260: Requires: netatalk
                    261: Requires: apache
                    262: Requires: bash2
                    263: Requires: dev
                    264: Requires: samba
                    265: Requires: ghostscript
                    266: Requires: kernel-headers
                    267: Requires: kernel
                    268: Requires: linuxconf
                    269: Requires: tetex
                    270: Requires: tetex-fonts
                    271: Requires: util-linux
                    272: Requires: vim-common
                    273: Requires: perl
                    274: Requires: cracklib
                    275: Requires: cracklib-dicts
                    276: Requires: cdrecord
                    277: Requires: ghostscript-fonts
                    278: Requires: libgr
                    279: Requires: libjpeg
                    280: Requires: libpng
                    281: Requires: libungif-progs
                    282: Requires: libtiff
                    283: Requires: libungif
                    284: Requires: samba-common
                    285: Requires: ImageMagick
                    286: Requires: libgr-progs
                    287: Requires: man-pages
                    288: Requires: tar
                    289: Requires: vim-minimal
                    290: END
                    291: }
                    292: else {
                    293:     $requires=<<END;
                    294: Requires: LON-CAPA-base
                    295: END
                    296: }
1.1       harris41  297: open (SPEC,">$tag/SPECS/LON-CAPA-$tag-$version.spec");
                    298: 
1.12    ! harris41  299: my $vendor='Laboratory for Instructional Technology Education, Division of '.
        !           300:     'Science and Mathematics Education, Michigan State University.';
        !           301: 
1.1       harris41  302: print SPEC <<END;
                    303: Summary: Files for the $tag component of LON-CAPA.
                    304: Name: LON-CAPA-$tag
                    305: Version: $version
                    306: Release: 1
1.12    ! harris41  307: Vendor: $vendor
1.1       harris41  308: BuildRoot: $currentdir/BuildRoot
1.10      harris41  309: Copyright: Michigan State University patents may apply.
1.1       harris41  310: Group: Utilities/System
                    311: Source: LON-CAPA-$tag-$version.tar.gz
                    312: AutoReqProv: no
1.7       harris41  313: $requires
1.1       harris41  314: # requires: filesystem
                    315: \%description
                    316: This package is automatically generated by the make_rpm.pl perl
                    317: script (written by the LON-CAPA development team, www.lon-capa.org,
                    318: Scott Harrison). This implements the $tag component for LON-CAPA.
                    319: For more on the LON-CAPA project, visit http://www.lon-capa.org/.
                    320: 
                    321: \%prep
                    322: \%setup
                    323: 
                    324: \%build
                    325: rm -Rf "$currentdir/BuildRoot"
                    326: 
                    327: \%install
                    328: make ROOT="\$RPM_BUILD_ROOT" SOURCE="$currentdir/BinaryRoot" directories
                    329: make ROOT="\$RPM_BUILD_ROOT" SOURCE="$currentdir/BinaryRoot" files
                    330: make ROOT="\$RPM_BUILD_ROOT" SOURCE="$currentdir/BinaryRoot" links
                    331: 
                    332: \%pre
                    333: echo "***********************************************************************"
                    334: echo "LON-CAPA  LearningOnline with CAPA"
                    335: echo "http://www.lon-capa.org/"
                    336: echo "Gerd Kortemeyer, et al"
                    337: echo "Laboratory for Instructional Technology Education"
                    338: echo "Michigan State University"
1.10      harris41  339: echo " "
1.1       harris41  340: echo "** Michigan State University patents may apply **"
                    341: echo " "
                    342: echo "This installation assumes an installation of Redhat 6.2"
                    343: echo " "
                    344: echo "The server computer should be currently connected to the ethernet"
                    345: echo " "
                    346: echo "The files in this package are only those for the $tag component."
                    347: echo "Configuration files are sometimes part of the LON-CAPA-base RPM."
                    348: echo "***********************************************************************"
                    349: 
                    350: \%post
                    351: \%postun
                    352: 
                    353: \%files
                    354: END
                    355: 
                    356: foreach $file (<>) {
                    357:     chop $file;
1.4       harris41  358:     my $comment="";
                    359:     if ($file=~/\s+\#(.*)$/) {
                    360: 	$file=~s/\s+\#(.*)$//;
                    361: 	$comment=$1;
                    362:     }
                    363:     my $config="";
                    364:     if ($comment=~/config/i) {
                    365: 	$config="\%config ";
                    366:     }
1.1       harris41  367:     if (($type,$size,$octalmode,$user,$group)=find_info($file)) {
                    368: 	$octalmode="0" . $octalmode if length($octalmode)<4;
                    369: 	if ($pathprefix) {
                    370: 	    $file=~s/^$pathprefix//;
                    371: 	}
                    372: 	if ($type eq "files") {
1.12    ! harris41  373: 	    push @{$BinaryRootMakefile{$type}},"\tinstall -D -m $octalmode ".
        !           374: 		"$pathprefix$file $binaryroot$file\n";
        !           375: 	    push @{$Makefile{$type}},"\tinstall -D -m $octalmode ".
        !           376: 		"\$(SOURCE)$file \$(ROOT)$file\n";
        !           377: 	    push @{$dotspecfile{$type}},"$config\%attr($octalmode,$user,".
        !           378: 		"$group) $file\n";
1.1       harris41  379: 	}
                    380: 	elsif ($type eq "directories") {
1.12    ! harris41  381: 	    push @{$BinaryRootMakefile{$type}},"\tinstall -m $octalmode -d ".
        !           382: 		"$binaryroot$file\n";
        !           383: 	    push @{$Makefile{$type}},"\tinstall -m $octalmode -d ".
        !           384: 		"\$(SOURCE)$file \$(ROOT)$file\n";
        !           385: 	    push @{$dotspecfile{$type}},"\%dir \%attr($octalmode,$user,".
        !           386: 		"$group) $file\n";
1.1       harris41  387: 	}
                    388: 	elsif ($type eq "links") {
1.12    ! harris41  389: 	    my $link=$size; # I use the size variable to pass the link value
        !           390:                             # from the subroutine find_info
1.1       harris41  391: 	    $link=~s/^$pathprefix//;
1.12    ! harris41  392: 	    push @{$BinaryRootMakefile{$type}},
        !           393: 	         "\tln -s $link $binaryroot$file\n";
1.1       harris41  394: 	    push @{$Makefile{$type}},"\tln -s $link \$(ROOT)$file\n";
                    395: 	    push @{$dotspecfile{$type}},"\%attr(-,$user,$group) $file\n";
                    396: 	}
                    397:     }
                    398: }
                    399: 
                    400: open OUT, ">$tag/SOURCES/LON-CAPA-$tag-$version/Makefile";
                    401: open OUT2, ">$tag/BinaryRootMakefile";
                    402: foreach $type ("directories","files","links") {
                    403:     print OUT "$type\:\n";
                    404:     print OUT join("",@{$Makefile{$type}});
                    405:     print OUT "\n";
                    406:     print OUT2 "$type\:\n";
                    407:     print OUT2 join("",@{$BinaryRootMakefile{$type}});
                    408:     print OUT2 "\n";
                    409:     print SPEC join("",@{$dotspecfile{$type}});
                    410: }
                    411: close OUT2;
                    412: close OUT;
                    413: 
                    414: 
                    415: close SPEC;
                    416: 
                    417: `make -f $tag/BinaryRootMakefile directories`;
                    418: `make -f $tag/BinaryRootMakefile files`;
                    419: `make -f $tag/BinaryRootMakefile links`;
                    420: 
1.12    ! harris41  421: my $command="cd $currentdir/SOURCES; tar czvf LON-CAPA-$tag-$version.tar.gz ".
        !           422:     "LON-CAPA-$tag-$version";
        !           423: print `$command`;
        !           424: $command="cd $currentdir/SPECS; rpm --rcfile=./rpmrc -ba ".
        !           425:     "LON-CAPA-$tag-$version.spec; cd ../RPMS/i386; cp ".
        !           426:     "LON-CAPA-$tag-$version-1.i386.rpm $invokingdir/.";
        !           427: print `$command`;
1.5       harris41  428: print `cd $invokingdir; rm -Rf $tag`;
1.1       harris41  429: 
                    430: sub find_info {
                    431:     # only look for
                    432:     my ($file)=@_;
                    433:     my $line;
                    434:     if (($line=`find $file -type f -prune`)=~/^$file\n/) {
                    435: 	$line=`find $file -type f -prune -printf "\%s\t\%m\t\%u\t\%g"`;
                    436: 	return ("files",split(/\t/,$line));
                    437:     }
                    438:     elsif (($line=`find $file -type d -prune`)=~/^$file\n/) {
                    439: 	$line=`find $file -type d -prune -printf "\%s\t\%m\t\%u\t\%g"`;
                    440: 	return ("directories",split(/\t/,$line));
                    441:     }
                    442:     elsif (($line=`find $file -type l -prune`)=~/^$file\n/) {
1.6       harris41  443: 	$line=`find $file -type l -prune -printf "\%l\t\%m\t\%u\t\%g"`;
1.1       harris41  444: 	return ("links",split(/\t/,$line));
                    445:     }
                    446: 
                    447: }

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