xref: /aoo4110/main/oowintool (revision b1cdbd2c)
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