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 | |