#!/usr/bin/perl -w # # Do-rpm - compile RPM packages out of a source tarball and move the # resulting RPM packages into the current directory. # # The script currently assumes the following environment (which should exist # like that, if the Do-compile script was used to build the binary # distribution) # # - there must be a source distribution (mysql-.tar.gz) # in the current directory # - there must be a spec file (mysql-.spec) in the directory # $HOME//mysql-/support-files/ # # Use the "--help" option for more info! # # written by Lenz Grimmer # use Cwd; use File::Basename; use File::Copy; use Getopt::Long; Getopt::Long::Configure ("bundling"); use Sys::Hostname; $opt_cc= undef; $opt_cflags= undef; $opt_clean= undef; $opt_cxx= undef; $opt_cxxflags= undef; $opt_dry_run= undef; $opt_help= undef; $opt_log= undef; $opt_mail= ""; $opt_verbose= undef; $MAJOR= $MINOR= $RELEASE= 0; GetOptions( "cc=s", "cflags=s", "clean|c", "cxx=s", "cxxflags=s", "dry-run|t", "help|h", "log|l:s", "mail|m=s", "verbose|v", ) || &print_help; defined($VERSION=$ARGV[0]) || print_help("Please provide the MySQL version!"); # Include helper functions $PWD= cwd(); $LOGGER= "$PWD/logger.pm"; if (-f "$LOGGER") { do "$LOGGER"; } else { die "ERROR: $LOGGER cannot be found!\n"; } # # Override predefined Log file name # if (defined $opt_log) { if ($opt_log ne "") { if ($opt_log =~ /^\/.*/) { $LOGFILE= $opt_log; } else { $LOGFILE= $PWD . "/" . $opt_log; } } } ($MAJOR, $MINOR, $RELEASE)= split(/\./, $VERSION); $HOST= hostname(); $HOST=~ /^([^.-]*)/; $HOST= $1; $LOGFILE= "$PWD/Logs/Do-rpm-$HOST-$MAJOR.$MINOR.log"; &print_help("") if ($opt_help); # # Newer RPM versions ship with a separate tool "rpmbuild" to build RPMs # if (-x "/usr/bin/rpmbuild") { $RPM= "/usr/bin/rpmbuild"; } else { $RPM= "/bin/rpm"; } if ($RPM) { &logger("Found rpm binary: $RPM"); } else { &abort("Unable to find RPM binary!"); } # # determine some RPM settings for this host # chomp($RPMARCH= `$RPM --eval "%{_arch}" 2> /dev/null`); chomp($RPMDIR= `$RPM --eval "%{_rpmdir}" 2> /dev/null`); chomp($SOURCEDIR= `$RPM --eval "%{_sourcedir}" 2> /dev/null`); chomp($SPECDIR= `$RPM --eval "%{_specdir}" 2> /dev/null`); chomp($SRCRPMDIR= `$RPM --eval "%{_srcrpmdir}" 2> /dev/null`); $SOURCEFILE= "mysql-$VERSION.tar.gz"; $SPECFILE= "$PWD/$HOST/mysql-$VERSION/support-files/mysql-$VERSION.spec"; &logger("Starting RPM build of MySQL-$VERSION on $HOST"); foreach $file ($SOURCEFILE, $SPECFILE) { &abort("Unable to find $file!") unless (-f "$file"); } # # Install source and spec file # &logger("Copying SOURCE and SPEC file to build directories."); copy($SOURCEFILE, $SOURCEDIR) or &abort("Unable to copy $SOURCEFILE to $SOURCEDIR!"); copy($SPECFILE, $SPECDIR) or &abort("Unable to copy $SPECFILE to $SPECDIR!"); # # Set environment variables - these are being used in the # official MySQL RPM spec file # &logger("Setting special build environment variables") if ($opt_cc) or ($opt_cflags) or ($opt_cxxflags) or ($opt_cxx); $ENV{MYSQL_BUILD_CC}=$opt_cc if ($opt_cc); $ENV{MYSQL_BUILD_CFLAGS}=$opt_cflags if ($opt_cflags); $ENV{MYSQL_BUILD_CXXFLAGS}=$opt_cxxflags if ($opt_cxxflags); $ENV{MYSQL_BUILD_CXX}=$opt_cxx if ($opt_cxx); # # Build the RPMs # $command= "$RPM"; $command.= " -v" if ($opt_verbose); $command.= " -ba"; $command.= " --clean" if $opt_clean; $command.= " $SPECDIR/"; $command.= basename($SPECFILE); &logger("Building RPM."); &run_command($command, "Error while building the RPMs!"); # # Move the resulting RPMs into the pwd # $command= "mv"; $command.= " -v " if ($opt_verbose); $command.= "$SRCRPMDIR/MySQL*$VERSION*.src.rpm $PWD"; &run_command($command, "Error moving source RPM!"); $command= "mv"; $command.= " -v " if ($opt_verbose); $command.= "$RPMDIR/$RPMARCH/MySQL*$VERSION*.$RPMARCH.rpm $PWD"; &run_command($command, "Error moving binary RPMs!"); # # Clean up # if ($opt_clean) { &logger("Removing spec file and source package"); unlink("$SPECDIR/" . basename($SPECFILE)); unlink("$SOURCEDIR/$SOURCEFILE"); } &logger("SUCCESS: RPM files successfully created.") if (!$opt_dry_run); exit 0; sub print_help { my $message= $_[0]; if ($message ne "") { print "\n"; print "ERROR: $message\n\n}"; } print < Creates a binary RPM package out of a MySQL source distribution and moves the resulting RPMs into the current directory. is the MySQL version number (e.g. 4.0.11-gamma) Options: --cc= Use to compile C code --ccflags= Use special C compiler flags --cxx= Use to compile C++ code --cxxflags= Use special C++ compiler flags -c, --clean Clean up after the build -t, --dry-run Dry run without executing -h, --help Print this help -l, --log[=] Write a log file [to ] (default is "$LOGFILE") -m, --mail=
Mail a failure report to the given address (and include a log file snippet, if logging is enabled) Note that the \@-Sign needs to be quoted! Example: --mail=user\\\@domain.com -v, --verbose Verbose execution EOF exit 1; }