#!/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,'@LIBDL@','@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 < 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