blob: 6c80a9a52f5a125e3c0f6f706ee6842d979a7f10 [file] [log] [blame]
#!/usr/bin/perl -w
# *************************************************************
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
#
# *************************************************************
use File::Copy;
my $output_format = 'u';
sub reg_get_value($)
{
# it is believed that the registry moves keys around
# depending on OS version, this will de-mangle that
my $key = shift;
my $fhandle;
my $value;
open ($fhandle, "/proc/registry/$key") || return;
# reg keys have 0x00 0x5c at the end
$value = (split /\0/, <$fhandle>)[0];
close ($fhandle);
if ( defined $value ) {
chomp ($value);
$value =~ s|\r\n||;
# print "Value '$value' at '$key'\n";
}
return $value;
}
sub reg_find_key($)
{
# it is believed that the registry moves keys around
# depending on OS version, this will de-mangle that
my $key = shift;
$key =~ s| |\\ |;
$key = `cd /proc/registry/ ; ls $key`;
return $key;
}
sub print_syntax()
{
print "oowintool [option] ...\n";
print " encoding options\n";
print " -w - windows form\n";
print " -u - unix form (default)\n";
print " commands:\n";
print " --msvc-ver - dump version of MSVC eg. 6.0\n";
print " --msvc-copy-dlls <dest> - copy msvc[pr]??.dlls into <dest>/msvcp??/\n";
print " --msvc-productdir - dump productdir\n";
print " --msvs-productdir - dump productdir\n";
print " --dotnetsdk-dir - dump .Net SDK path\n";
print " --csc-compilerdir - dump .Net SDK compiler path\n";
print " --psdk-home - dump psdk install dir\n";
print " --jdk-home - dump the jdk install dir\n";
print " --nsis-dir - dump NSIS path\n";
print " --help - this message\n";
}
sub cygpath($$$)
{
my ($path, $input_format, $format) = @_;
return $path if ( ! defined $path );
# Strip trailing path separators
if ($input_format eq 'u') {
$path =~ s|/*\s*$||;
} else {
$path =~ s|\\*\s*$||;
}
# 'Unterminated quoted string errors' from 'ash' when
# forking cygpath so - reimplement cygpath in perl [ gack ]
if ($format eq 'u' && $input_format eq 'w') {
$path =~ s|\\|/|g;
$path =~ s|([a-zA-Z]):/|/cygdrive/$1/|g;
}
elsif ($format eq 'w' && $input_format eq 'u') {
$path =~ s|/cygdrive/([a-zA-Z])/|/$1/|g;
$path =~ s|/|\\|g;
}
return $path;
}
sub print_path($$)
{
my ($path, $unix) = @_;
$path = cygpath ($path, $unix, $output_format);
print $path;
}
sub print_psdk_home()
{
my ($value, $key);
$value = reg_get_value ('HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Microsoft SDKs/Windows/v6.1/InstallationFolder');
if (!defined $value)
{
$value = reg_get_value ('HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Microsoft SDKs/Windows/CurrentInstallFolder');
}
if (!defined $value)
{
$value = reg_get_value ('HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/MicrosoftSDK/Directories/Install Dir');
}
if (!defined $value)
{
$key = reg_find_key ('HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/MicrosoftSDK/InstalledSDKs/*/Install Dir');
$value = reg_get_value ($key);
}
if (!defined $value)
{
my $dir = cygpath (find_msvc()->{'product_dir'}, 'w', $output_format);
$value = `/bin/find "$dir" -iname platformsdk | head -n 1`;
}
defined $value || die "psdk not found";
print cygpath ($value, 'w', $output_format);
}
my %msvc_net_2003 = (
'ver' => '7.1',
'key' => 'Microsoft/VisualStudio/7.1/Setup/VC/ProductDir',
'dll_path' => '../Visual Studio .NET Professional 2003 - English',
'dll_suffix' => '71'
);
my %msvs_net_2003 = (
'ver' => '7.1',
'key' => 'Microsoft/VisualStudio/7.1/Setup/VS/ProductDir',
'dll_path' => 'Visual Studio .NET Professional 2003 - English',
'dll_suffix' => '71'
);
my %msvs_net_2003_ea = (
'ver' => '7.1',
'key' => 'Microsoft/VisualStudio/7.1/Setup/VS/ProductDir',
'dll_path' => 'Visual Studio .NET Enterprise Architect 2003 - English', # testme ...
'dll_suffix' => '71'
);
my %msvs_express_2005 = (
'ver' => '8.0',
'key' => 'Microsoft/VCExpress/8.0/Setup/VS/ProductDir',
'dll_path' => '../SDK/v2.0/Bin',
'dll_suffix' => '80'
);
my %msvc_express_2005 = (
'ver' => '8.0',
'key' => 'Microsoft/VCExpress/8.0/Setup/VC/ProductDir',
'dll_path' => '../SDK/v2.0/Bin',
'dll_suffix' => '80'
);
my %msvs_2005 = (
'ver' => '8.0',
'key' => 'Microsoft/VisualStudio/8.0/Setup/VS/ProductDir',
'dll_path' => 'Visual Studio .NET Professional 2005 - English',
'dll_suffix' => '80'
);
my %msvc_2005 = (
'ver' => '8.0',
'key' => 'Microsoft/VisualStudio/8.0/Setup/VC/ProductDir',
'dll_path' => '../SDK/v2.0/Bin',
'dll_suffix' => '80'
);
my %msvs_2008 = (
'ver' => '9.0',
'key' => 'Microsoft/VisualStudio/9.0/Setup/VS/ProductDir',
'dll_path' => 'VC/redist/x86/Microsoft.VC90.CRT',
'dll_suffix' => '90'
);
my %msvc_2008 = (
'ver' => '9.0',
'key' => 'Microsoft/VisualStudio/9.0/Setup/VC/ProductDir',
'dll_path' => 'redist/x86/Microsoft.VC90.CRT',
'dll_suffix' => '90'
);
my %msvs_express_2008 = (
'ver' => '9.0',
'key' => 'Microsoft/VCExpress/9.0/Setup/VS/ProductDir',
'dll_path' => 'VC/redist/x86/Microsoft.VC90.CRT',
'dll_suffix' => '90'
);
my %msvc_express_2008 = (
'ver' => '9.0',
'key' => 'Microsoft/VCExpress/9.0/Setup/VC/ProductDir',
'dll_path' => 'redist/x86/Microsoft.VC90.CRT',
'dll_suffix' => '90'
);
sub find_msvs()
{
my @ms_versions = ( \%msvs_2008, \%msvs_express_2008, \%msvs_2005, \%msvs_express_2005, \%msvs_net_2003_ea, \%msvs_net_2003 );
for $ver (@ms_versions)
{
my $install = reg_get_value ("HKEY_LOCAL_MACHINE/SOFTWARE/" . $ver->{'key'});
if (defined $install && $install ne '') {
$ver->{'product_dir'} = $install;
return $ver;
}
}
die "Can't find MS Visual Studio / VC++";
}
sub find_msvc()
{
my @ms_versions = ( \%msvc_2008, \%msvc_express_2008, \%msvc_2005, \%msvc_express_2005, \%msvc_net_2003 );
for $ver (@ms_versions)
{
my $install = reg_get_value ("HKEY_LOCAL_MACHINE/SOFTWARE/" . $ver->{'key'});
if (defined $install && $install ne '') {
$ver->{'product_dir'} = $install;
return $ver;
}
}
die "Can't find MS Visual Studio / VC++";
}
sub print_msvc_ver()
{
my $ver = find_msvc();
print $ver->{'ver'};
}
sub print_msvc_product_dir()
{
my $ver = find_msvc();
print cygpath ($ver->{'product_dir'}, 'w', $output_format);
}
sub print_msvs_productdir()
{
my $ver = find_msvs();
print cygpath ($ver->{'product_dir'}, 'w', $output_format);
}
sub print_csc_compiler_dir()
{
my $dir = cygpath (reg_get_value ("HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/.NETFramework/InstallRoot"), 'w', $output_format);
my $csc_exe = `/bin/find "$dir" -iname csc.exe | grep "v2\." | head -n 1`;
print `dirname $csc_exe`;
}
sub print_dotnetsdk_dir()
{
my $dir =
reg_get_value ("HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/.NETFramework/sdkInstallRootv1.1") ||
reg_get_value ("HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/.NETFramework/sdkInstallRootv2.0");
print cygpath ($dir, 'w', $output_format);
}
sub print_jdk_dir()
{
my $dir =
reg_get_value ("HKEY_LOCAL_MACHINE/SOFTWARE/JavaSoft/Java\ Development\ Kit/1.7/JavaHome") ||
reg_get_value ("HKEY_LOCAL_MACHINE/SOFTWARE/JavaSoft/Java\ Development\ Kit/1.6/JavaHome") ||
reg_get_value ("HKEY_LOCAL_MACHINE/SOFTWARE/JavaSoft/Java\ Development\ Kit/1.5/JavaHome") ||
reg_get_value ("HKEY_LOCAL_MACHINE/SOFTWARE/JavaSoft/Java\ Development\ Kit/1.4/JavaHome") ||
reg_get_value ("HKEY_LOCAL_MACHINE/SOFTWARE/JavaSoft/Java\ Development\ Kit/1.3/JavaHome");
print cygpath($dir, 'w', $output_format);
}
sub print_nsis_dir()
{
my $dir = reg_get_value ("HKEY_LOCAL_MACHINE/SOFTWARE/NSIS/@");
print cygpath ($dir, 'w', $output_format) if defined $dir;
}
sub copy_dll($$$)
{
my ($src, $fname, $dest) = @_;
-f "$src/$fname" || die "can't find $src";
-d $dest || die "no directory $dest";
print STDERR "Copying $src/$fname to $dest\n";
copy ("$src/$fname", $dest) || die "copy failed: $!";
chmod (0755, "$dest/$fname") || die "failed to set dll executable: $!";
}
sub msvc_find_version($)
{
my $checkpath = shift;
my $ver = find_msvc();
my $srcdir = (cygpath ($ver->{'product_dir'}, 'w', 'u') . '/' .
$ver->{$checkpath});
-d $srcdir && return $ver;
$ver = find_msvs();
$srcdir = (cygpath ($ver->{'product_dir'}, 'w', 'u') . '/' .
$ver->{$checkpath});
-d $srcdir && return $ver;
return undef;
}
sub msvc_copy_dlls($)
{
my $dest = shift;
my $ver = msvc_find_version('dll_path');
defined $ver || return;
my $srcdir = (cygpath ($ver->{'product_dir'}, 'w', 'u') . '/' .
$ver->{'dll_path'});
copy_dll ($srcdir, "msvcp" . $ver->{'dll_suffix'} . ".dll",
$dest . $ver->{'dll_suffix'});
copy_dll ($srcdir, "msvcr" . $ver->{'dll_suffix'} . ".dll",
$dest . $ver->{'dll_suffix'});
if ($ver->{'dll_suffix'} >= 90) {
copy_dll ($srcdir, "msvcm" . $ver->{'dll_suffix'} . ".dll",
$dest . $ver->{'dll_suffix'});
copy_dll ($srcdir, "Microsoft.VC90.CRT.manifest", $dest . $ver->{'dll_suffix'});
}
}
if (!@ARGV) {
print_syntax();
exit 1;
}
my @commands = ();
my $opt;
while (@ARGV) {
$opt = shift @ARGV;
if ($opt eq '-w' || $opt eq '-u') {
$output_format = substr($opt, 1, 1);
} else {
push @commands, $opt;
}
}
while (@commands) {
$opt = shift @commands;
if (0) {
} elsif ($opt eq '--msvc-ver') {
print_msvc_ver();
} elsif ($opt eq '--msvc-copy-dlls') {
my $dest = shift @commands;
defined $dest || die "copy-dlls requires a destination directory";
msvc_copy_dlls( $dest );
} elsif ($opt eq '--msvs-productdir') {
print_msvs_productdir();
} elsif ($opt eq '--msvc-productdir') {
print_msvc_product_dir();
} elsif ($opt eq '--dotnetsdk-dir') {
print_dotnetsdk_dir();
} elsif ($opt eq '--csc-compilerdir') {
print_csc_compiler_dir();
} elsif ($opt eq '--psdk-home') {
print_psdk_home();
} elsif ($opt eq '--jdk-home') {
print_jdk_dir();
} elsif ($opt eq '--nsis-dir') {
print_nsis_dir();
} elsif ($opt eq '--help' || $opt eq '/?') {
print_syntax();
} else {
print "Unknown option '$opt'\n";
print_syntax();
exit 1;
}
}