#~ Copyright 2002-2007 Rene Rivera.
#~ Distributed under the Boost Software License, Version 1.0.
#~ (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)

# Clean env vars of any "extra" empty values.
for local v in ARGV CC CFLAGS LIBS
{
	local values ;
	for local x in $($(v))
	{
		if $(x) != ""
		{
			values += $(x) ;
		}
	}
	$(v) = $(values) ;
}

# Platform related specifics.
if $(NT) { rule .path { return "$(<:J=\\)" ; } ./ = "/" ; }
else if $(OS2) { rule .path { return "$(<:J=\\)" ; } ./ = "/" ; }
else if $(VMS) { rule .path { return "[.$(<:J=/)]" ; } }
else if $(MAC) { rule .path { return ":$(<:J=\:)" ; } }
else { rule .path { return "$(<:J=/)" ; } }
if $(VMS) { . = "_" ; }
else { . = "." ; }
./ ?= "" ;

# Info about what we are building.
_VERSION_ = 3 1 19 ;
NAME = boost-jam ;
VERSION = $(_VERSION_:J=$(.)) ;
RELEASE = 1 ;
LICENSE = LICENSE_1_0 ;

# Generate development debug binaries?
if --debug in $(ARGV)
{
    debug = true ;
}

if --profile in $(ARGV)
{
    profile = true ;
}

# Attempt to generate and/or build the grammar?
if --grammar in $(ARGV)
{
    grammar = true ;
}

# Do we need to add a default build type argument?
if ! ( --release in $(ARGV) ) &&
   ! ( --debug in $(ARGV) ) &&
   ! ( --profile in $(ARGV) )
{
    ARGV += --release ;
}

# Enable, and configure, Python hooks.
with-python = ;
python-location = [ MATCH --with-python=(.*) : $(ARGV) ] ;
if $(python-location)
{
    with-python = true ;
}
if $(with-python)
{
    if $(NT)
    {
        --python-include = [ .path $(python-location) include ] ;
        --python-lib = ;
        for local v in 26 25 24 23 22
        {
            --python-lib ?=
                [ GLOB [ .path $(python-location) libs ] : "python$(v).lib" ]
                [ GLOB $(python-location) [ .path $(python-location) libs ]
                    $(Path) $(PATH) $(path) : "python$(v).dll" ]
                ;
            if ! $(--python-lib[2])
            {
                --python-lib = ;
            }
        }
        --python-lib = $(--python-lib[1]) ;
    }
    else if $(OS) = MACOSX
    {
        --python-include = [ .path $(python-location) Headers ] ;
        --python-lib = $(python-location) Python ;
    }
    else
    {
        --python-include = ;
        --python-lib = ;
        for local v in 2.6 2.5 2.4 2.3 2.2
        {
            local inc = [ GLOB [ .path $(python-location) include ] : python$(v) ] ;
            local lib = [ GLOB [ .path $(python-location) lib ] : libpython$(v)* ] ;
            if $(inc) && $(lib)
            {
                --python-include ?= $(inc) ;
                --python-lib ?= $(lib[1]:D) python$(v) ;
            }
        }
    }
}

# Boehm GC?
if --gc in $(ARGV)
{
    --boehm-gc = true ;
}
if $(--boehm-gc)
{
    --extra-include += [ .path [ PWD ] "boehm_gc" "include" ] ;
}

# Duma?
if --duma in $(ARGV)
{
    --duma = true ;
}
if $(--duma)
{
    --extra-include += [ .path [ PWD ] "duma" ] ;
}

# An explicit root for the toolset? (trim spaces)
toolset-root = [ MATCH --toolset-root=(.*) : $(ARGV) ] ;
{
    local t = [ MATCH "[ ]*(.*)" : $(toolset-root:J=" ") ] ;
    toolset-root = ;
    while $(t)
    {
        t = [ MATCH "([^ ]+)([ ]*)(.*)" : $(t) ] ;
        toolset-root += $(t[1]) ;
        if $(t[3]) { toolset-root += $(t[2]) ; }
        t = $(t[3]) ;
    }
    toolset-root = $(toolset-root:J="") ;
}

# Configure the implemented toolsets. These are minimal
# commands and options to compile the full Jam. When
# adding new toolsets make sure to add them to the
# "known" list also.

rule toolset ( name command .type ? : opt.out + : opt.define * : flags * : linklibs * )
{
    .type ?= "" ;
    tool.$(name)$(.type).cc ?= $(command) ;
    tool.$(name)$(.type).opt.out ?= $(opt.out) ;
    tool.$(name)$(.type).opt.define ?= $(opt.define) ;
    tool.$(name)$(.type).flags ?= $(flags) ;
    tool.$(name)$(.type).linklibs ?= $(linklibs) ;
    if ! $(name) in $(toolsets) { toolsets += $(name) ; }
}

rule if-os ( os + : yes-opt * : no-opt * )
    { if $(os) in $(OS) { return $(yes-opt) ; } else { return $(no-opt) ; } }

