#!C:/Perl/bin/perl
use strict;
use warnings;

my $VERSION = 0.1;

use Getopt::Long;
use File::Basename;
require File::Spec;

BEGIN {
   die 'This script is intended for Win32' unless $^O =~ /Win32/i;
}

my ($mysql_dir, $mysqladmin, $help);
my $result = GetOptions("with-mysql=s" => \$mysql_dir, "help" => \$help);
usage() if $help;

if ($mysql_dir) {
 unless (-d $mysql_dir) {
   die qq{"$mysql_dir" does not exist};
 }
 $mysqladmin = File::Spec->catfile($mysql_dir, 'bin', 'mysqladmin.exe');
 unless (-f $mysqladmin) {
   die qq{"bin/mysqladmin.exe" not found under "$mysql_dir"};
 }
}

my (@path_ext);
unless ($mysqladmin) {
 path_ext();
 $mysqladmin = which('mysqladmin');
 unless ($mysqladmin) {
   die << 'DEATH';

mysqladmin.exe was not found in your PATH.
Please either add the directory containing mysqladmin.exe
to your PATH environment variable, or rerun this script
with the --with-mysql=C:\Path\to\Mysql option, giving the
root directory of your MySQL installation.
DEATH
 }
 ($mysql_dir = dirname($mysqladmin)) =~ s{[/\\]bin[/\\]?$}{};
}

my $basedir = Win32::GetShortPathName($mysql_dir);
my $ldata = File::Spec->catdir($basedir, 'data');
my $execdir = File::Spec->catdir($basedir, 'bin');
my $bindir = File::Spec->catdir($basedir, 'bin');
my $pkglibdir= File::Spec->catdir($basedir, 'lib', 'opt');
my $pkgincludedir = File::Spec->catdir($basedir, 'include');
my $ldflags = '';
my $client_libs = '-lzlib';

$mysqladmin = Win32::GetShortPathName($mysqladmin);
my $v = qx($mysqladmin version);
unless ($v) {
 print STDERR "Problem running $mysqladmin - aborting ...\n";
 exit(1);
}

my ($version, $port);
if ($v =~ /Server version\s+(.*?)\n/m) {
 $version = $1;
}
if ($v =~ /TCP port\s+(.*?)\n/m) {
 $port = $1;
}

my $libs = qq{$ldflags -L"$pkglibdir" -lmysqlclient $client_libs};
my $cflags = qq{-I"$pkgincludedir"};
my $embedded_libs = qq{$ldflags -L"$pkglibdir"};

my $license = <<'EOL';
# Copyright (C) 2005 MySQL AB & MySQL Finland AB & TCX DataKonsult 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; either version 2 of the License, or
# (at your option) any later version.
#
# 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.
EOL

my $mysql_config = File::Spec->catfile($basedir, 'bin', 'mysql_config.pl');
open(my $fh, '>', $mysql_config)
 or die "Cannot open $mysql_config for writing: $!";

print $fh <<"EOL";
#!$^X
use strict;
use warnings;
use Getopt::Long;

$license

my \$basedir = q{$basedir};
my \$ldata = q{$ldata};
my \$execdir = q{$execdir};
my \$bindir = q{$bindir};
my \$pkglibdir = q{$pkglibdir};
my \$pkgincludedir = q{$pkgincludedir};
my \$ldflags = q{$ldflags};
my \$client_libs = q{$client_libs};
my \$version = q{$version};
my \$port = q{$port};
my \$libs = q{$libs};
my \$cflags = q{$cflags};
my \$embedded_libs = q{$embedded_libs};
EOL

while (<DATA>) {
 print $fh $_;
}
close $fh;
my @args = ('pl2bat', $mysql_config);
system(@args) == 0 or die "System @args failed: $?";

print << "END";

mysql_config.pl, and an associated bat file, has been
successfully created under
  $basedir\\bin

END
exit(0);

