mirror of
https://github.com/MariaDB/server.git
synced 2025-01-20 05:52:27 +01:00
94c7024eaa
(Do-compile) - added mysql.info to the binary distribution files (BUG#1019) - heavily reworked the Do-rpm script to be more in line with Do-pkg - create a "docs" subdirectory in the binary distribution and moved the manual, ChangeLog and mysql.info file into it to unclutter the top directory
777 lines
20 KiB
Perl
Executable file
777 lines
20 KiB
Perl
Executable file
#!/usr/bin/perl -w
|
|
|
|
use Getopt::Long;
|
|
|
|
@config_options= ();
|
|
@make_options= ();
|
|
|
|
$opt_distribution=$opt_user=$opt_config_env="";
|
|
$opt_dbd_options=$opt_perl_options=$opt_config_options=$opt_make_options=$opt_suffix="";
|
|
$opt_tmp=$opt_version_suffix="";
|
|
$opt_help=$opt_delete=$opt_debug=$opt_stage=$opt_no_test=$opt_no_perl=$opt_with_low_memory=$opt_fast_benchmark=$opt_static_client=$opt_static_server=$opt_static_perl=$opt_sur=$opt_with_small_disk=$opt_local_perl=$opt_tcpip=$opt_build_thread=$opt_use_old_distribution=$opt_enable_shared=$opt_no_crash_me=$opt_no_strip=$opt_with_debug=$opt_no_benchmark=$opt_no_mysqltest=$opt_without_embedded=0;
|
|
$opt_innodb=$opt_bdb=$opt_raid=$opt_libwrap=0;
|
|
|
|
GetOptions(
|
|
"bdb",
|
|
"build-thread=i",
|
|
"config-env=s" => \@config_env,
|
|
"config-options=s" => \@config_options,
|
|
"dbd-options=s",
|
|
"debug",
|
|
"delete",
|
|
"distribution=s",
|
|
"enable-shared",
|
|
"fast-benchmark",
|
|
"help|Information",
|
|
"innodb",
|
|
"libwrap",
|
|
"local-perl",
|
|
"make-options=s" => \@make_options,
|
|
"no-crash-me",
|
|
"no-perl",
|
|
"no-strip",
|
|
"no-test",
|
|
"no-mysqltest",
|
|
"no-benchmark",
|
|
"perl-files=s",
|
|
"perl-options=s",
|
|
"raid",
|
|
"stage=i",
|
|
"static-client",
|
|
"static-perl",
|
|
"static-server",
|
|
"suffix=s",
|
|
"sur",
|
|
"tcpip",
|
|
"tmp=s",
|
|
"use-old-distribution",
|
|
"user=s",
|
|
"version-suffix=s",
|
|
"with-debug",
|
|
"with-low-memory",
|
|
"with-other-libc=s",
|
|
"with-small-disk",
|
|
) || usage();
|
|
|
|
usage() if ($opt_help);
|
|
usage() if (!$opt_distribution);
|
|
|
|
if (@make_options > 0)
|
|
{
|
|
chomp(@make_options);
|
|
$opt_make_options= join(" ", @make_options);
|
|
}
|
|
|
|
if (@config_options > 0)
|
|
{
|
|
chomp(@config_options);
|
|
$opt_config_options= join(" ", @config_options);
|
|
}
|
|
|
|
if (@config_env > 0)
|
|
{
|
|
chomp(@config_env);
|
|
$opt_config_env= join(" ", @config_env);
|
|
}
|
|
|
|
chomp($host=`hostname`);
|
|
chomp($uname=`uname`);
|
|
$full_host_name=$host;
|
|
$connect_option= ($opt_tcpip ? "--host=$host" : "");
|
|
$host =~ /^([^.-]*)/;
|
|
$host=$1 . $opt_suffix;
|
|
$email="$opt_user\@mysql.com";
|
|
chomp($pwd = `pwd`);
|
|
$VER= `basename $opt_distribution`; chop $VER;
|
|
$VER=~ /mysql.*-([1-9]\.[0-9]{1,2}\.[0-9]{1,2}.*)\.tar*/; $version=$1;
|
|
($major, $minor, $release) = split(/\./,$version);
|
|
$log="$pwd/Logs/$host-$major.$minor$opt_version_suffix.log";
|
|
$opt_distribution =~ /(mysql[^\/]*)\.tar/;
|
|
$ver=$1;
|
|
$gcc_version=which("gcc");
|
|
if (defined($gcc_version) && ! $opt_config_env)
|
|
{
|
|
$tmp=`$gcc_version -v 2>&1`;
|
|
if ($tmp =~ /version 2\.7\./)
|
|
{
|
|
$opt_config_env= 'CC=gcc CFLAGS="-O2 -fno-omit-frame-pointer" CXX=gcc CXXFLAGS="-O2 -fno-omit-frame-pointer"';
|
|
}
|
|
elsif ($tmp =~ /version 3\.0\./)
|
|
{
|
|
$opt_config_env= 'CC=gcc CFLAGS="-O3 -fno-omit-frame-pointer" CXXFLAGS="-O3 -fno-omit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti"';
|
|
}
|
|
else
|
|
{
|
|
$opt_config_env= 'CC=gcc CFLAGS="-O3 -fno-omit-frame-pointer" CXX=gcc CXXFLAGS="-O3 -fno-omit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti"';
|
|
}
|
|
}
|
|
|
|
$new_opt_tmp=0;
|
|
if ($opt_tmp)
|
|
{
|
|
if (! -d $opt_tmp)
|
|
{
|
|
safe_system("mkdir $opt_tmp");
|
|
$new_opt_tmp=1;
|
|
}
|
|
$ENV{'TMPDIR'}=$opt_tmp;
|
|
}
|
|
else
|
|
{
|
|
$opt_tmp="/tmp";
|
|
}
|
|
$bench_tmpdir="$opt_tmp/my_build-$host";
|
|
$ENV{'PATH'}= "$pwd/$host/bin:" . $ENV{'PATH'};
|
|
$make=which("gmake","make"); # Can't use -j here!
|
|
$tar=which("gtar","tar");
|
|
$sendmail=find("/usr/lib/sendmail","/usr/sbin/sendmail");
|
|
$sur= $opt_sur ? "/my/local/bin/sur" : "";
|
|
delete $ENV{'MYSQL_PWD'}; # Reset possibly password
|
|
delete $ENV{'MY_BASEDIR_VERSION'};
|
|
$ENV{'MYSQL_TCP_PORT'}= $mysql_tcp_port= 3334 + $opt_build_thread*2;
|
|
$ENV{'MYSQL_UNIX_PORT'}=$mysql_unix_port="$opt_tmp/mysql$opt_suffix.build";
|
|
$ENV{"PERL5LIB"}="$pwd/$host/perl5:$pwd/$host/perl5/site_perl";
|
|
$slave_port=$mysql_tcp_port+16;
|
|
$manager_port=$mysql_tcp_port+1;
|
|
$mysqladmin_args="--no-defaults -u root --connect_timeout=5 --shutdown_timeout=20";
|
|
|
|
if ($opt_stage == 0)
|
|
{
|
|
system("mkdir Logs") if (! -d "Logs");
|
|
system("mv $log ${log}-old") if (-f $log);
|
|
unlink($log);
|
|
}
|
|
|
|
open(LOG,">>$log") || abort("Can't open log file, error $?");
|
|
select LOG;
|
|
$|=1;
|
|
select STDOUT;
|
|
$|=1;
|
|
|
|
info("Compiling MySQL$opt_version_suffix at $host$opt_suffix, stage: $opt_stage\n");
|
|
log_timestamp();
|
|
|
|
if (-x "$host/bin/mysqladmin")
|
|
{
|
|
log_system("$host/bin/mysqladmin $mysqladmin_args -S $mysql_unix_port -s shutdown");
|
|
log_system("$host/bin/mysqladmin $mysqladmin_args -P $mysql_tcp_port -h $host -s shutdown");
|
|
log_system("$host/bin/mysqladmin $mysqladmin_args -P $slave_port -h $host -s shutdown");
|
|
log_system("$host/bin/mysqladmin $mysqladmin_args -P 9306 -h $host -s shutdown");
|
|
log_system("$host/bin/mysqladmin $mysqladmin_args -P 9307 -h $host -s shutdown");
|
|
}
|
|
kill_all("mysqlmanager");
|
|
#
|
|
# Kill all old processes that are in the build directories
|
|
# This is to find any old mysqld servers left from previous builds
|
|
kill_all("$pwd/host/mysql");
|
|
kill_all("$pwd/host/test");
|
|
|
|
if ($opt_stage == 0)
|
|
{
|
|
log_timestamp();
|
|
print "$host: Removing old distribution\n" if ($opt_debug);
|
|
if (!$opt_use_old_distribution)
|
|
{
|
|
system("mkdir $host") if (! -d $host);
|
|
system("touch $host/mysql-fix-for-glob");
|
|
rm_all(<$host/mysql*>);
|
|
system("mkdir $host/bin") if (! -d "$host/bin");
|
|
}
|
|
rm_all("$host/test");
|
|
system("mkdir $host/test") if (! -d "$host/test");
|
|
}
|
|
|
|
safe_cd($host);
|
|
if ($opt_stage == 0 && ! $opt_use_old_distribution)
|
|
{
|
|
safe_system("gunzip < $opt_distribution | $tar xf -");
|
|
|
|
# Fix file times; This is needed because the time for files may be
|
|
# in the future. The following is done this way to ensure that
|
|
# we don't get any errors from xargs touch
|
|
system("touch timestamp");
|
|
sleep(2);
|
|
system("touch timestamp2");
|
|
system("find . -newer timestamp -print | xargs touch");
|
|
unlink("timestamp");
|
|
unlink("timestamp2");
|
|
sleep(2);
|
|
# Ensure that files we don't want to rebuild are newer than other files
|
|
safe_cd($ver);
|
|
foreach $name ("configure",
|
|
"Docs/include.texi",
|
|
"Docs/*.html", "Docs/manual.txt", "Docs/mysql.info",
|
|
"sql/sql_yacc.h", "sql/sql_yacc.cc")
|
|
{
|
|
system("touch $name");
|
|
}
|
|
# Fix some file modes in BDB tables that makes life harder.
|
|
system("chmod -R u+rw .");
|
|
}
|
|
|
|
safe_cd("$pwd/$host/$ver");
|
|
|
|
#
|
|
# Configure the sources
|
|
#
|
|
if ($opt_stage <= 1)
|
|
{
|
|
# Fix files if this is in another timezone than the build host
|
|
log_timestamp();
|
|
unlink("config.cache");
|
|
unlink("bdb/build_unix/config.cache");
|
|
unlink("innobase/config.cache");
|
|
log_system("$make clean") if ($opt_use_old_distribution);
|
|
$opt_config_options.= " --disable-shared" if (!$opt_enable_shared); # Default for binary versions
|
|
$opt_config_options.= " --with-berkeley-db" if ($opt_bdb);
|
|
$opt_config_options.= " --with-client-ldflags=-all-static" if ($opt_static_client);
|
|
$opt_config_options.= " --with-debug" if ($opt_with_debug);
|
|
$opt_config_options.= " --with-libwrap" if ($opt_libwrap);
|
|
$opt_config_options.= " --with-low-memory" if ($opt_with_low_memory);
|
|
$opt_config_options.= " --with-mysqld-ldflags=-all-static" if ($opt_static_server);
|
|
$opt_config_options.= " --with-raid" if ($opt_raid);
|
|
$opt_config_options.= " --with-embedded-server" unless ($opt_without_embedded);
|
|
|
|
# Only enable InnoDB when requested (required to be able to
|
|
# build the "Classic" packages that do not include InnoDB)
|
|
if ($opt_innodb)
|
|
{
|
|
$opt_config_options.= " --with-innodb";
|
|
}
|
|
else
|
|
{
|
|
$opt_config_options.= " --without-innodb";
|
|
}
|
|
|
|
if ($opt_with_other_libc)
|
|
{
|
|
$opt_with_other_libc= " --with-other-libc=$opt_with_other_libc";
|
|
$opt_config_options.= $opt_with_other_libc;
|
|
}
|
|
|
|
$prefix="/usr/local/mysql";
|
|
check_system("$opt_config_env ./configure --prefix=$prefix --localstatedir=$prefix/data --libexecdir=$prefix/bin --with-comment=\"Official MySQL$opt_version_suffix binary\" --with-extra-charsets=complex --with-server-suffix=\"$opt_version_suffix\" --enable-thread-safe-client --enable-local-infile $opt_config_options","Thank you for choosing MySQL");
|
|
if (-d "$pwd/$host/include-mysql")
|
|
{
|
|
safe_system("cp -r $pwd/$host/include-mysql/* $pwd/$host/$ver/include");
|
|
}
|
|
}
|
|
|
|
#
|
|
# Compile the binaries
|
|
#
|
|
if ($opt_stage <= 2)
|
|
{
|
|
my ($command);
|
|
log_timestamp();
|
|
unlink($opt_distribution) if ($opt_delete && !$opt_use_old_distribution);
|
|
$command=$make;
|
|
$command.= " $opt_make_options" if (defined($opt_make_options) && $opt_make_options ne "");
|
|
safe_system($command);
|
|
}
|
|
|
|
#
|
|
# Create the binary distribution
|
|
#
|
|
if ($opt_stage <= 3)
|
|
{
|
|
my $flags= "";
|
|
log_timestamp();
|
|
log_system("rm -fr mysql-3* mysql-4* $pwd/$host/*.tar.gz");
|
|
# No need to add the debug symbols, if the binaries are not stripped (saves space)
|
|
unless ($opt_with_debug || $opt_no_strip)
|
|
{
|
|
log_system("nm -n sql/mysqld | gzip -9 -v 2>&1 > sql/mysqld.sym.gz | cat");
|
|
}
|
|
|
|
$flags.= "--no-strip" if ($opt_no_strip || $opt_with_debug);
|
|
check_system("scripts/make_binary_distribution --tmp=$opt_tmp --suffix=$opt_suffix $flags",".tar.gz created");
|
|
safe_system("mv mysql*.tar.gz $pwd/$host");
|
|
if (-f "client/.libs/mysqladmin")
|
|
{
|
|
safe_system("cp client/.libs/mysqladmin $pwd/$host/bin");
|
|
}
|
|
else
|
|
{
|
|
safe_system("cp client/mysqladmin $pwd/$host/bin");
|
|
}
|
|
safe_system("$make clean") if ($opt_with_small_disk);
|
|
}
|
|
|
|
$tar_file=<$pwd/$host/*.tar.gz>;
|
|
if (!defined($tar_file))
|
|
{
|
|
$tar_file=<$pwd/$host/*.tgz>;
|
|
}
|
|
|
|
#
|
|
# Unpack the binary distribution
|
|
#
|
|
if ($opt_stage <= 4 && !$opt_no_test)
|
|
{
|
|
log_timestamp();
|
|
rm_all(<$pwd/$host/test/*>);
|
|
safe_cd("$pwd/$host/test");
|
|
safe_system("gunzip < $tar_file | $tar xf -");
|
|
}
|
|
|
|
$tar_file =~ /(mysql[^\/]*)\.tar/;
|
|
$ver=$1;
|
|
$test_dir="$pwd/$host/test/$ver";
|
|
$ENV{"LD_LIBRARY_PATH"}= ("$test_dir/lib" .
|
|
(defined($ENV{"LD_LIBRARY_PATH"}) ?
|
|
":" . $ENV{"LD_LIBRARY_PATH"} : ""));
|
|
#
|
|
# Run the test suite
|
|
#
|
|
if ($opt_stage <= 5 && !$opt_no_test && !$opt_no_mysqltest)
|
|
{
|
|
log_timestamp();
|
|
system("mkdir $bench_tmpdir") if (! -d $bench_tmpdir);
|
|
safe_cd("${test_dir}/mysql-test");
|
|
check_system("./mysql-test-run --warnings --tmpdir=$bench_tmpdir --master_port=$mysql_tcp_port --slave_port=$slave_port --manager-port=$manager_port --no-manager --sleep=10", "tests were successful");
|
|
}
|
|
|
|
#
|
|
# Start the server if we are going to run any of the benchmarks
|
|
#
|
|
if (!$opt_no_test && !$opt_no_benchmark)
|
|
{
|
|
my $extra;
|
|
safe_cd($test_dir);
|
|
log_system("./bin/mysqladmin $mysqladmin_args -S $mysql_unix_port -s shutdown") || info("There was no mysqld running\n");
|
|
sleep(2);
|
|
log_system("rm -f ./data/mysql/*");
|
|
check_system("scripts/mysql_install_db --no-defaults --skip-locking","https://order");
|
|
$extra="";
|
|
if ($opt_bdb)
|
|
{
|
|
$extra.=" --bdb_cache_size=16M --bdb_max_lock=60000"
|
|
}
|
|
if ($opt_innodb)
|
|
{
|
|
$extra.=" --innodb_data_file_path=ibdata1:100M:autoextend";
|
|
}
|
|
safe_system("./bin/mysqld --no-defaults --basedir . --datadir ./data --skip-locking $extra >> $log 2>&1 &");
|
|
sleep(2);
|
|
}
|
|
|
|
#
|
|
# Compile and install the required Perl modules
|
|
#
|
|
if ($opt_stage <= 7 && $opt_perl_files && !$opt_no_perl && !$opt_no_test &&
|
|
!$opt_no_benchmark)
|
|
{
|
|
log_timestamp();
|
|
safe_cd($test_dir);
|
|
rm_all("perl");
|
|
safe_system("mkdir perl");
|
|
$ENV{'IN_MYSQL_DISTRIBUTION'}=1;
|
|
$ENV{'MYSQL_BUILD'}=$test_dir;
|
|
|
|
foreach $module (split(/,/,$opt_perl_files))
|
|
{
|
|
my $options;
|
|
safe_cd("$test_dir/perl");
|
|
if ($opt_debug)
|
|
{
|
|
safe_system("gunzip < $pwd/$module | tar xvf -");
|
|
}
|
|
else
|
|
{
|
|
safe_system("gunzip < $pwd/$module | tar xf -");
|
|
}
|
|
$module =~ m|([^/]+)\.tar\.gz|;
|
|
$module = $1;
|
|
safe_cd($module);
|
|
$options="";
|
|
$options= "--mysql-install --noprompt --mysql-incdir=$test_dir/include --mysql-libdir=$test_dir/lib -nomsql-install -nomsql1-install --mysql-test-db=test $opt_dbd_options" if ($module =~ /Msql-Mysql/);
|
|
$options.= " PREFIX=$pwd/$host INSTALLPRIVLIB=$pwd/$host/perl5 INSTALLSCRIPT=$pwd/$host/bin INSTALLSITELIB=$pwd/$host/perl5/site_perl INSTALLBIN=$pwd/$host/bin INSTALLMAN1DIR=$pwd/$host/man INSTALLMAN3DIR=$pwd/$host/man/man3" if ($opt_local_perl);
|
|
$options.= " $opt_perl_options" if (defined($opt_perl_options));
|
|
safe_system($opt_static_perl ? "perl Makefile.PL -static $options" : "perl Makefile.PL $options");
|
|
safe_system("$make ; $sur $make install");
|
|
}
|
|
}
|
|
|
|
#
|
|
# Run crash-me test
|
|
#
|
|
if ($opt_stage <= 8 && !$opt_no_test && !$opt_no_crash_me)
|
|
{
|
|
log_timestamp();
|
|
safe_cd("$test_dir/sql-bench");
|
|
log_system("rm -f limits/mysql.cfg");
|
|
safe_system("perl ./crash-me --force --batch-mode $connect_option");
|
|
}
|
|
|
|
#
|
|
# Run sql-bench Benchmarks
|
|
#
|
|
if ($opt_stage <= 9 && !$opt_no_test && !$opt_no_benchmark)
|
|
{
|
|
log_timestamp();
|
|
safe_cd("$test_dir/sql-bench");
|
|
log_system("rm -f output/*");
|
|
$tmp= $opt_fast_benchmark ? "--fast --user root --small-test" : "";
|
|
check_system("perl ./run-all-tests --log --die-on-errors $connect_option $tmp","RUN-mysql");
|
|
# Run additional fast test with dynamic-row tables
|
|
check_system("perl ./run-all-tests --log --suffix=\"_dynamic_rows\" --die-on-errors $connect_option --fast --user=root --small-test --create-options=\"row_format=dynamic\"","RUN-mysql");
|
|
if ($opt_innodb)
|
|
{
|
|
check_system("perl ./run-all-tests --log --suffix=\"_innodb\" --die-on-errors $connect_option $tmp --create-options=\"type=innodb\"","RUN-mysql");
|
|
}
|
|
if ($opt_bdb)
|
|
{
|
|
check_system("perl ./run-all-tests --log --suffix=\"_bdb\" --die-on-errors $connect_option $tmp --create-options=\"type=bdb\"","RUN-mysql");
|
|
}
|
|
}
|
|
|
|
rm_all($bench_tmpdir);
|
|
rm_all("$opt_tmp") if ($new_opt_tmp);
|
|
|
|
log_system("$pwd/$host/bin/mysqladmin $mysqladmin_args -S $mysql_unix_port shutdown");
|
|
print LOG "ok\n";
|
|
close LOG;
|
|
print "$host: ok\n";
|
|
|
|
exit 0;
|
|
|
|
|
|
sub usage
|
|
{
|
|
print <<EOF;
|
|
$0 version 1.5
|
|
|
|
$0 takes the following options:
|
|
|
|
--bdb
|
|
Compile with support for Berkeley DB tables
|
|
|
|
--config-env <environment for configure>
|
|
To set up the environment, like 'CC=cc CXX=gcc CXXFLAGS=-O3'
|
|
|
|
--config-options <options>
|
|
To add some extra options to configure (e.g. '--with-perl=yes')
|
|
|
|
--dbd-options <options>
|
|
Options for Makefile.PL when configuring msql-mysql-modules.
|
|
|
|
--debug
|
|
Print all shell commands on stdout.
|
|
|
|
--delete
|
|
Delete the distribution file.
|
|
|
|
--distribution <distribution_file>
|
|
Name of the MySQL source distribution file.
|
|
|
|
--enable-shared
|
|
Compile with shared libraries
|
|
|
|
--fast-benchmark
|
|
Run fast benchmark only to speed up testing
|
|
|
|
--help or --Information
|
|
Show this help
|
|
|
|
--innodb
|
|
Compile with support for Innodb tables
|
|
|
|
--libwrap
|
|
Compile with TCP wrapper support
|
|
|
|
--local-perl
|
|
Install Perl modules locally
|
|
|
|
--make-options <options>
|
|
Options to make after configure. (Like 'CXXLD=gcc')
|
|
|
|
--no-crash-me
|
|
Do not run the "crash-me" test
|
|
|
|
--no-strip
|
|
Do not strip the binaries included in the binary distribution
|
|
|
|
--no-test
|
|
Do not run any tests.
|
|
|
|
--no-benchmark
|
|
Do not run the benchmark test (written in perl)
|
|
|
|
--no-mysqltest
|
|
Do not run the the mysql-test-run test (Same as 'make test')
|
|
|
|
--perl-files=list of files
|
|
Compile and install the given perl modules.
|
|
|
|
--perl-options <options>
|
|
Build Perl modules with the additional options
|
|
|
|
--raid
|
|
Compile with RAID support
|
|
|
|
--stage (1-6)
|
|
Start script from some specific point.
|
|
|
|
--static-client
|
|
Build statically linked client binaries
|
|
|
|
--static-perl
|
|
Build statically linked Perl modules
|
|
|
|
--static-server
|
|
Build statically linked server binary
|
|
|
|
--tcpip
|
|
Connect to the server to be tested via TCP/IP instead of socket
|
|
|
|
--tmp <directory>
|
|
Use a different temporary directory than /tmp
|
|
|
|
--use-old-distribution
|
|
Do not clean up the build environment and extract a fresh source
|
|
distribution, use an existing one instead.
|
|
|
|
--user <user_name>
|
|
Mail 'user_name'\@mysql.com if something went wrong.
|
|
If user is empty then no mail is sent.
|
|
|
|
--version-suffix suffix
|
|
Set name suffix (e.g. 'com' or '-max') for a distribution
|
|
|
|
--with-debug
|
|
Build binaries with debug information (implies "--no-strip")
|
|
|
|
--with-low-memory
|
|
Use less memory when compiling.
|
|
|
|
--with-other-libc <path to libc>
|
|
Link against libc and other standard libraries installed in the specified
|
|
non-standard location overriding default.
|
|
|
|
--with-small-disk
|
|
Clean up the build environment before testing the binary distribution
|
|
(to save disk space)
|
|
|
|
--without-embedded
|
|
Don't compile the embedded server.
|
|
EOF
|
|
exit 1;
|
|
}
|
|
|
|
sub abort
|
|
{
|
|
my($message)=@_;
|
|
my($mail_header_file);
|
|
print LOG "\n$message\n";
|
|
print "$host: $message\n" if ($opt_debug);
|
|
print LOG "Aborting\n";
|
|
close LOG;
|
|
|
|
if ($opt_user)
|
|
{
|
|
$mail_header_file="$opt_tmp/do-command.$$";
|
|
open(TMP,">$mail_header_file");
|
|
print TMP "From: mysqldev\@$full_host_name\n";
|
|
print TMP "To: $email\n";
|
|
print TMP "Subject: $host($uname): $ver$opt_version_suffix compilation failed\n\n";
|
|
close TMP;
|
|
system("tail -n 40 $log > $log.mail");
|
|
system("cat $mail_header_file $log.mail | $sendmail -t -f $email");
|
|
unlink($mail_header_file);
|
|
unlink("$log.mail");
|
|
}
|
|
exit 1;
|
|
}
|
|
|
|
sub info
|
|
{
|
|
my($message)=@_;
|
|
print LOG "$message\n";
|
|
print "$host: $message\n";
|
|
}
|
|
|
|
sub log_system
|
|
{
|
|
my($com)=@_;
|
|
print "$host: $com\n" if ($opt_debug);
|
|
if (defined($log))
|
|
{
|
|
print LOG "$com\n";
|
|
system("$com >> $log 2>&1") &&
|
|
print LOG ("Info: couldn't execute command, error: " . ($? / 256) ."\n");
|
|
}
|
|
else
|
|
{
|
|
system($com) && print "$host: Couldn't execute command, error: " . ($? / 256) ."\n";
|
|
}
|
|
}
|
|
|
|
|
|
sub safe_system
|
|
{
|
|
my($com,$res)=@_;
|
|
print LOG "$com\n";
|
|
print "$host: $com\n" if ($opt_debug);
|
|
system("$com >> $log 2>&1") && abort("error: Couldn't execute command, error: " . ($? / 256));
|
|
}
|
|
|
|
sub check_system
|
|
{
|
|
my($com,$res)=@_;
|
|
my ($error,$found);
|
|
print LOG "$com\n";
|
|
print "$host: $com\n" if ($opt_debug);
|
|
open (COM, "$com 2>&1 < /dev/null|") || abort("Got error " . ($?/256) ." opening pipe");
|
|
$found=0;
|
|
while (<COM>)
|
|
{
|
|
print LOG $_;
|
|
if (index($_,$res) >= 0)
|
|
{
|
|
$found=1;
|
|
last;
|
|
}
|
|
}
|
|
close COM;
|
|
abort("Couldn't find '$res' in the command result") if (!$found);
|
|
print "$host: Command ok\n" if ($opt_debug);
|
|
}
|
|
|
|
sub safe_cd
|
|
{
|
|
my($dir)=@_;
|
|
print LOG "cd $dir\n";
|
|
print "$host: cd $dir\n" if ($opt_debug);
|
|
chdir($dir) || abort("Can't cd to $dir");
|
|
}
|
|
|
|
sub which
|
|
{
|
|
my(@progs)=@_;
|
|
foreach $prog (@progs)
|
|
{
|
|
chomp($found=`which $prog | head -n 1`);
|
|
if ($? == 0 && $found ne "" && index($found," ") == -1)
|
|
{
|
|
$found =~ s|/+|/|g; # Make nicer output
|
|
return $found;
|
|
}
|
|
}
|
|
return undef();
|
|
}
|
|
|
|
sub find
|
|
{
|
|
my (@progs)=@_;
|
|
foreach $prog (@progs)
|
|
{
|
|
return $prog if (-x $prog);
|
|
}
|
|
return undef();
|
|
}
|
|
|
|
#
|
|
# Remove recursively all from a directory
|
|
# This is needed because problems with NFS and open files
|
|
#
|
|
|
|
sub rm_all
|
|
{
|
|
my(@rm_files)=@_;
|
|
my($dir,$current_dir,@files,@dirs);
|
|
$current_dir = `pwd`; chomp($current_dir);
|
|
|
|
foreach $dir (@rm_files)
|
|
{
|
|
if (-d $dir)
|
|
{
|
|
chdir($dir) || abort("Can't cd to $dir");
|
|
print "$host: Removing from $dir\n" if ($opt_debug);
|
|
while (<* .*>)
|
|
{
|
|
next if ($_ eq "." x (length($_)));
|
|
if (-d $_)
|
|
{
|
|
# die "Can't remove directory that starts with ." if ($_ =~ /^\./ && $_ ne ".libs"); # Safety
|
|
push (@dirs,$_);
|
|
}
|
|
else
|
|
{
|
|
push (@files,$_);
|
|
}
|
|
}
|
|
if ($#files >= 0)
|
|
{
|
|
system("rm -f " . join(" ",@files)) && abort("Can't remove files from $dir");
|
|
}
|
|
foreach $dir (@dirs)
|
|
{
|
|
rm_all($dir);
|
|
}
|
|
chdir($current_dir) || abort("Can't cd to $current_dir");
|
|
log_system("rmdir $dir");
|
|
}
|
|
else
|
|
{
|
|
system("rm -f $dir") && abort("Can't remove file $dir");
|
|
}
|
|
}
|
|
}
|
|
|
|
sub kill_all
|
|
{
|
|
my ($pattern) = @_;
|
|
my ($USER,$BSD,$LINUX, $pscmd, $user, $os, $pid);
|
|
$user=$ENV{'USER'};
|
|
$os=defined($ENV{'OS'}) ? $ENV{'OS'} : "unknown";
|
|
$BSD = -f '/vmunix' || $os eq "SunOS4" || $^O eq 'darwin';
|
|
$LINUX = $^O eq 'linux';
|
|
$pscmd = $BSD ? "/bin/ps -auxww" : $LINUX ? "/bin/ps axuw" : "/bin/ps -ef";
|
|
|
|
if (!open(PS, "$pscmd|"))
|
|
{
|
|
print "Warning: Can't run $pscmd: $!\n";
|
|
exit;
|
|
}
|
|
|
|
# Catch any errors with eval. A bad pattern, for instance.
|
|
process:
|
|
while ($cand = <PS>)
|
|
{
|
|
chop($cand);
|
|
($pid_user, $pid) = split(' ', $cand);
|
|
next if $pid eq $$;
|
|
next process if (! ($cand =~ $pattern) || $pid_user ne $user);
|
|
print LOG "Killing $_\n";
|
|
&killpid($pid);
|
|
}
|
|
}
|
|
|
|
sub killpid
|
|
{
|
|
local($pid) = @_;
|
|
kill 15, $pid;
|
|
for (1..5)
|
|
{
|
|
sleep 2;
|
|
return if kill(0, $pid) == 0;
|
|
}
|
|
kill 9, $pid;
|
|
for (1..5) {
|
|
sleep 2;
|
|
return if kill(0, $pid) == 0;
|
|
}
|
|
print LOG "$pid will not die!\n";
|
|
}
|
|
|
|
#
|
|
# return the current date as a string (YYYY-MM-DD HH:MM:SS)
|
|
#
|
|
sub log_timestamp
|
|
{
|
|
my @ta=localtime(time());
|
|
print LOG sprintf("%4d-%02d-%02d %02d:%02d:%02d\n",
|
|
$ta[5]+1900, $ta[4]+1, $ta[3], $ta[2], $ta[1], $ta[0]);
|
|
|
|
}
|