rule opt ( type : yes-opt * : no-opt * )
    { if $(type) in $(ARGV) { return $(yes-opt) ; } else { return $(no-opt) ; } }

## HP-UX aCC compiler
toolset acc cc : "-o " : -D
    : -Ae
    [ opt --release : -s -O3 ]
    [ opt --debug : -g -pg ]
    -I$(--python-include) -I$(--extra-include)
    : -L$(--python-lib[1]) -l$(--python-lib[2]) ;
## Borland C++ 5.5.x
toolset borland bcc32 : -e -n : /D
    : -WC -w- -q "-I$(toolset-root)Include" "-L$(toolset-root)Lib"
    [ opt --release : -O2 -vi -w-inl ]
    [ opt --debug : -v -Od -vi- ]
    -I$(--python-include) -I$(--extra-include)
    : $(--python-lib[1]) ;
## Generic Unix cc
if ! $(CC) { CC = cc ; }
toolset cc $(CC) : "-o " : -D
    : $(CFLAGS)
    [ opt --release : -s -O ]
    [ opt --debug : -g ]
    -I$(--python-include) -I$(--extra-include)
    : $(LIBS) -L$(--python-lib[1]) -l$(--python-lib[2]) ;
## Comeau C/C++ 4.x
toolset como como : "-o " : -D
    : --c
    [ opt --release : --inlining ]
    [ opt --debug : --no_inlining ]
    -I$(--python-include) -I$(--extra-include)
    : -L$(--python-lib[1]) -l$(--python-lib[2]) ;
## MacOSX Darwin, using GCC 2.9.x, 3.x
toolset darwin cc :  "-o " : -D
    :
    [ opt --release : -Wl,-x -O3 -finline-functions ]
    [ opt --debug : -g -O0 -fno-inline -pg ]
    [ opt --profile : -Wl,-x -O3 -finline-functions -g -pg ]
    -I$(--python-include) -I$(--extra-include)
    : -L$(--python-lib[1]) -l$(--python-lib[2]) ;
## GCC 2.x, 3.x, 4.x
toolset gcc gcc : "-o " : -D
    : -pedantic -fno-strict-aliasing
    [ opt --release : [ opt --symbols : -g : -s ] -O3 ]
    [ opt --debug : -g -O0 -fno-inline ]
    -I$(--python-include) -I$(--extra-include) -Wno-long-long
    : -L$(--python-lib[1]) -l$(--python-lib[2]) ;
## GCC 2.x, 3.x on CYGWIN but without cygwin1.dll
toolset gcc-nocygwin gcc : "-o " : -D
    : -s -O3 -mno-cygwin
    [ opt --release : -finline-functions ]
    [ opt --debug : -s -O3 -fno-inline -pg ]
    -I$(--python-include) -I$(--extra-include)
    : -L$(--python-lib[1]) -l$(--python-lib[2]) ;
## Intel C/C++ for Linux
toolset intel-linux icc : "-o " : -D
    :
    [ opt --release : -Xlinker -s -O3 ]
    [ opt --debug : -g -O0 -p ]
    -I$(--python-include) -I$(--extra-include)
    : -L$(--python-lib[1]) -l$(--python-lib[2]) ;
## Intel C/C++ for Win32
toolset intel-win32 icl : /Fe : -D
    : /nologo
    [ opt --release : /MT /O2 /Ob2 /Gy /GF /GA /GB ]
    [ opt --debug : /MTd /DEBUG /Z7 /Od /Ob0 ]
    -I$(--python-include) -I$(--extra-include)
    : kernel32.lib advapi32.lib user32.lib $(--python-lib[1]) ;
## KCC ?
toolset kcc KCC : "-o " : -D
    :
    [ opt --release : -s +K2 ]
    [ opt --debug : -g +K0 ]
    -I$(--python-include) -I$(--extra-include)
    : -L$(--python-lib[1]) -l$(--python-lib[2]) ;
## Borland Kylix
toolset kylix bc++ : -o : -D
    : -tC -q
    [ opt --release : -O2 -vi -w-inl ]
    [ opt --debug : -v -Od -vi- ]
    -I$(--python-include) -I$(--extra-include)
    : -L$(--python-lib[1]) -l$(--python-lib[2]) ;
## Metrowerks CodeWarrior 8.x
{
    # Even though CW can compile all files at once, it crashes if it tries in the bjam case.
    local mwcc = ; if $(NT) { mwcc = mwcc ; } else { mwcc = mwc$(OSPLAT:L) ; }
    mwcc ?= mwcc ;
    toolset metrowerks $(mwcc) : "-o " : -D
        : -c -lang c -subsystem console -cwd include
        [ opt --release : -runtime ss -opt full -inline all ]
        [ opt --debug : -runtime ssd -opt none -inline off ]
        -I$(--python-include) -I$(--extra-include) ;
    toolset metrowerks $(mwcc) .link : "-o " :
        : -subsystem console -lkernel32.lib -ladvapi32.lib -luser32.lib
        [ opt --release : -runtime ss ]
        [ opt --debug : -runtime ssd ]
        : $(--python-lib[1]) ;
}
## MINGW GCC
toolset mingw gcc : "-o " : -D
    :
    [ opt --release : -s -O3 -finline-functions ]
    [ opt --debug : -g -O0 -fno-inline -pg ]
    -I$(--python-include) -I$(--extra-include)
    : $(--python-lib[2]) ;
