| #!/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'; | |
| my $aoo32OnWin64 = 0; | |
| 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; | |
| } | |
| $install = reg_get_value ("HKEY_LOCAL_MACHINE/SOFTWARE/Wow6432Node/" . $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; | |
| } | |
| $install = reg_get_value("HKEY_LOCAL_MACHINE/SOFTWARE/Wow6432Node/" . $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"); | |
| defined $dir || exit 1; | |
| print cygpath ($dir, 'w', $output_format); | |
| } | |
| sub print_jdk_dir() | |
| { | |
| my $softwareKey; | |
| if ($aoo32OnWin64) { | |
| $softwareKey = "HKEY_LOCAL_MACHINE/SOFTWARE/Wow6432Node/"; | |
| } else { | |
| $softwareKey = "HKEY_LOCAL_MACHINE/SOFTWARE/"; | |
| } | |
| # Java 1.9 had to be different: | |
| my $currentVersion = reg_get_value ($softwareKey . "JavaSoft/JDK/CurrentVersion"); | |
| if (defined $currentVersion) { | |
| my $newDir = reg_get_value ($softwareKey . "JavaSoft/JDK/" . $currentVersion . "/JavaHome"); | |
| if (defined $newDir) { | |
| print cygpath($newDir, 'w', $output_format); | |
| return; | |
| } | |
| } | |
| my $dir = | |
| reg_get_value ($softwareKey . "JavaSoft/Java\ Development\ Kit/1.8/JavaHome") || | |
| reg_get_value ($softwareKey . "JavaSoft/Java\ Development\ Kit/1.7/JavaHome") || | |
| reg_get_value ($softwareKey . "JavaSoft/Java\ Development\ Kit/1.6/JavaHome") || | |
| reg_get_value ($softwareKey . "JavaSoft/Java\ Development\ Kit/1.5/JavaHome") || | |
| reg_get_value ($softwareKey . "JavaSoft/Java\ Development\ Kit/1.4/JavaHome") || | |
| reg_get_value ($softwareKey . "JavaSoft/Java\ Development\ Kit/1.3/JavaHome"); | |
| defined $dir || exit 1; | |
| 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 ($opt eq '--aoo32-on-win64') { | |
| $aoo32OnWin64 = 1; | |
| } 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; | |
| } | |
| } | |