1*b1cdbd2cSJim Jagielski#!/usr/bin/perl -w 2*b1cdbd2cSJim Jagielski# ************************************************************* 3*b1cdbd2cSJim Jagielski# 4*b1cdbd2cSJim Jagielski# Licensed to the Apache Software Foundation (ASF) under one 5*b1cdbd2cSJim Jagielski# or more contributor license agreements. See the NOTICE file 6*b1cdbd2cSJim Jagielski# distributed with this work for additional information 7*b1cdbd2cSJim Jagielski# regarding copyright ownership. The ASF licenses this file 8*b1cdbd2cSJim Jagielski# to you under the Apache License, Version 2.0 (the 9*b1cdbd2cSJim Jagielski# "License"); you may not use this file except in compliance 10*b1cdbd2cSJim Jagielski# with the License. You may obtain a copy of the License at 11*b1cdbd2cSJim Jagielski# 12*b1cdbd2cSJim Jagielski# http://www.apache.org/licenses/LICENSE-2.0 13*b1cdbd2cSJim Jagielski# 14*b1cdbd2cSJim Jagielski# Unless required by applicable law or agreed to in writing, 15*b1cdbd2cSJim Jagielski# software distributed under the License is distributed on an 16*b1cdbd2cSJim Jagielski# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 17*b1cdbd2cSJim Jagielski# KIND, either express or implied. See the License for the 18*b1cdbd2cSJim Jagielski# specific language governing permissions and limitations 19*b1cdbd2cSJim Jagielski# under the License. 20*b1cdbd2cSJim Jagielski# 21*b1cdbd2cSJim Jagielski# ************************************************************* 22*b1cdbd2cSJim Jagielski 23*b1cdbd2cSJim Jagielskiuse File::Copy; 24*b1cdbd2cSJim Jagielski 25*b1cdbd2cSJim Jagielskimy $output_format = 'u'; 26*b1cdbd2cSJim Jagielski 27*b1cdbd2cSJim Jagielskisub reg_get_value($) 28*b1cdbd2cSJim Jagielski{ 29*b1cdbd2cSJim Jagielski # it is believed that the registry moves keys around 30*b1cdbd2cSJim Jagielski # depending on OS version, this will de-mangle that 31*b1cdbd2cSJim Jagielski my $key = shift; 32*b1cdbd2cSJim Jagielski my $fhandle; 33*b1cdbd2cSJim Jagielski my $value; 34*b1cdbd2cSJim Jagielski 35*b1cdbd2cSJim Jagielski open ($fhandle, "/proc/registry/$key") || return; 36*b1cdbd2cSJim Jagielski # reg keys have 0x00 0x5c at the end 37*b1cdbd2cSJim Jagielski $value = (split /\0/, <$fhandle>)[0]; 38*b1cdbd2cSJim Jagielski close ($fhandle); 39*b1cdbd2cSJim Jagielski 40*b1cdbd2cSJim Jagielski if ( defined $value ) { 41*b1cdbd2cSJim Jagielski chomp ($value); 42*b1cdbd2cSJim Jagielski $value =~ s|\r\n||; 43*b1cdbd2cSJim Jagielski# print "Value '$value' at '$key'\n"; 44*b1cdbd2cSJim Jagielski } 45*b1cdbd2cSJim Jagielski 46*b1cdbd2cSJim Jagielski return $value; 47*b1cdbd2cSJim Jagielski} 48*b1cdbd2cSJim Jagielski 49*b1cdbd2cSJim Jagielskisub reg_find_key($) 50*b1cdbd2cSJim Jagielski{ 51*b1cdbd2cSJim Jagielski # it is believed that the registry moves keys around 52*b1cdbd2cSJim Jagielski # depending on OS version, this will de-mangle that 53*b1cdbd2cSJim Jagielski my $key = shift; 54*b1cdbd2cSJim Jagielski $key =~ s| |\\ |; 55*b1cdbd2cSJim Jagielski $key = `cd /proc/registry/ ; ls $key`; 56*b1cdbd2cSJim Jagielski 57*b1cdbd2cSJim Jagielski return $key; 58*b1cdbd2cSJim Jagielski} 59*b1cdbd2cSJim Jagielski 60*b1cdbd2cSJim Jagielskisub print_syntax() 61*b1cdbd2cSJim Jagielski{ 62*b1cdbd2cSJim Jagielski print "oowintool [option] ...\n"; 63*b1cdbd2cSJim Jagielski print " encoding options\n"; 64*b1cdbd2cSJim Jagielski print " -w - windows form\n"; 65*b1cdbd2cSJim Jagielski print " -u - unix form (default)\n"; 66*b1cdbd2cSJim Jagielski print " commands:\n"; 67*b1cdbd2cSJim Jagielski print " --msvc-ver - dump version of MSVC eg. 6.0\n"; 68*b1cdbd2cSJim Jagielski print " --msvc-copy-dlls <dest> - copy msvc[pr]??.dlls into <dest>/msvcp??/\n"; 69*b1cdbd2cSJim Jagielski print " --msvc-productdir - dump productdir\n"; 70*b1cdbd2cSJim Jagielski print " --msvs-productdir - dump productdir\n"; 71*b1cdbd2cSJim Jagielski print " --dotnetsdk-dir - dump .Net SDK path\n"; 72*b1cdbd2cSJim Jagielski print " --csc-compilerdir - dump .Net SDK compiler path\n"; 73*b1cdbd2cSJim Jagielski print " --psdk-home - dump psdk install dir\n"; 74*b1cdbd2cSJim Jagielski print " --jdk-home - dump the jdk install dir\n"; 75*b1cdbd2cSJim Jagielski print " --nsis-dir - dump NSIS path\n"; 76*b1cdbd2cSJim Jagielski print " --help - this message\n"; 77*b1cdbd2cSJim Jagielski} 78*b1cdbd2cSJim Jagielski 79*b1cdbd2cSJim Jagielskisub cygpath($$$) 80*b1cdbd2cSJim Jagielski{ 81*b1cdbd2cSJim Jagielski my ($path, $input_format, $format) = @_; 82*b1cdbd2cSJim Jagielski 83*b1cdbd2cSJim Jagielski return $path if ( ! defined $path ); 84*b1cdbd2cSJim Jagielski # Strip trailing path separators 85*b1cdbd2cSJim Jagielski if ($input_format eq 'u') { 86*b1cdbd2cSJim Jagielski $path =~ s|/*\s*$||; 87*b1cdbd2cSJim Jagielski } else { 88*b1cdbd2cSJim Jagielski $path =~ s|\\*\s*$||; 89*b1cdbd2cSJim Jagielski } 90*b1cdbd2cSJim Jagielski 91*b1cdbd2cSJim Jagielski # 'Unterminated quoted string errors' from 'ash' when 92*b1cdbd2cSJim Jagielski # forking cygpath so - reimplement cygpath in perl [ gack ] 93*b1cdbd2cSJim Jagielski if ($format eq 'u' && $input_format eq 'w') { 94*b1cdbd2cSJim Jagielski $path =~ s|\\|/|g; 95*b1cdbd2cSJim Jagielski $path =~ s|([a-zA-Z]):/|/cygdrive/$1/|g; 96*b1cdbd2cSJim Jagielski } 97*b1cdbd2cSJim Jagielski elsif ($format eq 'w' && $input_format eq 'u') { 98*b1cdbd2cSJim Jagielski $path =~ s|/cygdrive/([a-zA-Z])/|/$1/|g; 99*b1cdbd2cSJim Jagielski $path =~ s|/|\\|g; 100*b1cdbd2cSJim Jagielski } 101*b1cdbd2cSJim Jagielski 102*b1cdbd2cSJim Jagielski return $path; 103*b1cdbd2cSJim Jagielski} 104*b1cdbd2cSJim Jagielski 105*b1cdbd2cSJim Jagielskisub print_path($$) 106*b1cdbd2cSJim Jagielski{ 107*b1cdbd2cSJim Jagielski my ($path, $unix) = @_; 108*b1cdbd2cSJim Jagielski 109*b1cdbd2cSJim Jagielski $path = cygpath ($path, $unix, $output_format); 110*b1cdbd2cSJim Jagielski 111*b1cdbd2cSJim Jagielski print $path; 112*b1cdbd2cSJim Jagielski} 113*b1cdbd2cSJim Jagielski 114*b1cdbd2cSJim Jagielskisub print_psdk_home() 115*b1cdbd2cSJim Jagielski{ 116*b1cdbd2cSJim Jagielski my ($value, $key); 117*b1cdbd2cSJim Jagielski $value = reg_get_value ('HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Microsoft SDKs/Windows/v6.1/InstallationFolder'); 118*b1cdbd2cSJim Jagielski if (!defined $value) 119*b1cdbd2cSJim Jagielski { 120*b1cdbd2cSJim Jagielski $value = reg_get_value ('HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Microsoft SDKs/Windows/CurrentInstallFolder'); 121*b1cdbd2cSJim Jagielski } 122*b1cdbd2cSJim Jagielski if (!defined $value) 123*b1cdbd2cSJim Jagielski { 124*b1cdbd2cSJim Jagielski $value = reg_get_value ('HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/MicrosoftSDK/Directories/Install Dir'); 125*b1cdbd2cSJim Jagielski } 126*b1cdbd2cSJim Jagielski if (!defined $value) 127*b1cdbd2cSJim Jagielski { 128*b1cdbd2cSJim Jagielski $key = reg_find_key ('HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/MicrosoftSDK/InstalledSDKs/*/Install Dir'); 129*b1cdbd2cSJim Jagielski $value = reg_get_value ($key); 130*b1cdbd2cSJim Jagielski } 131*b1cdbd2cSJim Jagielski if (!defined $value) 132*b1cdbd2cSJim Jagielski { 133*b1cdbd2cSJim Jagielski my $dir = cygpath (find_msvc()->{'product_dir'}, 'w', $output_format); 134*b1cdbd2cSJim Jagielski $value = `/bin/find "$dir" -iname platformsdk | head -n 1`; 135*b1cdbd2cSJim Jagielski } 136*b1cdbd2cSJim Jagielski 137*b1cdbd2cSJim Jagielski defined $value || die "psdk not found"; 138*b1cdbd2cSJim Jagielski 139*b1cdbd2cSJim Jagielski print cygpath ($value, 'w', $output_format); 140*b1cdbd2cSJim Jagielski} 141*b1cdbd2cSJim Jagielski 142*b1cdbd2cSJim Jagielskimy %msvc_net_2003 = ( 143*b1cdbd2cSJim Jagielski 'ver' => '7.1', 144*b1cdbd2cSJim Jagielski 'key' => 'Microsoft/VisualStudio/7.1/Setup/VC/ProductDir', 145*b1cdbd2cSJim Jagielski 'dll_path' => '../Visual Studio .NET Professional 2003 - English', 146*b1cdbd2cSJim Jagielski 'dll_suffix' => '71' 147*b1cdbd2cSJim Jagielski); 148*b1cdbd2cSJim Jagielskimy %msvs_net_2003 = ( 149*b1cdbd2cSJim Jagielski 'ver' => '7.1', 150*b1cdbd2cSJim Jagielski 'key' => 'Microsoft/VisualStudio/7.1/Setup/VS/ProductDir', 151*b1cdbd2cSJim Jagielski 'dll_path' => 'Visual Studio .NET Professional 2003 - English', 152*b1cdbd2cSJim Jagielski 'dll_suffix' => '71' 153*b1cdbd2cSJim Jagielski); 154*b1cdbd2cSJim Jagielskimy %msvs_net_2003_ea = ( 155*b1cdbd2cSJim Jagielski 'ver' => '7.1', 156*b1cdbd2cSJim Jagielski 'key' => 'Microsoft/VisualStudio/7.1/Setup/VS/ProductDir', 157*b1cdbd2cSJim Jagielski 'dll_path' => 'Visual Studio .NET Enterprise Architect 2003 - English', # testme ... 158*b1cdbd2cSJim Jagielski 'dll_suffix' => '71' 159*b1cdbd2cSJim Jagielski); 160*b1cdbd2cSJim Jagielskimy %msvs_express_2005 = ( 161*b1cdbd2cSJim Jagielski 'ver' => '8.0', 162*b1cdbd2cSJim Jagielski 'key' => 'Microsoft/VCExpress/8.0/Setup/VS/ProductDir', 163*b1cdbd2cSJim Jagielski 'dll_path' => '../SDK/v2.0/Bin', 164*b1cdbd2cSJim Jagielski 'dll_suffix' => '80' 165*b1cdbd2cSJim Jagielski); 166*b1cdbd2cSJim Jagielskimy %msvc_express_2005 = ( 167*b1cdbd2cSJim Jagielski 'ver' => '8.0', 168*b1cdbd2cSJim Jagielski 'key' => 'Microsoft/VCExpress/8.0/Setup/VC/ProductDir', 169*b1cdbd2cSJim Jagielski 'dll_path' => '../SDK/v2.0/Bin', 170*b1cdbd2cSJim Jagielski 'dll_suffix' => '80' 171*b1cdbd2cSJim Jagielski); 172*b1cdbd2cSJim Jagielskimy %msvs_2005 = ( 173*b1cdbd2cSJim Jagielski 'ver' => '8.0', 174*b1cdbd2cSJim Jagielski 'key' => 'Microsoft/VisualStudio/8.0/Setup/VS/ProductDir', 175*b1cdbd2cSJim Jagielski 'dll_path' => 'Visual Studio .NET Professional 2005 - English', 176*b1cdbd2cSJim Jagielski 'dll_suffix' => '80' 177*b1cdbd2cSJim Jagielski); 178*b1cdbd2cSJim Jagielskimy %msvc_2005 = ( 179*b1cdbd2cSJim Jagielski 'ver' => '8.0', 180*b1cdbd2cSJim Jagielski 'key' => 'Microsoft/VisualStudio/8.0/Setup/VC/ProductDir', 181*b1cdbd2cSJim Jagielski 'dll_path' => '../SDK/v2.0/Bin', 182*b1cdbd2cSJim Jagielski 'dll_suffix' => '80' 183*b1cdbd2cSJim Jagielski); 184*b1cdbd2cSJim Jagielskimy %msvs_2008 = ( 185*b1cdbd2cSJim Jagielski 'ver' => '9.0', 186*b1cdbd2cSJim Jagielski 'key' => 'Microsoft/VisualStudio/9.0/Setup/VS/ProductDir', 187*b1cdbd2cSJim Jagielski 'dll_path' => 'VC/redist/x86/Microsoft.VC90.CRT', 188*b1cdbd2cSJim Jagielski 'dll_suffix' => '90' 189*b1cdbd2cSJim Jagielski); 190*b1cdbd2cSJim Jagielskimy %msvc_2008 = ( 191*b1cdbd2cSJim Jagielski 'ver' => '9.0', 192*b1cdbd2cSJim Jagielski 'key' => 'Microsoft/VisualStudio/9.0/Setup/VC/ProductDir', 193*b1cdbd2cSJim Jagielski 'dll_path' => 'redist/x86/Microsoft.VC90.CRT', 194*b1cdbd2cSJim Jagielski 'dll_suffix' => '90' 195*b1cdbd2cSJim Jagielski); 196*b1cdbd2cSJim Jagielskimy %msvs_express_2008 = ( 197*b1cdbd2cSJim Jagielski 'ver' => '9.0', 198*b1cdbd2cSJim Jagielski 'key' => 'Microsoft/VCExpress/9.0/Setup/VS/ProductDir', 199*b1cdbd2cSJim Jagielski 'dll_path' => 'VC/redist/x86/Microsoft.VC90.CRT', 200*b1cdbd2cSJim Jagielski 'dll_suffix' => '90' 201*b1cdbd2cSJim Jagielski); 202*b1cdbd2cSJim Jagielskimy %msvc_express_2008 = ( 203*b1cdbd2cSJim Jagielski 'ver' => '9.0', 204*b1cdbd2cSJim Jagielski 'key' => 'Microsoft/VCExpress/9.0/Setup/VC/ProductDir', 205*b1cdbd2cSJim Jagielski 'dll_path' => 'redist/x86/Microsoft.VC90.CRT', 206*b1cdbd2cSJim Jagielski 'dll_suffix' => '90' 207*b1cdbd2cSJim Jagielski); 208*b1cdbd2cSJim Jagielski 209*b1cdbd2cSJim Jagielskisub find_msvs() 210*b1cdbd2cSJim Jagielski{ 211*b1cdbd2cSJim Jagielski my @ms_versions = ( \%msvs_2008, \%msvs_express_2008, \%msvs_2005, \%msvs_express_2005, \%msvs_net_2003_ea, \%msvs_net_2003 ); 212*b1cdbd2cSJim Jagielski 213*b1cdbd2cSJim Jagielski for $ver (@ms_versions) 214*b1cdbd2cSJim Jagielski { 215*b1cdbd2cSJim Jagielski my $install = reg_get_value ("HKEY_LOCAL_MACHINE/SOFTWARE/" . $ver->{'key'}); 216*b1cdbd2cSJim Jagielski if (defined $install && $install ne '') { 217*b1cdbd2cSJim Jagielski $ver->{'product_dir'} = $install; 218*b1cdbd2cSJim Jagielski return $ver; 219*b1cdbd2cSJim Jagielski } 220*b1cdbd2cSJim Jagielski } 221*b1cdbd2cSJim Jagielski die "Can't find MS Visual Studio / VC++"; 222*b1cdbd2cSJim Jagielski} 223*b1cdbd2cSJim Jagielski 224*b1cdbd2cSJim Jagielskisub find_msvc() 225*b1cdbd2cSJim Jagielski{ 226*b1cdbd2cSJim Jagielski my @ms_versions = ( \%msvc_2008, \%msvc_express_2008, \%msvc_2005, \%msvc_express_2005, \%msvc_net_2003 ); 227*b1cdbd2cSJim Jagielski 228*b1cdbd2cSJim Jagielski for $ver (@ms_versions) 229*b1cdbd2cSJim Jagielski { 230*b1cdbd2cSJim Jagielski my $install = reg_get_value ("HKEY_LOCAL_MACHINE/SOFTWARE/" . $ver->{'key'}); 231*b1cdbd2cSJim Jagielski if (defined $install && $install ne '') { 232*b1cdbd2cSJim Jagielski $ver->{'product_dir'} = $install; 233*b1cdbd2cSJim Jagielski return $ver; 234*b1cdbd2cSJim Jagielski } 235*b1cdbd2cSJim Jagielski } 236*b1cdbd2cSJim Jagielski die "Can't find MS Visual Studio / VC++"; 237*b1cdbd2cSJim Jagielski} 238*b1cdbd2cSJim Jagielski 239*b1cdbd2cSJim Jagielskisub print_msvc_ver() 240*b1cdbd2cSJim Jagielski{ 241*b1cdbd2cSJim Jagielski my $ver = find_msvc(); 242*b1cdbd2cSJim Jagielski print $ver->{'ver'}; 243*b1cdbd2cSJim Jagielski} 244*b1cdbd2cSJim Jagielski 245*b1cdbd2cSJim Jagielskisub print_msvc_product_dir() 246*b1cdbd2cSJim Jagielski{ 247*b1cdbd2cSJim Jagielski my $ver = find_msvc(); 248*b1cdbd2cSJim Jagielski print cygpath ($ver->{'product_dir'}, 'w', $output_format); 249*b1cdbd2cSJim Jagielski} 250*b1cdbd2cSJim Jagielski 251*b1cdbd2cSJim Jagielskisub print_msvs_productdir() 252*b1cdbd2cSJim Jagielski{ 253*b1cdbd2cSJim Jagielski my $ver = find_msvs(); 254*b1cdbd2cSJim Jagielski print cygpath ($ver->{'product_dir'}, 'w', $output_format); 255*b1cdbd2cSJim Jagielski} 256*b1cdbd2cSJim Jagielski 257*b1cdbd2cSJim Jagielskisub print_csc_compiler_dir() 258*b1cdbd2cSJim Jagielski{ 259*b1cdbd2cSJim Jagielski my $dir = cygpath (reg_get_value ("HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/.NETFramework/InstallRoot"), 'w', $output_format); 260*b1cdbd2cSJim Jagielski my $csc_exe = `/bin/find "$dir" -iname csc.exe | grep "v2\." | head -n 1`; 261*b1cdbd2cSJim Jagielski print `dirname $csc_exe`; 262*b1cdbd2cSJim Jagielski} 263*b1cdbd2cSJim Jagielski 264*b1cdbd2cSJim Jagielskisub print_dotnetsdk_dir() 265*b1cdbd2cSJim Jagielski{ 266*b1cdbd2cSJim Jagielski my $dir = 267*b1cdbd2cSJim Jagielski reg_get_value ("HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/.NETFramework/sdkInstallRootv1.1") || 268*b1cdbd2cSJim Jagielski reg_get_value ("HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/.NETFramework/sdkInstallRootv2.0"); 269*b1cdbd2cSJim Jagielski print cygpath ($dir, 'w', $output_format); 270*b1cdbd2cSJim Jagielski} 271*b1cdbd2cSJim Jagielski 272*b1cdbd2cSJim Jagielskisub print_jdk_dir() 273*b1cdbd2cSJim Jagielski{ 274*b1cdbd2cSJim Jagielski my $dir = 275*b1cdbd2cSJim Jagielski reg_get_value ("HKEY_LOCAL_MACHINE/SOFTWARE/JavaSoft/Java\ Development\ Kit/1.7/JavaHome") || 276*b1cdbd2cSJim Jagielski reg_get_value ("HKEY_LOCAL_MACHINE/SOFTWARE/JavaSoft/Java\ Development\ Kit/1.6/JavaHome") || 277*b1cdbd2cSJim Jagielski reg_get_value ("HKEY_LOCAL_MACHINE/SOFTWARE/JavaSoft/Java\ Development\ Kit/1.5/JavaHome") || 278*b1cdbd2cSJim Jagielski reg_get_value ("HKEY_LOCAL_MACHINE/SOFTWARE/JavaSoft/Java\ Development\ Kit/1.4/JavaHome") || 279*b1cdbd2cSJim Jagielski reg_get_value ("HKEY_LOCAL_MACHINE/SOFTWARE/JavaSoft/Java\ Development\ Kit/1.3/JavaHome"); 280*b1cdbd2cSJim Jagielski print cygpath($dir, 'w', $output_format); 281*b1cdbd2cSJim Jagielski} 282*b1cdbd2cSJim Jagielski 283*b1cdbd2cSJim Jagielskisub print_nsis_dir() 284*b1cdbd2cSJim Jagielski{ 285*b1cdbd2cSJim Jagielski my $dir = reg_get_value ("HKEY_LOCAL_MACHINE/SOFTWARE/NSIS/@"); 286*b1cdbd2cSJim Jagielski print cygpath ($dir, 'w', $output_format) if defined $dir; 287*b1cdbd2cSJim Jagielski} 288*b1cdbd2cSJim Jagielski 289*b1cdbd2cSJim Jagielskisub copy_dll($$$) 290*b1cdbd2cSJim Jagielski{ 291*b1cdbd2cSJim Jagielski my ($src, $fname, $dest) = @_; 292*b1cdbd2cSJim Jagielski 293*b1cdbd2cSJim Jagielski -f "$src/$fname" || die "can't find $src"; 294*b1cdbd2cSJim Jagielski -d $dest || die "no directory $dest"; 295*b1cdbd2cSJim Jagielski 296*b1cdbd2cSJim Jagielski print STDERR "Copying $src/$fname to $dest\n"; 297*b1cdbd2cSJim Jagielski copy ("$src/$fname", $dest) || die "copy failed: $!"; 298*b1cdbd2cSJim Jagielski chmod (0755, "$dest/$fname") || die "failed to set dll executable: $!"; 299*b1cdbd2cSJim Jagielski} 300*b1cdbd2cSJim Jagielski 301*b1cdbd2cSJim Jagielskisub msvc_find_version($) 302*b1cdbd2cSJim Jagielski{ 303*b1cdbd2cSJim Jagielski my $checkpath = shift; 304*b1cdbd2cSJim Jagielski my $ver = find_msvc(); 305*b1cdbd2cSJim Jagielski my $srcdir = (cygpath ($ver->{'product_dir'}, 'w', 'u') . '/' . 306*b1cdbd2cSJim Jagielski $ver->{$checkpath}); 307*b1cdbd2cSJim Jagielski -d $srcdir && return $ver; 308*b1cdbd2cSJim Jagielski $ver = find_msvs(); 309*b1cdbd2cSJim Jagielski $srcdir = (cygpath ($ver->{'product_dir'}, 'w', 'u') . '/' . 310*b1cdbd2cSJim Jagielski $ver->{$checkpath}); 311*b1cdbd2cSJim Jagielski -d $srcdir && return $ver; 312*b1cdbd2cSJim Jagielski return undef; 313*b1cdbd2cSJim Jagielski} 314*b1cdbd2cSJim Jagielski 315*b1cdbd2cSJim Jagielskisub msvc_copy_dlls($) 316*b1cdbd2cSJim Jagielski{ 317*b1cdbd2cSJim Jagielski my $dest = shift; 318*b1cdbd2cSJim Jagielski my $ver = msvc_find_version('dll_path'); 319*b1cdbd2cSJim Jagielski defined $ver || return; 320*b1cdbd2cSJim Jagielski my $srcdir = (cygpath ($ver->{'product_dir'}, 'w', 'u') . '/' . 321*b1cdbd2cSJim Jagielski $ver->{'dll_path'}); 322*b1cdbd2cSJim Jagielski 323*b1cdbd2cSJim Jagielski copy_dll ($srcdir, "msvcp" . $ver->{'dll_suffix'} . ".dll", 324*b1cdbd2cSJim Jagielski $dest . $ver->{'dll_suffix'}); 325*b1cdbd2cSJim Jagielski copy_dll ($srcdir, "msvcr" . $ver->{'dll_suffix'} . ".dll", 326*b1cdbd2cSJim Jagielski $dest . $ver->{'dll_suffix'}); 327*b1cdbd2cSJim Jagielski if ($ver->{'dll_suffix'} >= 90) { 328*b1cdbd2cSJim Jagielski copy_dll ($srcdir, "msvcm" . $ver->{'dll_suffix'} . ".dll", 329*b1cdbd2cSJim Jagielski $dest . $ver->{'dll_suffix'}); 330*b1cdbd2cSJim Jagielski copy_dll ($srcdir, "Microsoft.VC90.CRT.manifest", $dest . $ver->{'dll_suffix'}); 331*b1cdbd2cSJim Jagielski } 332*b1cdbd2cSJim Jagielski} 333*b1cdbd2cSJim Jagielski 334*b1cdbd2cSJim Jagielskiif (!@ARGV) { 335*b1cdbd2cSJim Jagielski print_syntax(); 336*b1cdbd2cSJim Jagielski exit 1; 337*b1cdbd2cSJim Jagielski} 338*b1cdbd2cSJim Jagielski 339*b1cdbd2cSJim Jagielskimy @commands = (); 340*b1cdbd2cSJim Jagielskimy $opt; 341*b1cdbd2cSJim Jagielskiwhile (@ARGV) { 342*b1cdbd2cSJim Jagielski $opt = shift @ARGV; 343*b1cdbd2cSJim Jagielski 344*b1cdbd2cSJim Jagielski if ($opt eq '-w' || $opt eq '-u') { 345*b1cdbd2cSJim Jagielski $output_format = substr($opt, 1, 1); 346*b1cdbd2cSJim Jagielski } else { 347*b1cdbd2cSJim Jagielski push @commands, $opt; 348*b1cdbd2cSJim Jagielski } 349*b1cdbd2cSJim Jagielski} 350*b1cdbd2cSJim Jagielski 351*b1cdbd2cSJim Jagielskiwhile (@commands) { 352*b1cdbd2cSJim Jagielski $opt = shift @commands; 353*b1cdbd2cSJim Jagielski 354*b1cdbd2cSJim Jagielski if (0) { 355*b1cdbd2cSJim Jagielski } elsif ($opt eq '--msvc-ver') { 356*b1cdbd2cSJim Jagielski print_msvc_ver(); 357*b1cdbd2cSJim Jagielski } elsif ($opt eq '--msvc-copy-dlls') { 358*b1cdbd2cSJim Jagielski my $dest = shift @commands; 359*b1cdbd2cSJim Jagielski defined $dest || die "copy-dlls requires a destination directory"; 360*b1cdbd2cSJim Jagielski msvc_copy_dlls( $dest ); 361*b1cdbd2cSJim Jagielski } elsif ($opt eq '--msvs-productdir') { 362*b1cdbd2cSJim Jagielski print_msvs_productdir(); 363*b1cdbd2cSJim Jagielski } elsif ($opt eq '--msvc-productdir') { 364*b1cdbd2cSJim Jagielski print_msvc_product_dir(); 365*b1cdbd2cSJim Jagielski } elsif ($opt eq '--dotnetsdk-dir') { 366*b1cdbd2cSJim Jagielski print_dotnetsdk_dir(); 367*b1cdbd2cSJim Jagielski } elsif ($opt eq '--csc-compilerdir') { 368*b1cdbd2cSJim Jagielski print_csc_compiler_dir(); 369*b1cdbd2cSJim Jagielski } elsif ($opt eq '--psdk-home') { 370*b1cdbd2cSJim Jagielski print_psdk_home(); 371*b1cdbd2cSJim Jagielski } elsif ($opt eq '--jdk-home') { 372*b1cdbd2cSJim Jagielski print_jdk_dir(); 373*b1cdbd2cSJim Jagielski } elsif ($opt eq '--nsis-dir') { 374*b1cdbd2cSJim Jagielski print_nsis_dir(); 375*b1cdbd2cSJim Jagielski } elsif ($opt eq '--help' || $opt eq '/?') { 376*b1cdbd2cSJim Jagielski print_syntax(); 377*b1cdbd2cSJim Jagielski } else { 378*b1cdbd2cSJim Jagielski print "Unknown option '$opt'\n"; 379*b1cdbd2cSJim Jagielski print_syntax(); 380*b1cdbd2cSJim Jagielski exit 1; 381*b1cdbd2cSJim Jagielski } 382*b1cdbd2cSJim Jagielski} 383*b1cdbd2cSJim Jagielski 384