workshops/slides/makefiles/makefiles.md

159 lines
2.1 KiB
Markdown

---
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