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 $?