mirror of
https://github.com/MariaDB/server.git
synced 2025-01-17 12:32:27 +01:00
383 lines
10 KiB
Perl
Executable file
383 lines
10 KiB
Perl
Executable file
#!/usr/bin/perl -w
|
|
#
|
|
# Bootstrap
|
|
#
|
|
# Script to export a given BK source tree into a separate directory
|
|
# and create the source distribution to be used for all binary builds
|
|
#
|
|
# Use the "--help" option for more info!
|
|
#
|
|
# written by Lenz Grimmer <lenz@mysql.com>
|
|
#
|
|
|
|
use Getopt::Long;
|
|
Getopt::Long::Configure ("bundling");
|
|
|
|
# Include helper functions
|
|
$LOGGER= "$ENV{HOME}/bin/logger.pm";
|
|
if (-f $LOGGER)
|
|
{
|
|
do "$LOGGER";
|
|
}
|
|
else
|
|
{
|
|
die "ERROR: $LOGGER cannot be found!\n";
|
|
}
|
|
|
|
# Some predefined settings
|
|
$build_command= "BUILD/compile-pentium-max";
|
|
chomp ($LOGFILE= `pwd`);
|
|
$LOGFILE.= "/Bootstrap.log";
|
|
chomp ($opt_directory= `pwd`);
|
|
$opt_docdir= $opt_directory . "/mysqldoc";
|
|
$opt_build_command= undef;
|
|
$opt_changelog= undef;
|
|
$opt_delete= undef;
|
|
$opt_dry_run= undef;
|
|
$opt_export_only= undef;
|
|
$opt_help= $opt_verbose= 0;
|
|
$opt_log= undef;
|
|
$opt_mail= "";
|
|
$opt_suffix= "";
|
|
$opt_test= undef;
|
|
$opt_skip_check= undef;
|
|
$opt_skip_manual= undef;
|
|
$version= "unknown";
|
|
|
|
GetOptions(
|
|
"build-command|b=s",
|
|
"changelog|c:s",
|
|
"directory|d=s",
|
|
"delete",
|
|
"docdir=s",
|
|
"dry-run",
|
|
"export-only|e",
|
|
"help|h",
|
|
"log|l:s",
|
|
"mail|m=s",
|
|
"revision|r=s",
|
|
"skip-check|s",
|
|
"skip-manual",
|
|
"suffix=s",
|
|
"test|t",
|
|
"verbose|v"
|
|
) || print_help("");
|
|
|
|
#
|
|
# Override predefined Log file name
|
|
#
|
|
if (defined $opt_log)
|
|
{
|
|
if ($opt_log ne "")
|
|
{
|
|
if ($opt_log =~ /^\/.*/)
|
|
{
|
|
$LOGFILE= $opt_log;
|
|
}
|
|
else
|
|
{
|
|
chomp ($LOGFILE= `pwd`);
|
|
$LOGFILE.= "/" . $opt_log;
|
|
}
|
|
}
|
|
}
|
|
|
|
#
|
|
# Override predefined build command
|
|
#
|
|
if (defined $opt_build_command)
|
|
{
|
|
$build_command= $opt_build_command;
|
|
}
|
|
|
|
print_help("") if ($opt_help);
|
|
defined($REPO=$ARGV[0]) || print_help("Please enter the BK repository to be used!");
|
|
|
|
&logger("Starting build");
|
|
&abort("The directory \"$REPO\" could not be found!") if (!-d $REPO);
|
|
&logger("Using $REPO as the BK parent repository");
|
|
system ("bk help > /dev/null") == 0 or &abort("Cannot execute BitKeeper binary!");
|
|
system ("bk root $REPO > /dev/null 2>&1") == 0 or &abort("$REPO does not seem to be a valid BK repository!");
|
|
|
|
if (($opt_directory ne ".") && (!-d $opt_directory && !$opt_dry_run))
|
|
{
|
|
&abort("Could not find target directory \"$opt_directory\"!");
|
|
}
|
|
|
|
&logger("Logging to $LOGFILE") if (defined $opt_log);
|
|
|
|
#
|
|
# Use a temporary name until we know the version number
|
|
#
|
|
$target_dir= $opt_directory . "/mysql-" . $$ . "-" . time() . ".tmp";
|
|
&logger("Using temporary directory $target_dir");
|
|
&abort("Target directory $target_dir already exists!") if (-d $target_dir && !$opt_dry_run);
|
|
|
|
#
|
|
# Export the BK tree
|
|
#
|
|
$command= "bk export ";
|
|
$command.= "-r " . $opt_revision . " " if $opt_revision;
|
|
$command.= "-v " if ($opt_verbose || defined $opt_log);
|
|
$command.= $REPO . " " . $target_dir;
|
|
&logger("Exporting $REPO");
|
|
&run_command($command, "Could not create $target_dir!");
|
|
|
|
#
|
|
# Make sure we can write all files
|
|
#
|
|
$command= "find $target_dir -type f -print0 | xargs --null chmod u+w";
|
|
&run_command($command, "Failed to fix file permissions!");
|
|
|
|
#
|
|
# Try to obtain version number from newly extracted configure.in
|
|
#
|
|
$CONF="$target_dir/configure.in";
|
|
&abort("Could not find \"$CONF\" to determine version!") if (!-f $CONF && !$opt_dry_run);
|
|
|
|
#
|
|
# The following can only be done, if the tree has actually been
|
|
# exported - it cannot be performed in a dry run.
|
|
#
|
|
if (!$opt_dry_run)
|
|
{
|
|
open (CONF, $CONF) or &abort("Unable to open \"$CONF\": $!");
|
|
@conf= <CONF>;
|
|
close CONF;
|
|
|
|
foreach (@conf)
|
|
{
|
|
m/^AM_INIT_AUTOMAKE\(mysql, ([1-9]\.[0-9]{1,2}\.[0-9]{1,2}.*)\)/;
|
|
$version= $1;
|
|
}
|
|
&logger("Found version string: $version");
|
|
|
|
#
|
|
# Add suffix to version string and write out the modified file
|
|
#
|
|
if ($opt_suffix)
|
|
{
|
|
$opt_suffix= "-" . &ymd() if ($opt_suffix eq "YMD");
|
|
|
|
&logger("Replacing $version with $version$opt_suffix");
|
|
foreach (@conf)
|
|
{
|
|
s/^AM_INIT_AUTOMAKE.*/AM_INIT_AUTOMAKE\(mysql, $version$opt_suffix\)/;
|
|
}
|
|
open(CONF,">$CONF") or &abort("Unable to open \"$CONF\": $!");
|
|
print CONF @conf;
|
|
close(CONF);
|
|
}
|
|
}
|
|
|
|
#
|
|
# Rename directory according to the version number found in configure.in
|
|
# of the extracted tree (plus suffix, if requested)
|
|
#
|
|
$temp_name= $target_dir;
|
|
$target_dir= $opt_directory . "/mysql-" . $version . $opt_suffix . "-build";
|
|
if (-d $target_dir)
|
|
{
|
|
&logger("Target directory $target_dir already exists!");
|
|
if ($opt_delete)
|
|
{
|
|
&logger("Deleting $target_dir...");
|
|
$command= "rm ";
|
|
$command.= "-v " if ($opt_verbose || defined $opt_log);
|
|
$command.= "$target_dir";
|
|
&run_command($command, "Could not delete $target_dir!");
|
|
}
|
|
else
|
|
{
|
|
&logger("Renaming $target_dir to $target_dir.old." . $$);
|
|
$command= "mv ";
|
|
$command.= "-v " if ($opt_verbose || defined $opt_log);
|
|
$command.= "$target_dir $target_dir.old." . $$;
|
|
&run_command($command, "Could not rename $target_dir!");
|
|
}
|
|
}
|
|
|
|
&logger("Renaming temporary directory to $target_dir");
|
|
$command= "mv ";
|
|
$command.= "-v " if ($opt_verbose || defined $opt_log);
|
|
$command.= "$temp_name $target_dir";
|
|
&run_command($command, "Could not rename $temp_name!");
|
|
|
|
#
|
|
# Add a ChangeLog (make dist will pick it up automatically)
|
|
#
|
|
if (defined $opt_changelog)
|
|
{
|
|
#
|
|
# Use some magic to obtain the correct ChangeSet number that identifies
|
|
# the last tagged ChangeSet (this relies heavily on our current tagging
|
|
# practice!)
|
|
#
|
|
my $revision= "";
|
|
if ($opt_changelog eq "last")
|
|
{
|
|
if (!$opt_revision)
|
|
{
|
|
$revision= `bk changes -t -d':REV:' -n $REPO | head -1`;
|
|
}
|
|
else
|
|
{
|
|
$revision= `bk changes -r..$opt_revision -t -d':REV:' -n $REPO | head -2 | tail -1`;
|
|
}
|
|
chomp($revision);
|
|
$opt_changelog= $revision;
|
|
}
|
|
|
|
$msg= "Adding $target_dir/ChangeLog";
|
|
$msg.= " (down to revision $opt_changelog)" if $opt_changelog ne "";
|
|
&logger($msg);
|
|
$command= "bk changes -v";
|
|
$command.= " -r" if ($opt_changelog ne "" || $opt_revision);
|
|
$command.= $opt_changelog if $opt_changelog ne "";
|
|
$command.= ".." if ($opt_changelog ne "" && !$opt_revision);
|
|
$command.= ".." . $opt_revision if $opt_revision;
|
|
$command.= " " . $REPO . " > $target_dir/ChangeLog";
|
|
&logger($command);
|
|
# We cannot use run_command here because of output redirection
|
|
if (!$opt_dry_run)
|
|
{
|
|
system($command) == 0 or &abort("Could not create $target_dir/ChangeLog!");
|
|
}
|
|
}
|
|
|
|
#
|
|
# Add the latest manual from the mysqldoc tree
|
|
#
|
|
if (!$opt_skip_manual)
|
|
{
|
|
$msg= "Adding manual.texi";
|
|
&logger($msg);
|
|
$command= "install -m 644 $opt_docdir/Docs/{manual,reservedwords}.texi";
|
|
$command.= " $target_dir/Docs/";
|
|
&run_command($command, "Could not update the manual in $target_dir/Docs/!");
|
|
}
|
|
|
|
#
|
|
# Abort here, if we just wanted to export the tree
|
|
#
|
|
if ($opt_export_only)
|
|
{
|
|
&logger("SUCCESS: Export finished successfully.");
|
|
exit 0;
|
|
}
|
|
|
|
#
|
|
# Enter the target directory first
|
|
#
|
|
&logger("Entering $target_dir");
|
|
if (!$opt_dry_run)
|
|
{
|
|
chdir($target_dir) or &abort("Cannot chdir to $target_dir: $!");
|
|
}
|
|
|
|
#
|
|
# Now build the source distribution
|
|
#
|
|
&logger("Compiling");
|
|
$command= $build_command;
|
|
&run_command($command, "Compilation failed!");
|
|
|
|
#
|
|
# Testing the built binary by running "make test" (optional)
|
|
#
|
|
if ($opt_test)
|
|
{
|
|
&logger ("Running test suite");
|
|
$command= "make test";
|
|
&run_command($command, "\"make test\" failed!");
|
|
}
|
|
|
|
#
|
|
# Pack it all up
|
|
#
|
|
&logger("Creating source distribution");
|
|
$command= "make dist";
|
|
&run_command($command, "make dist failed!");
|
|
|
|
#
|
|
# Run "make distcheck" to verify the source archive
|
|
#
|
|
if (!$opt_skip_check)
|
|
{
|
|
&logger ("Checking source distribution");
|
|
$command= "make distcheck";
|
|
&run_command($command, "make distcheck failed!");
|
|
}
|
|
|
|
#
|
|
# All done when we came down here
|
|
#
|
|
&logger("SUCCESS: Build finished successfully.") if (!$opt_dry_run);
|
|
exit 0;
|
|
|
|
#
|
|
# Print the help text message (with an optional message on top)
|
|
#
|
|
sub print_help
|
|
{
|
|
my $message= $_[0];
|
|
if ($message ne "")
|
|
{
|
|
print "\n";
|
|
print "ERROR: $message\n";
|
|
}
|
|
print <<EOF;
|
|
|
|
Usage: Bootstrap [options] <bk repository>
|
|
|
|
Checks out (exports) a clear-text version of the given local BitKeeper
|
|
repository, creates and adds a Changelog file (if requested), adds the
|
|
latest manual.texi from the mysqldoc tree and builds a source distribution
|
|
(*.tar.gz) file. Optionally, the test suite can be run before the source
|
|
archive is being created.
|
|
|
|
Options:
|
|
|
|
-b, --build-command=<cmd> Use <cmd> to compile the sources before packing
|
|
the distribution.
|
|
(default is "$build_command")
|
|
-c, --changelog[=<rev>] Add a ChangeLog [down to revision <rev>]
|
|
This will automatically be included in the source
|
|
distribution. To get a ChangeLog down to the last
|
|
tagged Changeset, simply use "last" as the revision
|
|
number.
|
|
--delete Delete an already existing distribution directory
|
|
in the target directory instead of renaming it.
|
|
-d, --directory=<dir> Specify the target directory
|
|
(default is "$opt_directory")
|
|
--docdir=<dir> Use the MySQL documentation BK tree located
|
|
in <dir>
|
|
(default is "$opt_docdir")
|
|
--dry-run Dry run without executing
|
|
-e, --export-only Just export (and add the ChangeLog, if requested),
|
|
do not build or test the source distribution
|
|
-h, --help Print this help message
|
|
-l, --log[=<filename>] Write a log file [to <filename>]
|
|
(default is "$LOGFILE")
|
|
-m, --mail=<address> 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
|
|
-r, --revision=<rev> Export the tree as of revision <rev>
|
|
(default is up to the latest revision)
|
|
-s, --skip-check Skip checking the distribution with "make distcheck"
|
|
--skip-manual Skip updating the manual from the mysqldoc tree
|
|
--suffix=<suffix> Append <suffix> to the version number in
|
|
configure.in. Using the special suffix "YMD" will
|
|
add the current date as the suffix
|
|
(e.g. "-20020518").
|
|
-t, --test Run the test suite after build
|
|
-v, --verbose Be verbose
|
|
|
|
Example:
|
|
|
|
Bootstrap -c last -v -l -- mysql-4.0
|
|
|
|
EOF
|
|
exit 1;
|
|
}
|