summaryrefslogtreecommitdiff
path: root/Build-tools/Bootstrap
diff options
context:
space:
mode:
Diffstat (limited to 'Build-tools/Bootstrap')
-rwxr-xr-xBuild-tools/Bootstrap369
1 files changed, 369 insertions, 0 deletions
diff --git a/Build-tools/Bootstrap b/Build-tools/Bootstrap
new file mode 100755
index 00000000000..969ab748e80
--- /dev/null
+++ b/Build-tools/Bootstrap
@@ -0,0 +1,369 @@
+#!/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_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(
+ "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",
+ "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;
+ }
+ }
+}
+
+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:
+
+-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 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;
+}