1use IO::File; 2use File::Find; 3 4if ($ARGV[0] eq '-6') { 5 find(\&tovc6, '.'); 6} 7elsif ($ARGV[0] eq '-5') { 8 find(\&tovc5, '.'); 9} 10elsif ($ARGV[0] eq '-2005') { 11 find(\&tovc2005, '.'); 12} 13elsif ($ARGV[0] eq '-w3') { 14 find(\&tow3, '.'); 15} 16elsif ($ARGV[0] eq '-w4') { 17 find(\&tow4, '.'); 18} 19elsif ($ARGV[0] eq '-ia64') { 20 find(\&tovc64, '.'); 21} 22elsif ($ARGV[0] eq '-d') { 23 find(\&todebugpools, '.'); 24} 25elsif ($ARGV[0] eq '-b') { 26 find(\&tobrowse, '.'); 27} 28elsif ($ARGV[0] eq '-mt') { 29 find(\&addmt, '.'); 30} 31elsif ($ARGV[0] eq '-m') { 32 ## 0 - conapp, 1 - dll lib, 2 - static lib 33 $dsptype = 2; 34 $name = "apr"; 35 onemake(); 36} 37else { 38 print "Specify -5 or -6 for Visual Studio 5 or 6 (98) .dsp format\n"; 39 print "Specify -w3 or -w4 for .dsp build with warning level 3 or 4 (strict)\n\n"; 40 print "Specify -ia64 for build targeted at Itanium (req's psdk tools)\n\n"; 41 print "Specify -p for extreme pool debugging\n\n"; 42 print "Specify -mt to add .manifest embedding\n\n"; 43 die "Missing argument"; 44} 45 46sub addmt { 47 my $outpath, $outtype; 48 49 if (m|\.dsp$|) { 50 $oname = $_; 51 $tname = '.#' . $_; 52 $verchg = 0; 53 $srcfl = new IO::File $oname, "r" || die; 54 $dstfl = new IO::File $tname, "w" || die; 55 while ($src = <$srcfl>) { 56 if ($src =~ m|^# TARGTYPE .+ Application|) { 57 $outtype = ".exe" 58 } 59 if ($src =~ m|^# TARGTYPE .+ Dynamic-Link|) { 60 $outtype = ".dll" 61 } 62 if ($src =~ m|^# PROP Output_Dir "(.+)"|) { 63 $outdir = $1; 64 $outpath = $oname; 65 $outpath =~ s|\.dsp||; 66 $outpath = ".\\" . $outdir . "\\" . $outpath . $outtype; 67 } 68 if ($src =~ m|^# ADD (BASE )?LINK32 .+ /out:"([^"]+)"|) { 69 $outpath = $2; 70 $outpath =~ s|/|\\|; 71 $outpath = ".\\" . $outpath if (!($outpath =~ m|^\.|)); 72 $src =~ s|/out:"([^"]+)"|/out:"$outpath"|; 73 } 74 if (defined($outpath) && ($src =~ m|^# Begin Special Build Tool|)) { 75 undef $outpath; 76 } 77 if (defined($outpath) && defined($outtype) && ($src =~ m|^\s*$|)) { 78 print $dstfl '# Begin Special Build Tool' . "\n"; 79 print $dstfl 'TargetPath=' . $outpath . "\n"; 80 print $dstfl 'SOURCE="$(InputPath)"' . "\n"; 81 print $dstfl 'PostBuild_Desc=Embed .manifest' . "\n"; 82 print $dstfl 'PostBuild_Cmds=if exist $(TargetPath).manifest mt.exe -manifest $(TargetPath).manifest -outputresource:$(TargetPath);2' . "\n"; 83 print $dstfl '# End Special Build Tool' . "\n"; 84 $verchg = -1; 85 undef $outpath; 86 } 87 print $dstfl $src; 88 } 89 undef $outtype if (defined($outtype)); 90 undef $outpath if (defined($outpath)); 91 undef $srcfl; 92 undef $dstfl; 93 if ($verchg) { 94 unlink $oname || die; 95 rename $tname, $oname || die; 96 print "Added manifest to " . $oname . " in " . $File::Find::dir . "\n"; 97 } 98 else { 99 unlink $tname; 100 } 101 } 102} 103sub tovc5 { 104 105 if (m|\.dsp$|) { 106 $oname = $_; 107 $tname = '.#' . $_; 108 $verchg = 0; 109 $srcfl = new IO::File $oname, "r" || die; 110 $dstfl = new IO::File $tname, "w" || die; 111 while ($src = <$srcfl>) { 112 if ($src =~ s|Format Version 6\.00|Format Version 5\.00|) { 113 $verchg = -1; 114 } 115 if ($src =~ s|^(# ADD CPP .*)/ZI (.*)|$1/Zi $2|) { 116 $verchg = -1; 117 } 118 if ($src =~ s|^(# ADD BASE CPP .*)/ZI (.*)|$1/Zi $2|) { 119 $verchg = -1; 120 } 121 if ($src =~ s|^(# ADD CPP .*)/EHsc (.*)|$1/GX $2|) { 122 $verchg = -1; 123 } 124 if ($src =~ s|^(# ADD BASE CPP .*)/EHsc (.*)|$1/GX $2|) { 125 $verchg = -1; 126 } 127 while ($src =~ s|^(# ADD RSC .*)/d "([^ ="]+)=([^"]+)"|$1/d $2="$3"|) { 128 $verchg = -1; 129 } 130 if ($src !~ m|^# PROP AllowPerConfigDependencies|) { 131 print $dstfl $src; } 132 else { 133 $verchg = -1; 134 } 135 } 136 undef $srcfl; 137 undef $dstfl; 138 if ($verchg) { 139 unlink $oname || die; 140 rename $tname, $oname || die; 141 print "Converted VC6 project " . $oname . " to VC5 in " . $File::Find::dir . "\n"; 142 } 143 else { 144 unlink $tname; 145 } 146 } 147} 148 149sub tovc6 { 150 151 if (m|\.dsp$|) { 152 $oname = $_; 153 $tname = '.#' . $_; 154 $verchg = 0; 155 $srcfl = new IO::File $_, "r" || die; 156 $dstfl = new IO::File $tname, "w" || die; 157 while ($src = <$srcfl>) { 158 if ($src =~ s|Format Version 5\.00|Format Version 6\.00|) { 159 $verchg = -1; 160 } 161 if ($src =~ s|^(!MESSAGE .*)\\\n|$1|) { 162 $cont = <$srcfl>; 163 $src = $src . $cont; 164 $verchg = -1; 165 } 166 if ($src =~ s|^(# ADD CPP .*)/GX (.*)|$1/EHsc $2|) { 167 $verchg = -1; 168 } 169 if ($src =~ s|^(# ADD BASE CPP .*)/GX (.*)|$1/EHsc $2|) { 170 $verchg = -1; 171 } 172 while ($src =~ s|^(# ADD RSC .*)/d "([^ ="]+)=([^"]+)"|$1/d $2="$3"|) { 173 $verchg = -1; 174 } 175 print $dstfl $src; 176 if ($verchg && $src =~ m|^# Begin Project|) { 177 print $dstfl "# PROP AllowPerConfigDependencies 0\n"; 178 } 179 } 180 undef $srcfl; 181 undef $dstfl; 182 if ($verchg) { 183 unlink $oname || die; 184 rename $tname, $oname || die; 185 print "Converted VC5 project " . $oname . " to VC6 in " . $File::Find::dir . "\n"; 186 } 187 else { 188 unlink $tname; 189 } 190 } 191} 192 193sub tovc2005 { 194 195 if (m|\.dsp$| || m|\.mak$|) { 196 $oname = $_; 197 $tname = '.#' . $_; 198 $verchg = 0; 199 $srcfl = new IO::File $_, "r" || die; 200 $dstfl = new IO::File $tname, "w" || die; 201 while ($src = <$srcfl>) { 202 if ($src =~ s|(\bCPP.*) /GX(.*)|$1 /EHsc$2|) { 203 $verchg = -1; 204 } 205 if ($src =~ s|(\bLINK32.*) /machine:I386(.*)|$1$2|) { 206 $verchg = -1; 207 } 208 while ($src =~ s|^(# ADD RSC .*)/d ([^ ="]+)="([^"]+)"|$1/d "$2=$3"|) { 209 $verchg = -1; 210 } 211 print $dstfl $src; 212 } 213 undef $srcfl; 214 undef $dstfl; 215 if ($verchg) { 216 unlink $oname || die; 217 rename $tname, $oname || die; 218 print "Converted project " . $oname . " to 2005 in " . $File::Find::dir . "\n"; 219 } 220 else { 221 unlink $tname; 222 } 223 } 224} 225 226sub tow3 { 227 228 if (m|\.dsp$| || m|\.mak$|) { 229 $oname = $_; 230 $tname = '.#' . $_; 231 $verchg = 0; 232 $srcfl = new IO::File $_, "r" || die; 233 $dstfl = new IO::File $tname, "w" || die; 234 while ($src = <$srcfl>) { 235 while ($src =~ m|\\\n$|) { 236 $src = $src . <$srcfl> 237 } 238 if ($src =~ s|(\bCPP.*) /W4(.*)|$1 /W3$2|) { 239 $verchg = -1; 240 } 241 print $dstfl $src; 242 } 243 undef $srcfl; 244 undef $dstfl; 245 if ($verchg) { 246 unlink $oname || die; 247 rename $tname, $oname || die; 248 print "Converted project " . $oname . " to warn:3 in " . $File::Find::dir . "\n"; 249 } 250 else { 251 unlink $tname; 252 } 253 } 254} 255 256sub tow4 { 257 258 if (m|\.dsp$| || m|\.mak$|) { 259 $oname = $_; 260 $tname = '.#' . $_; 261 $verchg = 0; 262 $srcfl = new IO::File $_, "r" || die; 263 $dstfl = new IO::File $tname, "w" || die; 264 while ($src = <$srcfl>) { 265 while ($src =~ m|\\\n$|) { 266 $src = $src . <$srcfl> 267 } 268 if ($src =~ s|(\bCPP.*) /W3(.*)|$1 /W4$2|) { 269 $verchg = -1; 270 } 271 print $dstfl $src; 272 } 273 undef $srcfl; 274 undef $dstfl; 275 if ($verchg) { 276 unlink $oname || die; 277 rename $tname, $oname || die; 278 print "Converted project " . $oname . " to warn:4 " . $File::Find::dir . "\n"; 279 } 280 else { 281 unlink $tname; 282 } 283 } 284} 285 286sub tovc64 { 287 288 if (m|\.dsp$| || m|\.mak$|) { 289 $oname = $_; 290 $tname = '.#' . $_; 291 $verchg = 0; 292 $srcfl = new IO::File $_, "r" || die; 293 $dstfl = new IO::File $tname, "w" || die; 294 while ($src = <$srcfl>) { 295 while ($src =~ m|\\\n$|) { 296 $src = $src . <$srcfl> 297 } 298 if ($src =~ s|Win32 \(x86\) (Release)|Win32 (IA64) $1|s) { 299 $verchg = -1; 300 } 301 if ($src =~ s|Win32 \(x86\) (Debug)|Win32 (IA64) $1|s) { 302 $verchg = -1; 303 } 304 if ($src =~ s| - Win32 (Release)| - Win32 (IA64) $1|s) { 305 $verchg = -1; 306 } 307 if ($src =~ s| - Win32 (Debug)| - Win32 (IA64) $1|s) { 308 $verchg = -1; 309 } 310 # Cross compilation exceptions 311 if (!(m|gen[^/]*$| || m|dftables[^/]*$|)) { 312 if ($src =~ s|(\bCPP.* /W3)(.*) /FD(.*)|$1 /As64 /Wp64$2$3|s) { 313 $verchg = -1; 314 } 315 if ($src =~ s|(\bLINK.*/machine):I386(.*)|$1:IA64$2|s) { 316 $verchg = -1; 317 } 318 } 319 else { 320 if ($src =~ s|(\bCPP.* /W3)(.*) /FD(.*)|$1 /As32 /Wp64$2$3|s) { 321 $verchg = -1; 322 } 323 } 324 print $dstfl $src; 325 } 326 undef $srcfl; 327 undef $dstfl; 328 if ($verchg) { 329 unlink $oname || die; 330 rename $tname, $oname || die; 331 print "Converted build file " . $oname . " to Win64 in " . $File::Find::dir . "\n"; 332 } 333 else { 334 unlink $tname; 335 } 336 } 337} 338 339sub todebugpools { 340 341 if (m|\.dsp$|) { 342 $oname = $_; 343 $tname = '.#' . $_; 344 $verchg = 0; 345 $srcfl = new IO::File $oname, "r" || die; 346 $dstfl = new IO::File $tname, "w" || die; 347 while ($src = <$srcfl>) { 348 if ($src =~ s|^(# ADD CPP .* /D "_DEBUG" )|$1/D "APR_POOL_DEBUG" |) { 349 $verchg = -1; 350 if ($oname =~ /apr\.dsp$/) { 351 $src =~ s|^(# ADD CPP .* /D "_DEBUG" )|$1/D "POOL_DEBUG" |; 352 } 353 } 354 print $dstfl $src; 355 } 356 undef $srcfl; 357 undef $dstfl; 358 if ($verchg) { 359 unlink $oname || die; 360 rename $tname, $oname || die; 361 print "Converted project " . $oname . " to debug pools in " . $File::Find::dir . "\n"; 362 } 363 else { 364 unlink $tname; 365 } 366 } 367} 368 369sub tobrowsesources { 370 371 if (m|\.dsp$|) { 372 $oname = $_; 373 $tname = '.#' . $_; 374 $verchg = 0; 375 $srcfl = new IO::File $oname, "r" || die; 376 $dstfl = new IO::File $tname, "w" || die; 377 while ($src = <$srcfl>) { 378 if ($src =~ s|^(# ADD CPP .*)( /Fd)|$1 /Fr "/httpd-2.0/srclib/apr"$2|) { 379 $verchg = -1; 380 } 381 print $dstfl $src; 382 } 383 undef $srcfl; 384 undef $dstfl; 385 if ($verchg) { 386 unlink $oname || die; 387 rename $tname, $oname || die; 388 print "Converted project " . $oname . " to browse sources in " . $File::Find::dir . "\n"; 389 } 390 else { 391 unlink $tname; 392 } 393 } 394} 395 396sub frommakefiles { 397 398 if (m|\.mak\.in$|) { 399 $oname = $_; 400 $dname = $_; 401 $_ =~ s/\.mak\.in/.dsp/; 402 $verchg = 0; 403 $srcfl = new IO::File $oname, "r" || die; 404 $dstfl = new IO::File $tname, "w" || die; 405 while ($src = <$srcfl>) { 406 if ($src =~ s|^(# ADD CPP .*)( /Fd)|$1 /Fr "/httpd-2.0/srclib/apr"$2|) { 407 $verchg = -1; 408 } 409 print $dstfl $src; 410 } 411 undef $srcfl; 412 undef $dstfl; 413 if ($verchg) { 414 unlink $oname || die; 415 rename $tname, $oname || die; 416 print "Converted project " . $oname . " to browse sources in " . $File::Find::dir . "\n"; 417 } 418 else { 419 unlink $tname; 420 } 421 } 422} 423 424 425sub onemake { 426 427 if ($dsptype == 0) { 428 $cdefs = qq{/D "WIN32" /D "_CONSOLE"}; 429 $lmodel = qq{/subsystem:console}; 430 $targname = "Win32 (x86) Console Application"; 431 $targid = "0x0103"; 432 $debpath = "Debug"; $relpath = "Release"; 433 } elsif ($dsptype == 1) { 434 $cdefs = qq{/D "WIN32" /D "_WINDOWS"}; 435 $lmodel = qq{/subsystem:windows /dll}; 436 $targname = "Win32 (x86) Dynamic-Link Library"; 437 $targid = "0x0102"; 438 $debpath = "Debug"; $relpath = "Release"; 439 } elsif($dsptype == 2) { 440 $cdefs = qq{/D "WIN32" /D "_CONSOLE"}; 441 $lmodel = qq{/subsystem:console}; 442 $targname = "Win32 (x86) Static Library"; 443 $targid = "0x0104"; 444 $debpath = "LibD"; $relpath = "LibR"; 445 } 446 $file = dspheader(); 447 448 449 $second = ""; 450 451 $model = "Release"; 452 $usedebuglib = "0"; 453 $debugdef = "NDEBUG"; 454 $cflags = "/MD /W3 /O2"; 455 $cincl = qq{/I "./include" /I "./os/win32" /I "./srclib/apr/include" /I "./srclib/apr-util/include"}; 456 $lflags = qq{/map}; 457 $file .= dsponemodel(); 458 459 $second = "ELSE"; 460 $model = "Debug"; 461 $usedebuglib = "1"; 462 $debugdef = "_DEBUG"; 463 $cflags = "/MDd /W3 /GX /Zi /Od"; 464 $cincl = qq{/I "./include" /I "./os/win32" /I "./srclib/apr/include" /I "./srclib/apr-util/include"}; 465 $lflags = qq{/incremental:no /debug}; 466 $file .= dsponemodel(); 467 468 $file .= qq{ 469!ENDIF 470 471# Begin Target 472 473# Name "$name - Win32 Release" 474# Name "$name - Win32 Debug" 475}; 476 477 $toroot = "."; 478 479#HERE IS OUR FOREACH! 480 $file .= qq{# Begin Source File 481 482SOURCE=./server/main.c 483# End Source File 484}; 485 486 if ($dsptype == 0) { 487 #HERE IS OUR ICON! 488 $icon="$toroot/build/win32/apache.ico"; 489 $file .= qq{# Begin Source File 490 491SOURCE=$icon 492# End Source File 493}; 494 $icon = "icon=" . $icon . " "; 495 } 496 if ($dsptype == 0 || $dsptype == 1) { 497 $file .= qq{ 498# Begin Source File 499 500SOURCE=./$name.rc 501# End Source File 502# Begin Source File 503 504SOURCE=$toroot/include/ap_release.h 505# PROP Ignore_Default_Tool 1 506# Begin Custom Build - Creating Version Resource 507InputPath=$toroot/include/ap_release.h $toroot/build/win32/win32ver.awk 508 509"./$name.rc" : \$(SOURCE) "\$(INTDIR)" "\$(OUTDIR)" 510 awk -f $toroot/build/win32/win32ver.awk $name "Apache HTTP Server" $toroot/include/ap_release.h $icon> ./Apache.rc 511 512# End Custom Build 513# End Source File 514}; 515 } 516 $file .= qq{ 517# End Target 518# End Project 519}; 520 print $file; 521} 522 523sub dspheader { 524 if ($dsptype == 1) { 525 $midl = "MTL=midl.exe\n"; 526 } else { 527 $midl = "" 528 } 529qq{# Microsoft Developer Studio Project File - Name="$name" - Package Owner=<4> 530# Microsoft Developer Studio Generated Build File, Format Version 6.00 531# ** DO NOT EDIT ** 532 533# TARGTYPE "$targname" $targid 534 535CFG=$name - Win32 Release 536!MESSAGE This is not a valid makefile. To build this project using NMAKE, 537!MESSAGE use the Export Makefile command and run 538!MESSAGE 539!MESSAGE NMAKE /f "$name.mak". 540!MESSAGE 541!MESSAGE You can specify a configuration when running NMAKE 542!MESSAGE by defining the macro CFG on the command line. For example: 543!MESSAGE 544!MESSAGE NMAKE /f "$name.mak" CFG="$name - Win32 Release" 545!MESSAGE 546!MESSAGE Possible choices for configuration are: 547!MESSAGE 548!MESSAGE "$name - Win32 Release" (based on "$targname") 549!MESSAGE "$name - Win32 Debug" (based on "$targname") 550!MESSAGE 551 552# Begin Project 553# PROP AllowPerConfigDependencies 0 554# PROP Scc_ProjName "" 555# PROP Scc_LocalPath "" 556CPP=cl.exe 557${midl}RSC=rc.exe 558}; 559} 560sub dsponemodel { 561 if ($model eq "Release") { 562 $targpath = $relpath; 563 } else { 564 $targpath = $debpath; 565 } 566 if ($dsptype == 1) { 567 $midl = 568qq{# ADD BASE MTL /nologo /D "$debugdef" /win32 569# ADD MTL /nologo /D "$debugdef" /mktyplib203 /win32 570}; } 571 if ($dsptype == 2) { 572 $linkop = qq{LIB32=link.exe -lib 573# ADD BASE LIB32 /nologo 574# ADD LIB32 /nologo 575}; 576 } else { 577 $linkop = qq{LINK32=link.exe 578# ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib ws2_32.lib mswsock.lib /nologo $lmodel $lflags /machine:I386 579# ADD LINK32 kernel32.lib user32.lib advapi32.lib ws2_32.lib mswsock.lib /nologo $lmodel $lflags /machine:I386 580}; 581 } 582 583qq{ 584!${second}IF "\$(CFG)" == "$name - Win32 $model" 585 586# PROP BASE Use_MFC 0 587# PROP BASE Use_Debug_Libraries $usedebuglib 588# PROP BASE Output_Dir "$targpath" 589# PROP BASE Intermediate_Dir "$targpath" 590# PROP BASE Target_Dir "" 591# PROP Use_MFC 0 592# PROP Use_Debug_Libraries $usedebuglib 593# PROP Output_Dir "$targpath" 594# PROP Intermediate_Dir "$targpath" 595# PROP Ignore_Export_Lib 0 596# PROP Target_Dir "" 597# ADD BASE CPP /nologo $cflags $cincl /D "$debugdef" $cdefs /FD /c 598# ADD CPP /nologo $cflags $cincl /D "$debugdef" $cdefs /Fd"$targpath/$name" /FD /c 599${midl}# ADD BASE RSC /l 0x409 /d "$debugdef" 600# ADD RSC /l 0x409 /d "$debugdef" 601BSC32=bscmake.exe 602# ADD BASE BSC32 /nologo 603# ADD BSC32 /nologo 604$linkop}; 605}