## MIPS Pro
toolset mipspro cc : "-o " : -D
    :
    [ opt --release : -s -O3 -g0 -INLINE:none ]
    [ opt --debug : -g -O0 -INLINE ]
    -I$(--python-include) -I$(--extra-include)
    : -L$(--python-lib[1]) -l$(--python-lib[2]) ;
## Microsoft Visual Studio C++ 6.x
toolset msvc cl : /Fe /Fe /Fd /Fo : -D
    : /nologo
    [ opt --release : /ML /O2 /Ob2 /Gy /GF /GA /GB ]
    [ opt --debug : /MLd /DEBUG /Z7 /Od /Ob0 ]
    -I$(--python-include) -I$(--extra-include)
    : kernel32.lib advapi32.lib user32.lib $(--python-lib[1]) ;
## QNX 6.x GCC 3.x/2.95.3
toolset qcc qcc : "-o " : -D
    : -Wc,-pedantic -Wc,-fno-strict-aliasing
    [ opt --release : [ opt --symbols : -g ] -O3 -Wc,-finline-functions ]
    [ opt --debug : -g -O0 -Wc,-fno-inline ]
    -I$(--python-include) -I$(--extra-include)
    : -L$(--python-lib[1]) -l$(--python-lib[2]) ;
## Qlogic Pathscale 2.4
toolset pathscale pathcc : "-o " : -D
    :
    [ opt --release : -s -Ofast -O3 ]
    [ opt --debug : -g ]
    -I$(--python-include) -I$(--extra-include)
    : -L$(--python-lib[1]) -l$(--python-lib[2]) ;
## Portland Group Pgi 6.2
toolset pgi pgcc : "-o " : -D
    :
    [ opt --release : -s -O3 ]
    [ opt --debug : -g ]
    -I$(--python-include) -I$(--extra-include)
    : -L$(--python-lib[1]) -l$(--python-lib[2]) ;
## Sun Workshop 6 C++
toolset sun cc : "-o " : -D
    :
    [ opt --release : -s -fast -xO4 ]
    [ opt --debug : -g ]
    -I$(--python-include) -I$(--extra-include)
    : -L$(--python-lib[1]) -l$(--python-lib[2]) ;
## Sun Workshop 6 C++ (old alias)
toolset sunpro cc : "-o " : -D
    :
    [ opt --release : -s -fast -xO4 ]
    [ opt --debug : -g ]
    -I$(--python-include) -I$(--extra-include)
    : -L$(--python-lib[1]) -l$(--python-lib[2]) ;
## Compaq Alpha CXX
toolset tru64cxx cc : "-o " : -D
    :
    [ opt --release : -s -O5 -inline speed ]
    [ opt --debug : -g -O0 -pg ]
    -I$(--python-include) -I$(--extra-include)
    : -L$(--python-lib[1]) -l$(--python-lib[2]) ;
## IBM VisualAge C++
toolset vacpp xlc : "-o " : -D
    :
    [ opt --release : -s -O3 -qstrict -qinline ]
    [ opt --debug : -g -qNOOPTimize -qnoinline -pg ]
    -I$(--python-include) -I$(--extra-include)
    : -L$(--python-lib[1]) -l$(--python-lib[2]) [ if-os AIX : -bmaxdata:0x40000000 ] ;
## Microsoft Visual C++ .NET 7.x
toolset vc7 cl : /Fe /Fe /Fd /Fo : -D
    : /nologo
    [ opt --release : /ML /O2 /Ob2 /Gy /GF /GA /GB ]
    [ opt --debug : /MLd /DEBUG /Z7 /Od /Ob0 ]
    -I$(--python-include) -I$(--extra-include)
    : kernel32.lib advapi32.lib user32.lib $(--python-lib[1]) ;
## Microsoft Visual C++ 2005
toolset vc8 cl : /Fe /Fe /Fd /Fo : -D
    : /nologo
    [ opt --release : /MT /O2 /Ob2 /Gy /GF /GA /wd4996 ]
    [ opt --debug : /MTd /DEBUG /Z7 /Od /Ob0 /wd4996 ]
    -I$(--python-include) -I$(--extra-include)
    : kernel32.lib advapi32.lib user32.lib $(--python-lib[1]) ;
## Microsoft Visual C++ 2008
toolset vc9 cl : /Fe /Fe /Fd /Fo : -D
    : /nologo
    [ opt --release : /MT /O2 /Ob2 /Gy /GF /GA /wd4996 ]
    [ opt --debug : /MTd /DEBUG /Z7 /Od /Ob0 /wd4996 ]
    -I$(--python-include) -I$(--extra-include)
    : kernel32.lib advapi32.lib user32.lib $(--python-lib[1]) ;
