diff options
Diffstat (limited to 'oowintool')
-rwxr-xr-x | oowintool | 336 |
1 files changed, 336 insertions, 0 deletions
diff --git a/oowintool b/oowintool new file mode 100755 index 000000000000..fc18a8dd0347 --- /dev/null +++ b/oowintool @@ -0,0 +1,336 @@ +#!/usr/bin/perl -w + +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 " --windows-sdk-home - dump Windows SDK 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_windows_sdk_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 "Windows Sdk not found"; + + print cygpath ($value, 'w', $output_format); +} + +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' +); +my %msvs_2010 = ( + 'ver' => '10.0', + 'key' => 'Microsoft/VisualStudio/10.0/Setup/VS/ProductDir', + 'dll_path' => 'VC/redist/x86/Microsoft.VC100.CRT', + 'dll_suffix' => '100' +); +my %msvc_2010 = ( + 'ver' => '10.0', + 'key' => 'Microsoft/VisualStudio/10.0/Setup/VC/ProductDir', + 'dll_path' => 'redist/x86/Microsoft.VC100.CRT', + 'dll_suffix' => '100' +); + +sub find_msvs() +{ + my @ms_versions = ( \%msvs_2008, \%msvs_express_2008, \%msvs_2010 ); + + 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_2010 ); + + 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 "v3\.5\." | head -n 1` || + `/bin/find "$dir" -iname csc.exe | grep "v4\." | head -n 1` || + `/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"); + if ($dir) { + print cygpath ($dir, 'w', $output_format); + } +} + +sub print_jdk_dir() +{ + my $dir = + 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.6/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 '--windows-sdk-home') { + print_windows_sdk_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; + } +} + |