From 2f5e92556ed70ff62d36a9c89ab157a91931acf1 Mon Sep 17 00:00:00 2001
From: Daniela Engert <dani@ngrt.de>
Date: Mon, 22 Jul 2013 12:16:01 +0200
Subject: [PATCH] Boost.Build finally enable building of PDB files with both dynamic and static libs.
Add workaround for projects with multiple targets and precompiled header (e.g. Boost.Math).
A corresponding implementation in msvc.py is still missing!
Signed-off-by: Daniela Engert <dani@ngrt.de>
---
tools/build/v2/tools/msvc.jam | 46 ++++++++++++++++++++++++-------------------
1 file changed, 26 insertions(+), 20 deletions(-)
diff --git a/tools/build/v2/tools/msvc.jam b/tools/build/v2/tools/msvc.jam
index 9a9e37d..88431af 100644
|
a
|
b
|
actions preprocess-c-c++ bind PDB_NAME
|
| 382 | 382 | $(.CC) @"@($(<[1]:W).rsp:E="$(>[1]:W)" -E $(PDB_CFLAG)"$(PDB_NAME)" -Yu"$(>[3]:D=)" -Fp"$(>[2]:W)" $(CC_RSPLINE))" >"$(<[1]:W)" |
| 383 | 383 | } |
| 384 | 384 | |
| 385 | | rule compile-c-c++ ( targets + : sources * ) |
| | 385 | rule compile-c-c++ ( targets + : sources * : properties * ) |
| 386 | 386 | { |
| 387 | 387 | DEPENDS $(<[1]) : [ on $(<[1]) return $(PCH_HEADER) ] ; |
| 388 | 388 | DEPENDS $(<[1]) : [ on $(<[1]) return $(PCH_FILE) ] ; |
| 389 | | PDB_NAME on $(<) = $(<[1]:S=.pdb) ; |
| 390 | | LOCATE on $(<[1]:S=.pdb) = [ on $(<[1]) return $(LOCATE) ] ; |
| 391 | 389 | } |
| 392 | 390 | |
| 393 | | rule preprocess-c-c++ ( targets + : sources * ) |
| | 391 | rule preprocess-c-c++ ( targets + : sources * : properties * ) |
| 394 | 392 | { |
| 395 | 393 | DEPENDS $(<[1]) : [ on $(<[1]) return $(PCH_HEADER) ] ; |
| 396 | 394 | DEPENDS $(<[1]) : [ on $(<[1]) return $(PCH_FILE) ] ; |
| 397 | | PDB_NAME on $(<) = $(<:S=.pdb) ; |
| 398 | | LOCATE on $(<[1]:S=.pdb) = [ on $(<[1]) return $(LOCATE) ] ; |
| 399 | 395 | } |
| 400 | 396 | |
| 401 | 397 | # Action for running the C/C++ compiler using precompiled headers. In addition |
| … |
… |
rule preprocess-c-c++ ( targets + : sources * )
|
| 404 | 400 | # |
| 405 | 401 | # The global .escaped-double-quote variable is used to avoid messing up Emacs |
| 406 | 402 | # syntax highlighting in the messy N-quoted code below. |
| 407 | | actions compile-c-c++-pch |
| | 403 | actions compile-c-c++-pch bind PDB_NAME |
| 408 | 404 | { |
| 409 | | $(.CC) @"@($(<[1]:W).rsp:E="$(>[2]:W)" -Fo"$(<[2]:W)" -Yc"$(>[1]:D=)" $(YLOPTION)"__bjam_pch_symbol_$(>[1]:D=)" -Fp"$(<[1]:W)" $(CC_RSPLINE))" "@($(<[1]:W).cpp:E=#include $(.escaped-double-quote)$(>[1]:D=)$(.escaped-double-quote)$(.nl))" $(.CC.FILTER) |
| | 405 | $(.CC) @"@($(<[1]:W).rsp:E="$(>[2]:W)" -Fo"$(<[2]:W)" -Yc"$(>[1]:D=)" $(YLOPTION)"__bjam_pch_symbol_$(>[1]:D=)" -Fp"$(<[1]:W)" $(PDB_CFLAG)"$(PDB_NAME)" $(CC_RSPLINE))" "@($(<[1]:W).cpp:E=#include $(.escaped-double-quote)$(>[1]:D=)$(.escaped-double-quote)$(.nl))" $(.CC.FILTER) |
| 410 | 406 | } |
| 411 | 407 | |
| 412 | 408 | |
| 413 | 409 | # Action for running the C/C++ compiler using precompiled headers. An already |
| 414 | 410 | # built source file for compiling the precompiled headers is expected to be |
| 415 | 411 | # given as one of the source parameters. |
| 416 | | actions compile-c-c++-pch-s |
| | 412 | actions compile-c-c++-pch-s bind PDB_NAME |
| 417 | 413 | { |
| 418 | | $(.CC) @"@($(<[1]:W).rsp:E="$(>[2]:W)" -Fo"$(<[2]:W)" -Yc"$(>[1]:D=)" $(YLOPTION)"__bjam_pch_symbol_$(>[1]:D=)" -Fp"$(<[1]:W)" $(CC_RSPLINE))" $(.CC.FILTER) |
| | 414 | $(.CC) @"@($(<[1]:W).rsp:E="$(>[2]:W)" -Fo"$(<[2]:W)" -Yc"$(>[1]:D=)" $(YLOPTION)"__bjam_pch_symbol_$(>[1]:D=)" -Fp"$(<[1]:W)" $(PDB_CFLAG)"$(PDB_NAME)" $(CC_RSPLINE))" $(.CC.FILTER) |
| 419 | 415 | } |
| 420 | 416 | |
| 421 | 417 | |
| … |
… |
actions compile.rc
|
| 473 | 469 | |
| 474 | 470 | rule link ( targets + : sources * : properties * ) |
| 475 | 471 | { |
| | 472 | PDB_NAME on $(<[1]) = $(<[1]:S=.pdb) ; |
| | 473 | LOCATE on $(<[1]:S=.pdb) = [ on $(<[1]) return $(LOCATE) ] ; |
| | 474 | PDB_NAME on $(>) = $(<[1]:S=.pdb) ; |
| | 475 | LOCATE on $(<[1]:S=.pdb) = [ on $(<[1]) return $(LOCATE) ] ; |
| 476 | 476 | if <embed-manifest>on in $(properties) |
| 477 | 477 | { |
| 478 | 478 | msvc.manifest $(targets) : $(sources) : $(properties) ; |
| … |
… |
rule link ( targets + : sources * : properties * )
|
| 481 | 481 | |
| 482 | 482 | rule link.dll ( targets + : sources * : properties * ) |
| 483 | 483 | { |
| | 484 | PDB_NAME on $(<[1]) = $(<[1]:S=.pdb) ; |
| | 485 | LOCATE on $(<[1]:S=.pdb) = [ on $(<[1]) return $(LOCATE) ] ; |
| | 486 | PDB_NAME on $(>) = $(<[1]:S=.intermediate-pdb) ; |
| | 487 | LOCATE on $(<[1]:S=.intermediate-pdb) = [ on $(<[1]) return $(LOCATE) ] ; |
| 484 | 488 | DEPENDS $(<) : [ on $(<) return $(DEF_FILE) ] ; |
| 485 | 489 | if <embed-manifest>on in $(properties) |
| 486 | 490 | { |
| … |
… |
rule link.dll ( targets + : sources * : properties * )
|
| 500 | 504 | |
| 501 | 505 | if [ os.name ] in NT |
| 502 | 506 | { |
| 503 | | actions link bind DEF_FILE LIBRARIES_MENTIONED_BY_FILE |
| | 507 | actions link bind DEF_FILE LIBRARIES_MENTIONED_BY_FILE PDB_NAME |
| 504 | 508 | { |
| 505 | | $(.LD) $(LINKFLAGS) /out:"$(<[1]:W)" /LIBPATH:"$(LINKPATH:W)" $(OPTIONS) @"@($(<[1]:W).rsp:E=$(.nl)"$(>)" $(.nl)$(LIBRARIES_MENTIONED_BY_FILE) $(.nl)$(LIBRARIES) $(.nl)"$(LIBRARY_OPTION)$(FINDLIBS_ST).lib" $(.nl)"$(LIBRARY_OPTION)$(FINDLIBS_SA).lib")" |
| | 509 | $(.LD) $(LINKFLAGS) /out:"$(<[1]:W)" /LIBPATH:"$(LINKPATH:W)" $(OPTIONS) $(PDB_LINKFLAG)"$(PDB_NAME)" /PDBALTPATH:"$(PDB_NAME:B).pdb" @"@($(<[1]:W).rsp:E=$(.nl)"$(>)" $(.nl)$(LIBRARIES_MENTIONED_BY_FILE) $(.nl)$(LIBRARIES) $(.nl)"$(LIBRARY_OPTION)$(FINDLIBS_ST).lib" $(.nl)"$(LIBRARY_OPTION)$(FINDLIBS_SA).lib")" |
| 506 | 510 | if %ERRORLEVEL% NEQ 0 EXIT %ERRORLEVEL% |
| 507 | 511 | } |
| 508 | 512 | |
| … |
… |
if [ os.name ] in NT
|
| 513 | 517 | ) |
| 514 | 518 | } |
| 515 | 519 | |
| 516 | | actions link.dll bind DEF_FILE LIBRARIES_MENTIONED_BY_FILE |
| | 520 | actions link.dll bind DEF_FILE LIBRARIES_MENTIONED_BY_FILE PDB_NAME |
| 517 | 521 | { |
| 518 | | $(.LD) /DLL $(LINKFLAGS) /out:"$(<[1]:W)" /IMPLIB:"$(<[2]:W)" /LIBPATH:"$(LINKPATH:W)" /def:"$(DEF_FILE)" $(OPTIONS) @"@($(<[1]:W).rsp:E=$(.nl)"$(>)" $(.nl)$(LIBRARIES_MENTIONED_BY_FILE) $(.nl)$(LIBRARIES) $(.nl)"$(LIBRARY_OPTION)$(FINDLIBS_ST).lib" $(.nl)"$(LIBRARY_OPTION)$(FINDLIBS_SA).lib")" |
| | 522 | $(.LD) /DLL $(LINKFLAGS) /out:"$(<[1]:W)" /IMPLIB:"$(<[2]:W)" /LIBPATH:"$(LINKPATH:W)" /def:"$(DEF_FILE)" $(OPTIONS) $(PDB_LINKFLAG)"$(PDB_NAME)" /PDBALTPATH:"$(PDB_NAME:B).pdb" @"@($(<[1]:W).rsp:E=$(.nl)"$(>)" $(.nl)$(LIBRARIES_MENTIONED_BY_FILE) $(.nl)$(LIBRARIES) $(.nl)"$(LIBRARY_OPTION)$(FINDLIBS_ST).lib" $(.nl)"$(LIBRARY_OPTION)$(FINDLIBS_SA).lib")" |
| 519 | 523 | if %ERRORLEVEL% NEQ 0 EXIT %ERRORLEVEL% |
| | 524 | if exist "$(PDB_NAME:S=.intermediate-pdb)" DEL "$(PDB_NAME:S=.intermediate-pdb)" |
| 520 | 525 | } |
| 521 | 526 | |
| 522 | 527 | actions manifest.dll |
| … |
… |
if [ os.name ] in NT
|
| 528 | 533 | } |
| 529 | 534 | else |
| 530 | 535 | { |
| 531 | | actions link bind DEF_FILE LIBRARIES_MENTIONED_BY_FILE |
| | 536 | actions link bind DEF_FILE LIBRARIES_MENTIONED_BY_FILE PDB_NAME |
| 532 | 537 | { |
| 533 | | $(.LD) $(LINKFLAGS) /out:"$(<[1]:W)" /LIBPATH:"$(LINKPATH:W)" $(OPTIONS) @"@($(<[1]:W).rsp:E=$(.nl)"$(>)" $(.nl)$(LIBRARIES_MENTIONED_BY_FILE) $(.nl)$(LIBRARIES) $(.nl)"$(LIBRARY_OPTION)$(FINDLIBS_ST).lib" $(.nl)"$(LIBRARY_OPTION)$(FINDLIBS_SA).lib")" |
| | 538 | $(.LD) $(LINKFLAGS) /out:"$(<[1]:W)" /LIBPATH:"$(LINKPATH:W)" $(OPTIONS) $(PDB_LINKFLAG)"$(PDB_NAME)" /PDBALTPATH:"$(PDB_NAME:B).pdb" @"@($(<[1]:W).rsp:E=$(.nl)"$(>)" $(.nl)$(LIBRARIES_MENTIONED_BY_FILE) $(.nl)$(LIBRARIES) $(.nl)"$(LIBRARY_OPTION)$(FINDLIBS_ST).lib" $(.nl)"$(LIBRARY_OPTION)$(FINDLIBS_SA).lib")" |
| 534 | 539 | } |
| 535 | 540 | |
| 536 | 541 | actions manifest |
| … |
… |
else
|
| 540 | 545 | fi |
| 541 | 546 | } |
| 542 | 547 | |
| 543 | | actions link.dll bind DEF_FILE LIBRARIES_MENTIONED_BY_FILE |
| | 548 | actions link.dll bind DEF_FILE LIBRARIES_MENTIONED_BY_FILE PDB_NAME |
| 544 | 549 | { |
| 545 | | $(.LD) /DLL $(LINKFLAGS) /out:"$(<[1]:W)" /IMPLIB:"$(<[2]:W)" /LIBPATH:"$(LINKPATH:W)" /def:"$(DEF_FILE)" $(OPTIONS) @"@($(<[1]:W).rsp:E=$(.nl)"$(>)" $(.nl)$(LIBRARIES_MENTIONED_BY_FILE) $(.nl)$(LIBRARIES) $(.nl)"$(LIBRARY_OPTION)$(FINDLIBS_ST).lib" $(.nl)"$(LIBRARY_OPTION)$(FINDLIBS_SA).lib")" |
| | 550 | $(.LD) /DLL $(LINKFLAGS) /out:"$(<[1]:W)" /IMPLIB:"$(<[2]:W)" /LIBPATH:"$(LINKPATH:W)" /def:"$(DEF_FILE)" $(OPTIONS) $(PDB_LINKFLAG)"$(PDB_NAME)" /PDBALTPATH:"$(PDB_NAME:B).pdb" @"@($(<[1]:W).rsp:E=$(.nl)"$(>)" $(.nl)$(LIBRARIES_MENTIONED_BY_FILE) $(.nl)$(LIBRARIES) $(.nl)"$(LIBRARY_OPTION)$(FINDLIBS_ST).lib" $(.nl)"$(LIBRARY_OPTION)$(FINDLIBS_SA).lib")" |
| | 551 | $(.RM) "$(PDB_NAME:S=.intermediate-pdb)" |
| 546 | 552 | } |
| 547 | 553 | |
| 548 | 554 | actions manifest.dll |
| … |
… |
class msvc-pch-generator : pch-generator
|
| 620 | 626 | { |
| 621 | 627 | if [ type.is-derived [ $(g).type ] PCH ] |
| 622 | 628 | { |
| 623 | | pch-file = $(g) ; |
| | 629 | pch-file = $(PDB_NAME:B)$(g) ; |
| 624 | 630 | } |
| 625 | 631 | } |
| 626 | 632 | |
| … |
… |
local rule register-toolset-really ( )
|
| 1258 | 1264 | |
| 1259 | 1265 | # Declare flags for linking. |
| 1260 | 1266 | { |
| 1261 | | toolset.flags msvc.link PDB_LINKFLAG <debug-symbols>on/<debug-store>database : /PDB: ; # not used yet |
| | 1267 | toolset.flags msvc.link PDB_LINKFLAG <debug-symbols>on/<debug-store>database : /PDB: ; |
| 1262 | 1268 | toolset.flags msvc.link LINKFLAGS <debug-symbols>on : /DEBUG ; |
| 1263 | 1269 | toolset.flags msvc.link DEF_FILE <def-file> ; |
| 1264 | 1270 | |