have_java.inc 3.42 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
--perl
use strict;
use File::Basename;
use IO::File;
use lib "lib/";
use My::Platform;
use My::Find;

require "lib/mtr_misc.pl";


#
# Looks for java executable (/bin/java) in several locations:
# - MTR_JAVA environment variable
# - JAVA_HOME/bin/java
# - Other hard-coded locations (see below)
# - $PATH
#
# If java executable is found, MTR_JAVA will be set to reflect this location
#
my $java_args = "";
my @arch_paths = ();

sub getRegValue
{
  my ($key, $valuename) = @_;
  my $cmd = "reg query \"$key\" /v $valuename";

  my $res = "";

  my @ares = `$cmd`;
  if($? == 0)
  {
    foreach my $row (@ares)
    {
      if($row =~ m/.*$valuename\s*REG_SZ\s*(.*)/)
      {
        $row = $1;
        $row =~ s/^\s*//;
        $row =~ s/\s*$//;
        $res = $row;
        last;
      }
    }
  }
  return $res;
}

sub getJavaPath
{
  my $key = "HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit";
  my $version = getRegValue($key, "CurrentVersion");

  if(length($version) < 1)
  {
    return "";
  }

  $key = "HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\$version";
  my $path = getRegValue($key, "JavaHome");

  return $path;
}

my $pathsep = "/";

if(!IS_WINDOWS)
{
  push(@arch_paths, ('/usr/lib/jvm/java', '/usr/lib64/jvm/java'));

  $java_args = "-d32";

  # Architecture dependent paths, will be expanded with -64 if we are running on 64 bit build
  my $bits = $ENV{MYSQL_SYSTEM_ARCHITECTURE};
  if ($bits == 64) {
    map { $_ . "-64" } @arch_paths;
    $java_args = "-d64";
    push(@arch_paths, ('/usr/local/jdk', '/usr/local/java', '/usr/local/java/jdk'));
    push(@arch_paths, ('/usr/java-local/jdk-64/', '/usr/local/jdk-64', '/usr/local/java/jdk-64'));
  } else {
    push(@arch_paths, ('/usr/local/jdk', '/usr/local/java', '/usr/local/java/jdk'));
  }
}
else
{ 
  my $win_path = getJavaPath();
  if(length($win_path) > 0) 
  {
    push(@arch_paths, $win_path);
  }
  $pathsep = "\\";
}


my @java_paths = ($ENV{MTR_JAVA}, $ENV{JAVA_HOME}, $ENV{JDK_HOME});

push(@java_paths, @arch_paths);
push(@java_paths, "*"); # empty path for "java on PATH variable"

my $java_loc = "";
our $java_version = "";

sub java_exists {
   my ($path, $exe) = @_;

   $exe .= ".exe" if IS_WINDOWS;
   $path .= $pathsep if length($path) > 0;
   my $exists = $path . $exe;
   my $devnull = "/dev/null";
   $devnull = "NUL" if IS_WINDOWS;

   system($exists . " " . $java_args . " -version > " . $devnull);
  
   my $ret =  $exists if ($? == 0);
   if($? == 0) {
     my $ret = $exists;
     open(VER, "$exists  -version 2>&1 |");
     $java_version = <VER>;
     close(VER);
   }
   
   return $ret;
}

foreach my $path (@java_paths) 
{
  if (!defined $path || $path eq '') {
    next;
  }
  if ($path eq "*" ) {
    # java on PATH env case
    $path = "";
  } else {
    # std case
    $path .= $pathsep . "bin";
  }
 
  my $tmp = java_exists($path, "java");

  if ($tmp ne "") 
  {
     $java_loc = $tmp;
     last;
   }
}

my $vardir = $ENV{MYSQLTEST_VARDIR} or die "Need MYSQLTEST_VARDIR";
my $F = IO::File->new("$vardir/tmp/have_java_result.inc", "w") or die;
if ($java_loc eq '') {
  print $F "--skip Could not find Java executable;\n";
} else {
  print $F "--let \MTR_JAVA= $java_loc\n";
  print $F "--let \MTR_JAVA_ARGS= $java_args\n";
  print $F "--let \MTR_JAVA_VERSION= $java_version\n";
  print $F "--echo Found Java: '\$MTR_JAVA'\n";
  print $F "--echo Java version: '\$MTR_JAVA_VERSION'\n";
}
$F->close();

EOF

--source $MYSQLTEST_VARDIR/tmp/have_java_result.inc