|
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> </DIV>
<DIV><FONT face=Arial size=2>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. My directory structure looks like
this:</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2>Root/</FONT></DIV>
<DIV><FONT face=Arial size=2> jamfile</FONT></DIV>
<DIV><FONT face=Arial size=2> project-root.jam
(empty)</FONT></DIV>
<DIV><FONT face=Arial size=2> Code/</FONT></DIV>
<DIV><FONT face=Arial size=2>
foo.h</FONT></DIV>
<DIV><FONT face=Arial size=2>
foo.c</FONT></DIV>
<DIV><FONT face=Arial size=2>
jamfile</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2>The contents of Root/jamfile are:</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2>variant _debug : debug
:<BR> <link>static<BR> <link-runtime>static<BR> <define>RWDEBUG<BR> <define>LFPDEBUG<BR> <define>VC_DEBUG<BR> <define>_DEBUG<BR> ;</FONT></DIV>
<DIV> </DIV><FONT face=Arial size=2>
<DIV><BR>project jamtest <BR> :
requirements<BR> <include>.<BR> <include>"./Code"</DIV>
<DIV> </DIV>
<DIV> : build-dir /build/lib<BR> ;</DIV>
<DIV> </DIV>
<DIV><BR>alias src_list :<BR> Code<BR> ;</DIV>
<DIV> </DIV>
<DIV><BR>lib JamTest<BR> : src_list<BR> :
<variant>_debug<BR> ;</DIV>
<DIV> </DIV>
<DIV>-----------------------------</DIV>
<DIV>and the contents Root/Code/jamfile are:</DIV>
<DIV> </DIV>
<DIV>project _Code<BR> : usage-requirements
<include>.<BR> : build-dir /build/obj/Code
<BR> ;</DIV>
<DIV> </DIV>
<DIV>obj foo : foo.c ;</DIV>
<DIV> </DIV>
<DIV>alias _Code : foo ; </DIV>
<DIV> </DIV>
<DIV>I build using:</DIV>
<DIV>bjam toolset=pc debug JamTest</DIV>
<DIV> </DIV>
<DIV>-----------------------------</DIV>
<DIV>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.hand
recompiles foo.cpp. I am baffled. I've attached pc.jam below, the
definitions the custom toolset uses if that's any help. I'm also using
Boost.Build V2 (Milestone 10) and Boost.Jam 03.01.10.</DIV>
<DIV> </DIV>
<DIV>Thanks,</DIV>
<DIV>Austin</DIV>
<DIV> </DIV>
<DIV> </DIV>
<DIV> </DIV>
<DIV> </DIV>
<DIV> </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> </DIV>
<DIV>if [ MATCH (--debug-configuration) : [ modules.peek : ARGV ]
]<BR>{<BR> .debug-configuration = true ;<BR>}</DIV>
<DIV> </DIV>
<DIV>feature.extend toolset : pc ;</DIV>
<DIV> </DIV>
<DIV><BR>rule init ( <BR> version ? # the msvc version which is being
configured. When
omitted<BR> #
the tools invoked when no explicit version is given will be
configured.<BR> : path ? <BR> # the path to root
directory of msvc installation. If not specified:<BR>
# - if version is given, default location
for that version will be searched<BR> # <BR>
# - if version is not given, default
locations for 7.1, 7.0 and 6.* will <BR>
#
be searched <BR> # <BR>
# - if compiler is not found in default
locations, PATH will be searched. <BR> :
vendor ? : setup ? compiler ? linker ? )<BR>{ </DIV>
<DIV> </DIV>
<DIV>}</DIV>
<DIV> </DIV>
<DIV>.CC = cl ;<BR>.LD = LINK ;</DIV>
<DIV> </DIV>
<DIV>type.set-generated-target-suffix STATIC_LIB : <toolset>pc : a ;
</DIV>
<DIV> </DIV>
<DIV> </DIV>
<DIV> </DIV>
<DIV># Declare generators</DIV>
<DIV> </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 : <toolset>pc ;<BR>generators.register-linker
pc.link.dll : OBJ SEARCHED_LIB STATIC_LIB IMPORT_LIB : SHARED_LIB IMPORT_LIB RSP
: <toolset>pc ;</DIV>
<DIV> </DIV>
<DIV>generators.register-composing pc.archive : OBJ : STATIC_LIB RSP :
<toolset>pc ;<BR>generators.register-c-compiler pc.compile.c++ : CPP : OBJ
: <toolset>pc ;<BR>generators.register-c-compiler pc.compile.c : C : OBJ :
<toolset>pc ;</DIV>
<DIV> </DIV>
<DIV>#<BR># Declare flags and action for compilation<BR>#</DIV>
<DIV> </DIV>
<DIV>flags pc.compile CFLAGS <debug-symbols>on : /Z7 ;<BR>flags pc.compile
CFLAGS <optimization>off : /Od ;<BR>flags pc.compile CFLAGS
<optimization>speed : /Ogity /O2 /Gs ;<BR>flags pc.compile CFLAGS
<optimization>space : /Ogisy /O1 /Gs ;<BR>flags pc.compile CFLAGS
<inlining>off : /Ob0 ;<BR>flags pc.compile CFLAGS <inlining>on :
/Ob1 ;<BR>flags pc.compile CFLAGS <inlining>full : /Ob2 ;<BR>flags
pc.compile CFLAGS <rtti>off : /GR- ;<BR>flags pc.compile CFLAGS
<rtti>on : /GR ;<BR>flags pc.compile CFLAGS
<runtime-debugging>off/<link-runtime>shared : /MD ;<BR>flags
pc.compile CFLAGS <runtime-debugging>on/<link-runtime>shared : /MDd
;</DIV>
<DIV> </DIV>
<DIV>flags pc.compile CFLAGS
<runtime-debugging>off/<link-runtime>static/<threading>single
: /ML ;<BR>flags pc.compile CFLAGS
<runtime-debugging>on/<link-runtime>static/<threading>single :
/MLd ;<BR>flags pc.compile CFLAGS
<runtime-debugging>off/<link-runtime>static/<threading>multi :
/MT ;<BR>flags pc.compile CFLAGS
<runtime-debugging>on/<link-runtime>static/<threading>multi :
/MTd ;</DIV>
<DIV> </DIV>
<DIV>flags pc.compile USER_CFLAGS <cflags> : ;<BR>flags pc.compile.c++
USER_CFLAGS <cxxflags> : ;</DIV>
<DIV> </DIV>
<DIV><BR>flags pc.compile DEFINES <define> ;<BR>flags pc.compile UNDEFS
<undef> ;<BR>flags pc.compile INCLUDES <include> ;</DIV>
<DIV> </DIV>
<DIV><BR># *********************************<BR># some standard compile options,
defines and includes<BR># *********************************<BR>STD_OPTIONS =
;<BR>STD_DEFINES = TARGET_PC ;</DIV>
<DIV> </DIV>
<DIV><BR>rule compile.c++ ( targets * : sources * : property-set * )<BR>{</DIV>
<DIV> </DIV>
<DIV> local myvariant = [ feature.get-values <variant> :
$(property-set) ] ;<BR> <BR> local sbrname = [ regex.replace
$(targets:G=) "obj" "sbr" ] ;</DIV>
<DIV> </DIV>
<DIV> SBRDIR = ./build/lib/pc/$(myvariant)/sbr/ ;<BR> </DIV>
<DIV> </DIV>
<DIV> SBROPTION = /FR\"./build/lib/pc/$(myvariant)/\" ;<BR>}</DIV>
<DIV> </DIV>
<DIV> </DIV>
<DIV> </DIV>
<DIV># The actions differ only by explicit selection of input
language<BR>actions compile.c<BR>{<BR> call "C:\Program
Files\Microsoft Visual Studio .NET 2003\Vc7\bin\vcvars32.bat" >
nul<BR> $(.CC) -nologo -TC -U$(UNDEFS) -D$(STD_DEFINES)
-D$(DEFINES) $(STD_OPTIONS) $(CFLAGS) $(USER_CFLAGS) -I"$(INCLUDES)" -c
-Fo"$(<)" "$(>)"<BR>}<BR>actions compile.c++<BR>{<BR>
call "C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\bin\vcvars32.bat"
> nul<BR> $(.CC) -nologo -TP -U$(UNDEFS) -D$(STD_DEFINES)
-D$(DEFINES) $(STD_OPTIONS) $(CFLAGS) $(USER_CFLAGS) -I"$(INCLUDES)" -c
-Fo"$(<)" "$(>)"<BR>}</DIV>
<DIV> </DIV>
<DIV><BR># Declare flags and action for linking<BR>flags pc.link LINKFLAGS
<debug-symbols>on : /DEBUG ;<BR>flags pc.link DEF_FILE <def-file>
;<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
<debug-symbols>on/<runtime-debugging>off : /OPT:REF,ICF ;</DIV>
<DIV> </DIV>
<DIV><BR>flags pc LINKFLAGS <main-target-type>LIB/<link>shared :
/DLL ;</DIV>
<DIV> </DIV>
<DIV>toolset.flags pc.link USER_LINKFLAGS <linkflags> ;<BR>toolset.flags
pc.link LINKPATH <library-path> ;</DIV>
<DIV> </DIV>
<DIV><BR>flags pc.link FINDLIBS_ST <find-static-library> ;<BR>flags
pc.link FINDLIBS_SA <find-shared-library> ;<BR>flags pc.link
LIBRARY_OPTION <toolset>pc : "" : unchecked ;</DIV>
<DIV> </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> </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> </DIV>
<DIV>OTHERLIBS = dbghelp.lib ;<BR>OTHERLIBPATHS = "C:\\Program Files\\Microsoft
Visual Studio\\VC98\\Lib" ;</DIV>
<DIV> </DIV>
<DIV>STDLINKOPTIONS = /subsystem:windows ;</DIV>
<DIV> </DIV>
<DIV># Declare action for creating static libraries</DIV>
<DIV> </DIV>
<DIV>rule link ( targets + : sources * : properties * )<BR>{</DIV>
<DIV> </DIV>
<DIV> local myvariant = [ feature.get-values <variant> :
$(properties) ] ;</DIV>
<DIV> </DIV>
<DIV> local mapname = [ regex.replace $(targets[1]:G=) "exe" "map"]
;</DIV>
<DIV> </DIV>
<DIV> MAPFILE = ./build/elf/pc/$(myvariant)/$(mapname) ;</DIV>
<DIV> </DIV>
<DIV> common.response-file $(targets) : $(sources) : $(targets[2])
<BR> : $(properties) ;<BR>}</DIV>
<DIV> </DIV>
<DIV><BR>actions link bind DEF_FILE<BR>{<BR> call "C:\Program
Files\Microsoft Visual Studio .NET 2003\Vc7\bin\vcvars32.bat" >
nul<BR> <BR> $(.LD) /NOLOGO
/MAP:"$(MAPFILE)" $(LINKFLAGS) /out:"$(<[1]:W)" /INCREMENTAL:NO
/LIBPATH:"$(LINKPATH:W)" /LIBPATH:"$(OTHERLIBPATHS:W)" $(STDLINKOPTIONS)
$(USER_LINKFLAGS) $(DXLIBS) $(OTHERLIBS) @"$(<[2]:W)"<BR>}</DIV>
<DIV> </DIV>
<DIV><BR>rule archive ( targets + : sources * : properties * )
<BR>{<BR> common.response-file $(targets) : $(sources) :
$(targets[2]) : $(properties) ;<BR>}</DIV>
<DIV> </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>
<BR># for rationale.<BR>actions archive <BR>{ <BR>
call "C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\bin\vcvars32.bat"
> nul</DIV>
<DIV> </DIV>
<DIV> if exist "$(<[1])" DEL "$(<[1])"</DIV>
<DIV> </DIV>
<DIV> $(.LD) /lib /NOLOGO /out:"$(<[1])"
@"$(<[2])"<BR>}<BR> <BR></DIV>
<DIV></FONT> </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