---
title:
- Making Makefiles
author:
- Malin

theme:
- Warsaw
colortheme:
- orchid
---

# Intro

The fundamental problem:

```bash
git submodule update --init soundscape
cargo build --release
install -pm755 target/release/tap /usr/local/bin/
```

You can't type this after every test.

***

## First Solution

```bash
#!/bin/sh
git submodule update --init soundscape
cargo build --release
install -pm755 target/release/tap /usr/local/bin/
```

At this point, every test takes 10 minutes.

## Second Solution

```bash
#!/bin/sh
[ -f soundscape/.git ] || git submodule update --init soundscape
[ -f target/release/tap ] || cargo build --release
[ -f target/release/tap ] || \
    install -pm755 target/release/tap /usr/local/bin/
```

***

# Makefile Solutions

- input, process, output.
- automatic idempotence

```bash
INSTALL_DIR = /usr/local/bin

soundscape/.git:
    git submodule update --init soundscape

/usr/local/bin/tap: target/release/tap
	install -pm755 target/release/tap $(INSTALL_DIR)

target/release/tap: src soundscape/.git
	cargo build --release
```

***

# Basic

- *Gotcha*: directories
- This, that, and these

***

## Repetition, Repetition, Repetition

```make
.PHONY: output
output: release/index.html

release/: backups.zip
	mkdir $@

release/index.html: index.html release/
	cp  $< $@

index.html: backups.zip
	unzip $<
```

***

# Variables

- From your shell.
- New variables.
- Filenames as variables.
- *Gotcha*: no shell variables, only make!

## Equality

- Variables with '=', never ':='.
- *Gotcha*: one shell per line.
- Variables as shell output.


***


# Phonies, and the Problems with Lies

- clean (common)
- check (excellent)

***


## Non-Compiling Checks

- `make` -n
- *Gotcha*: shell output variables.

***


# The Fourth Sigil: `%`

- Standard rules, e.g. ImageMagick, copying, et c.
- *Gotcha*: intermediaries are deleted.

***

# Bling: make2graph

- *Gotcha*: completely outdated.

***

# Inclusivity

- `include dir/Makefile`
- *Gotcha*: directory has not changed
- `$(MAKEFILE_LIST)`


# Special Commands

- dir
- `DIR = test -d $(dir $@) || mkdir $(dir $@)`
- patsubst
- Wildcards (or not?)

# Maintanance

- backups
- saving files
