Make Reference

Kip Landergren

(Updated: )

My cheat sheet for Make covering resources and examples.

Contents

Helpful Options

-n / --dry-run / --just-print / --recon print the commands that would be executed (but do not execute them)
-p / --print-database print the database that results from reading the makefiles, and then execute as normal

Resources

Make Terminology

makefile
a file that contains rules which tell make what to do
phony target
a target that does not generate a file of the same name
prerequisite
a file that is used as input to create the target
recipe
the action—commands—that make carries out for a rule
rule
the collection of information used to determine when and how to remake certain files
target
the name of a file generated by the rule, except in special cases like phony targets

make-study

README.md

# make-study

Study area for [Make](https://www.gnu.org/software/make/)

examples/basic/Makefile

# default shell is `/bin/sh`
SHELL := /bin/bash

# the first rule will be run if `make` is invoked without arguments

# the target name of `myfile.txt` is chosen because its recipe actually creates
# an output at the path `./myfile.txt`. `make` will use the file's last
# modified timestamp, compared to its prerequisites, to determine if it needs
# to run

# targets `dep1.txt` and `dep2.txt` are specified as prerequisites of `myfile.txt`
myfile.txt: dep1.txt dep2.txt
	cat dep1.txt dep2.txt > myfile.txt

# alternatively could use `printf` instead of `echo` to be more portable
dep1.txt:
	echo -n 'hello' > dep1.txt

dep2.txt:
	echo ' world' > dep2.txt

mydir/foo.txt:
	mkdir mydir
	# each command effectively executes in a new shell—I don't know more
	# details on this—and so chaining path-dependent commands is important
	cd mydir && echo 'foo' > foo.txt

# .PHONY is used because there is no file named `clean` created by this
# target. If one were created by an unrelated process `make` could
# inadvertently not run (because it sees that file `clean` already exists)
.PHONY: clean
clean:
	rm dep1.txt
	rm dep2.txt
	rm myfile.txt
	rm -rf ./mydir

# use of `wildcard`
.PHONY: print
print: $(wildcard *.txt)
	ls -la $?