Boost logo

Boost-Build :

From: Austin Robison (austin_at_[hidden])
Date: 2005-08-17 20:22:35


Hi all,

I'm having some problems with implicit dependencies not functioning properly with .c files. The system does not appear to detect changes in header files, though works just fine for c++ code. I've set up a small canonical example of the problem extracted from the larger project I am working on. Mydirectory structure looks like this:

Root/
jamfile
project-root.jam (empty)
Code/
foo.h
foo.c
jamfile

The contents of Root/jamfile are:

variant _debug : debug :
<link>static
<link-runtime>static
<define>RWDEBUG
<define>LFPDEBUG
<define>VC_DEBUG
<define>_DEBUG
;

project jamtest
: requirements
<include>.
<include>"./Code"

: build-dir /build/lib
;

alias src_list :
Code
;

lib JamTest
: src_list
: <variant>_debug
;

-----------------------------
and the contents Root/Code/jamfile are:

project _Code
: usage-requirements <include>.
: build-dir /build/obj/Code
;

obj foo : foo.c ;

alias _Code : foo ;

I build using:
bjam toolset=pc debug JamTest

-----------------------------
The problem occurs when, after a successful build, I make a change to foo.h. When I run bjam again, it believes that the project is up to date and foo.c is not recompiled. However, if I rename foo.c to foo.cpp and change the jamfile to reflect this it correctly detects the change in foo.h and recompiles foo.cpp. I am baffled. I've attached pc.jam below, the definitionsthe custom toolset uses if that's any help. I'm also using Boost.Build V2(Milestone 10) and Boost.Jam 03.01.10.

Thanks,
Austin

pc.jam
---------------------------------------------------
# Copyright David Abrahams 2003. Permission to copy, use,
# modify, sell and distribute this software is granted provided this
# copyright notice appears in all copies. This software is provided
# "as is" without express or implied warranty, and with no claim as
# to its suitability for any purpose.
import property ;
import generators ;
import os ;
import type ;
import toolset : flags ;
import errors : error ;
import feature : feature ;
import path ;
import sequence : unique ;
import common ;
import regex ;

if [ MATCH (--debug-configuration) : [ modules.peek : ARGV ] ]
{
.debug-configuration = true ;
}

feature.extend toolset : pc ;

rule init (
version ? # the msvc version which is being configured. When omitted
# the tools invoked when no explicit version is given will be configured.
: path ?
# the path to root directory of msvc installation. If not specified:
# - if version is given, default location for that version will besearched
#
# - if version is not given, default locations for 7.1, 7.0 and 6.* will
# be searched
#
# - if compiler is not found in default locations, PATH will be searched.
: vendor ? : setup ? compiler ? linker ? )
{

}

.CC = cl ;
.LD = LINK ;

type.set-generated-target-suffix STATIC_LIB : <toolset>pc : a ;

# Declare generators

# is it possible to combine these?
# make the generators non-composing, so that they don't convert each source
# into separate rsp file.
generators.register-linker pc.link : OBJ SEARCHED_LIB STATIC_LIB IMPORT_LIB: EXE RSP : <toolset>pc ;
generators.register-linker pc.link.dll : OBJ SEARCHED_LIB STATIC_LIB IMPORT_LIB : SHARED_LIB IMPORT_LIB RSP : <toolset>pc ;

generators.register-composing pc.archive : OBJ : STATIC_LIB RSP : <toolset>pc ;
generators.register-c-compiler pc.compile.c++ : CPP : OBJ : <toolset>pc ;
generators.register-c-compiler pc.compile.c : C : OBJ : <toolset>pc ;

#
# Declare flags and action for compilation
#

