Compare commits
2 Commits
master
...
e59538a3bd
| Author | SHA1 | Date | |
|---|---|---|---|
|
e59538a3bd
|
|||
|
a9f7fd7f75
|
@@ -0,0 +1,13 @@
|
||||
|
||||
forts/big_fort.txt: forts/short.txt forts/long.txt
|
||||
cat forts/short.txt forts/long.txt > forts/big_fort.txt
|
||||
|
||||
forts/:
|
||||
mkdir forts
|
||||
|
||||
forts/short.txt: forts/
|
||||
fortune -s > forts/short.txt
|
||||
|
||||
forts/long.txt: forts/
|
||||
fortune -l > forts/long.txt
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
|
||||
forts/big_fort.txt: forts/short.txt forts/long.txt
|
||||
cat $^ > $@
|
||||
|
||||
forts/:
|
||||
mkdir $@
|
||||
|
||||
forts/short.txt: forts/
|
||||
fortune -s > $@
|
||||
|
||||
forts/long.txt: forts/
|
||||
fortune -l > $@
|
||||
|
||||
clean:
|
||||
rm -rf forts
|
||||
@@ -0,0 +1,158 @@
|
||||
---
|
||||
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
|
||||
Reference in New Issue
Block a user