159 lines
2.1 KiB
Markdown
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
|