## Microsoft Visual C++ 2010
toolset vc10 cl : /Fe /Fe /Fd /Fo : -D
    : /nologo
    [ opt --release : /MT /O2 /Ob2 /Gy /GF /GA /wd4996 ]
    [ opt --debug : /MTd /DEBUG /Z7 /Od /Ob0 /wd4996 ]
    -I$(--python-include) -I$(--extra-include)
    : kernel32.lib advapi32.lib user32.lib $(--python-lib[1]) ;
## VMS/OpenVMS DEC C
toolset vmsdecc cc : /OBJECT= : "/DEFINES=(" "," ")"
    : /STANDARD=VAXC /PREFIX_LIBRARY_ENTRIES=ALL_ENTRIES
    [ opt --release : /OPTIMIZE /NODEBUG ]
    [ opt --debug : /NOOPTIMIZE /DEBUG ]
    ;
toolset vmsdecc link .link : /EXECUTABLE= :
    : /NOMAP
    [ opt --release : /NODEBUG ]
    [ opt --debug : /DEBUG ]
    ;

# First set the build commands and options according to the
# preset toolset.
toolset = [ MATCH --toolset=(.*) : $(ARGV) ] ;
if ! $(toolset)
{
    # For some reason, the following test does not catch empty toolset.
    ECHO "###" ;
    ECHO "###" No toolset specified. Please use --toolset option. ;
    ECHO "###" ;
    ECHO "###" Known toolsets are: $(toolsets:J=", ") ;
    EXIT "###" ;
}
if ! $(toolset) in $(toolsets)
{
    ECHO "###" ;
    ECHO "###" Unknown toolset: $(toolset) ;
    ECHO "###" ;
    ECHO "###" Known toolsets are: $(toolsets:J=", ") ;
    EXIT "###" ;
}
--cc = $(tool.$(toolset).cc) ;
if $(tool.$(toolset).opt.out[2])
{
    if $(tool.$(toolset).opt.out[1]) = $(tool.$(toolset).opt.out[2])
    {
        --out = $(tool.$(toolset).opt.out[1]) ;
        --dir = $(tool.$(toolset).opt.out[3-]) ;
    }
    else
    {
        --bin = $(tool.$(toolset).opt.out[1]) ;
        --dir = $(tool.$(toolset).opt.out[2-]) ;
    }
}
else
{
    --out = $(tool.$(toolset).opt.out) ;
}
--def = $(tool.$(toolset).opt.define) ;
--flags = $(tool.$(toolset).flags) ;
--defs = $(tool.$(toolset).defines) ;
--libs = $(tool.$(toolset).linklibs) ;
if $(tool.$(toolset).link.cc)
{
    --link = $(tool.$(toolset).link.cc) ;
    if $(tool.$(toolset).link.opt.out[2])
    {
        if $(tool.$(toolset).link.opt.out[1]) = $(tool.$(toolset).link.opt.out[2])
        {
            --link-out = $(tool.$(toolset).link.opt.out[1]) ;
            --link-dir = $(tool.$(toolset).link.opt.out[3-]) ;
        }
        else
        {
            --link-bin = $(tool.$(toolset).link.opt.out[1]) ;
            --link-dir = $(tool.$(toolset).link.opt.out[2-]) ;
        }
    }
    else
    {
        --link-out = $(tool.$(toolset).link.opt.out) ;
    }
    --link-def = $(tool.$(toolset).link.opt.define) ;
    --link-flags = $(tool.$(toolset).link.flags) ;
    --link-defs = $(tool.$(toolset).link.defines) ;
    --link-libs = $(tool.$(toolset).link.linklibs) ;
}

# Put executables in platform-specific subdirectory.
locate-target = $(LOCATE_TARGET) ;
if $(VMS)
{
    locate-target ?= bin$(.)vms ;
    platform = vms ;
}
else if $(MAC)
{
    locate-target ?= bin$(.)$(OS:L)$(OSPLAT:L) ;
    platform = $(OS:L)$(OSPLAT:L) ;
}
else if $(OSPLAT)
{
    locate-target ?= bin$(.)$(OS:L)$(OSPLAT:L) ;
    platform = $(OS:L)$(OSPLAT:L) ;
}
else
{
    locate-target ?= bin$(.)$(OS:L) ;
    platform = $(OS:L) ;
}
if $(debug)
{
    locate-target = [ .path $(locate-target)$(.)debug ] ;
}
if $(profile)
{
    locate-target = [ .path $(locate-target)$(.)profile ] ;
}
else
{
    locate-target = [ .path $(locate-target) ] ;
}

if --show-locate-target in $(ARGV)
{
  ECHO $(locate-target) ;
}

