mirror of
				https://github.com/MariaDB/server.git
				synced 2025-10-30 04:26:45 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			420 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			420 lines
		
	
	
		
			11 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 Cwd;
 | |
| 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";
 | |
| $PWD= cwd();
 | |
| $LOGFILE= $PWD . "/Bootstrap.log";
 | |
| $opt_docdir= $PWD . "/mysqldoc";
 | |
| $opt_build_command= undef;
 | |
| $opt_changelog= undef;
 | |
| $opt_delete= undef;
 | |
| $opt_directory= $PWD;
 | |
| $opt_dry_run= undef;
 | |
| $opt_export_only= undef;
 | |
| $opt_help= $opt_verbose= 0;
 | |
| $opt_log= undef;
 | |
| $opt_mail= "";
 | |
| $opt_pull= undef;
 | |
| $opt_revision= undef;
 | |
| $opt_suffix= "";
 | |
| $opt_test= undef;
 | |
| $opt_skip_check= undef;
 | |
| $opt_skip_manual= undef;
 | |
| $opt_win_dist= undef;
 | |
| $version= "unknown";
 | |
| $major=$minor=$release=0;
 | |
| 
 | |
| 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",
 | |
| 	"pull|p",
 | |
| 	"revision|r=s",
 | |
| 	"skip-check|s",
 | |
| 	"skip-manual",
 | |
| 	"suffix=s",
 | |
| 	"test|t",
 | |
| 	"verbose|v",
 | |
| 	"win-dist|w"
 | |
| ) || print_help("");
 | |
| 
 | |
| #
 | |
| # Override predefined Log file name
 | |
| #
 | |
| if (defined $opt_log)
 | |
| {
 | |
| 	if ($opt_log ne "")
 | |
| 	{
 | |
| 		if ($opt_log =~ /^\/.*/)
 | |
| 		{
 | |
| 			$LOGFILE= $opt_log;
 | |
| 		}
 | |
| 		else
 | |
| 		{
 | |
| 			$LOGFILE= $PWD . "/" . $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 $PWD) && (!-d $opt_directory && !$opt_dry_run))
 | |
| {
 | |
| 	&abort("Could not find target directory \"$opt_directory\"!");
 | |
| }
 | |
| 
 | |
| &logger("Logging to $LOGFILE") if (defined $opt_log);
 | |
| 
 | |
| #
 | |
| # Pull recent changes first
 | |
| #
 | |
| if ($opt_pull)
 | |
| {
 | |
| 	&logger("Updating BK tree $REPO to latest ChangeSet first");
 | |
| 	$command= "cd $REPO; bk pull; cd ..";
 | |
| 	&run_command($command, "Could not update $REPO!");
 | |
| 
 | |
| 	unless ($opt_skip_manual)
 | |
| 	{
 | |
| 		&logger("Updating manual tree in $opt_docdir");
 | |
| 		$command= "cd $opt_docdir; bk pull; cd ..";
 | |
| 		&run_command($command, "Could not update $opt_docdir!");
 | |
| 	}
 | |
| }
 | |
| 
 | |
| #
 | |
| # 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;
 | |
| 		($major, $minor, $release) = split(/\./,$version);
 | |
| 	}
 | |
| 	&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:::TAG:' -n $REPO | grep mysql-$major.$minor | head -1 | cut -f1 -d ":"`;
 | |
| 		}
 | |
| 		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
 | |
| #
 | |
| unless ($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!");
 | |
| 
 | |
| #
 | |
| # Package the Windows source
 | |
| #
 | |
| if ($opt_win_dist)
 | |
| {
 | |
| 	&logger ("Creating Windows source package");
 | |
| 	$command= "./scripts/make_win_src_distribution --tar --zip";
 | |
| 	&run_command($command, "make_win_src_distribution 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
 | |
| -p, --pull                 Update the source BK trees before building
 | |
| -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
 | |
| -w, --win-dist             Also make Windows source distribution
 | |
| 
 | |
| Example:
 | |
| 
 | |
|     Bootstrap -c last -v -l -- mysql-4.0
 | |
| 
 | |
| EOF
 | |
| 	exit 1;
 | |
| }
 | 
