1
+package Generators::Vcproj;
2
+require Exporter;
3
+
4
+use strict;
5
+use vars qw($VERSION);
6
+
7
+our $VERSION = '1.00';
8
+our(@ISA, @EXPORT, @EXPORT_OK, @AVAILABLE);
9
+@ISA = qw(Exporter);
10
+
11
+BEGIN {
12
+ push @EXPORT_OK, qw(generate);
13
+}
14
+
15
+my $guid_index = 0;
16
+my @GUIDS = (
17
+ "{E07B9989-2BF7-4F21-8918-BE22BA467AC3}",
18
+ "{278FFB51-0296-4A44-A81A-22B87B7C3592}",
19
+ "{7346A2C4-F0FD-444F-9EBE-1AF23B2B5650}",
20
+ "{67F421AC-EB34-4D49-820B-3196807B423F}",
21
+ "{385DCFE1-CC8C-4211-A451-80FCFC31CA51}",
22
+ "{97CC46C5-D2CC-4D26-B634-E75792B79916}",
23
+ "{C7CE21FE-6EF8-4012-A5C7-A22BCEDFBA11}",
24
+ "{51575134-3FDF-42D1-BABD-3FB12669C6C9}",
25
+ "{0AE195E4-9823-4B87-8E6F-20C5614AF2FF}",
26
+ "{4B918255-67CA-43BB-A46C-26704B666E6B}",
27
+ "{18CCFEEF-C8EE-4CC1-A265-26F95C9F4649}",
28
+ "{5D5D90FA-01B7-4973-AFE5-CA88C53AC197}",
29
+ "{1F054320-036D-49E1-B384-FB5DF0BC8AC0}",
30
+ "{7CED65EE-F2D9-4171-825B-C7D561FE5786}",
31
+ "{8D341679-0F07-4664-9A56-3BA0DE88B9BC}",
32
+ "{C189FEDC-2957-4BD7-9FA4-7622241EA145}",
33
+ "{66844203-1B9F-4C53-9274-164FFF95B847}",
34
+ "{E4FEA145-DECC-440D-AEEA-598CF381FD43}",
35
+ "{73300A8E-C8AC-41B0-B555-4F596B681BA7}",
36
+ "{873FDEB1-D01D-40BF-A1BF-8BBC58EC0F51}",
37
+ "{7922C8BE-76C5-4AC6-8BF7-885C0F93B782}",
38
+ "{E245D370-308B-4A49-BFC1-1E527827975F}",
39
+ "{F6FA957B-66FC-4ED7-B260-E59BBE4FE813}",
40
+ "{E6055070-0198-431A-BC49-8DB6CEE770AE}",
41
+ "{54159234-C3EB-43DA-906B-CE5DA5C74654}",
42
+ "{594CFC35-0B60-46F6-B8EF-9983ACC1187D}",
43
+ "{D93FCAB7-1F01-48D2-B832-F761B83231A5}",
44
+ "{DBA5E6AC-E7BE-42D3-8703-4E787141526E}",
45
+ "{6171953F-DD26-44C7-A3BE-CC45F86FC11F}",
46
+ "{9E19DDBE-F5E4-4A26-A2FE-0616E04879B8}",
47
+ "{AE81A615-99E3-4885-9CE0-D9CAA193E867}",
48
+ "{FBF4067E-1855-4F6C-8BCD-4D62E801A04D}",
49
+ "{17007948-6593-4AEB-8106-F7884B4F2C19}",
50
+ "{199D4C8D-8639-4DA6-82EF-08668C35DEE0}",
51
+ "{E085E50E-C140-4CF3-BE4B-094B14F0DDD6}",
52
+ "{00785268-A9CC-4E40-AC29-BAC0019159CE}",
53
+ "{4C06F56A-DCDB-46A6-B67C-02339935CF12}",
54
+ "{3A62D3FD-519E-4EC9-8171-D2C1BFEA022F}",
55
+ "{3A62D3FD-519E-4EC9-8171-D2C1BFEA022F}",
56
+ "{9392EB58-D7BA-410B-B1F0-B2FAA6BC89A7}",
57
+ "{2ACAB2D5-E0CE-4027-BCA0-D78B2D7A6C66}",
58
+ "{86E216C3-43CE-481A-BCB2-BE5E62850635}",
59
+ "{FB631291-7923-4B91-9A57-7B18FDBB7A42}",
60
+ "{0A176EC9-E934-45B8-B87F-16C7F4C80039}",
61
+ "{DF55CA80-46E8-4C53-B65B-4990A23DD444}",
62
+ "{3A0F9895-55D2-4710-BE5E-AD7498B5BF44}",
63
+ "{294BDC5A-F448-48B6-8110-DD0A81820F8C}",
64
+ "{4B9F66E9-FAC9-47AB-B1EF-C16756FBFD06}",
65
+ "{72EA49C6-2806-48BD-B81B-D4905102E19C}",
66
+ "{5728EB7E-8929-486C-8CD5-3238D060E768}"
67
+);
68
+
69
+sub generate {
70
+ my ($git_dir, $out_dir, $rel_dir, %build_structure) = @_;
71
+ my @libs = @{$build_structure{"LIBS"}};
72
+ foreach (@libs) {
73
+ createLibProject($_, $git_dir, $out_dir, $rel_dir, \%build_structure);
74
+ }
75
+
76
+ my @apps = @{$build_structure{"APPS"}};
77
+ foreach (@apps) {
78
+ createAppProject($_, $git_dir, $out_dir, $rel_dir, \%build_structure);
79
+ }
80
+
81
+ createGlueProject($git_dir, $out_dir, $rel_dir, %build_structure);
82
+ return 0;
83
+}
84
+
85
+sub createLibProject {
86
+ my ($libname, $git_dir, $out_dir, $rel_dir, $build_structure) = @_;
87
+ print "Generate $libname vcproj lib project\n";
88
+ $rel_dir = "..\\$rel_dir";
89
+ $rel_dir =~ s/\//\\/g;
90
+
91
+ my $target = $libname;
92
+ $target =~ s/\//_/g;
93
+ $target =~ s/\.a//;
94
+
95
+ my $uuid = $GUIDS[$guid_index];
96
+ $$build_structure{"LIBS_${target}_GUID"} = $uuid;
97
+ $guid_index += 1;
98
+
99
+ my @srcs = sort(map("$rel_dir\\$_", @{$$build_structure{"LIBS_${libname}_SOURCES"}}));
100
+ my @sources;
101
+ foreach (@srcs) {
102
+ $_ =~ s/\//\\/g;
103
+ push(@sources, $_);
104
+ }
105
+ my $defines = join(",", sort(@{$$build_structure{"LIBS_${libname}_DEFINES"}}));
106
+ my $includes= join(";", sort(map(""$rel_dir\\$_"", @{$$build_structure{"LIBS_${libname}_INCLUDES"}})));
107
+ my $cflags = join(" ", sort(@{$$build_structure{"LIBS_${libname}_CFLAGS"}}));
108
+ $cflags =~ s/\"/"/g;
109
+
110
+ my $cflags_debug = $cflags;
111
+ $cflags_debug =~ s/-MT/-MTd/;
112
+ $cflags_debug =~ s/-O.//;
113
+
114
+ my $cflags_release = $cflags;
115
+ $cflags_release =~ s/-MTd/-MT/;
116
+
117
+ my @tmp = @{$$build_structure{"LIBS_${libname}_LFLAGS"}};
118
+ my @tmp2 = ();
119
+ foreach (@tmp) {
120
+ if (/^-LTCG/) {
121
+ } elsif (/^-L/) {
122
+ $_ =~ s/^-L/-LIBPATH:$rel_dir\//;
123
+ }
124
+ push(@tmp2, $_);
125
+ }
126
+ my $lflags = join(" ", sort(@tmp));
127
+
128
+ $defines =~ s/-D//g;
129
+ $defines =~ s/\"/\\"/g;
130
+ $defines =~ s/\'//g;
131
+ $includes =~ s/-I//g;
132
+ mkdir "$target" || die "Could not create the directory $target for lib project!\n";
133
+ open F, ">$target/$target.vcproj" || die "Could not open $target/$target.pro for writing!\n";
134
+ print F << "EOM";
135
+<?xml version="1.0" encoding = "Windows-1252"?>
136
+<VisualStudioProject
137
+ ProjectType="Visual C++"
138
+ Version="9,00"
139
+ Name="$target"
140
+ ProjectGUID="$uuid">
141
+ <Platforms>
142
+ <Platform
143
+ Name="Win32"/>
144
+ </Platforms>
145
+ <ToolFiles>
146
+ </ToolFiles>
147
+ <Configurations>
148
+ <Configuration
149
+ Name="Debug|Win32"
150
+ OutputDirectory="$rel_dir"
151
+ ConfigurationType="4"
152
+ CharacterSet="0"
153
+ IntermediateDirectory="\$(ProjectDir)\$(ConfigurationName)"
154
+ >
155
+ <Tool
156
+ Name="VCPreBuildEventTool"
157
+ />
158
+ <Tool
159
+ Name="VCCustomBuildTool"
160
+ />
161
+ <Tool
162
+ Name="VCXMLDataGeneratorTool"
163
+ />
164
+ <Tool
165
+ Name="VCWebServiceProxyGeneratorTool"
166
+ />
167
+ <Tool
168
+ Name="VCMIDLTool"
169
+ />
170
+ <Tool
171
+ Name="VCCLCompilerTool"
172
+ AdditionalOptions="$cflags_debug"
173
+ Optimization="0"
174
+ InlineFunctionExpansion="1"
175
+ AdditionalIncludeDirectories="$includes"
176
+ PreprocessorDefinitions="UNICODE,WIN32,_DEBUG,$defines"
177
+ MinimalRebuild="true"
178
+ RuntimeLibrary="1"
179
+ UsePrecompiledHeader="0"
180
+ WarningLevel="3"
181
+ DebugInformationFormat="3"
182
+ />
183
+ <Tool
184
+ Name="VCManagedResourceCompilerTool"
185
+ />
186
+ <Tool
187
+ Name="VCResourceCompilerTool"
188
+ />
189
+ <Tool
190
+ Name="VCPreLinkEventTool"
191
+ />
192
+ <Tool
193
+ Name="VCLibrarianTool"
194
+ SuppressStartupBanner="true"
195
+ />
196
+ <Tool
197
+ Name="VCALinkTool"
198
+ />
199
+ <Tool
200
+ Name="VCXDCMakeTool"
201
+ />
202
+ <Tool
203
+ Name="VCBscMakeTool"
204
+ />
205
+ <Tool
206
+ Name="VCFxCopTool"
207
+ />
208
+ <Tool
209
+ Name="VCPostBuildEventTool"
210
+ />
211
+ </Configuration>
212
+ <Configuration
213
+ Name="Release|Win32"
214
+ OutputDirectory="$rel_dir"
215
+ ConfigurationType="4"
216
+ CharacterSet="0"
217
+ WholeProgramOptimization="1"
218
+ IntermediateDirectory="\$(ProjectDir)\$(ConfigurationName)"
219
+ >
220
+ <Tool
221
+ Name="VCPreBuildEventTool"
222
+ />
223
+ <Tool
224
+ Name="VCCustomBuildTool"
225
+ />
226
+ <Tool
227
+ Name="VCXMLDataGeneratorTool"
228
+ />
229
+ <Tool
230
+ Name="VCWebServiceProxyGeneratorTool"
231
+ />
232
+ <Tool
233
+ Name="VCMIDLTool"
234
+ />
235
+ <Tool
236
+ Name="VCCLCompilerTool"
237
+ AdditionalOptions="$cflags_release"
238
+ Optimization="2"
239
+ InlineFunctionExpansion="1"
240
+ EnableIntrinsicFunctions="true"
241
+ AdditionalIncludeDirectories="$includes"
242
+ PreprocessorDefinitions="UNICODE,WIN32,NDEBUG,$defines"
243
+ RuntimeLibrary="0"
244
+ EnableFunctionLevelLinking="true"
245
+ UsePrecompiledHeader="0"
246
+ WarningLevel="3"
247
+ DebugInformationFormat="3"
248
+ />
249
+ <Tool
250
+ Name="VCManagedResourceCompilerTool"
251
+ />
252
+ <Tool
253
+ Name="VCResourceCompilerTool"
254
+ />
255
+ <Tool
256
+ Name="VCPreLinkEventTool"
257
+ />
258
+ <Tool
259
+ Name="VCLibrarianTool"
260
+ SuppressStartupBanner="true"
261
+ />
262
+ <Tool
263
+ Name="VCALinkTool"
264
+ />
265
+ <Tool
266
+ Name="VCXDCMakeTool"
267
+ />
268
+ <Tool
269
+ Name="VCBscMakeTool"
270
+ />
271
+ <Tool
272
+ Name="VCFxCopTool"
273
+ />
274
+ <Tool
275
+ Name="VCPostBuildEventTool"
276
+ />
277
+ </Configuration>
278
+ </Configurations>
279
+ <Files>
280
+ <Filter
281
+ Name="Source Files"
282
+ Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
283
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
284
+EOM
285
+ foreach(@sources) {
286
+ print F << "EOM";
287
+ <File
288
+ RelativePath="$_"/>
289
+EOM
290
+ }
291
+ print F << "EOM";
292
+ </Filter>
293
+ </Files>
294
+ <Globals>
295
+ </Globals>
296
+</VisualStudioProject>
297
+EOM
298
+ close F;
299
+}
300
+
301
+sub createAppProject {
302
+ my ($appname, $git_dir, $out_dir, $rel_dir, $build_structure) = @_;
303
+ print "Generate $appname vcproj app project\n";
304
+ $rel_dir = "..\\$rel_dir";
305
+ $rel_dir =~ s/\//\\/g;
306
+
307
+ my $target = $appname;
308
+ $target =~ s/\//_/g;
309
+ $target =~ s/\.exe//;
310
+
311
+ my $uuid = $GUIDS[$guid_index];
312
+ $$build_structure{"APPS_${target}_GUID"} = $uuid;
313
+ $guid_index += 1;
314
+
315
+ my @srcs = sort(map("$rel_dir\\$_", @{$$build_structure{"APPS_${appname}_SOURCES"}}));
316
+ my @sources;
317
+ foreach (@srcs) {
318
+ $_ =~ s/\//\\/g;
319
+ push(@sources, $_);
320
+ }
321
+ my $defines = join(",", sort(@{$$build_structure{"APPS_${appname}_DEFINES"}}));
322
+ my $includes= join(";", sort(map(""$rel_dir\\$_"", @{$$build_structure{"APPS_${appname}_INCLUDES"}})));
323
+ my $cflags = join(" ", sort(@{$$build_structure{"APPS_${appname}_CFLAGS"}}));
324
+ $cflags =~ s/\"/"/g;
325
+
326
+ my $cflags_debug = $cflags;
327
+ $cflags_debug =~ s/-MT/-MTd/;
328
+ $cflags_debug =~ s/-O.//;
329
+
330
+ my $cflags_release = $cflags;
331
+ $cflags_release =~ s/-MTd/-MT/;
332
+
333
+ my $libs;
334
+ foreach (sort(@{$$build_structure{"APPS_${appname}_LIBS"}})) {
335
+ $_ =~ s/\//_/g;
336
+ $libs .= " $_";
337
+ }
338
+ my @tmp = @{$$build_structure{"APPS_${appname}_LFLAGS"}};
339
+ my @tmp2 = ();
340
+ foreach (@tmp) {
341
+ if (/^-LTCG/) {
342
+ } elsif (/^-L/) {
343
+ $_ =~ s/^-L/-LIBPATH:$rel_dir\//;
344
+ }
345
+ push(@tmp2, $_);
346
+ }
347
+ my $lflags = join(" ", sort(@tmp)) . " -LIBPATH:$rel_dir";
348
+
349
+ $defines =~ s/-D//g;
350
+ $defines =~ s/\"/\\"/g;
351
+ $defines =~ s/\'//g;
352
+ $defines =~ s/\\\\/\\/g;
353
+ $includes =~ s/-I//g;
354
+ mkdir "$target" || die "Could not create the directory $target for lib project!\n";
355
+ open F, ">$target/$target.vcproj" || die "Could not open $target/$target.pro for writing!\n";
356
+ print F << "EOM";
357
+<?xml version="1.0" encoding = "Windows-1252"?>
358
+<VisualStudioProject
359
+ ProjectType="Visual C++"
360
+ Version="9,00"
361
+ Name="$target"
362
+ ProjectGUID="$uuid">
363
+ <Platforms>
364
+ <Platform
365
+ Name="Win32"/>
366
+ </Platforms>
367
+ <ToolFiles>
368
+ </ToolFiles>
369
+ <Configurations>
370
+ <Configuration
371
+ Name="Debug|Win32"
372
+ OutputDirectory="$rel_dir"
373
+ ConfigurationType="1"
374
+ CharacterSet="0"
375
+ IntermediateDirectory="\$(ProjectDir)\$(ConfigurationName)"
376
+ >
377
+ <Tool
378
+ Name="VCPreBuildEventTool"
379
+ />
380
+ <Tool
381
+ Name="VCCustomBuildTool"
382
+ />
383
+ <Tool
384
+ Name="VCXMLDataGeneratorTool"
385
+ />
386
+ <Tool
387
+ Name="VCWebServiceProxyGeneratorTool"
388
+ />
389
+ <Tool
390
+ Name="VCMIDLTool"
391
+ />
392
+ <Tool
393
+ Name="VCCLCompilerTool"
394
+ AdditionalOptions="$cflags_debug"
395
+ Optimization="0"
396
+ InlineFunctionExpansion="1"
397
+ AdditionalIncludeDirectories="$includes"
398
+ PreprocessorDefinitions="UNICODE,WIN32,_DEBUG,$defines"
399
+ MinimalRebuild="true"
400
+ RuntimeLibrary="1"
401
+ UsePrecompiledHeader="0"
402
+ WarningLevel="3"
403
+ DebugInformationFormat="3"
404
+ />
405
+ <Tool
406
+ Name="VCManagedResourceCompilerTool"
407
+ />
408
+ <Tool
409
+ Name="VCResourceCompilerTool"
410
+ />
411
+ <Tool
412
+ Name="VCPreLinkEventTool"
413
+ />
414
+ <Tool
415
+ Name="VCLinkerTool"
416
+ AdditionalDependencies="$libs"
417
+ AdditionalOptions="$lflags"
418
+ LinkIncremental="2"
419
+ GenerateDebugInformation="true"
420
+ SubSystem="1"
421
+ TargetMachine="1"
422
+ />
423
+ <Tool
424
+ Name="VCALinkTool"
425
+ />
426
+ <Tool
427
+ Name="VCXDCMakeTool"
428
+ />
429
+ <Tool
430
+ Name="VCBscMakeTool"
431
+ />
432
+ <Tool
433
+ Name="VCFxCopTool"
434
+ />
435
+ <Tool
436
+ Name="VCPostBuildEventTool"
437
+ />
438
+ </Configuration>
439
+ <Configuration
440
+ Name="Release|Win32"
441
+ OutputDirectory="$rel_dir"
442
+ ConfigurationType="1"
443
+ CharacterSet="0"
444
+ WholeProgramOptimization="1"
445
+ IntermediateDirectory="\$(ProjectDir)\$(ConfigurationName)"
446
+ >
447
+ <Tool
448
+ Name="VCPreBuildEventTool"
449
+ />
450
+ <Tool
451
+ Name="VCCustomBuildTool"
452
+ />
453
+ <Tool
454
+ Name="VCXMLDataGeneratorTool"
455
+ />
456
+ <Tool
457
+ Name="VCWebServiceProxyGeneratorTool"
458
+ />
459
+ <Tool
460
+ Name="VCMIDLTool"
461
+ />
462
+ <Tool
463
+ Name="VCCLCompilerTool"
464
+ AdditionalOptions="$cflags_release"
465
+ Optimization="2"
466
+ InlineFunctionExpansion="1"
467
+ EnableIntrinsicFunctions="true"
468
+ AdditionalIncludeDirectories="$includes"
469
+ PreprocessorDefinitions="UNICODE,WIN32,NDEBUG,$defines"
470
+ RuntimeLibrary="0"
471
+ EnableFunctionLevelLinking="true"
472
+ UsePrecompiledHeader="0"
473
+ WarningLevel="3"
474
+ DebugInformationFormat="3"
475
+ />
476
+ <Tool
477
+ Name="VCManagedResourceCompilerTool"
478
+ />
479
+ <Tool
480
+ Name="VCResourceCompilerTool"
481
+ />
482
+ <Tool
483
+ Name="VCPreLinkEventTool"
484
+ />
485
+ <Tool
486
+ Name="VCLinkerTool"
487
+ AdditionalDependencies="$libs"
488
+ AdditionalOptions="$lflags"
489
+ LinkIncremental="1"
490
+ GenerateDebugInformation="true"
491
+ SubSystem="1"
492
+ TargetMachine="1"
493
+ OptimizeReferences="2"
494
+ EnableCOMDATFolding="2"
495
+ />
496
+ <Tool
497
+ Name="VCALinkTool"
498
+ />
499
+ <Tool
500
+ Name="VCXDCMakeTool"
501
+ />
502
+ <Tool
503
+ Name="VCBscMakeTool"
504
+ />
505
+ <Tool
506
+ Name="VCFxCopTool"
507
+ />
508
+ <Tool
509
+ Name="VCPostBuildEventTool"
510
+ />
511
+ </Configuration>
512
+ </Configurations>
513
+ <Files>
514
+ <Filter
515
+ Name="Source Files"
516
+ Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
517
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
518
+EOM
519
+ foreach(@sources) {
520
+ print F << "EOM";
521
+ <File
522
+ RelativePath="$_"/>
523
+EOM
524
+ }
525
+ print F << "EOM";
526
+ </Filter>
527
+ </Files>
528
+ <Globals>
529
+ </Globals>
530
+</VisualStudioProject>
531
+EOM
532
+ close F;
533
+}
534
+
535
+sub createGlueProject {
536
+ my ($git_dir, $out_dir, $rel_dir, %build_structure) = @_;
537
+ print "Generate solutions file\n";
538
+ $rel_dir = "..\\$rel_dir";
539
+ $rel_dir =~ s/\//\\/g;
540
+ my $SLN_HEAD = "Microsoft Visual Studio Solution File, Format Version 10.00\n";
541
+ my $SLN_PRE = "Project(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = ";
542
+ my $SLN_POST = "\nEndProject\n";
543
+
544
+ my @libs = @{$build_structure{"LIBS"}};
545
+ my @tmp;
546
+ foreach (@libs) {
547
+ $_ =~ s/\//_/g;
548
+ $_ =~ s/\.a//;
549
+ push(@tmp, $_);
550
+ }
551
+ @libs = @tmp;
552
+
553
+ my @apps = @{$build_structure{"APPS"}};
554
+ @tmp = ();
555
+ foreach (@apps) {
556
+ $_ =~ s/\//_/g;
557
+ $_ =~ s/\.exe//;
558
+ push(@tmp, $_);
559
+ }
560
+ @apps = @tmp;
561
+
562
+ open F, ">git.sln" || die "Could not open git.sln for writing!\n";
563
+ print F "$SLN_HEAD";
564
+ foreach (@libs) {
565
+ my $libname = $_;
566
+ my $uuid = $build_structure{"LIBS_${libname}_GUID"};
567
+ print F "$SLN_PRE";
568
+ print F "\"${libname}\", \"${libname}\\${libname}.vcproj\", \"${uuid}\"";
569
+ print F "$SLN_POST";
570
+ }
571
+ foreach (@apps) {
572
+ my $appname = $_;
573
+ my $uuid = $build_structure{"APPS_${appname}_GUID"};
574
+ print F "$SLN_PRE";
575
+ print F "\"${appname}\", \"${appname}\\${appname}.vcproj\", \"${uuid}\"";
576
+ print F "$SLN_POST";
577
+ }
578
+
579
+ print F << "EOM";
580
+Global
581
+ GlobalSection(SolutionConfiguration) = preSolution
582
+ ConfigName.0 = Debug|Win32
583
+ ConfigName.1 = Release|Win32
584
+ EndGlobalSection
585
+ GlobalSection(ProjectDependencies) = postSolution
586
+EOM
587
+ foreach (@{$build_structure{"APPS"}}) {
588
+ my $appname = $_;
589
+ my $appname_clean = $_;
590
+ $appname_clean =~ s/\//_/g;
591
+ $appname_clean =~ s/\.exe//;
592
+
593
+ my $uuid = $build_structure{"APPS_${appname_clean}_GUID"};
594
+ my $dep_index = 0;
595
+ foreach(@{$build_structure{"APPS_${appname}_LIBS"}}) {
596
+ my $libname = $_;
597
+ $libname =~ s/\//_/g;
598
+ $libname =~ s/\.(a|lib)//;
599
+ my $libuuid = $build_structure{"LIBS_${libname}_GUID"};
600
+ if (defined $libuuid) {
601
+ print F "\t\t${uuid}.${dep_index} = ${libuuid}\n";
602
+ $dep_index += 1;
603
+ }
604
+ }
605
+ }
606
+
607
+ print F << "EOM";
608
+ EndGlobalSection
609
+ GlobalSection(ProjectConfiguration) = postSolution
610
+EOM
611
+ foreach (@libs) {
612
+ my $libname = $_;
613
+ my $uuid = $build_structure{"LIBS_${libname}_GUID"};
614
+ print F "\t\t${uuid}.Debug|Win32.ActiveCfg = Debug|Win32\n";
615
+ print F "\t\t${uuid}.Debug|Win32.Build.0 = Debug|Win32\n";
616
+ print F "\t\t${uuid}.Release|Win32.ActiveCfg = Release|Win32\n";
617
+ print F "\t\t${uuid}.Release|Win32.Build.0 = Release|Win32\n";
618
+ }
619
+ foreach (@apps) {
620
+ my $appname = $_;
621
+ my $uuid = $build_structure{"APPS_${appname}_GUID"};
622
+ print F "\t\t${uuid}.Debug|Win32.ActiveCfg = Debug|Win32\n";
623
+ print F "\t\t${uuid}.Debug|Win32.Build.0 = Debug|Win32\n";
624
+ print F "\t\t${uuid}.Release|Win32.ActiveCfg = Release|Win32\n";
625
+ print F "\t\t${uuid}.Release|Win32.Build.0 = Release|Win32\n";
626
+ }
627
+
628
+ print F << "EOM";
629
+ EndGlobalSection
630
+ GlobalSection(ExtensibilityGlobals) = postSolution
631
+ EndGlobalSection
632
+ GlobalSection(ExtensibilityAddIns) = postSolution
633
+ EndGlobalSection
634
+EndGlobal
635
+EOM
636
+ close F;
637
+}
638
+
639
+1;