workshops/slides/makefiles/makefiles.md

2.1 KiB

title author theme colortheme
Making Makefiles
Malin
Warsaw
orchid

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

  • backups
  • saving files