Parameterized goal

Make code easier to reuse.

Declaration syntax (using @params):

@goal goal_name @params A B C

Usage syntax (using @args):

@goal other_goal @params PARAM
@depends_on goal_name @args 'value1' 'value 2' PARAM

The idea of using two complementary keywords @params + @args was inspired by async + await from JavaScript.

Example:

@goal file_downloaded @params FILE_NAME
  echo "Downloading $FILE_NAME..."
  
@goal file_processed @params FILE_NAME
@depends_on file_downloaded @args FILE_NAME
  echo "Processing $FILE_NAME..."
  
@goal all_files_processed
@depends_on file_processed @args 'file1' 
@depends_on file_processed @args 'file2' 
@depends_on file_processed @args 'file3' 

Having the above in Makesurefile will produce next output when ran with ./makesure all_files_processed:

  goal 'file_downloaded@file1' ...
Downloading file1...
  goal 'file_processed@file1' ...
Processing file1...
  goal 'file_downloaded@file2' ...
Downloading file2...
  goal 'file_processed@file2' ...
Processing file2...
  goal 'file_downloaded@file3' ...
Downloading file3...
  goal 'file_processed@file3' ...
Processing file3...
  goal 'all_files_processed' [empty].

When listing goals, you'll see "instantiated" goals there:

$ ./makesure -l
Available goals:
  all_files_processed
  file_processed@file1
  file_downloaded@file1
  file_processed@file2
  file_downloaded@file2
  file_processed@file3
  file_downloaded@file3

And you can even call such "instantiated" goal:

$ ./makesure file_processed@file2
  goal 'file_downloaded@file2' ...
Downloading file2...
  goal 'file_processed@file2' ...
Processing file2...

You can also take a look at an example from a real project.

Note, the goal's body parameter values will appear as environment variables (as if defined via export).

Note, you can reference the @define-ed variables in the arguments of the parameterized goals:

@define HELLO 'hello'

@goal parameterized_goal @params ARG
  echo "ARG=$ARG"
  
@goal goal1
@depends_on parameterized_goal @args HELLO          # reference by name
@depends_on parameterized_goal @args "$HELLO world" # interpolated inside string

Having the above in Makesurefile will produce next output when ran with ./makesure goal1:

  goal 'parameterized_goal@hello' ...
ARG=hello
  goal 'parameterized_goal@hello world' ...
ARG=hello world
  goal 'goal1' [empty].

You can also rely on parameterized goals parameters interpolation.

Also, it's possible for a @glob goal to be parameterized.

Please find a more real-world example here.

For more technical consideration regarding this feature see parameterized_goals.md.