# We have some different files for UNIX, VMS, and NT.
jam.source =
    command.c compile.c debug.c expand.c glob.c
    hash.c hcache.c headers.c hdrmacro.c
    jam.c jambase.c jamgram.c
    lists.c make.c make1.c mem.c newstr.c
    option.c output.c parse.c regexp.c rules.c
    scan.c search.c subst.c w32_getreg.c
    timestamp.c variable.c modules.c strings.c filesys.c
    builtins.c pwd.c class.c native.c md5.c modules/set.c
    modules/path.c modules/regex.c modules/property-set.c
    modules/sequence.c modules/order.c
    ;
if $(NT)
{
    jam.source += execnt.c filent.c pathunix.c ;
}
else if $(OS2)
{
    jam.source += execunix.c fileos2.c pathunix.c ;
}
else if $(VMS)
{
    jam.source += execvms.c filevms.c pathvms.c ;
}
else if $(MAC)
{
    jam.source += execmac.c filemac.c pathmac.c ;
}
else
{
    jam.source += execunix.c fileunix.c pathunix.c ;
}

# Debug assertions, or not.
if ! $(debug) || --noassert in $(ARGV)
{
    --defs += NDEBUG ;
}

# Enable some optional features.
--defs += OPT_HEADER_CACHE_EXT ;
--defs += OPT_GRAPH_DEBUG_EXT ;
--defs += OPT_SEMAPHORE ;
--defs += OPT_AT_FILES ;
--defs += OPT_DEBUG_PROFILE ;

# Bug fixes
--defs += OPT_FIX_TARGET_VARIABLES_EXT ;
#~ --defs += OPT_NO_EXTERNAL_VARIABLE_SPLIT ;

# Improvements
--defs += OPT_IMPROVED_PATIENCE_EXT ;

# Use Boehm GC memory allocator?
if $(--boehm-gc)
{
    --defs += OPT_BOEHM_GC ;
    if $(debug)
    {
        --defs += GC_DEBUG ;
    }
}

if $(--duma)
{
    --defs += OPT_DUMA ;
}

if ( $(OS) = NT || $(NT) ) && ! NT in $(--defs)
{
    --defs += NT ;
}
if $(VMS)
{
    --defs += VMS ;
}
--defs += YYSTACKSIZE=5000 ;

if $(with-python)
{
    --defs += HAVE_PYTHON ;
}

if $(debug)
{
    --defs += BJAM_NEWSTR_NO_ALLOCATE ;
}


# The basic symbolic targets...
NOTFILE all clean dist ;
ALWAYS clean ;

# Utility rules and actions...
rule .clean
{
    [DELETE] clean : $(<) ;
}
if $(NT) { actions piecemeal together existing [DELETE] {
    del /F /Q "$(>)"
} }
if $(UNIX) { actions piecemeal together existing [DELETE] {
    rm -f "$(>)"
} }
if $(VMS) { actions piecemeal together existing [DELETE] {
    DELETE $(>[--2]:J=";*, ") $(>[-1]);*
} }
if $(NT) {
    --chmod+w = "attrib -r " ;
}
if $(UNIX) {
    --chmod+w = "chmod +w " ;
}
if $(VMS) {
    --chmod+w = "SET FILE/PROT=(S:RWED) " ;
}

rule .mkdir
{
    NOUPDATE $(<) ;
    if $(<:P) { DEPENDS $(<) : $(<:P) ; .mkdir $(<:P) ; }
    if ! $(md<$(<)>) { [MKDIR] $(<) ; md<$(<)> = - ; }
}
if $(NT) { actions [MKDIR] {
    md "$(<)"
} }
if $(UNIX) { actions [MKDIR] {
    mkdir "$(<)"
} }
if $(VMS) { actions [MKDIR] {
    CREATE/DIR $(<J=", ")
} }

rule .exe
{
    local exe = $(<) ;
    if $(NT) || ( $(UNIX) && $(OS) = CYGWIN ) || $(VMS) { exe = $(exe:S=.exe) ; }
    LOCATE on $(exe) = $(locate-target) ;
    DEPENDS all : $(exe) ;
    .mkdir $(locate-target) ;
    if $(--link)
    {
        local objs = ;
        for local s in $(>)
        {
            # Translate any subdir elements into a simple file name.
            local o = [ MATCH "([^/]+)[/]?(.+)" : $(s) ] ;
            o = $(o:J=_) ;
            o = $(o:S=.o) ;
            objs += $(o) ;
            LOCATE on $(o) = $(locate-target) ;
            DEPENDS $(exe) : $(o) ;
            DEPENDS $(o) : $(s) ;
            DEPENDS $(o) : $(locate-target) ;
            [COMPILE] $(o) : $(s) ;
            .clean $(o) ;
        }
        DEPENDS $(exe) : $(objs) ;
        DEPENDS $(exe) : $(locate-target) ;
        [COMPILE.LINK] $(exe) : $(objs) ;
        .clean $(exe) ;
    }
    else
    {
        DEPENDS $(exe) : $(>) ;
        DEPENDS $(exe) : $(locate-target) ;
        [COMPILE] $(exe) : $(>) ;
        .clean $(exe) ;
    }
    return $(exe) ;
}
if ! $(--def[2]) { actions [COMPILE] {
    "$(--cc)" "$(--bin)$(<:D=)" "$(--dir)$(<:D)$(./)" $(--out)$(<) "$(--def)$(--defs)" "$(--flags)" "$(--libs)" "$(>)"
} }
else { actions [COMPILE] {
    "$(--cc)" "$(--bin)$(<:D=)" "$(--dir)$(<:D)$(./)" $(--out)$(<) "$(--def[1])$(--defs:J=$(--def[2]))$(--def[3])" "$(--flags)" "$(--libs)" "$(>)"
} }
if $(VMS) { actions [COMPILE.LINK] {
    "$(--link)" $(--link-bin)$(<:D=) $(--link-dir)$(<:D)$(./) $(--link-out)$(<) $(--link-def)$(--link-defs) $(--link-flags) "$(--link-libs)" $(>J=", ")
} }
else { actions [COMPILE.LINK] {
    "$(--link)" "$(--link-bin)$(<:D=)" "$(--link-dir)$(<:D)$(./)" "$(--link-out)$(<)" "$(--link-def)$(--link-defs)" "$(--link-flags)" "$(--link-libs)" "$(>)"
} }

