cheatsheets/makefile.md

100 lines
1.9 KiB
Markdown

---
title: Makefile
layout: default
---
## Var assignment
uglify = $(uglify) # assignment
compressor := $(uglify) # lazy assignment
prefix ?= /usr/local # safe assignment
## Magic variables
out.o: src.c src.h
$@ - "out.o" (target)
$< - "src.c" (first prerequisite)
$^ - "src.c src.h" (all prerequisites)
%.o: %.c
$% - target member name ("foo" in "foo.c")
also:
$+ - prerequisites (all, with duplication)
$? - prerequisites (new ones)
$| - prerequisites (order-only?)
$* - basename without extension of the target (?)
$(@D) - target directory
## Command prefixes
| Prefix | Description |
| ------ | ----------- |
| `-` | Ignore errors |
| `@` | Don't print command |
| `+` | Run even if Make is in 'don't execute' mode |
build:
@echo "compiling"
-gcc $< $@
-include .depend
## Find files
js_files := $(wildcard test/*.js)
all_files := $(shell find images -name "*")
## Substitutions
file = $(SOURCE:.cpp=.o) # foo.cpp => foo.o
outputs = $(files:src/%.coffee=lib/%.js)
outputs = $(patsubst %.c, %.o, $(wildcard *.c))
assets = $(patsubst images/%, assets/%, $(wildcard images/*))
## More functions
$(strip $(string_var))
$(filter %.less, $(files))
$(filter-out %.less, $(files))
## Building files
%.o: %.c
ffmpeg -i $< > $@ # Input and output
foo $^
## Includes
-include foo.make
## Options
make
-e, --environment-overrides
-B, --always-make
-s, --silent
-j, --jobs=N # parallel processing
## Conditionals
foo: $(objects)
ifeq ($(CC),gcc)
$(CC) -o foo $(objects) $(libs_for_gcc)
else
$(CC) -o foo $(objects) $(normal_libs)
endif
## Recursive
deploy:
$(MAKE) deploy2
## Further reading
* [isaacs's Makefile](https://gist.github.com/isaacs/62a2d1825d04437c6f08)