update dev300-m58
[ooovba.git] / oowintool
blob0b4be43f9a7e741d80fc515695f0172d9d634b4e
1 #!/usr/bin/perl -w
3 use File::Copy;
5 my $output_format = 'u';
7 sub reg_get_value($)
9 # it is believed that the registry moves keys around
10 # depending on OS version, this will de-mangle that
11 my $key = shift;
12 my $fhandle;
13 my $value;
15 open ($fhandle, "/proc/registry/$key") || return;
16 # reg keys have 0x00 0x5c at the end
17 $value = (split /\0/, <$fhandle>)[0];
18 close ($fhandle);
20 if ( defined $value ) {
21 chomp ($value);
22 $value =~ s|\r\n||;
23 # print "Value '$value' at '$key'\n";
26 return $value;
29 sub reg_find_key($)
31 # it is believed that the registry moves keys around
32 # depending on OS version, this will de-mangle that
33 my $key = shift;
34 $key =~ s| |\\ |;
35 $key = `cd /proc/registry/ ; ls $key`;
37 return $key;
40 sub print_syntax()
42 print "oowintool [option] ...\n";
43 print " encoding options\n";
44 print " -w - windows form\n";
45 print " -u - unix form (default)\n";
46 print " commands:\n";
47 print " --msvc-ver - dump version of MSVC eg. 6.0\n";
48 print " --msvc-copy-dlls <dest> - copy msvc[pr]??.dlls into <dest>/msvcp??/\n";
49 print " --msvc-copy-instmsi <dest> - copy instmsia.exe, insmsiw.exe into <dest>\n";
50 print " --msvc-productdir - dump productdir\n";
51 print " --msvs-productdir - dump productdir\n";
52 print " --dotnetsdk-dir - dump .Net SDK path\n";
53 print " --csc-compilerdir - dump .Net SDK compiler path\n";
54 print " --psdk-home - dump psdk install dir\n";
55 print " --jdk-home - dump the jdk install dir\n";
56 print " --nsis-dir - dump NSIS path\n";
57 print " --help - this message\n";
60 sub cygpath($$$)
62 my ($path, $input_format, $format) = @_;
64 return $path if ( ! defined $path );
65 # Strip trailing path separators
66 if ($input_format eq 'u') {
67 $path =~ s|/*\s*$||;
68 } else {
69 $path =~ s|\\*\s*$||;
72 # 'Unterminated quoted string errors' from 'ash' when
73 # forking cygpath so - reimplement cygpath in perl [ gack ]
74 if ($format eq 'u' && $input_format eq 'w') {
75 $path =~ s|\\|/|g;
76 $path =~ s|([a-zA-Z]):/|/cygdrive/$1/|g;
78 elsif ($format eq 'w' && $input_format eq 'u') {
79 $path =~ s|/cygdrive/([a-zA-Z])/|/$1/|g;
80 $path =~ s|/|\\|g;
83 return $path;
86 sub print_path($$)
88 my ($path, $unix) = @_;
90 $path = cygpath ($path, $unix, $output_format);
92 print $path;
95 sub print_psdk_home()
97 my ($value, $key);
98 $value = reg_get_value ('HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Microsoft SDKs/Windows/v6.1/InstallationFolder');
99 if (!defined $value)
101 $value = reg_get_value ('HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Microsoft SDKs/Windows/CurrentInstallFolder');
103 if (!defined $value)
105 $value = reg_get_value ('HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/MicrosoftSDK/Directories/Install Dir');
107 if (!defined $value)
109 $key = reg_find_key ('HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/MicrosoftSDK/InstalledSDKs/*/Install Dir');
110 $value = reg_get_value ($key);
112 if (!defined $value)
114 my $dir = cygpath (find_msvc()->{'product_dir'}, 'w', $output_format);
115 $value = `/bin/find "$dir" -iname platformsdk | head -n 1`;
118 defined $value || die "psdk not found";
120 print cygpath ($value, 'w', $output_format);
123 my %msvc_net_2003 = (
124 'ver' => '7.1',
125 'key' => 'Microsoft/VisualStudio/7.1/Setup/VC/ProductDir',
126 'instmsi_path' => '../Common7/Tools/Deployment/MsiRedist',
127 'dll_path' => '../Visual Studio .NET Professional 2003 - English',
128 'dll_suffix' => '71'
130 my %msvs_net_2003 = (
131 'ver' => '7.1',
132 'key' => 'Microsoft/VisualStudio/7.1/Setup/VS/ProductDir',
133 'instmsi_path' => 'Common7/Tools/Deployment/MsiRedist',
134 'dll_path' => 'Visual Studio .NET Professional 2003 - English',
135 'dll_suffix' => '71'
137 my %msvs_net_2003_ea = (
138 'ver' => '7.1',
139 'key' => 'Microsoft/VisualStudio/7.1/Setup/VS/ProductDir',
140 'instmsi_path' => 'Common7/Tools/Deployment/MsiRedist',
141 'dll_path' => 'Visual Studio .NET Enterprise Architect 2003 - English', # testme ...
142 'dll_suffix' => '71'
144 my %msvs_express_2005 = (
145 'ver' => '8.0',
146 'key' => 'Microsoft/VCExpress/8.0/Setup/VS/ProductDir',
147 'instmsi_path' => '../SDK/v2.0/BootStrapper/Packages/InstMSI',
148 'dll_path' => '../SDK/v2.0/Bin',
149 'dll_suffix' => '80'
151 my %msvc_express_2005 = (
152 'ver' => '8.0',
153 'key' => 'Microsoft/VCExpress/8.0/Setup/VC/ProductDir',
154 'instmsi_path' => '../SDK/v2.0/BootStrapper/Packages/InstMSI',
155 'dll_path' => '../SDK/v2.0/Bin',
156 'dll_suffix' => '80'
158 my %msvs_2005 = (
159 'ver' => '8.0',
160 'key' => 'Microsoft/VisualStudio/8.0/Setup/VS/ProductDir',
161 'instmsi_path' => 'SDK/v2.0/BootStrapper/Packages/InstMSI',
162 'dll_path' => 'Visual Studio .NET Professional 2005 - English',
163 'dll_suffix' => '80'
165 my %msvc_2005 = (
166 'ver' => '8.0',
167 'key' => 'Microsoft/VisualStudio/8.0/Setup/VC/ProductDir',
168 'instmsi_path' => '../SDK/v2.0/BootStrapper/Packages/InstMSI',
169 'dll_path' => '../SDK/v2.0/Bin',
170 'dll_suffix' => '80'
172 my %msvs_2008 = (
173 'ver' => '9.0',
174 'key' => 'Microsoft/VisualStudio/9.0/Setup/VS/ProductDir',
175 'instmsi_path' => '?',
176 'dll_path' => 'VC/redist/x86/Microsoft.VC90.CRT',
177 'dll_suffix' => '90'
179 my %msvc_2008 = (
180 'ver' => '9.0',
181 'key' => 'Microsoft/VisualStudio/9.0/Setup/VC/ProductDir',
182 'instmsi_path' => '?',
183 'dll_path' => 'redist/x86/Microsoft.VC90.CRT',
184 'dll_suffix' => '90'
186 my %msvs_express_2008 = (
187 'ver' => '9.0',
188 'key' => 'Microsoft/VCExpress/9.0/Setup/VS/ProductDir',
189 'instmsi_path' => '?',
190 'dll_path' => 'VC/redist/x86/Microsoft.VC90.CRT',
191 'dll_suffix' => '90'
193 my %msvc_express_2008 = (
194 'ver' => '9.0',
195 'key' => 'Microsoft/VCExpress/9.0/Setup/VC/ProductDir',
196 'instmsi_path' => '?',
197 'dll_path' => 'redist/x86/Microsoft.VC90.CRT',
198 'dll_suffix' => '90'
201 sub find_msvs()
203 my @ms_versions = ( \%msvs_2008, \%msvs_express_2008, \%msvs_2005, \%msvs_express_2005, \%msvs_net_2003_ea, \%msvs_net_2003 );
205 for $ver (@ms_versions)
207 my $install = reg_get_value ("HKEY_LOCAL_MACHINE/SOFTWARE/" . $ver->{'key'});
208 if (defined $install && $install ne '') {
209 $ver->{'product_dir'} = $install;
210 return $ver;
213 die "Can't find MS Visual Studio / VC++";
216 sub find_msvc()
218 my @ms_versions = ( \%msvc_2008, \%msvc_express_2008, \%msvc_2005, \%msvc_express_2005, \%msvc_net_2003 );
220 for $ver (@ms_versions)
222 my $install = reg_get_value ("HKEY_LOCAL_MACHINE/SOFTWARE/" . $ver->{'key'});
223 if (defined $install && $install ne '') {
224 $ver->{'product_dir'} = $install;
225 return $ver;
228 die "Can't find MS Visual Studio / VC++";
231 sub print_msvc_ver()
233 my $ver = find_msvc();
234 print $ver->{'ver'};
237 sub print_msvc_product_dir()
239 my $ver = find_msvc();
240 print cygpath ($ver->{'product_dir'}, 'w', $output_format);
243 sub print_msvs_productdir()
245 my $ver = find_msvs();
246 print cygpath ($ver->{'product_dir'}, 'w', $output_format);
249 sub print_csc_compiler_dir()
251 my $dir = cygpath (reg_get_value ("HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/.NETFramework/InstallRoot"), 'w', $output_format);
252 my $csc_exe = `/bin/find "$dir" -iname csc.exe | grep "v2\." | head -n 1`;
253 print `dirname $csc_exe`;
256 sub print_dotnetsdk_dir()
258 my $dir =
259 reg_get_value ("HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/.NETFramework/sdkInstallRootv1.1") ||
260 reg_get_value ("HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/.NETFramework/sdkInstallRootv2.0");
261 print cygpath ($dir, 'w', $output_format);
264 sub print_jdk_dir()
266 my $dir =
267 reg_get_value ("HKEY_LOCAL_MACHINE/SOFTWARE/JavaSoft/Java\ Development\ Kit/1.5/JavaHome") ||
268 reg_get_value ("HKEY_LOCAL_MACHINE/SOFTWARE/JavaSoft/Java\ Development\ Kit/1.4/JavaHome") ||
269 reg_get_value ("HKEY_LOCAL_MACHINE/SOFTWARE/JavaSoft/Java\ Development\ Kit/1.3/JavaHome");
270 print cygpath($dir, 'w', $output_format);
273 sub print_nsis_dir()
275 my $dir = reg_get_value ("HKEY_LOCAL_MACHINE/SOFTWARE/NSIS/@");
276 print cygpath ($dir, 'w', $output_format) if defined $dir;
279 sub copy_dll($$$)
281 my ($src, $fname, $dest) = @_;
283 -f "$src/$fname" || die "can't find $src";
284 -d $dest || die "no directory $dest";
286 print STDERR "Copying $src/$fname to $dest\n";
287 copy ("$src/$fname", $dest) || die "copy failed: $!";
288 chmod (0755, "$dest/$fname") || die "failed to set dll executable: $!";
291 sub msvc_find_version($)
293 my $checkpath = shift;
294 my $ver = find_msvc();
295 my $srcdir = (cygpath ($ver->{'product_dir'}, 'w', 'u') . '/' .
296 $ver->{$checkpath});
297 -d $srcdir && return $ver;
298 $ver = find_msvs();
299 $srcdir = (cygpath ($ver->{'product_dir'}, 'w', 'u') . '/' .
300 $ver->{$checkpath});
301 -d $srcdir && return $ver;
302 return undef;
305 sub msvc_copy_dlls($)
307 my $dest = shift;
308 my $ver = msvc_find_version('dll_path');
309 defined $ver || return;
310 my $srcdir = (cygpath ($ver->{'product_dir'}, 'w', 'u') . '/' .
311 $ver->{'dll_path'});
313 copy_dll ($srcdir, "msvcp" . $ver->{'dll_suffix'} . ".dll",
314 $dest . $ver->{'dll_suffix'});
315 copy_dll ($srcdir, "msvcr" . $ver->{'dll_suffix'} . ".dll",
316 $dest . $ver->{'dll_suffix'});
317 if ($ver->{'dll_suffix'} >= 90) {
318 copy_dll ($srcdir, "msvcm" . $ver->{'dll_suffix'} . ".dll",
319 $dest . $ver->{'dll_suffix'});
320 copy_dll ($srcdir, "Microsoft.VC90.CRT.manifest", $dest . $ver->{'dll_suffix'});
324 sub msvc_copy_instmsi($)
326 my $dest = shift;
327 my $ver = msvc_find_version('instmsi_path');
328 defined $ver || return;
329 my $srcdir = (cygpath ($ver->{'product_dir'}, 'w', 'u') . '/' .
330 $ver->{'instmsi_path'});
332 copy_dll ($srcdir, "instmsia.exe",
333 $dest);
334 copy_dll ($srcdir, "instmsiw.exe",
335 $dest);
338 if (!@ARGV) {
339 print_syntax();
340 exit 1;
343 my @commands = ();
344 my $opt;
345 while (@ARGV) {
346 $opt = shift @ARGV;
348 if ($opt eq '-w' || $opt eq '-u') {
349 $output_format = substr($opt, 1, 1);
350 } else {
351 push @commands, $opt;
355 while (@commands) {
356 $opt = shift @commands;
358 if (0) {
359 } elsif ($opt eq '--msvc-ver') {
360 print_msvc_ver();
361 } elsif ($opt eq '--msvc-copy-dlls') {
362 my $dest = shift @commands;
363 defined $dest || die "copy-dlls requires a destination directory";
364 msvc_copy_dlls( $dest );
365 } elsif ($opt eq '--msvc-copy-instmsi') {
366 my $dest = shift @commands;
367 defined $dest || die "copy-instmsi requires a destination directory";
368 msvc_copy_instmsi( $dest );
369 } elsif ($opt eq '--msvs-productdir') {
370 print_msvs_productdir();
371 } elsif ($opt eq '--msvc-productdir') {
372 print_msvc_product_dir();
373 } elsif ($opt eq '--dotnetsdk-dir') {
374 print_dotnetsdk_dir();
375 } elsif ($opt eq '--csc-compilerdir') {
376 print_csc_compiler_dir();
377 } elsif ($opt eq '--psdk-home') {
378 print_psdk_home();
379 } elsif ($opt eq '--jdk-home') {
380 print_jdk_dir();
381 } elsif ($opt eq '--nsis-dir') {
382 print_nsis_dir();
383 } elsif ($opt eq '--help' || $opt eq '/?') {
384 print_syntax();
385 } else {
386 print "Unknown option '$opt'\n";
387 print_syntax();
388 exit 1;