rule .link
{
    DEPENDS all : $(<) ;
    DEPENDS $(<) : $(>) ;
    [LINK] $(<) : $(>) ;
    .clean $(<) ;
}
if $(NT) { actions [LINK] {
    copy "$(>)" "$(<)"
} }
if $(UNIX) { actions [LINK] {
    ln -fs "$(>)" "$(<)"
} }
if $(VMS) { actions [LINK] {
    COPY/REPLACE $(>) $(<)
} }

rule .move
{
    DEPENDS $(<) : $(>) ;
    [MOVE] $(<) : $(>) ;
}
if $(NT) { actions [MOVE] {
    del /f "$(<)"
    rename "$(>)" "$(<)"
} }
if $(UNIX) { actions [MOVE] {
    mv -f "$(>)" "$(<)"
} }
if $(VMS) { actions [MOVE] {
    RENAME "$(>)" "$(<)"
} }

# Generate the grammar tokens table, and the real yacc grammar.
rule .yyacc
{
    local exe = [ .exe yyacc : yyacc.c ] ;
    NOUPDATE $(exe) ;
    DEPENDS $(<) : $(exe) $(>) ;
    LEAVES $(<) ;
    yyacc.exe on $(<) = $(exe:R=$(locate-target)) ;
    [YYACC] $(<) : $(>) ;
}
actions [YYACC] {
    $(--chmod+w)$(<[1])
    $(--chmod+w)$(<[2])
    "$(yyacc.exe)" "$(<)" "$(>)"
}
if $(grammar)
{
    .yyacc jamgram.y jamgramtab.h : jamgram.yy ;
}
else if $(debug)
{
    .exe yyacc : yyacc.c ;
}

# How to build the grammar.
if $(NT)
{
    SUFEXE = .exe ;
    # try some other likely spellings...
    PATH ?= $(Path) ;
    PATH ?= $(path) ;
}
SUFEXE ?= "" ;

yacc ?= [ GLOB $(PATH) : yacc$(SUFEXE) ] ;
yacc ?= [ GLOB $(PATH) : bison$(SUFEXE) ] ;
yacc ?= [ GLOB "$(ProgramFiles:J= )\\GnuWin32\\bin" "C:\\Program Files\\GnuWin32\\bin" : bison$(SUFEXE) ] ;
yacc = $(yacc[1]) ;
switch $(yacc:D=:S=)
{
    case bison : yacc += -d --yacc ;
    case yacc  : yacc += -d ;
}
if $(debug) && $(yacc)
{
    yacc += -t -v ;
}
yacc += $(YACCFLAGS) ;

rule .yacc
{
    DEPENDS $(<) : $(>) ;
    LEAVES $(<) ;
    [YACC] $(<) : $(>) ;
}
if $(NT) { actions [YACC] {
    "$(yacc)" "$(>)"
    if not errorlevel 1 (
        del /f "$(<[1])"
        rename y.tab$(<[1]:S) "$(<[1])"
        del /f $(<[2])
        rename y.tab$(<[2]:S) "$(<[2])"
    ) else set _error_ =
} }
if $(UNIX) { actions [YACC] {
    if ` "$(yacc)" "$(>)" ` ; then
        mv -f y.tab$(<[1]:S) "$(<[1])"
        mv -f y.tab$(<[2]:S) "$(<[2])"
    else
        exit 1
    fi
} }
if $(VMS) { actions [YACC] {
    IF "$(yacc)" $(>)
    THEN
        RENAME y_tab$(<[1]:S) $(<[1])
        RENAME y_tab$(<[2]:S) $(<[2])
    ENDIF
} }
if $(grammar) && ! $(yacc)
{
    EXIT "Could not find the 'yacc' tool, and therefore can not build the grammar." ;
}
if $(grammar) && $(yacc)
{
    .yacc jamgram.c jamgram.h : jamgram.y ;
}

