title |
author |
theme |
colortheme |
|
|
|
|
Intro
The fundamental problem:
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
#!/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
#!/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
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
.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