(--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)"
} }

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 $(OS) = NT { actions [LINK] {
    copy "$(>)" "$(<)"
} }
if $(UNIX) = true { actions [LINK] {
    ln -fs "$(>)" "$(<)"
} }

rule .copy
{
    DEPENDS all : $(<) ;
    DEPENDS $(<) : $(>) ;
    [COPY] $(<) : $(>) ;
    .clean $(<) ;
}

# Will be redefined later.
actions [COPY]
{
}


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

# 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 $(OS) = 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 : ya