====== Overview ====== [[https://www.gnu.org/software/make/manual/html_node/index.html|HTML Manual]] # Print without running $ make --just-print or $ make -n # Print lot of stuff $ make --print-data-base ====== Magic symbols ====== [[https://www.gnu.org/software/make/manual/html_node/Automatic-Variables.html#Automatic-Variables|Automatic variables]] | $@ | Target | | $%%^%% | All prerequisites (excluding duplicates) | | $+ | All prerequisites (including duplicates) | | $? | All prerequisites newer than target | | $< | First prerequisite | | $(@D) | Directory part of target with trailing slash | | $(@F) | File part of target without directory path | | $* | The stem of the target match in implicit rules | ====== Examples ====== # This is a comment # And this is\ a multi line comment # Define a bunch of variables CC=gcc CFLAGS=-std=c99 -Wall -Wextra -pedantic -O3 -I utils DEPS=main.o cbuf.o event_system.o fsm.o OUTFILE=main.exe # VPATH tells make to search the following directories for targets and dependencies. Separated with : VPATH = utils:../header:src # A rule with any of the following names are always run, even if a file with that name already exists .PHONY: clean run pre remake asm # A rule that describes how to generate $(OUTFILE), after all of the depencies $(DEPS) has been made $(OUTFILE): $(DEPS) # $@ is the target # $< is all the dependencies $(CC) -o $@ $< $(CFLAGS) @echo "This command line is not echoed thanks to @. The output to stdout is, however, printed" # This rule matches targets ending with .o, and it depends on the same filename ending with .c %.o: %.c $(CC) -c -o $@ $< $(CFLAGS) # A rule that doesn't correspond to a file, thanks to .PHONY, but can always be run clean: @rm -f $(OUTFILE) *.mk *.o *.pp *.s listing.txt Evaluation time of variables # This will populate TEXTEN with the output from the shell command ls TEXTEN = $(lsoutput) # TEXTEN will contain $(lsouput) and will be evaluated when used TEXTEN2 := $(lsoutput) # TEXTEN2 will contain the evaluated $(lsoutput), which is blank at this line lsoutput = $(shell ls) # Hereafter $(lsoutput) will evaluate to what ls returns # Substitutions when referencing variables, only the ending is substituted SOURCES = a.c b.c c.c OBJECTS = $(SOURCES:c=o) # A make file that compiles all c files and places object files # in the same tree-structure that the sources were found CC = gcc CFLAGS = -std=c99 -Wall -Wextra -pedantic -O0 -I. -I utils -I protocol -I command -I driver OUTFILE = main.exe OBJDIR := build/objects SOURCES := $(shell find * -type f -name "*.c") OBJECTS := $(addprefix $(OBJDIR)/,$(SOURCES:.c=.o)) run: $(OUTFILE) @echo ""; @./$(OUTFILE) $(OUTFILE): $(OBJECTS) $(CC) -o $@ $^ $(CFLAGS) $(OBJECTS): $(OBJDIR)/%.o: %.c mkdir -p $(@D) $(CC) -c -o $@ $^ $(CFLAGS) .PHONY: clean clean: @rm -f $(OUTFILE) *.mk *.o *.pp *.s listing.txt @rm -rf $(OBJDIR)