# How to build the compiled in jambase.
rule .mkjambase
{
    local exe = [ .exe mkjambase : mkjambase.c ] ;
    DEPENDS $(<) : $(exe) $(>) ;
    LEAVES $(<) ;
    mkjambase.exe on $(<) = $(exe:R=$(locate-target)) ;
    [MKJAMBASE] $(<) : $(>) ;
}
actions [MKJAMBASE] {
    $(--chmod+w)$(<)
    $(mkjambase.exe) "$(<)" "$(>)"
}
if $(debug)
{
    .mkjambase jambase.c : Jambase ;
}

# How to build Jam.
rule .jam
{
    $(>).exe = [ .exe $(>) : $(jam.source) ] ;
    DEPENDS all : $($(>).exe) ;

    if $(debug)
    {
        $(<).exe = $(<:S=$($(>).exe:S)) ;
        LOCATE on $($(<).exe) = $(locate-target) ;
        .link $($(<).exe) : $($(>).exe) ;
        DEPENDS all : $($(<).exe) ;
    }
}
.jam jam : bjam ;

# Scan sources for header dependencies.
#	WARNING: Yes those are *REAL TABS* below. DO NOT CHANGE,
#	under any circumstances, to spaces!! And the tabs
#	indenting this are so that if someone is in the mood to
#	replace tabs they hit this comment, and hopefully notice
#	their error.
rule .scan
{
    HDRRULE on $(<:D=) = .hdr.scan ;
    HDRSCAN on $(<:D=) = "^[ 	]*#[ 	]*include[ 	]*([<\"][^\">]*[\">]).*$" ;
}
rule .hdr.scan
{
    local hdrs = [ GLOB . : $(>:D=) ] ;
    INCLUDES $(<:D=) : $(hdrs:D=) ;
    HDRRULE on $(>:D=) = .hdr.scan ;
    HDRSCAN on $(>:D=) = "^[ 	]*#[ 	]*include[ 	]*([<\"][^\">]*[\">]).*$" ;
}
.scan [ GLOB . : *.c ] ;

# Distribution making from here on out. Assumes that
# the docs are already built as html at ../doc/html. If
# they aren't, then the docs are not included in the dist
# archive.
dist.license =
    [ GLOB . : $(LICENSE).txt ]
    ;
dist.license = $(dist.license:D=)
    [ GLOB [ .path .. .. .. ] : $(LICENSE).txt ]
    [ GLOB [ .path .. boost ] : $(LICENSE).txt ] ;
dist.docs =
    [ GLOB . : *.png *.css *.html ]
    ;
dist.docs = $(dist.docs:D=)
    [ GLOB [ .path images ] : *.png ]
    [ GLOB [ .path jam ] : *.html ]
    ;
dist.source =
    [ GLOB . : *.c *.h ]
    ;
dist.source = $(dist.source:D=)
    $(dist.license[1])
    $(dist.docs)
    build.jam build.bat build.sh build_vms.com
    Jambase
    jamgram.y jamgram.yy
    [ .path modules set.c ]
    [ .path modules path.c ]
    [ .path modules regex.c ]
    [ .path modules property-set.c ]
    [ .path modules sequence.c ]
    [ .path modules order.c ]
    [ GLOB [ .path boehm_gc ] : * ]
    [ GLOB [ .path boehm_gc include ] : * ]
    [ GLOB [ .path boehm_gc include private ] : * ]
    [ GLOB [ .path boehm_gc cord ] : * ]
    [ GLOB [ .path boehm_gc Mac_files ] : * ]
    [ GLOB [ .path boehm_gc tests ] : * ]
    [ GLOB [ .path boehm_gc doc ] : * ]
    ;
dist.bin =
    bjam
    ;
dist.bin =
    $(dist.license[1])
    $(dist.bin:S=$(bjam.exe:S))
    ;

if $(NT)
{
    zip ?= [ GLOB "$(ProgramFiles:J= )\\7-ZIP" "C:\\Program Files\\7-ZIP" : "7z.exe" ] ;
    zip ?= [ GLOB "$(ProgramFiles:J= )\\7-ZIP" "C:\\Program Files\\7-ZIP" : "7zn.exe" ] ;
    zip ?= [ GLOB $(PATH) : zip.exe ] ;
    zip ?= zip ;
    zip = $(zip[1]) ;
    switch $(zip:D=:S=)
    {
        case 7z* : zip += a -r -tzip -mx=9 ;
        case zip  : zip += -9r ;
    }
    actions piecemeal [PACK] {
    "$(zip)" "$(<)" "$(>)"
    }
    actions piecemeal [ZIP] {
    "$(zip)" "$(<)" "$(>)"
    }
    actions piecemeal [COPY] {
    copy /Y "$(>)" "$(<)" >NUL:
    }
}
if $(UNIX)
{
    tar ?= [ GLOB $(PATH) : star bsdtar tar ] ;
    tar = $(tar[1]) ;
    switch $(tar:D=:S=)
    {
        case star : tar += -c artype=pax -D -d -to-stdout ;
        case * : tar += -c -f - ;
    }
    actions [PACK] {
    "$(tar)" "$(>)" | gzip -c9 > "$(<)"
    }
    #~ actions [PACK] {
    #~ tar cf "$(<:S=.tar)" "$(>)"
    #~ }
    actions [ZIP] {
    gzip -c9 "$(>)" > "$(<)"
    }
    actions [COPY] {
    cp -Rpf "$(>)" "$(<)"
    }
}