flags pc.compile CFLAGS <debug-symbols>on : /Z7 ;
flags pc.compile CFLAGS <optimization>off : /Od ;
flags pc.compile CFLAGS <optimization>speed : /Ogity /O2 /Gs ;
flags pc.compile CFLAGS <optimization>space : /Ogisy /O1 /Gs ;
flags pc.compile CFLAGS <inlining>off : /Ob0 ;
flags pc.compile CFLAGS <inlining>on : /Ob1 ;
flags pc.compile CFLAGS <inlining>full : /Ob2 ;
flags pc.compile CFLAGS <rtti>off : /GR- ;
flags pc.compile CFLAGS <rtti>on : /GR ;
flags pc.compile CFLAGS <runtime-debugging>off/<link-runtime>shared : /MD ;
flags pc.compile CFLAGS <runtime-debugging>on/<link-runtime>shared : /MDd ;

flags pc.compile CFLAGS <runtime-debugging>off/<link-runtime>static/<threading>single : /ML ;
flags pc.compile CFLAGS <runtime-debugging>on/<link-runtime>static/<threading>single : /MLd ;
flags pc.compile CFLAGS <runtime-debugging>off/<link-runtime>static/<threading>multi : /MT ;
flags pc.compile CFLAGS <runtime-debugging>on/<link-runtime>static/<threading>multi : /MTd ;

flags pc.compile USER_CFLAGS <cflags> : ;
flags pc.compile.c++ USER_CFLAGS <cxxflags> : ;

flags pc.compile DEFINES <define> ;
flags pc.compile UNDEFS <undef> ;
flags pc.compile INCLUDES <include> ;

# *********************************
# some standard compile options, defines and includes
# *********************************
STD_OPTIONS = ;
STD_DEFINES = TARGET_PC ;

rule compile.c++ ( targets * : sources * : property-set * )
{

local myvariant = [ feature.get-values <variant> : $(property-set) ] ;
 
local sbrname = [ regex.replace $(targets:G=) "obj" "sbr" ] ;

SBRDIR = ./build/lib/pc/$(myvariant)/sbr/ ;
 

SBROPTION = /FR\"./build/lib/pc/$(myvariant)/\" ;
}

# The actions differ only by explicit selection of input language
actions compile.c
{
call "C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\bin\vcvars32.bat" > nul
$(.CC) -nologo -TC -U$(UNDEFS) -D$(STD_DEFINES) -D$(DEFINES) $(STD_OPTIONS) $(CFLAGS) $(USER_CFLAGS) -I"$(INCLUDES)" -c -Fo"$(<)" "$(>)"
}
actions compile.c++
{
call "C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\bin\vcvars32.bat" > nul
$(.CC) -nologo -TP -U$(UNDEFS) -D$(STD_DEFINES) -D$(DEFINES) $(STD_OPTIONS) $(CFLAGS) $(USER_CFLAGS) -I"$(INCLUDES)" -c -Fo"$(<)" "$(>)"
}

# Declare flags and action for linking
flags pc.link LINKFLAGS <debug-symbols>on : /DEBUG ;
flags pc.link DEF_FILE <def-file> ;
# The linker disables the default optimizations when using /DEBUG. Whe have
# to enable them manually for release builds with debug symbols.
flags pc LINKFLAGS <debug-symbols>on/<runtime-debugging>off : /OPT:REF,ICF ;

flags pc LINKFLAGS <main-target-type>LIB/<link>shared : /DLL ;

toolset.flags pc.link USER_LINKFLAGS <linkflags> ;
toolset.flags pc.link LINKPATH <library-path> ;

flags pc.link FINDLIBS_ST <find-static-library> ;
flags pc.link FINDLIBS_SA <find-shared-library> ;
flags pc.link LIBRARY_OPTION <toolset>pc : "" : unchecked ;

# incremental linking a DLL causes no end of problems: if the
# actual exports don't change, the import .lib file is never
# updated. Therefore, the .lib is always out-of-date and gets
# rebuilt every time. I'm not sure that incremental linking is
# such a great idea in general, but in this case I'm sure we
# don't want it.

