1#!@PERL_PATH@ 2# -*- cperl -*- 3# 4# Copyright (c) 2007, 2017, Oracle and/or its affiliates. All rights reserved. 5# 6# This program is free software; you can redistribute it and/or modify 7# it under the terms of the GNU General Public License as published by 8# the Free Software Foundation; version 2 of the License. 9# 10# This program is distributed in the hope that it will be useful, 11# but WITHOUT ANY WARRANTY; without even the implied warranty of 12# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13# GNU General Public License for more details. 14# 15# You should have received a copy of the GNU General Public License 16# along with this program; if not, write to the Free Software 17# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA 18 19############################################################################## 20# 21# This script reports various configuration settings that may be needed 22# when using the MySQL client library. 23# 24# This script try to match the shell script version as close as possible, 25# but in addition being compatible with ActiveState Perl on Windows. 26# 27# All unrecognized arguments to this script are passed to mysqld. 28# 29# NOTE: This script will only be used on Windows until solved how to 30# handle @LIBS@ and other strings inserted that might contain 31# several arguments, possibly with spaces in them. 32# 33# NOTE: This script was deliberately written to be as close to the shell 34# script as possible, to make the maintenance of both in parallel 35# easier. 36# 37############################################################################## 38 39use File::Basename; 40use Getopt::Long; 41use Cwd; 42use strict; 43 44my @exclude_cflags = 45 qw/DDBUG_OFF DSAFE_MUTEX DUNIV_MUST_NOT_INLINE DFORCE_INIT_OF_VARS 46 DEXTRA_DEBUG DHAVE_valgrind O O[0-9] xO[0-9] W[-A-Za-z]* 47 Xa xstrconst xc99=none 48 unroll2 ip mp restrict/; 49 50my @exclude_libs = qw/lmtmalloc static-libcxa i-static static-intel/; 51 52my $cwd = cwd(); 53my $basedir; 54 55my $socket = '@MYSQL_UNIX_ADDR@'; 56my $version = '@VERSION@'; 57 58sub which 59{ 60 my $file = shift; 61 62 my $IFS = $^O eq "MSWin32" ? ";" : ":"; 63 64 foreach my $dir ( split($IFS, $ENV{PATH}) ) 65 { 66 if ( -f "$dir/$file" or -f "$dir/$file.exe" ) 67 { 68 return "$dir/$file"; 69 } 70 } 71 print STDERR "which: no $file in ($ENV{PATH})\n"; 72 exit 1; 73} 74 75# ---------------------------------------------------------------------- 76# If we can find the given directory relatively to where mysql_config is 77# we should use this instead of the incompiled one. 78# This is to ensure that this script also works with the binary MySQL 79# version 80# ---------------------------------------------------------------------- 81 82sub fix_path 83{ 84 my $default = shift; 85 my @dirs = @_; 86 87 foreach my $dirname ( @dirs ) 88 { 89 my $path = "$basedir/$dirname"; 90 if ( -d $path ) 91 { 92 return $path; 93 } 94 } 95 return $default; 96} 97 98sub get_full_path 99{ 100 my $file = shift; 101 102 # if the file is a symlink, try to resolve it 103 if ( $^O ne "MSWin32" and -l $file ) 104 { 105 $file = readlink($file); 106 } 107 108 if ( $file =~ m,^/, ) 109 { 110 # Do nothing, absolute path 111 } 112 elsif ( $file =~ m,/, ) 113 { 114 # Make absolute, and remove "/./" in path 115 $file = "$cwd/$file"; 116 $file =~ s,/\./,/,g; 117 } 118 else 119 { 120 # Find in PATH 121 $file = which($file); 122 } 123 124 return $file; 125} 126 127############################################################################## 128# 129# Form a command line that can handle spaces in paths and arguments 130# 131############################################################################## 132 133sub quote_options { 134 my @cmd; 135 foreach my $opt ( @_ ) 136 { 137 next unless $opt; # If undefined or empty, just skip 138 push(@cmd, "\"$opt\""); # Quote argument 139 } 140 return join(" ", @cmd); 141} 142 143############################################################################## 144# 145# Main program 146# 147############################################################################## 148 149my $me = get_full_path($0); 150$basedir = dirname(dirname($me)); # Remove "/bin/mysql_config" part 151 152my $ldata = '@localstatedir@'; 153my $execdir = '@libexecdir@'; 154my $bindir = '@bindir@'; 155 156# ---------------------------------------------------------------------- 157# If installed, search for the compiled in directory first (might be "lib64") 158# ---------------------------------------------------------------------- 159 160my $pkglibdir = fix_path('@pkglibdir@',"libmysql/relwithdebinfo", 161 "libmysql/release","libmysql/debug","lib/mysql","lib"); 162 163my $pkgincludedir = fix_path('@pkgincludedir@', "include/mysql", "include"); 164 165# Assume no argument with space in it 166my @ldflags = split(" ",'@LDFLAGS@'); 167 168my $port; 169if ( '@MYSQL_TCP_PORT_DEFAULT@' == 0 ) { 170 $port = 0; 171} else { 172 $port = '@MYSQL_TCP_PORT@'; 173} 174 175# ---------------------------------------------------------------------- 176# Create options 177# We intentionally add a space to the beginning and end of lib strings, simplifies replace later 178# ---------------------------------------------------------------------- 179 180my (@lib_opts,@lib_r_opts,@lib_e_opts); 181if ( $^O eq "MSWin32" ) 182{ 183 my $linkpath = "$pkglibdir"; 184 # user32 is only needed for debug or embedded 185 my @winlibs = ("wsock32.lib","advapi32.lib","user32.lib"); 186 @lib_opts = ("$linkpath/mysqlclient.lib",@winlibs); 187 @lib_r_opts = @lib_opts; 188 @lib_e_opts = ("$linkpath/mysqlserver.lib",@winlibs); 189} 190else 191{ 192 my $linkpath = "-L$pkglibdir @RPATH_OPTION@"; 193 @lib_opts = ($linkpath,"-lmysqlclient"); 194 @lib_r_opts = ($linkpath,"-lmysqlclient_r"); 195 @lib_e_opts = ($linkpath,"-lmysqld"); 196} 197 198my $flags; 199$flags->{libs} = 200 [@ldflags,@lib_opts,'@ZLIB_DEPS@','@NON_THREADED_LIBS@','@openssl_libs@','@STATIC_NSS_FLAGS@']; 201$flags->{libs_r} = 202 [@ldflags,@lib_r_opts,'@ZLIB_DEPS@','@LIBS@','@openssl_libs@']; 203$flags->{embedded_libs} = 204 [@ldflags,@lib_e_opts,'@LIBDL@','@ZLIB_DEPS@','@LIBS@','@WRAPLIBS@','@openssl_libs@']; 205 206$flags->{include} = ["-I$pkgincludedir"]; 207$flags->{cflags} = [@{$flags->{include}},split(" ",'@CFLAGS@')]; 208 209# ---------------------------------------------------------------------- 210# Remove some options that a client doesn't have to care about 211# FIXME until we have a --cxxflags, we need to remove -Xa 212# and -xstrconst to make --cflags usable for Sun Forte C++ 213# ---------------------------------------------------------------------- 214 215my $filter = join("|", @exclude_cflags); 216my @tmp = @{$flags->{cflags}}; # Copy the flag list 217$flags->{cflags} = []; # Clear it 218foreach my $cflag ( @tmp ) 219{ 220 push(@{$flags->{cflags}}, $cflag) unless $cflag =~ m/^($filter)$/o; 221} 222 223# Same for --libs(_r) 224$filter = join("|", @exclude_libs); 225foreach my $lib_type ( "libs","libs_r","embedded_libs" ) 226{ 227 my @tmp = @{$flags->{$lib_type}}; # Copy the flag list 228 $flags->{$lib_type} = []; # Clear it 229 foreach my $lib ( @tmp ) 230 { 231 push(@{$flags->{$lib_type}}, $lib) unless $lib =~ m/^($filter)$/o; 232 } 233} 234 235my $include = quote_options(@{$flags->{include}}); 236my $cflags = quote_options(@{$flags->{cflags}}); 237my $libs = quote_options(@{$flags->{libs}}); 238my $libs_r = quote_options(@{$flags->{libs_r}}); 239my $embedded_libs = quote_options(@{$flags->{embedded_libs}}); 240 241############################################################################## 242# 243# Usage information, output if no option is given 244# 245############################################################################## 246 247sub usage 248{ 249 print <<EOF; 250Usage: $0 [OPTIONS] 251Options: 252 --cflags [$cflags] 253 --include [$include] 254 --libs [$libs] 255 --libs_r [$libs_r] 256 --socket [$socket] 257 --port [$port] 258 --version [$version] 259 --libmysqld-libs [$embedded_libs] 260EOF 261 exit 0; 262} 263 264@ARGV or usage(); 265 266############################################################################## 267# 268# Get options and output the values 269# 270############################################################################## 271 272GetOptions( 273 "cflags" => sub { print "$cflags\n" }, 274 "include" => sub { print "$include\n" }, 275 "libs" => sub { print "$libs\n" }, 276 "libs_r" => sub { print "$libs_r\n" }, 277 "socket" => sub { print "$socket\n" }, 278 "port" => sub { print "$port\n" }, 279 "version" => sub { print "$version\n" }, 280 "embedded-libs|embedded|libmysqld-libs" => 281 sub { print "$embedded_libs\n" }, 282 ) or usage(); 283 284exit 0 285