Passing Parameters to Tasks in Makefile

In this installment of our Makefile series, we explore how to pass parameters to tasks, using the example of downloading JSON playlists from YouTube with youtube-dl. Learn how to enhance your Makefile to accept dynamic parameters, making your tasks more flexible and efficient.

Passing Parameters to Tasks in Makefile

In this article, part of our ongoing Makefile series, I will demonstrate how to pass parameters to tasks in a Makefile.

Example

Consider the useful tool youtube-dl, which is used to download videos from YouTube. It also has a flag to download the JSON list of a playlist. The command looks like this:

youtube-dl -J https://www.youtube.com/playlist?list=<playlist_id>

I want to create a Makefile task to download the JSON file simply, as shown below:

download-youtube-playlist-json:
	@youtube-dl -J "https://www.youtube.com/playlist?list=<playlist_id>" > <playlist_id>.json

In this example, the playlist_id is hardcoded in the Makefile. If I want to download another JSON list, I need to update the Makefile.

Solution

To simplify the task, we can update the Makefile to accept a parameter, allowing us to download different playlist JSON files with the same task but different parameters. The modified Makefile is shown below:

PLAYLIST_ID=$(list)

download-youtube-playlist-json:
ifeq ($(strip $(PLAYLIST_ID)),)
	$(error list is empty. Please run the task like: make download-youtube-playlist-json list=<playlist_id>)
endif
	@youtube-dl -J "https://www.youtube.com/playlist?list=$(PLAYLIST_ID)" > $(PLAYLIST_ID).json

Explanation

Variable Definition

PLAYLIST_ID=$(list)
  • This line defines a variable PLAYLIST_ID which is assigned the value of another variable list. When you run the make command, you can pass a value to list with list=<playlist_id>.

Conditional Check

ifeq ($(strip $(PLAYLIST_ID)),)
	$(error list is empty. Please run the task like: make download-youtube-playlist-json list=<playlist_id>)
endif
  • The ifeq ($(strip $(PLAYLIST_ID)),) directive checks if PLAYLIST_ID is empty after stripping any leading or trailing whitespace.
  • If PLAYLIST_ID is empty, the $(error ...) function is invoked, which stops the make process and prints the error message: "list is empty. Please run the task like: make download-youtube-playlist-json list=<playlist_id>".
  • Note that the directive should not be indented.

Usage

To use the task to download the JSON of a YouTube playlist, you can use the following command:

make download-youtube-playlist-json list=<playlist_id>

By using this approach, you can easily pass different playlist IDs to the Makefile task without modifying the Makefile itself each time. This makes the process more efficient and flexible.