DXLIBS = dinput.lib dxguid.lib dxerr9.lib dinput8.lib d3dx9.lib d3d9.lib winmm.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib;
RWLIBS = rpskinmatfx.lib rpmatfx.lib rpptank.lib rtquat.lib rpskin.lib rtanim.lib rphanim.lib rt2d.lib rtpitexd.lib rtcharse.lib rtfsyst.lib rtbmp.lib rtpng.lib rpworld.lib rwcore.lib rpptank.lib rtpick.lib rpcollis.lib rtintsec.lib rplogo.lib rttoc.lib rtquat.lib ;

OTHERLIBS = dbghelp.lib ;
OTHERLIBPATHS = "C:\\Program Files\\Microsoft Visual Studio\\VC98\\Lib" ;

STDLINKOPTIONS = /subsystem:windows ;

# Declare action for creating static libraries

rule link ( targets + : sources * : properties * )
{

local myvariant = [ feature.get-values <variant> : $(properties) ] ;

local mapname = [ regex.replace $(targets[1]:G=) "exe" "map" ] ;

MAPFILE = ./build/elf/pc/$(myvariant)/$(mapname) ;

common.response-file $(targets) : $(sources) : $(targets[2])
: $(properties) ;
}

actions link bind DEF_FILE
{
call "C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\bin\vcvars32.bat" > nul
    
$(.LD) /NOLOGO /MAP:"$(MAPFILE)" $(LINKFLAGS) /out:"$(<[1]:W)" /INCREMENTAL:NO /LIBPATH:"$(LINKPATH:W)" /LIBPATH:"$(OTHERLIBPATHS:W)" $(STDLINKOPTIONS) $(USER_LINKFLAGS) $(DXLIBS) $(OTHERLIBS) @"$(<[2]:W)"
}

rule archive ( targets + : sources * : properties * )
{
common.response-file $(targets) : $(sources) : $(targets[2]) : $(properties) ;
}

# If library exists, remove it before adding files. See
# http://article.gmane.org/gmane.comp.lib.boost.build/4241
# for rationale.
actions archive
{
call "C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\bin\vcvars32.bat" > nul

if exist "$(<[1])" DEL "$(<[1])"

$(.LD) /lib /NOLOGO /out:"$(<[1])" @"$(<[2])"
}
        

 ------=_NextPart_000_0062_01C5A358.A3DB3970 Content-Type: text/html;
charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=Content-Type content="text/html; charset=iso-8859-1">
<META content="MSHTML 6.00.2800.1505" name=GENERATOR>
<STYLE></STYLE>
</HEAD>
<BODY bgColor=#ffffff>
<DIV><FONT face=Arial size=2>Hi all,</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>I'm having some problems with implicit dependencies
not functioning properly with .c files.&nbsp; The system does not appear to
detect changes in header files, though works just fine for c++ code.&nbsp; I've
set up a small canonical example of the problem extracted from the larger
project I am working on.&nbsp; My directory structure looks like
this:</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>Root/</FONT></DIV>
<DIV><FONT face=Arial size=2>&nbsp;&nbsp;&nbsp; jamfile</FONT></DIV>
<DIV><FONT face=Arial size=2>&nbsp;&nbsp;&nbsp; project-root.jam
(empty)</FONT></DIV>
<DIV><FONT face=Arial size=2>&nbsp;&nbsp;&nbsp; Code/</FONT></DIV>
<DIV><FONT face=Arial size=2>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
foo.h</FONT></DIV>
<DIV><FONT face=Arial size=2>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
foo.c</FONT></DIV>
<DIV><FONT face=Arial size=2>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
jamfile</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>The contents of Root/jamfile are:</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>variant _debug : debug
:<BR>&nbsp;&lt;link&gt;static<BR>&nbsp;&lt;link-runtime&gt;static<BR>&nbsp;&lt;define&gt;RWDEBUG<BR>&nbsp;&lt;define&gt;LFPDEBUG<BR>&nbsp;&lt;define&gt;VC_DEBUG<BR>&nbsp;&lt;define&gt;_DEBUG<BR>&nbsp;;</FONT></DIV>
<DIV>&nbsp;</DIV><FONT face=Arial size=2>
<DIV><BR>project jamtest <BR>&nbsp;:
requirements<BR>&nbsp;&nbsp;&lt;include&gt;.<BR>&nbsp;&nbsp;&lt;include&gt;"./Code"</DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp;: build-dir /build/lib<BR>&nbsp;;</DIV>
<DIV>&nbsp;</DIV>
<DIV><BR>alias src_list :<BR>&nbsp;Code<BR>&nbsp;;</DIV>
<DIV>&nbsp;</DIV>
<DIV><BR>lib JamTest<BR>&nbsp;: src_list<BR>&nbsp;:
&lt;variant&gt;_debug<BR>&nbsp;;</DIV>
<DIV>&nbsp;</DIV>
<DIV>-----------------------------</DIV>
<DIV>and the contents Root/Code/jamfile are:</DIV>
<DIV>&nbsp;</DIV>
<DIV>project _Code<BR>&nbsp;&nbsp;&nbsp; : usage-requirements
&lt;include&gt;.<BR>&nbsp;&nbsp;&nbsp; : build-dir /build/obj/Code
<BR>&nbsp;&nbsp;&nbsp; ;</DIV>
<DIV>&nbsp;</DIV>
<DIV>obj foo : foo.c ;</DIV>
<DIV>&nbsp;</DIV>
<DIV>alias _Code : foo ; </DIV>
<DIV>&nbsp;</DIV>
<DIV>I build using:</DIV>
<DIV>bjam toolset=pc debug JamTest</DIV>
<DIV>&nbsp;</DIV>
<DIV>-----------------------------</DIV>
<DIV>The problem occurs when, after a successful build, I make a change to
foo.h.&nbsp; When I run bjam again, it believes that the project is up to date
and foo.c is not recompiled.&nbsp; However, if I rename foo.c to foo.cpp and
change the jamfile to reflect this it correctly detects the change in foo.hand
recompiles foo.cpp.&nbsp; I am baffled.&nbsp; I've attached pc.jam below, the
definitions the custom toolset uses if that's any help.&nbsp; I'm also using
Boost.Build V2 (Milestone 10) and Boost.Jam 03.01.10.</DIV>
<DIV>&nbsp;</DIV>
<DIV>Thanks,</DIV>
<DIV>Austin</DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp;</DIV>
<DIV>pc.jam</DIV>
<DIV>---------------------------------------------------</DIV>
<DIV># Copyright David Abrahams 2003. Permission to copy, use,<BR># modify,sell
and distribute this software is granted provided this<BR># copyright notice
appears in all copies. This software is provided<BR># "as is" without express or
implied warranty, and with no claim as<BR># to its suitability for any
purpose.<BR>import property ;<BR>import generators ;<BR>import os ;<BR>import
type ;<BR>import toolset : flags ;<BR>import errors : error ;<BR>import feature
: feature ;<BR>import path ;<BR>import sequence : unique ;<BR>import common
;<BR>import regex ;</DIV>
<DIV>&nbsp;</DIV>
<DIV>if [ MATCH (--debug-configuration) : [ modules.peek : ARGV ]
]<BR>{<BR>&nbsp;&nbsp;&nbsp; .debug-configuration = true ;<BR>}</DIV>
<DIV>&nbsp;</DIV>
<DIV>feature.extend toolset : pc ;</DIV>
<DIV>&nbsp;</DIV>
<DIV><BR>rule init ( <BR>&nbsp; version ? # the msvc version which is being
configured. When
omitted<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #
the tools invoked when no explicit version is given will be
configured.<BR>&nbsp;&nbsp;&nbsp; : path ? <BR>&nbsp;&nbsp; # the path to root
directory of msvc installation. If not specified:<BR>&nbsp;&nbsp;
#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - if version is given, default location
for that version will be searched<BR>&nbsp;&nbsp; # <BR>&nbsp;&nbsp;
#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - if version is not given, default
locations for 7.1, 7.0 and 6.* will <BR>&nbsp;&nbsp;
#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
be searched&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp; # <BR>&nbsp;&nbsp;
#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - if compiler is not found in default
locations, PATH will be searched.&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; :
vendor ? : setup ? compiler ? linker ? )<BR>{&nbsp;&nbsp;&nbsp; </DIV>
<DIV>&nbsp;</DIV>
<DIV>}</DIV>
<DIV>&nbsp;</DIV>
<DIV>.CC = cl ;<BR>.LD = LINK ;</DIV>
<DIV>&nbsp;</DIV>
<DIV>type.set-generated-target-suffix STATIC_LIB : &lt;toolset&gt;pc : a ;&nbsp;
</DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp;</DIV>
<DIV># Declare generators</DIV>
<DIV>&nbsp;</DIV>
<DIV># is it possible to combine these?<BR># make the generators non-composing,
so that they don't convert each source<BR># into separate rsp
file.<BR>generators.register-linker pc.link : OBJ SEARCHED_LIB STATIC_LIB
IMPORT_LIB : EXE RSP : &lt;toolset&gt;pc ;<BR>generators.register-linker
pc.link.dll : OBJ SEARCHED_LIB STATIC_LIB IMPORT_LIB : SHARED_LIB IMPORT_LIB RSP
: &lt;toolset&gt;pc ;</DIV>
<DIV>&nbsp;</DIV>
<DIV>generators.register-composing pc.archive : OBJ : STATIC_LIB RSP :
&lt;toolset&gt;pc ;<BR>generators.register-c-compiler pc.compile.c++ : CPP : OBJ
: &lt;toolset&gt;pc ;<BR>generators.register-c-compiler pc.compile.c : C : OBJ :
&lt;toolset&gt;pc ;</DIV>
<DIV>&nbsp;</DIV>
<DIV>#<BR># Declare flags and action for compilation<BR>#</DIV>
<DIV>&nbsp;</DIV>
<DIV>flags pc.compile CFLAGS &lt;debug-symbols&gt;on : /Z7 ;<BR>flags pc.compile
CFLAGS &lt;optimization&gt;off : /Od ;<BR>flags pc.compile CFLAGS
&lt;optimization&gt;speed : /Ogity /O2 /Gs ;<BR>flags pc.compile CFLAGS
&lt;optimization&gt;space : /Ogisy /O1 /Gs ;<BR>flags pc.compile CFLAGS
&lt;inlining&gt;off : /Ob0 ;<BR>flags pc.compile CFLAGS &lt;inlining&gt;on :
/Ob1 ;<BR>flags pc.compile CFLAGS &lt;inlining&gt;full : /Ob2 ;<BR>flags
pc.compile CFLAGS &lt;rtti&gt;off : /GR- ;<BR>flags pc.compile CFLAGS
&lt;rtti&gt;on : /GR ;<BR>flags pc.compile CFLAGS
&lt;runtime-debugging&gt;off/&lt;link-runtime&gt;shared : /MD ;<BR>flags
pc.compile CFLAGS &lt;runtime-debugging&gt;on/&lt;link-runtime&gt;shared : /MDd
;</DIV>
<DIV>&nbsp;</DIV>
<DIV>flags pc.compile CFLAGS
&lt;runtime-debugging&gt;off/&lt;link-runtime&gt;static/&lt;threading&gt;single
: /ML ;<BR>flags pc.compile CFLAGS
&lt;runtime-debugging&gt;on/&lt;link-runtime&gt;static/&lt;threading&gt;single :
/MLd ;<BR>flags pc.compile CFLAGS
&lt;runtime-debugging&gt;off/&lt;link-runtime&gt;static/&lt;threading&gt;multi :
/MT ;<BR>flags pc.compile CFLAGS
&lt;runtime-debugging&gt;on/&lt;link-runtime&gt;static/&lt;threading&gt;multi :
/MTd ;</DIV>
<DIV>&nbsp;</DIV>
<DIV>flags pc.compile USER_CFLAGS &lt;cflags&gt; : ;<BR>flags pc.compile.c++
USER_CFLAGS &lt;cxxflags&gt; : ;</DIV>
<DIV>&nbsp;</DIV>
<DIV><BR>flags pc.compile DEFINES &lt;define&gt; ;<BR>flags pc.compile UNDEFS
&lt;undef&gt; ;<BR>flags pc.compile INCLUDES &lt;include&gt; ;</DIV>
<DIV>&nbsp;</DIV>
<DIV><BR># *********************************<BR># some standard compile options,
defines and includes<BR># *********************************<BR>STD_OPTIONS =
;<BR>STD_DEFINES = TARGET_PC ;</DIV>
<DIV>&nbsp;</DIV>
<DIV><BR>rule compile.c++ ( targets * : sources * : property-set * )<BR>{</DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp;local myvariant = [ feature.get-values &lt;variant&gt; :
$(property-set) ] ;<BR>&nbsp;<BR>&nbsp;local sbrname = [ regex.replace
$(targets:G=) "obj" "sbr" ] ;</DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp;SBRDIR = ./build/lib/pc/$(myvariant)/sbr/ ;<BR>&nbsp;</DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp;SBROPTION = /FR\"./build/lib/pc/$(myvariant)/\" ;<BR>}</DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp;</DIV>
<DIV># The actions differ only by explicit selection of input
language<BR>actions compile.c<BR>{<BR>&nbsp;&nbsp;&nbsp; call "C:\Program
Files\Microsoft Visual Studio .NET 2003\Vc7\bin\vcvars32.bat" &gt;
nul<BR>&nbsp;&nbsp;&nbsp; $(.CC) -nologo -TC -U$(UNDEFS) -D$(STD_DEFINES)
-D$(DEFINES) $(STD_OPTIONS) $(CFLAGS) $(USER_CFLAGS) -I"$(INCLUDES)" -c
-Fo"$(&lt;)" "$(&gt;)"<BR>}<BR>actions compile.c++<BR>{<BR>&nbsp;&nbsp;&nbsp;
call "C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\bin\vcvars32.bat"
&gt; nul<BR>&nbsp;&nbsp;&nbsp; $(.CC) -nologo -TP -U$(UNDEFS) -D$(STD_DEFINES)
-D$(DEFINES) $(STD_OPTIONS) $(CFLAGS) $(USER_CFLAGS) -I"$(INCLUDES)" -c
-Fo"$(&lt;)" "$(&gt;)"<BR>}</DIV>
<DIV>&nbsp;</DIV>
<DIV><BR># Declare flags and action for linking<BR>flags pc.link LINKFLAGS
&lt;debug-symbols&gt;on : /DEBUG ;<BR>flags pc.link DEF_FILE &lt;def-file&gt;
;<BR># The linker disables the default optimizations when using /DEBUG. Whe
have<BR># to enable them manually for release builds with debug
symbols.<BR>flags pc LINKFLAGS
&lt;debug-symbols&gt;on/&lt;runtime-debugging&gt;off : /OPT:REF,ICF ;</DIV>
<DIV>&nbsp;</DIV>
<DIV><BR>flags pc LINKFLAGS &lt;main-target-type&gt;LIB/&lt;link&gt;shared :
/DLL ;</DIV>
<DIV>&nbsp;</DIV>
<DIV>toolset.flags pc.link USER_LINKFLAGS &lt;linkflags&gt; ;<BR>toolset.flags
pc.link LINKPATH &lt;library-path&gt; ;</DIV>
<DIV>&nbsp;</DIV>
<DIV><BR>flags pc.link FINDLIBS_ST &lt;find-static-library&gt; ;<BR>flags
pc.link FINDLIBS_SA &lt;find-shared-library&gt; ;<BR>flags pc.link
LIBRARY_OPTION &lt;toolset&gt;pc : "" : unchecked ;</DIV>
<DIV>&nbsp;</DIV>
<DIV><BR># incremental linking a DLL causes no end of problems: if the<BR>#
actual exports don't change, the import .lib file is never<BR># updated.
Therefore, the .lib is always out-of-date and gets<BR># rebuilt every time.I'm
not sure that incremental linking is<BR># such a great idea in general, butin
this case I'm sure we<BR># don't want it.</DIV>
<DIV>&nbsp;</DIV>
<DIV>DXLIBS = dinput.lib dxguid.lib dxerr9.lib dinput8.lib d3dx9.lib d3d9.lib
winmm.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib
advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib
;<BR>RWLIBS = rpskinmatfx.lib rpmatfx.lib rpptank.lib rtquat.lib rpskin.lib
rtanim.lib rphanim.lib rt2d.lib rtpitexd.lib rtcharse.lib rtfsyst.lib rtbmp.lib
rtpng.lib rpworld.lib rwcore.lib rpptank.lib rtpick.lib rpcollis.lib
rtintsec.lib rplogo.lib rttoc.lib rtquat.lib ;</DIV>
<DIV>&nbsp;</DIV>
<DIV>OTHERLIBS = dbghelp.lib ;<BR>OTHERLIBPATHS = "C:\\Program Files\\Microsoft
Visual Studio\\VC98\\Lib" ;</DIV>
<DIV>&nbsp;</DIV>
<DIV>STDLINKOPTIONS = /subsystem:windows ;</DIV>
<DIV>&nbsp;</DIV>
<DIV># Declare action for creating static libraries</DIV>
<DIV>&nbsp;</DIV>
<DIV>rule link ( targets + : sources * : properties * )<BR>{</DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp;local myvariant = [ feature.get-values &lt;variant&gt; :
$(properties) ] ;</DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp;local mapname = [ regex.replace $(targets[1]:G=) "exe" "map"]
;</DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp;MAPFILE = ./build/elf/pc/$(myvariant)/$(mapname) ;</DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp;common.response-file $(targets) : $(sources) : $(targets[2])
<BR>&nbsp;&nbsp; : $(properties) ;<BR>}</DIV>
<DIV>&nbsp;</DIV>
<DIV><BR>actions link bind DEF_FILE<BR>{<BR>&nbsp;&nbsp;&nbsp; call "C:\Program
Files\Microsoft Visual Studio .NET 2003\Vc7\bin\vcvars32.bat" &gt;
nul<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; $(.LD) /NOLOGO
/MAP:"$(MAPFILE)" $(LINKFLAGS) /out:"$(&lt;[1]:W)" /INCREMENTAL:NO
/LIBPATH:"$(LINKPATH:W)" /LIBPATH:"$(OTHERLIBPATHS:W)" $(STDLINKOPTIONS)
$(USER_LINKFLAGS) $(DXLIBS) $(OTHERLIBS) @"$(&lt;[2]:W)"<BR>}</DIV>
<DIV>&nbsp;</DIV>
<DIV><BR>rule archive ( targets + : sources * : properties * )&nbsp;&nbsp;&nbsp;
<BR>{<BR>&nbsp;&nbsp;&nbsp; common.response-file $(targets) : $(sources) :
$(targets[2]) : $(properties) ;<BR>}</DIV>
<DIV>&nbsp;</DIV>
<DIV># If library exists, remove it before adding files. See<BR># <A
href="http://article.gmane.org/gmane.comp.lib.boost.build/4241">http://article.gmane.org/gmane.comp.lib.boost.build/4241>&nbsp;&nbsp;&nbsp;
<BR># for rationale.<BR>actions archive <BR>{&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;
call "C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\bin\vcvars32.bat"
&gt; nul</DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp;&nbsp;&nbsp; if exist "$(&lt;[1])" DEL "$(&lt;[1])"</DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp;&nbsp;&nbsp; $(.LD) /lib /NOLOGO /out:"$(&lt;[1])"
@"$(&lt;[2])"<BR>}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR></DIV>
<DIV></FONT>&nbsp;</DIV></BODY></HTML>
 ------=_NextPart_000_0062_01C5A358.A3DB3970--


Boost-Build list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk