Browse Source
make_win_bin_dist CMakeLists.txt resolveip.c Makefile.am:
make_win_bin_dist CMakeLists.txt resolveip.c Makefile.am:
Better Windows support in the scripts directory mysql_config.pl.in, mysql_install_db.pl.in: New Perl version of Unix shell script, mainly for Windows Many files in scripts directory: Use default Perl location "#!/usr/bin/perl" instead of the build host path extra/CMakeLists.txt: Added target for executable "resolveip" extra/resolveip.c: Exclude Unix specific headers when compiling on Windows scripts/CMakeLists.txt: On Windows, filter Perl scripts and change name from ".sh" to ".pl" mysql_convert_table_format.sh mysql_explain_log.sh mysql_secure_installation.sh mysql_tableinfo.sh mysqld_multi.sh mysqldumpslow.sh mysqlhotcopy.sh Do the same for the new Windows specific Perl versions of shell scripts mysql_config.pl.in mysql_install_db.pl.in In CMake, set reasonable values for 'CFLAGS', 'prefix', 'datadir' and so on. scripts/Makefile.am: Include "mysql_config.pl.in" and "mysql_install_db.pl.in" in the source TAR scripts/make_win_bin_dist: Only include explicitly listed scripts from the "scripts" directory scripts/mysql_convert_table_format.sh: Use default Perl location "#!/usr/bin/perl" instead of the build host path scripts/mysql_explain_log.sh: Use default Perl location "#!/usr/bin/perl" instead of the build host path scripts/mysql_tableinfo.sh: Use default Perl location "#!/usr/bin/perl" instead of the build host path scripts/mysqld_multi.sh: Use default Perl location "#!/usr/bin/perl" instead of the build host path scripts/mysqldumpslow.sh: Use default Perl location "#!/usr/bin/perl" instead of the build host path scripts/mysqlhotcopy.sh: Use default Perl location "#!/usr/bin/perl" instead of the build host path scripts/mysql_config.pl.in: New Perl version of Unix shell script, mainly for Windows scripts/mysql_install_db.pl.in: New Perl version of Unix shell script, mainly for Windowspull/374/head
13 changed files with 974 additions and 30 deletions
-
3extra/CMakeLists.txt
-
14extra/resolveip.c
-
41scripts/CMakeLists.txt
-
2scripts/Makefile.am
-
35scripts/make_win_bin_dist
-
285scripts/mysql_config.pl.in
-
2scripts/mysql_convert_table_format.sh
-
2scripts/mysql_explain_log.sh
-
612scripts/mysql_install_db.pl.in
-
2scripts/mysql_tableinfo.sh
-
2scripts/mysqld_multi.sh
-
2scripts/mysqldumpslow.sh
-
2scripts/mysqlhotcopy.sh
@ -0,0 +1,285 @@ |
|||
#!/usr/bin/perl |
|||
# -*- cperl -*- |
|||
# |
|||
# Copyright (C) 2007 MySQL AB |
|||
# |
|||
# This program is free software; you can redistribute it and/or modify |
|||
# it under the terms of the GNU General Public License as published by |
|||
# the Free Software Foundation; version 2 of the License. |
|||
# |
|||
# This program is distributed in the hope that it will be useful, |
|||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
# GNU General Public License for more details. |
|||
# |
|||
# You should have received a copy of the GNU General Public License |
|||
# along with this program; if not, write to the Free Software |
|||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
|||
|
|||
############################################################################## |
|||
# |
|||
# This script reports various configuration settings that may be needed |
|||
# when using the MySQL client library. |
|||
# |
|||
# This script try to match the shell script version as close as possible, |
|||
# but in addition being compatible with ActiveState Perl on Windows. |
|||
# |
|||
# All unrecognized arguments to this script are passed to mysqld. |
|||
# |
|||
# NOTE: This script will only be used on Windows until solved how to |
|||
# handle @LIBS@ and other strings inserted that might contain |
|||
# several arguments, possibly with spaces in them. |
|||
# |
|||
# NOTE: This script was deliberately written to be as close to the shell |
|||
# script as possible, to make the maintenance of both in parallel |
|||
# easier. |
|||
# |
|||
############################################################################## |
|||
|
|||
use File::Basename; |
|||
use Getopt::Long; |
|||
use Cwd; |
|||
use strict; |
|||
|
|||
my @exclude_cflags = |
|||
qw/DDBUG_OFF DSAFEMALLOC USAFEMALLOC DSAFE_MUTEX |
|||
DPEDANTIC_SAFEMALLOC DUNIV_MUST_NOT_INLINE DFORCE_INIT_OF_VARS |
|||
DEXTRA_DEBUG DHAVE_purify O O[0-9] xO[0-9] W[-A-Za-z]* |
|||
Xa xstrconst xc99=none |
|||
unroll2 ip mp restrict/; |
|||
|
|||
my @exclude_libs = qw/lmtmalloc static-libcxa i-static static-intel/; |
|||
|
|||
my $cwd = cwd(); |
|||
my $basedir; |
|||
|
|||
my $socket = '@MYSQL_UNIX_ADDR@'; |
|||
my $version = '@VERSION@'; |
|||
|
|||
sub which |
|||
{ |
|||
my $file = shift; |
|||
|
|||
my $IFS = $^O eq "MSWin32" ? ";" : ":"; |
|||
|
|||
foreach my $dir ( split($IFS, $ENV{PATH}) ) |
|||
{ |
|||
if ( -f "$dir/$file" or -f "$dir/$file.exe" ) |
|||
{ |
|||
return "$dir/$file"; |
|||
} |
|||
} |
|||
print STDERR "which: no $file in ($ENV{PATH})\n"; |
|||
exit 1; |
|||
} |
|||
|
|||
# ---------------------------------------------------------------------- |
|||
# If we can find the given directory relatively to where mysql_config is |
|||
# we should use this instead of the incompiled one. |
|||
# This is to ensure that this script also works with the binary MySQL |
|||
# version |
|||
# ---------------------------------------------------------------------- |
|||
|
|||
sub fix_path |
|||
{ |
|||
my $default = shift; |
|||
my @dirs = @_; |
|||
|
|||
foreach my $dirname ( @dirs ) |
|||
{ |
|||
my $path = "$basedir/$dirname"; |
|||
if ( -d $path ) |
|||
{ |
|||
return $path; |
|||
} |
|||
} |
|||
return $default; |
|||
} |
|||
|
|||
sub get_full_path |
|||
{ |
|||
my $file = shift; |
|||
|
|||
# if the file is a symlink, try to resolve it |
|||
if ( $^O ne "MSWin32" and -l $file ) |
|||
{ |
|||
$file = readlink($file); |
|||
} |
|||
|
|||
if ( $file =~ m,^/, ) |
|||
{ |
|||
# Do nothing, absolute path |
|||
} |
|||
elsif ( $file =~ m,/, ) |
|||
{ |
|||
# Make absolute, and remove "/./" in path |
|||
$file = "$cwd/$file"; |
|||
$file =~ s,/\./,/,g; |
|||
} |
|||
else |
|||
{ |
|||
# Find in PATH |
|||
$file = which($file); |
|||
} |
|||
|
|||
return $file; |
|||
} |
|||
|
|||
############################################################################## |
|||
# |
|||
# Form a command line that can handle spaces in paths and arguments |
|||
# |
|||
############################################################################## |
|||
|
|||
sub quote_options { |
|||
my @cmd; |
|||
foreach my $opt ( @_ ) |
|||
{ |
|||
next unless $opt; # If undefined or empty, just skip |
|||
push(@cmd, "\"$opt\""); # Quote argument |
|||
} |
|||
return join(" ", @cmd); |
|||
} |
|||
|
|||
############################################################################## |
|||
# |
|||
# Main program |
|||
# |
|||
############################################################################## |
|||
|
|||
my $me = get_full_path($0); |
|||
$basedir = dirname(dirname($me)); # Remove "/bin/mysql_config" part |
|||
|
|||
my $ldata = '@localstatedir@'; |
|||
my $execdir = '@libexecdir@'; |
|||
my $bindir = '@bindir@'; |
|||
|
|||
# ---------------------------------------------------------------------- |
|||
# If installed, search for the compiled in directory first (might be "lib64") |
|||
# ---------------------------------------------------------------------- |
|||
|
|||
my $pkglibdir = fix_path('@pkglibdir@',"libmysql/relwithdebinfo", |
|||
"libmysql/release","libmysql/debug","lib/mysql","lib"); |
|||
|
|||
my $pkgincludedir = fix_path('@pkgincludedir@', "include/mysql", "include"); |
|||
|
|||
# Assume no argument with space in it |
|||
my @ldflags = split(" ",'@LDFLAGS@'); |
|||
|
|||
my $port; |
|||
if ( '@MYSQL_TCP_PORT_DEFAULT@' == 0 ) { |
|||
$port = 0; |
|||
} else { |
|||
$port = '@MYSQL_TCP_PORT@'; |
|||
} |
|||
|
|||
# ---------------------------------------------------------------------- |
|||
# Create options |
|||
# We intentionally add a space to the beginning and end of lib strings, simplifies replace later |
|||
# ---------------------------------------------------------------------- |
|||
|
|||
my (@lib_opts,@lib_r_opts,@lib_e_opts); |
|||
if ( $^O eq "MSWin32" ) |
|||
{ |
|||
my $linkpath = "$pkglibdir"; |
|||
# user32 is only needed for debug or embedded |
|||
my @winlibs = ("wsock32.lib","advapi32.lib","user32.lib"); |
|||
@lib_opts = ("$linkpath/mysqlclient.lib",@winlibs); |
|||
@lib_r_opts = @lib_opts; |
|||
@lib_e_opts = ("$linkpath/mysqlserver.lib",@winlibs); |
|||
} |
|||
else |
|||
{ |
|||
my $linkpath = "-L$pkglibdir"; |
|||
@lib_opts = ($linkpath,"-lmysqlclient"); |
|||
@lib_r_opts = ($linkpath,"-lmysqlclient_r"); |
|||
@lib_e_opts = ($linkpath,"-lmysqld"); |
|||
} |
|||
|
|||
my $flags; |
|||
$flags->{libs} = |
|||
[@ldflags,@lib_opts,'@ZLIB_DEPS@','@NON_THREADED_LIBS@','@openssl_libs@','@STATIC_NSS_FLAGS@']; |
|||
$flags->{libs_r} = |
|||
[@ldflags,@lib_r_opts,'@ZLIB_DEPS@','@LIBS@','@openssl_libs@']; |
|||
$flags->{embedded_libs} = |
|||
[@ldflags,@lib_e_opts,'@ZLIB_DEPS@','@LIBS@','@WRAPLIBS@','@innodb_system_libs@','@openssl_libs@']; |
|||
|
|||
$flags->{include} = ["-I$pkgincludedir"]; |
|||
$flags->{cflags} = [@{$flags->{include}},split(" ",'@CFLAGS@')]; |
|||
|
|||
# ---------------------------------------------------------------------- |
|||
# Remove some options that a client doesn't have to care about |
|||
# FIXME until we have a --cxxflags, we need to remove -Xa |
|||
# and -xstrconst to make --cflags usable for Sun Forte C++ |
|||
# ---------------------------------------------------------------------- |
|||
|
|||
my $filter = join("|", @exclude_cflags); |
|||
my @tmp = @{$flags->{cflags}}; # Copy the flag list |
|||
$flags->{cflags} = []; # Clear it |
|||
foreach my $cflag ( @tmp ) |
|||
{ |
|||
push(@{$flags->{cflags}}, $cflag) unless $cflag =~ m/^($filter)$/o; |
|||
} |
|||
|
|||
# Same for --libs(_r) |
|||
$filter = join("|", @exclude_libs); |
|||
foreach my $lib_type ( "libs","libs_r","embedded_libs" ) |
|||
{ |
|||
my @tmp = @{$flags->{$lib_type}}; # Copy the flag list |
|||
$flags->{$lib_type} = []; # Clear it |
|||
foreach my $lib ( @tmp ) |
|||
{ |
|||
push(@{$flags->{$lib_type}}, $lib) unless $lib =~ m/^($filter)$/o; |
|||
} |
|||
} |
|||
|
|||
my $include = quote_options(@{$flags->{include}}); |
|||
my $cflags = quote_options(@{$flags->{cflags}}); |
|||
my $libs = quote_options(@{$flags->{libs}}); |
|||
my $libs_r = quote_options(@{$flags->{libs_r}}); |
|||
my $embedded_libs = quote_options(@{$flags->{embedded_libs}}); |
|||
|
|||
############################################################################## |
|||
# |
|||
# Usage information, output if no option is given |
|||
# |
|||
############################################################################## |
|||
|
|||
sub usage |
|||
{ |
|||
print <<EOF; |
|||
Usage: $0 [OPTIONS] |
|||
Options: |
|||
--cflags [$cflags] |
|||
--include [$include] |
|||
--libs [$libs] |
|||
--libs_r [$libs_r] |
|||
--socket [$socket] |
|||
--port [$port] |
|||
--version [$version] |
|||
--libmysqld-libs [$embedded_libs] |
|||
EOF |
|||
exit 1; |
|||
} |
|||
|
|||
@ARGV or usage(); |
|||
|
|||
############################################################################## |
|||
# |
|||
# Get options and output the values |
|||
# |
|||
############################################################################## |
|||
|
|||
GetOptions( |
|||
"cflags" => sub { print "$cflags\n" }, |
|||
"include" => sub { print "$include\n" }, |
|||
"libs" => sub { print "$libs\n" }, |
|||
"libs_r" => sub { print "$libs_r\n" }, |
|||
"socket" => sub { print "$socket\n" }, |
|||
"port" => sub { print "$port\n" }, |
|||
"version" => sub { print "$version\n" }, |
|||
"embedded-libs|embedded|libmysqld-libs" => |
|||
sub { print "$embedded_libs\n" }, |
|||
) or usage(); |
|||
|
|||
exit 0 |
@ -0,0 +1,612 @@ |
|||
#!/usr/bin/perl |
|||
# -*- cperl -*- |
|||
# |
|||
# Copyright (C) 2007 MySQL AB |
|||
# |
|||
# This program is free software; you can redistribute it and/or modify |
|||
# it under the terms of the GNU General Public License as published by |
|||
# the Free Software Foundation; version 2 of the License. |
|||
# |
|||
# This program is distributed in the hope that it will be useful, |
|||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
# GNU General Public License for more details. |
|||
# |
|||
# You should have received a copy of the GNU General Public License |
|||
# along with this program; if not, write to the Free Software |
|||
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
|||
|
|||
############################################################################## |
|||
# |
|||
# This scripts creates the MySQL Server system tables. |
|||
# |
|||
# This script try to match the shell script version as close as possible, |
|||
# but in addition being compatible with ActiveState Perl on Windows. |
|||
# |
|||
# All unrecognized arguments to this script are passed to mysqld. |
|||
# |
|||
# NOTE: This script in 5.0 doesn't really match the shell script |
|||
# version 100%, it is more close to the 5.1 version. |
|||
# |
|||
# NOTE: This script was deliberately written to be as close to the shell |
|||
# script as possible, to make the maintenance of both in parallel |
|||
# easier. |
|||
# |
|||
############################################################################## |
|||
|
|||
use File::Basename; |
|||
use Getopt::Long; |
|||
use Sys::Hostname; |
|||
use Data::Dumper; |
|||
use strict; |
|||
|
|||
Getopt::Long::Configure("pass_through"); |
|||
|
|||
my @args; # Argument list filled in |
|||
|
|||
############################################################################## |
|||
# |
|||
# Usage information |
|||
# |
|||
############################################################################## |
|||
|
|||
sub usage |
|||
{ |
|||
print <<EOF; |
|||
Usage: $0 [OPTIONS] |
|||
--basedir=path The path to the MySQL installation directory. |
|||
--builddir=path If using --srcdir with out-of-directory builds, you |
|||
will need to set this to the location of the build |
|||
directory where built files reside. |
|||
--cross-bootstrap For internal use. Used when building the MySQL system |
|||
tables on a different host than the target. |
|||
--datadir=path The path to the MySQL data directory. |
|||
--force Causes mysql_install_db to run even if DNS does not |
|||
work. In that case, grant table entries that normally |
|||
use hostnames will use IP addresses. |
|||
--ldata=path The path to the MySQL data directory. Same as --datadir. |
|||
--rpm For internal use. This option is used by RPM files |
|||
during the MySQL installation process. |
|||
--skip-name-resolve Use IP addresses rather than hostnames when creating |
|||
grant table entries. This option can be useful if |
|||
your DNS does not work. |
|||
--srcdir=path The path to the MySQL source directory. This option |
|||
uses the compiled binaries and support files within the |
|||
source tree, useful for if you don't want to install |
|||
MySQL yet and just want to create the system tables. |
|||
--user=user_name The login username to use for running mysqld. Files |
|||
and directories created by mysqld will be owned by this |
|||
user. You must be root to use this option. By default |
|||
mysqld runs using your current login name and files and |
|||
directories that it creates will be owned by you. |
|||
|
|||
All other options are passed to the mysqld program |
|||
|
|||
EOF |
|||
exit 1; |
|||
} |
|||
|
|||
############################################################################## |
|||
# |
|||
# Parse an argument list |
|||
# |
|||
# We only need to pass arguments through to the server if we don't |
|||
# handle them here. So, we collect unrecognized options (passed on |
|||
# the command line) into the args variable. |
|||
# |
|||
############################################################################## |
|||
|
|||
sub parse_arguments |
|||
{ |
|||
my $opt = shift; |
|||
|
|||
my @saved_ARGV = @ARGV; |
|||
@ARGV = @_; # Set ARGV so GetOptions works |
|||
|
|||
my $pick_args; |
|||
if (@ARGV and $ARGV[0] eq 'PICK-ARGS-FROM-ARGV') |
|||
{ |
|||
$pick_args = 1; |
|||
shift @ARGV; |
|||
} |
|||
|
|||
GetOptions( |
|||
$opt, |
|||
"force", |
|||
"basedir=s", |
|||
"builddir=s", # FIXME not documented |
|||
"srcdir=s", |
|||
"ldata|datadir=s", |
|||
|
|||
# Note that the user will be passed to mysqld so that it runs |
|||
# as 'user' (crucial e.g. if log-bin=/some_other_path/ |
|||
# where a chown of datadir won't help) |
|||
"user=s", |
|||
|
|||
"skip-name-resolve", |
|||
"verbose", |
|||
"rpm", |
|||
"help", |
|||
"defaults-file|defaults-extra-file|no-defaults:s", |
|||
|
|||
# Used when building the MySQL system tables on a different host than |
|||
# the target. The platform-independent files that are created in |
|||
# --datadir on the host can be copied to the target system. |
|||
# |
|||
# The most common use for this feature is in the Windows installer |
|||
# which will take the files from datadir and include them as part of |
|||
# the install package. See top-level 'dist-hook' make target. |
|||
# |
|||
# --windows is a deprecated alias |
|||
"cross-bootstrap|windows", # FIXME undocumented, even needed? |
|||
) or usage(); |
|||
|
|||
usage() if $opt->{help}; |
|||
|
|||
@args = @ARGV if $pick_args; |
|||
|
|||
@ARGV = @saved_ARGV; # Set back ARGV |
|||
} |
|||
|
|||
############################################################################## |
|||
# |
|||
# Try to find a specific file within --basedir which can either be a binary |
|||
# release or installed source directory and return the path. |
|||
# |
|||
############################################################################## |
|||
|
|||
sub find_in_basedir |
|||
{ |
|||
my $opt = shift; |
|||
my $mode = shift; # "dir" or "file" |
|||
my $files = shift; |
|||
|
|||
foreach my $file ( @{ref($files) ? $files : [$files]} ) |
|||
{ |
|||
foreach my $dir ( @_ ) |
|||
{ |
|||
foreach my $part ( "$file","$file.exe","release/$file.exe", |
|||
"debug/$file.exe","relwithdebinfo/$file.exe" ) |
|||
{ |
|||
my $path = "$opt->{basedir}/$dir/$part"; |
|||
if ( -f $path ) |
|||
{ |
|||
return $mode eq "dir" ? dirname($path) : $path; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
############################################################################## |
|||
# |
|||
# Just a function to write out an error report |
|||
# |
|||
############################################################################## |
|||
|
|||
sub cannot_find_file |
|||
{ |
|||
my $file = shift; |
|||
|
|||
print "FATAL ERROR: Could not find $file\n"; |
|||
print "\n"; |
|||
print "If you compiled from source, you need to run 'make install' to\n"; |
|||
print "copy the software into the correct location ready for operation.\n"; |
|||
print "\n"; |
|||
print "If you are using a binary release, you must either be at the top\n"; |
|||
print "level of the extracted archive, or pass the --basedir option\n"; |
|||
print "pointing to that location.\n"; |
|||
print "\n"; |
|||
|
|||
exit 1; |
|||
} |
|||
|
|||
############################################################################## |
|||
# |
|||
# Form a command line that can handle spaces in paths and arguments |
|||
# |
|||
############################################################################## |
|||
|
|||
# FIXME this backslash escaping needed if using '"..."' ? |
|||
# This regexp makes sure that any special chars are quoted, |
|||
# so the arg gets passed exactly to the server. |
|||
# XXX: This is broken; true fix requires using eval and proper |
|||
# quoting of every single arg ($opt->{basedir}, $opt->{ldata}, etc.) |
|||
# join(" ", map {s/([^\w\_\.\-])/\\$1/g} |
|||
|
|||
sub quote_options { |
|||
my @cmd; |
|||
foreach my $opt ( @_ ) |
|||
{ |
|||
next unless $opt; # If undefined or empty, just skip |
|||
push(@cmd, "\"$opt\""); # Quote argument |
|||
} |
|||
return join(" ", @cmd); |
|||
} |
|||
|
|||
############################################################################## |
|||
# |
|||
# Ok, let's go. We first need to parse arguments which are required by |
|||
# my_print_defaults so that we can execute it first, then later re-parse |
|||
# the command line to add any extra bits that we need. |
|||
# |
|||
############################################################################## |
|||
|
|||
my $opt = {}; |
|||
parse_arguments($opt, 'PICK-ARGS-FROM-ARGV', @ARGV); |
|||
|
|||
# ---------------------------------------------------------------------- |
|||
# We can now find my_print_defaults. This script supports: |
|||
# |
|||
# --srcdir=path pointing to compiled source tree |
|||
# --basedir=path pointing to installed binary location |
|||
# |
|||
# or default to compiled-in locations. |
|||
# ---------------------------------------------------------------------- |
|||
|
|||
my $print_defaults; |
|||
|
|||
if ( $opt->{srcdir} and $opt->{basedir} ) |
|||
{ |
|||
error("Specify either --basedir or --srcdir, not both"); |
|||
} |
|||
if ( $opt->{srcdir} ) |
|||
{ |
|||
$opt->{builddir} = $opt->{srcdir} unless $opt->{builddir}; |
|||
$print_defaults = "$opt->{builddir}/extra/my_print_defaults"; |
|||
} |
|||
elsif ( $opt->{basedir} ) |
|||
{ |
|||
$print_defaults = find_in_basedir($opt,"file","my_print_defaults","bin","extra"); |
|||
} |
|||
else |
|||
{ |
|||
$print_defaults='@bindir@/my_print_defaults'; |
|||
} |
|||
|
|||
-x $print_defaults or -f "$print_defaults.exe" |
|||
or cannot_find_file($print_defaults); |
|||
|
|||
# ---------------------------------------------------------------------- |
|||
# Now we can get arguments from the groups [mysqld] and [mysql_install_db] |
|||
# in the my.cfg file, then re-run to merge with command line arguments. |
|||
# ---------------------------------------------------------------------- |
|||
|
|||
my @default_options; |
|||
my $cmd = quote_options($print_defaults,$opt->{'defaults-file'}, |
|||
"mysqld","mysql_install_db"); |
|||
open(PIPE, "$cmd |") or error($opt,"can't run $cmd: $!"); |
|||
while ( <PIPE> ) |
|||
{ |
|||
chomp; |
|||
next unless /\S/; |
|||
push(@default_options, $_); |
|||
} |
|||
close PIPE; |
|||
$opt = {}; # Reset the arguments FIXME ? |
|||
parse_arguments($opt, @default_options); |
|||
parse_arguments($opt, 'PICK-ARGS-FROM-ARGV', @ARGV); |
|||
|
|||
# ---------------------------------------------------------------------- |
|||
# Configure paths to support files |
|||
# ---------------------------------------------------------------------- |
|||
|
|||
# FIXME $extra_bindir is not used |
|||
my ($bindir,$extra_bindir,$mysqld,$pkgdatadir,$mysqld_opt,$scriptdir); |
|||
|
|||
if ( $opt->{srcdir} ) |
|||
{ |
|||
$opt->{basedir} = $opt->{builddir}; |
|||
$bindir = "$opt->{basedir}/client"; |
|||
$extra_bindir = "$opt->{basedir}/extra"; |
|||
$mysqld = "$opt->{basedir}/sql/mysqld"; |
|||
$mysqld_opt = "--language=$opt->{srcdir}/sql/share/english"; |
|||
$pkgdatadir = "$opt->{srcdir}/scripts"; |
|||
$scriptdir = "$opt->{srcdir}/scripts"; |
|||
} |
|||
elsif ( $opt->{basedir} ) |
|||
{ |
|||
$bindir = "$opt->{basedir}/bin"; |
|||
$extra_bindir = $bindir; |
|||
$mysqld = find_in_basedir($opt,"file",["mysqld-nt","mysqld"], |
|||
"libexec","sbin","bin") || # ,"sql" |
|||
find_in_basedir($opt,"file","mysqld-nt", |
|||
"bin"); # ,"sql" |
|||
$pkgdatadir = find_in_basedir($opt,"dir","fill_help_tables.sql", |
|||
"share","share/mysql"); # ,"scripts" |
|||
$scriptdir = "$opt->{basedir}/scripts"; |
|||
} |
|||
else |
|||
{ |
|||
$opt->{basedir} = '@prefix@'; |
|||
$bindir = '@bindir@'; |
|||
$extra_bindir = $bindir; |
|||
$mysqld = '@libexecdir@/mysqld'; |
|||
$pkgdatadir = '@pkgdatadir@'; |
|||
$scriptdir = '@scriptdir@'; |
|||
} |
|||
|
|||
unless ( $opt->{ldata} ) |
|||
{ |
|||
$opt->{ldata} = '@localstatedir@'; |
|||
} |
|||
|
|||
if ( $opt->{srcdir} ) |
|||
{ |
|||
$pkgdatadir = "$opt->{srcdir}/scripts"; |
|||
} |
|||
|
|||
# ---------------------------------------------------------------------- |
|||
# Set up paths to SQL scripts required for bootstrap |
|||
# ---------------------------------------------------------------------- |
|||
|
|||
my $fill_help_tables = "$pkgdatadir/fill_help_tables.sql"; |
|||
my $create_system_tables = "$pkgdatadir/mysql_system_tables.sql"; |
|||
my $fill_system_tables = "$pkgdatadir/mysql_system_tables_data.sql"; |
|||
|
|||
foreach my $f ( $fill_help_tables,$create_system_tables,$fill_system_tables ) |
|||
{ |
|||
-f $f or cannot_find_file($f); |
|||
} |
|||
|
|||
-x $mysqld or -f "$mysqld.exe" or cannot_find_file($mysqld); |
|||
# Try to determine the hostname |
|||
my $hostname = hostname(); |
|||
|
|||
# ---------------------------------------------------------------------- |
|||
# Check if hostname is valid |
|||
# ---------------------------------------------------------------------- |
|||
|
|||
my $resolved; |
|||
if ( !$opt->{'cross-bootstrap'} and !$opt->{rpm} and !$opt->{force} ) |
|||
{ |
|||
my $resolveip; |
|||
|
|||
$resolved = `$resolveip $hostname 2>&1`; |
|||
if ( $? != 0 ) |
|||
{ |
|||
$resolved=`$resolveip localhost 2>&1`; |
|||
if ( $? != 0 ) |
|||
{ |
|||
error($opt, |
|||
"Neither host '$hostname' nor 'localhost' could be looked up with", |
|||
"$bindir/resolveip", |
|||
"Please configure the 'hostname' command to return a correct", |
|||
"hostname.", |
|||
"If you want to solve this at a later stage, restart this script", |
|||
"with the --force option"); |
|||
} |
|||
warning($opt, |
|||
"The host '$hostname' could not be looked up with resolveip.", |
|||
"This probably means that your libc libraries are not 100 % compatible", |
|||
"with this binary MySQL version. The MySQL daemon, mysqld, should work", |
|||
"normally with the exception that host name resolving will not work.", |
|||
"This means that you should use IP addresses instead of hostnames", |
|||
"when specifying MySQL privileges !"); |
|||
} |
|||
} |
|||
|
|||
# FIXME what does this really mean.... |
|||
if ( $opt->{'skip-name-resolve'} and $resolved and $resolved =~ /\s/ ) |
|||
{ |
|||
$hostname = (split(' ', $resolved))[5]; |
|||
} |
|||
|
|||
# ---------------------------------------------------------------------- |
|||
# Create database directories mysql & test |
|||
# ---------------------------------------------------------------------- |
|||
|
|||
foreach my $dir ( $opt->{ldata}, "$opt->{ldata}/mysql", "$opt->{ldata}/test" ) |
|||
{ |
|||
# FIXME not really the same as original "mkdir -p", but ok? |
|||
mkdir($dir, 0700) unless -d $dir; |
|||
chown($opt->{user}, $dir) if -w "/" and !$opt->{user}; |
|||
} |
|||
|
|||
push(@args, "--user=$opt->{user}") if $opt->{user}; |
|||
|
|||
# ---------------------------------------------------------------------- |
|||
# Configure mysqld command line |
|||
# ---------------------------------------------------------------------- |
|||
|
|||
# FIXME use --init-file instead of --bootstrap ?! |
|||
|
|||
my $mysqld_bootstrap = $ENV{MYSQLD_BOOTSTRAP} || $mysqld; |
|||
my $mysqld_install_cmd_line = quote_options($mysqld_bootstrap, |
|||
$opt->{'defaults-file'}, |
|||
$mysqld_opt, |
|||
"--bootstrap", |
|||
"--basedir=$opt->{basedir}", |
|||
"--datadir=$opt->{ldata}", |
|||
"--skip-innodb", |
|||
"--skip-bdb", |
|||
"--skip-ndbcluster", |
|||
"--max_allowed_packet=8M", |
|||
"--net_buffer_length=16K", |
|||
@args, |
|||
); |
|||
|
|||
# ---------------------------------------------------------------------- |
|||
# Create the system and help tables by passing them to "mysqld --bootstrap" |
|||
# ---------------------------------------------------------------------- |
|||
|
|||
report_verbose_wait($opt,"Installing MySQL system tables..."); |
|||
|
|||
open(SQL, $create_system_tables) |
|||
or error($opt,"can't open $create_system_tables for reading: $!"); |
|||
# FIXME > /dev/null ? |
|||
if ( open(PIPE, "| $mysqld_install_cmd_line") ) |
|||
{ |
|||
print PIPE "use mysql;\n"; |
|||
while ( <SQL> ) |
|||
{ |
|||
# When doing a "cross bootstrap" install, no reference to the current |
|||
# host should be added to the system tables. So we filter out any |
|||
# lines which contain the current host name. |
|||
next if $opt->{'cross-bootstrap'} and /\@current_hostname/; |
|||
|
|||
print PIPE $_; |
|||
} |
|||
close PIPE; |
|||
close SQL; |
|||
|
|||
report_verbose($opt,"OK"); |
|||
|
|||
# ---------------------------------------------------------------------- |
|||
# Pipe fill_help_tables.sql to "mysqld --bootstrap" |
|||
# ---------------------------------------------------------------------- |
|||
|
|||
report_verbose_wait($opt,"Filling help tables..."); |
|||
open(SQL, $fill_help_tables) |
|||
or error($opt,"can't open $fill_help_tables for reading: $!"); |
|||
# FIXME > /dev/null ? |
|||
if ( open(PIPE, "| $mysqld_install_cmd_line") ) |
|||
{ |
|||
print PIPE "use mysql;\n"; |
|||
while ( <SQL> ) |
|||
{ |
|||
print PIPE $_; |
|||
} |
|||
close PIPE; |
|||
close SQL; |
|||
|
|||
report_verbose($opt,"OK"); |
|||
} |
|||
else |
|||
{ |
|||
warning($opt,"HELP FILES ARE NOT COMPLETELY INSTALLED!", |
|||
"The \"HELP\" command might not work properly"); |
|||
} |
|||
|
|||
report_verbose($opt,"To start mysqld at boot time you have to copy", |
|||
"support-files/mysql.server to the right place " . |
|||
"for your system"); |
|||
|
|||
if ( !$opt->{'cross-bootstrap'} ) |
|||
{ |
|||
# This is not a true installation on a running system. The end user must |
|||
# set a password after installing the data files on the real host system. |
|||
# At this point, there is no end user, so it does not make sense to print |
|||
# this reminder. |
|||
report($opt, |
|||
"PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !", |
|||
"To do so, start the server, then issue the following commands:", |
|||
"", |
|||
" $bindir/mysqladmin -u root password 'new-password'", |
|||
" $bindir/mysqladmin -u root -h $hostname password 'new-password'", |
|||
"", |
|||
"Alternatively you can run:", |
|||
"", |
|||
" $bindir/mysql_secure_installation", |
|||
"", |
|||
"which will also give you the option of removing the test", |
|||
"databases and anonymous user created by default. This is", |
|||
"strongly recommended for production servers.", |
|||
"", |
|||
"See the manual for more instructions."); |
|||
|
|||
if ( !$opt->{rpm} ) |
|||
{ |
|||
report($opt, |
|||
"You can start the MySQL daemon with:", |
|||
"", |
|||
" cd " . '@prefix@' . " ; $bindir/mysqld_safe &", |
|||
"", |
|||
"You can test the MySQL daemon with mysql-test-run.pl", |
|||
"", |
|||
" cd mysql-test ; perl mysql-test-run.pl"); |
|||
} |
|||
report($opt, |
|||
"Please report any problems with the " . '@scriptdir@' . "/mysqlbug script!", |
|||
"", |
|||
"The latest information about MySQL is available on the web at", |
|||
"", |
|||
" http://www.mysql.com", |
|||
"", |
|||
"Support MySQL by buying support/licenses at http://shop.mysql.com"); |
|||
} |
|||
exit 0 |
|||
} |
|||
else |
|||
{ |
|||
error($opt, |
|||
"Installation of system tables failed!", |
|||
"", |
|||
"Examine the logs in $opt->{ldata} for more information.", |
|||
"You can try to start the mysqld daemon with:", |
|||
"$mysqld --skip-grant &", |
|||
"and use the command line tool", |
|||
"$bindir/mysql to connect to the mysql", |
|||
"database and look at the grant tables:", |
|||
"", |
|||
"shell> $bindir/mysql -u root mysql", |
|||
"mysql> show tables", |
|||
"", |
|||
"Try 'mysqld --help' if you have problems with paths. Using --log", |
|||
"gives you a log in $opt->{ldata} that may be helpful.", |
|||
"", |
|||
"The latest information about MySQL is available on the web at", |
|||
"http://www.mysql.com", |
|||
"Please consult the MySQL manual section: 'Problems running mysql_install_db',", |
|||
"and the manual section that describes problems on your OS.", |
|||
"Another information source is the MySQL email archive.", |
|||
"Please check all of the above before mailing us!", |
|||
"And if you do mail us, you MUST use the " . '@scriptdir@' . "/mysqlbug script!") |
|||
} |
|||
|
|||
############################################################################## |
|||
# |
|||
# Misc |
|||
# |
|||
############################################################################## |
|||
|
|||
sub report_verbose |
|||
{ |
|||
my $opt = shift; |
|||
my $text = shift; |
|||
|
|||
report_verbose_wait($opt, $text, @_); |
|||
print "\n\n"; |
|||
} |
|||
|
|||
sub report_verbose_wait |
|||
{ |
|||
my $opt = shift; |
|||
my $text = shift; |
|||
|
|||
if ( $opt->{verbose} or (!$opt->{rpm} and !$opt->{'cross-bootstrap'}) ) |
|||
{ |
|||
print "$text"; |
|||
map {print "\n$_"} @_; |
|||
} |
|||
} |
|||
|
|||
sub report |
|||
{ |
|||
my $opt = shift; |
|||
my $text = shift; |
|||
|
|||
print "$text\n"; |
|||
map {print "$_\n"} @_; |
|||
print "\n"; |
|||
} |
|||
|
|||
sub error |
|||
{ |
|||
my $opt = shift; |
|||
my $text = shift; |
|||
|
|||
print "FATAL ERROR: $text\n"; |
|||
map {print "$_\n"} @_; |
|||
exit 1; |
|||
} |
|||
|
|||
sub warning |
|||
{ |
|||
my $opt = shift; |
|||
my $text = shift; |
|||
|
|||
print "WARNING: $text\n"; |
|||
map {print "$_\n"} @_; |
|||
print "\n"; |
|||
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue