From 2f5e92556ed70ff62d36a9c89ab157a91931acf1 Mon Sep 17 00:00:00 2001 From: Daniela Engert 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 --- 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/tools/build/v2/tools/msvc.jam +++ b/tools/build/v2/tools/msvc.jam @@ -382,20 +382,16 @@ actions preprocess-c-c++ bind PDB_NAME $(.CC) @"@($(<[1]:W).rsp:E="$(>[1]:W)" -E $(PDB_CFLAG)"$(PDB_NAME)" -Yu"$(>[3]:D=)" -Fp"$(>[2]:W)" $(CC_RSPLINE))" >"$(<[1]:W)" } -rule compile-c-c++ ( targets + : sources * ) +rule compile-c-c++ ( targets + : sources * : properties * ) { DEPENDS $(<[1]) : [ on $(<[1]) return $(PCH_HEADER) ] ; DEPENDS $(<[1]) : [ on $(<[1]) return $(PCH_FILE) ] ; - PDB_NAME on $(<) = $(<[1]:S=.pdb) ; - LOCATE on $(<[1]:S=.pdb) = [ on $(<[1]) return $(LOCATE) ] ; } -rule preprocess-c-c++ ( targets + : sources * ) +rule preprocess-c-c++ ( targets + : sources * : properties * ) { DEPENDS $(<[1]) : [ on $(<[1]) return $(PCH_HEADER) ] ; DEPENDS $(<[1]) : [ on $(<[1]) return $(PCH_FILE) ] ; - PDB_NAME on $(<) = $(<:S=.pdb) ; - LOCATE on $(<[1]:S=.pdb) = [ on $(<[1]) return $(LOCATE) ] ; } # Action for running the C/C++ compiler using precompiled headers. In addition @@ -404,18 +400,18 @@ rule preprocess-c-c++ ( targets + : sources * ) # # The global .escaped-double-quote variable is used to avoid messing up Emacs # syntax highlighting in the messy N-quoted code below. -actions compile-c-c++-pch +actions compile-c-c++-pch bind PDB_NAME { - $(.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) + $(.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) } # Action for running the C/C++ compiler using precompiled headers. An already # built source file for compiling the precompiled headers is expected to be # given as one of the source parameters. -actions compile-c-c++-pch-s +actions compile-c-c++-pch-s bind PDB_NAME { - $(.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) + $(.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) } @@ -473,6 +469,10 @@ actions compile.rc rule link ( targets + : sources * : properties * ) { + PDB_NAME on $(<[1]) = $(<[1]:S=.pdb) ; + LOCATE on $(<[1]:S=.pdb) = [ on $(<[1]) return $(LOCATE) ] ; + PDB_NAME on $(>) = $(<[1]:S=.pdb) ; + LOCATE on $(<[1]:S=.pdb) = [ on $(<[1]) return $(LOCATE) ] ; if on in $(properties) { msvc.manifest $(targets) : $(sources) : $(properties) ; @@ -481,6 +481,10 @@ rule link ( targets + : sources * : properties * ) rule link.dll ( targets + : sources * : properties * ) { + PDB_NAME on $(<[1]) = $(<[1]:S=.pdb) ; + LOCATE on $(<[1]:S=.pdb) = [ on $(<[1]) return $(LOCATE) ] ; + PDB_NAME on $(>) = $(<[1]:S=.intermediate-pdb) ; + LOCATE on $(<[1]:S=.intermediate-pdb) = [ on $(<[1]) return $(LOCATE) ] ; DEPENDS $(<) : [ on $(<) return $(DEF_FILE) ] ; if on in $(properties) { @@ -500,9 +504,9 @@ rule link.dll ( targets + : sources * : properties * ) if [ os.name ] in NT { - actions link bind DEF_FILE LIBRARIES_MENTIONED_BY_FILE + actions link bind DEF_FILE LIBRARIES_MENTIONED_BY_FILE PDB_NAME { - $(.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")" + $(.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")" if %ERRORLEVEL% NEQ 0 EXIT %ERRORLEVEL% } @@ -513,10 +517,11 @@ if [ os.name ] in NT ) } - actions link.dll bind DEF_FILE LIBRARIES_MENTIONED_BY_FILE + actions link.dll bind DEF_FILE LIBRARIES_MENTIONED_BY_FILE PDB_NAME { - $(.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")" + $(.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")" if %ERRORLEVEL% NEQ 0 EXIT %ERRORLEVEL% + if exist "$(PDB_NAME:S=.intermediate-pdb)" DEL "$(PDB_NAME:S=.intermediate-pdb)" } actions manifest.dll @@ -528,9 +533,9 @@ if [ os.name ] in NT } else { - actions link bind DEF_FILE LIBRARIES_MENTIONED_BY_FILE + actions link bind DEF_FILE LIBRARIES_MENTIONED_BY_FILE PDB_NAME { - $(.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")" + $(.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")" } actions manifest @@ -540,9 +545,10 @@ else fi } - actions link.dll bind DEF_FILE LIBRARIES_MENTIONED_BY_FILE + actions link.dll bind DEF_FILE LIBRARIES_MENTIONED_BY_FILE PDB_NAME { - $(.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")" + $(.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")" + $(.RM) "$(PDB_NAME:S=.intermediate-pdb)" } actions manifest.dll @@ -620,7 +626,7 @@ class msvc-pch-generator : pch-generator { if [ type.is-derived [ $(g).type ] PCH ] { - pch-file = $(g) ; + pch-file = $(PDB_NAME:B)$(g) ; } } @@ -1258,7 +1264,7 @@ local rule register-toolset-really ( ) # Declare flags for linking. { - toolset.flags msvc.link PDB_LINKFLAG on/database : /PDB: ; # not used yet + toolset.flags msvc.link PDB_LINKFLAG on/database : /PDB: ; toolset.flags msvc.link LINKFLAGS on : /DEBUG ; toolset.flags msvc.link DEF_FILE ; -- 1.8.3.msysgit.0