@calls
Only valid: inside @goal.
Syntax:
@calls goal1 [ goal2 [ goal3 [...] ] ]
Imperative (non-declarative) counterpart of @depends_on.
The need for @calls may be not obvious, but the use-case is presented here.
Differences to @depends_on:
@callsdoesn't favor run-once semantics@callsdefers the@reached_ifprocessing of a goal being called to the invocation time (@depens_oncalculates all@reached_ifconditions at start)
Operationally @calls desugars to a nested makesure invocation:
@goal a
echo a
@goal b
@calls a
desugars to
@goal a
echo a
@goal b
./makesure a # actual command passes other arguments (for --file, --define, etc.)
Example Makesurefile:
@goal a
echo a
@goal b
@calls a
@calls a
Running ./makesure b will show
goal 'b' ...
goal 'a' ...
a
goal 'a' ...
a
You can declare multiple @calls targets for a goal:
@goal a
@calls b c d
Circular dependency (both @depends_on and @calls considered) will cause an error:
@goal a
@depends_on b
@goal b
@calls c
@goal c
@calls a
Running ./makesure a will show
There is a loop in goal dependencies via a -> c
You can use @calls to invoke a parameterized goal:
@goal hello @params WHO
echo "Hello $WHO!"
@goal a
@calls hello @args 'world'
@calls hello @args 'hacker'
Running ./makesure a will show
goal 'a' ...
goal 'hello@world' ...
Hello world!
goal 'hello@hacker' ...
Hello hacker!
You can mix @calls and @depends_on but please note, that depended-on goal will be invoked before the called one.
So this is valid:
@goal a
@calls b
@depends_on c
but you better write it as:
@goal a
@depends_on c
@calls b
You can find more information on how the directive interacts with other directives in @calls.md.