# The single binary, compressed.
rule .binary
{
    local zip = ;
    if $(NT) { zip = $($(<).exe:S=.zip) ; }
    if $(UNIX) { zip = $($(<).exe:S=.tgz) ; }
    zip = $(zip:S=)-$(VERSION)-$(RELEASE)-$(platform)$(zip:S) ;
    DEPENDS $(zip) : $($(<).exe) ;
    DEPENDS dist : $(zip) ;
    #~ LOCATE on $(zip) = $(locate-target) ;
    if $(NT) { [ZIP] $(zip) : $($(<).exe) ; }
    if $(UNIX) { [PACK] $(zip) : $($(<).exe) ; }
    .clean $(zip) ;
}

# Package some file.
rule .package ( dst-dir : src-files + )
{
    local dst-files ;
    local src-files-actual ;
    for local src-path in $(src-files)
    {
        if ! [ GLOB $(src-path:P) : $(src-path:B) ] || [ CHECK_IF_FILE $(src-path) ]
        {
            local src-subdir = $(src-path:D) ;
            local src-file = $(src-path) ;
            while $(src-subdir:D) { src-subdir = $(src-subdir:D) ; }
            if $(src-subdir) = ".."
            {
                src-file = $(src-file:D=) ;
            }
            dst-files += $(src-file:R=$(dst-dir)) ;
            src-files-actual += $(src-path) ;
        }
    }

    local pack = ;
    if $(NT) { pack = $(dst-dir).zip ; }
    if $(UNIX) { pack = $(dst-dir).tgz ; }

    DEPENDS dist : $(pack) ;
    DEPENDS $(pack) : $(dst-files) ;

    local dst-files-queue = $(dst-files) ;
    for local src-path in $(src-files-actual)
    {
        local dst-file = $(dst-files-queue[1]) ;
        dst-files-queue = $(dst-files-queue[2-]) ;
        DEPENDS $(dst-file) : $(src-path) $(dst-file:D) ;
        .mkdir $(dst-file:D) ;

        [COPY] $(dst-file) : $(src-path) ;
        .clean $(dst-file) ;
    }

    [PACK] $(pack) : $(dst-files) ;
    .clean $(pack) ;
}

# RPM distro file.
rpm-tool = [ GLOB $(PATH) : "rpmbuild" ] ;
rpm-tool ?= [ GLOB $(PATH) : "rpm" ] ;
rpm-tool = $(rpm-tool[1]) ;
rule .rpm ( name : source )
{
    local rpm-arch = ;
    switch $(OSPLAT)
    {
        case X86       : rpm-arch ?= i386 ;
        case PPC       : rpm-arch ?= ppc ;
        case AXP       : rpm-arch ?= alpha ;
        # no guaranty for these:
        case IA64      : rpm-arch ?= ia64 ;
        case ARM       : rpm-arch ?= arm ;
        case SPARC     : rpm-arch ?= sparc ;
        case *         : rpm-arch ?= other ;
    }
    local target = $(name)-rpm ;
    NOTFILE $(target) ;
    DEPENDS dist : $(target) ;
    DEPENDS $(target) : $(name).$(rpm-arch).rpm $(name).src.rpm ;
    DEPENDS $(name).$(rpm-arch).rpm : $(source) ;
    DEPENDS $(name).src.rpm : $(name).$(rpm-arch).rpm ;
    docs on $(target) = $(dist.docs:J=" ") ;
    arch on $(target) = $(rpm-arch) ;
    if $(rpm-arch) = ppc { target-opt on $(target) = --target= ; }
    else { target-opt on $(target) = "--target " ; }
    [RPM] $(target) : $(source) ;
    .clean $(name).$(rpm-arch).rpm $(name).src.rpm ;
}
actions [RPM] {
    set -e
    export BOOST_JAM_TOOLSET="$(toolset)"
    $(rpm-tool) -ta $(target-opt)$(arch) $(>) | tee rpm.out
    cp `grep -e '^Wrote:' rpm.out | sed 's/^Wrote: //'` .
    rm -f rpm.out
}

# The distribution targets. Don't bother with the targets if
# distribution build not requested.
if dist in $(ARGV)
{
    #~ .binary bjam ;
    .package $(NAME)-$(VERSION) : $(dist.source) ;
    .package $(NAME)-$(VERSION)-$(RELEASE)-$(platform) : $(dist.bin) ;
    if $(rpm-tool)
    {
        #~ .rpm $(NAME)-$(VERSION)-$(RELEASE) : $(NAME)-$(VERSION).tgz ;
    }
}
