---
title: "Makefile Patterns"
tags: [ "system", "make" ]
---

Using the [basic example](../Makefile.md), you can make a complete backup of all backup files.
This file will depend upon everything inside the `$(storage_directory)`.
Unlike `bash`, you can't just say `storage_directory/*`: the pattern must be stated as a 'wildcard'.

```make
$(storage_directory)/backup.tgz: $(wildcard $(storage_directory)/*.md)
	tar czf $@ $^
```

The `make` rules start by processing variables:

```make
backups/backup.tgz: $(wildcard backups/*.md)
	tar czf backups/backup.tgz $^
```

Then the `wildcard` variable equals whichever backup files are in the `backups/` directory:

```make
backups/backup.tgz: backups/backup_29.md backups/backup_30.md
    tar czf backups/backup.tgz backups/backup_29.md backups/backup_30.md
```

The phony `backup` target should now point to this tar backup.


```make
current_minute != date +%M

storage_directory = backups

.PHONY: backup
backup: $(storage_directory)/backup.tgz
$(storage_directory)/backup.tgz: $(wildcard $(storage_directory)/*.md)
	tar czf $@ $^

README.md: Makefile
	echo "Basic makefile example." > $@
	echo "" >> $@
	echo '```' >> $@
	cat $< >> $@
	echo '```' >> $@

$(storage_directory)/backup_$(current_minute).md: README.md
	mkdir -p $(@D)
	cp $< $@

```