sub usage {
 print << 'EOU';

Install a Win32 version of mysql_config.

Usage: mysql_config_win32.pl [ --with-mysql=C:\Path\to\MySQL ]

The command-line argument --with-mysql specifies the root
directory of your MySQL installation. This is optional if your
PATH environment variable includes your MySQL bin directory.

EOU
 exit(1);
}

sub path_ext {
 if ($ENV{PATHEXT}) {
   push @path_ext, split ';', $ENV{PATHEXT};
   for my $ext (@path_ext) {
     $ext =~ s/^\.*(.+)$/$1/;
   }
 }
 else {
   #Win9X: doesn't have PATHEXT
   push @path_ext, qw(com exe bat);
 }
}

sub which {
 my $program = shift;
 return unless $program;
 my @a = map {File::Spec->catfile($_, $program) } File::Spec->path();
 for my $base(@a) {
   return $base if -x $base;
   for my $ext (@path_ext) {
     return "$base.$ext" if -x "$base.$ext";
   }
 }
 return;
}

__DATA__

my %opts = ();
GetOptions(\%opts,
          'cflags',
          'libs',
          'port',
          'version',
          'libmysqld-libs',
          'embedded',
          'embedded-libs',
          'help',
         ) or usage();

usage() if ($opts{help} or not %opts);

SWITCH : {
 local $\ = "\n";
 $opts{cflags} and do {
   print $cflags;
   last SWITCH;
 };
 $opts{libs} and do {
   print $libs;
   last SWITCH;
 };
 $opts{port} and do {
   print $port;
   last SWITCH;
 };
 $opts{version} and do {
   print $version;
   last SWITCH;
 };
 ($opts{'libmysqld-libs'} or $opts{embedded} or $opts{'libmysqld-libs'} )
   and do {
     print $embedded_libs;
     last SWITCH;
   };
 usage();
}

exit(0);

sub usage {
 print << "EOU";
Usage: $0 [OPTIONS]

Options:
       --cflags         [$cflags]
       --libs           [$libs]
       --port           [$port]
       --version        [$version]
       --libmysqld-libs [$embedded_libs]
EOU
   exit(1);
}

__END__

=head1 NAME

mysql_config_win32.pl - create a mysql_config script for Win32

=head1 DESCRIPTION

On unix, MySQL comes with a shell script, F<mysql_config>, which
can be used to return information about the MySQL installation.
F<mysql_config_win32.pl> can be used to create a similar utility for Win32.

Installation proceeds as

 perl mysql_config_win32.pl [ --with-mysql=C:\Path\to\MySQL ]

The command-line argument C<--with-mysql> specifies the root
directory of your MySQL installation. This is optional if your
PATH environment variable includes your MySQL bin directory.
This will place a F<mysql_config.pl>, and accompanying
F<mysql_config.bat> file, in your MySQL C<bin> directory.

After installation, the utility may be used as

 C:\Path\to\MySQL\bin\mysql_config.bat  [OPTIONS]

with the available options being

 --help           # returns a summary of options
 --cflags         # returns, eg, -I"C:\MySQL\include"
 --libs           # returns, eg, -L"C:\MySQL\lib\opt" -lmysqlclient -lzlib
 --port           # returns, eg, 3306
 --version        # returns, eg, 4.1.10-nt
 --libmysqld-libs # returns, eg, -L"C:\MySQL\lib\opt"

=head1 PREREQUISITES

This script requires C<Getopt::Long>, C<File::Basename>, and
C<File::Spec>, which are standard modules in recent ActivePerl
installations. It also requires a MySQL installation.

=head1 AUTHOR

Copyright (C), 2005, by Randy Kobes E<lt>[email protected]<gt>.
This is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.

=begin CPAN

=head1 README

On unix, MySQL comes with a shell script, F<mysql_config>, which
can be used to return information about the MySQL installation.
This script is used to create a similar utility for Win32.

=pod OSNAMES

MSWin32

=pod SCRIPT CATEGORIES

Win32/Utilities

=end CPAN

=cut