fix typo
[LibreOffice.git] / oowintool
blob28f16da2f624c6cf45eb54ddac351ae959d5c00b
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 - print 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-msms <dest> - copy mscrt merge modules to <dest>/msm90/\n";
50 print " --msvc-copy-msms-64 <ds>- copy the x64 mscrt merge modules to <ds>/msm90/\n";
51 print " --msvc-productdir - print productdir\n";
52 print " --msvs-productdir - print productdir\n";
53 print " --dotnetsdk-dir - print .NET SDK path\n";
54 print " --csc-compilerdir - print .NET SDK compiler path\n";
55 print " --windows-sdk-home - print Windows SDK install dir\n";
56 print " --jdk-home - print the jdk install dir\n";
57 print " --help - print 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_windows_sdk_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 "Windows Sdk not found";
120 print cygpath ($value, 'w', $output_format);
123 my %msvs_2008 = (
124 'ver' => '9.0',
125 'key' => 'Microsoft/VisualStudio/9.0/Setup/VS/ProductDir',
126 'dll_path' => 'VC/redist/x86/Microsoft.VC90.CRT',
127 'dll_suffix' => '90'
129 my %msvc_2008 = (
130 'ver' => '9.0',
131 'key' => 'Microsoft/VisualStudio/9.0/Setup/VC/ProductDir',
132 'dll_path' => 'redist/x86/Microsoft.VC90.CRT',
133 'dll_suffix' => '90'
135 my %msvs_express_2008 = (
136 'ver' => '9.0',
137 'key' => 'Microsoft/VCExpress/9.0/Setup/VS/ProductDir',
138 'dll_path' => 'VC/redist/x86/Microsoft.VC90.CRT',
139 'dll_suffix' => '90'
141 my %msvc_express_2008 = (
142 'ver' => '9.0',
143 'key' => 'Microsoft/VCExpress/9.0/Setup/VC/ProductDir',
144 'dll_path' => 'redist/x86/Microsoft.VC90.CRT',
145 'dll_suffix' => '90'
147 my %msvs_2010 = (
148 'ver' => '10.0',
149 'key' => 'Microsoft/VisualStudio/10.0/Setup/VS/ProductDir',
150 'dll_path' => 'VC/redist/x86/Microsoft.VC100.CRT',
151 'dll_suffix' => '100'
153 my %msvc_2010 = (
154 'ver' => '10.0',
155 'key' => 'Microsoft/VisualStudio/10.0/Setup/VC/ProductDir',
156 'dll_path' => 'redist/x86/Microsoft.VC100.CRT',
157 'dll_suffix' => '100'
160 sub find_msvs()
162 my @ms_versions = ( \%msvs_2008, \%msvs_express_2008, \%msvs_2010 );
164 for $ver (@ms_versions)
166 my $install = reg_get_value ("HKEY_LOCAL_MACHINE/SOFTWARE/" . $ver->{'key'});
167 if (defined $install && $install ne '') {
168 $ver->{'product_dir'} = $install;
169 return $ver;
172 die "Can't find MS Visual Studio / VC++";
175 sub find_msvc()
177 my @ms_versions = ( \%msvc_2008, \%msvc_express_2008, \%msvc_2010 );
179 for $ver (@ms_versions)
181 my $install = reg_get_value ("HKEY_LOCAL_MACHINE/SOFTWARE/" . $ver->{'key'});
182 if (defined $install && $install ne '') {
183 $ver->{'product_dir'} = $install;
184 return $ver;
187 die "Can't find MS Visual Studio / VC++";
190 sub print_msvc_ver()
192 my $ver = find_msvc();
193 print $ver->{'ver'};
196 sub print_msvc_product_dir()
198 my $ver = find_msvc();
199 print cygpath ($ver->{'product_dir'}, 'w', $output_format);
202 sub print_msvs_productdir()
204 my $ver = find_msvs();
205 print cygpath ($ver->{'product_dir'}, 'w', $output_format);
208 sub print_csc_compiler_dir()
210 my $dir = cygpath (reg_get_value ("HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/.NETFramework/InstallRoot"), 'w', $output_format);
211 my $csc_exe = `/bin/find "$dir" -iname csc.exe | grep "v3\.5\." | head -n 1` ||
212 `/bin/find "$dir" -iname csc.exe | grep "v4\." | head -n 1` ||
213 `/bin/find "$dir" -iname csc.exe | grep "v2\." | head -n 1`;
214 print `dirname $csc_exe`;
217 sub print_dotnetsdk_dir()
219 my $dir =
220 reg_get_value ("HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/.NETFramework/sdkInstallRootv1.1") ||
221 reg_get_value ("HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/.NETFramework/sdkInstallRootv2.0");
222 if ($dir) {
223 print cygpath ($dir, 'w', $output_format);
227 sub print_jdk_dir()
229 my $dir =
230 reg_get_value ("HKEY_LOCAL_MACHINE/SOFTWARE/JavaSoft/Java\ Development\ Kit/1.5/JavaHome") ||
231 reg_get_value ("HKEY_LOCAL_MACHINE/SOFTWARE/JavaSoft/Java\ Development\ Kit/1.6/JavaHome") ||
232 reg_get_value ("HKEY_LOCAL_MACHINE/SOFTWARE/JavaSoft/Java\ Development\ Kit/1.4/JavaHome") ||
233 reg_get_value ("HKEY_LOCAL_MACHINE/SOFTWARE/JavaSoft/Java\ Development\ Kit/1.3/JavaHome");
234 print cygpath($dir, 'w', $output_format);
237 sub copy_dll($$$)
239 my ($src, $fname, $dest) = @_;
241 -f "$src/$fname" || die "can't find $src";
242 -d $dest || die "no directory $dest";
244 print STDERR "Copying $src/$fname to $dest\n";
245 copy ("$src/$fname", $dest) || die "copy failed: $!";
246 chmod (0755, "$dest/$fname") || die "failed to set dll executable: $!";
249 sub msvc_find_version($)
251 my $checkpath = shift;
252 my $ver = find_msvc();
253 my $srcdir = (cygpath ($ver->{'product_dir'}, 'w', 'u') . '/' .
254 $ver->{$checkpath});
255 -d $srcdir && return $ver;
256 $ver = find_msvs();
257 $srcdir = (cygpath ($ver->{'product_dir'}, 'w', 'u') . '/' .
258 $ver->{$checkpath});
259 -d $srcdir && return $ver;
260 return undef;
263 sub msvc_copy_dlls($)
265 my $dest = shift;
266 my $ver = msvc_find_version('dll_path');
267 defined $ver || return;
268 my $srcdir = (cygpath ($ver->{'product_dir'}, 'w', 'u') . '/' .
269 $ver->{'dll_path'});
271 copy_dll ($srcdir, "msvcp" . $ver->{'dll_suffix'} . ".dll",
272 $dest . $ver->{'dll_suffix'});
273 copy_dll ($srcdir, "msvcr" . $ver->{'dll_suffix'} . ".dll",
274 $dest . $ver->{'dll_suffix'});
275 if ($ver->{'dll_suffix'} == 90) {
276 copy_dll ($srcdir, "msvcm" . $ver->{'dll_suffix'} . ".dll",
277 $dest . $ver->{'dll_suffix'});
278 copy_dll ($srcdir, "Microsoft.VC90.CRT.manifest", $dest . $ver->{'dll_suffix'});
282 sub msvc_copy_msms($$)
284 # $postfix is empty for x86, and '_x64' for x64
285 my ($dest, $postfix) = @_;
286 my $common_files_path = $ENV{"CommonProgramFiles(x86)"};
287 if (!defined $common_files_path) {
288 $common_files_path = $ENV{CommonProgramFiles};
289 if (!defined $common_files_path) {
290 $common_files_path = "C:\\Program Files\\Common Files";
294 defined $common_files_path || die "Windows CommonProgramFiles not found";
296 my $msm_path = (cygpath $common_files_path . "\\Merge Modules", 'w', $output_format);
297 foreach $fname ("Microsoft_VC90_CRT_x86$postfix.msm", "policy_9_0_Microsoft_VC90_CRT_x86$postfix.msm") {
298 print STDERR "Copying $msm_path/$fname to $dest\n";
299 copy ("$msm_path/$fname", $dest) || die "copy failed: $!";
303 if (!@ARGV) {
304 print_syntax();
305 exit 1;
308 my @commands = ();
309 my $opt;
310 while (@ARGV) {
311 $opt = shift @ARGV;
313 if ($opt eq '-w' || $opt eq '-u') {
314 $output_format = substr($opt, 1, 1);
315 } else {
316 push @commands, $opt;
320 while (@commands) {
321 $opt = shift @commands;
323 if (0) {
324 } elsif ($opt eq '--msvc-ver') {
325 print_msvc_ver();
326 } elsif ($opt eq '--msvc-copy-dlls') {
327 my $dest = shift @commands;
328 defined $dest || die "copy-dlls requires a destination directory";
329 msvc_copy_dlls( $dest );
330 } elsif ($opt eq '--msvc-copy-msms') {
331 my $dest = shift @commands;
332 defined $dest || die "copy-msms requires a destination directory";
333 msvc_copy_msms( $dest, '' );
334 } elsif ($opt eq '--msvc-copy-msms-64') {
335 my $dest = shift @commands;
336 defined $dest || die "copy-msms-64 requires a destination directory";
337 msvc_copy_msms( $dest, '_x64' );
338 } elsif ($opt eq '--msvs-productdir') {
339 print_msvs_productdir();
340 } elsif ($opt eq '--msvc-productdir') {
341 print_msvc_product_dir();
342 } elsif ($opt eq '--dotnetsdk-dir') {
343 print_dotnetsdk_dir();
344 } elsif ($opt eq '--csc-compilerdir') {
345 print_csc_compiler_dir();
346 } elsif ($opt eq '--windows-sdk-home') {
347 print_windows_sdk_home();
348 } elsif ($opt eq '--jdk-home') {
349 print_jdk_dir();
350 } elsif ($opt eq '--help' || $opt eq '/?') {
351 print_syntax();
352 } else {
353 print "Unknown option '$opt'\n";
354 print_syntax();
355 exit 1;