Simple Transform Overview
Setup
Add a file called source.txt
to the directory with the contents:
Transform source to destination
We want to build a file destination.txt
from source.txt
. This involves setting a dependency between the two files using rule Depends targets1 : targets2 [ : target3 ... targets9 ] ;. We will depend the default all
target on def.txt
for simpler command-line usage. Additionally, def.txt
will be added to the clean
target.
//! [Adding dependencies]
local source = source.txt ;
local destination = destination.txt ;
# all -> destination.txt -> source.txt
Depends all : $(destination) : $(source) ;
Clean clean : $(destination) ;
//! [Adding dependencies]
Adding dependencies
# Jamfile.jam
local source = source.txt ;
local destination = destination.txt ;
# all -> destination.txt -> source.txt
Depends all : $(destination) : $(source) ;
Clean clean : $(destination) ;
Running jam at this point will not do anything, as we have not yet set up the action. We will call the action ConvertFile
and cause it to create a copy of the source file and append extra destination text
to the destination file.
# Jamfile.jam
local source = source.txt ;
local destination = destination.txt ;
Depends all : $(destination) : $(source) ;
Clean clean : $(destination) ;
# CAT comes from Jambase.jam and is either 'type' on Windows or 'cat' on non-Windows.
actions ConvertFile
{
$(CAT) $(2) > $(1)
echo extra destination text >> $(1)
}
# The first parameter to an action is the destination target(s). The second parameter to an action is the source target(s).
ConvertFile $(destination) : $(source) ;
Running jam yields:
# Shell
> jam
found 3 target(s)...
updating 1 target(s)...
@ ConvertFile destination.txt
updated 1 target(s)...
On disk will be the new file destination.txt
.
Build behaviors
There have been no changes to source.txt
, so running jam again shows there is nothing to be done:
# Shell
> jam
found 3 target(s)...
Modify source.txt
:
# source.txt
The modified source
As we would expect, running jam now with the modified source.txt
causes a build to run for destination.txt
.
# Shell
> jam
found 3 target(s)...
updating 1 target(s)...
@ ConvertFile destination.txt
updated 1 target(s)...
If the timestamp of source.txt
is ever later than destination.txt
, Jam will cause the ConvertFile
action to run.
Applying UseCommandLine
In addition to a timestamp update, sometimes we want to force a build anyway.
An incorrect way of doing this is to use the rule Always targets ; flag to mark the target as always needing to build.
# Jamfile.jam
local source = source.txt ;
local destination = destination.txt ;
Depends all : $(destination) : $(source) ;
Clean clean : $(destination) ;
Always $(destination) ;
actions ConvertFile
{
$(CAT) $(2) > $(1)
echo extra destination text >> $(1)
}
ConvertFile $(destination) : $(source) ;
Running jam will build destination.txt
.
# Shell
> jam
found 3 target(s)...
updating 1 target(s)...
@ ConvertFile destination.txt
updated 1 target(s)...
Running jam again will build destination.txt
again. And again. And again.
The goal of using a tool like Jam is to get it to identify what actually needs to be done and only do that and nothing more.
Instead, we can use rule UseCommandLine TARGETS : COMMANDLINE; to add some extra text into the build calculation such that changing the text will result in a forced build regardless of timestamp change.
# Jamfile.jam
local source = source.txt ;
local destination = destination.txt ;
Depends all : $(destination) : $(source) ;
Clean clean : $(destination) ;
UseCommandLine $(destination) : now-on-version-2 ;
actions ConvertFile
{
$(CAT) $(2) > $(1)
echo extra destination text >> $(1)
}
ConvertFile $(destination) : $(source) ;