# if $CC is not set, use gcc as a sensible default CC ?= gcc RM ?= rm -fv # if $CFLAGS is not set, be very pedantic and compile # as C11, that should catch some common errors, also # fortify the source, which is a must for security. CFLAGS ?= -Wall \ -D_FORTIFY_SOURCE=2 \ -Wextra -Wcast-align -Wcast-qual -Wpointer-arith \ -Waggregate-return -Wunreachable-code -Wfloat-equal \ -Wformat=2 -Wredundant-decls -Wundef \ -Wdisabled-optimization -Wshadow -Wmissing-braces \ -Wstrict-aliasing=2 -Wstrict-overflow=5 -Wconversion \ -Wno-unused-parameter \ -pedantic -std=c11 CFLAGS_DEBUG := -g3 \ -O \ -DDEBUG CFLAGS_RELEASE := -O2 \ -DNDEBUG \ -march=native \ -mtune=native \ -ftree-vectorize # the default target is debug all: debug # clean target, removing all .o and the executable clean: $(RM) *o bs_exe # when the target is debug, # add CFLAGS_DEBUG to CFLAGS debug: CFLAGS += $(CFLAGS_DEBUG) debug: clean bs_exe # when the target is release, # add CFLAGS_RELEASE to CFLAGS release: CFLAGS += $(CFLAGS_RELEASE) release: clean bs_exe bs_exe: main.o $(CC) $^ -o $@ $(CFLAGS) # when looking for something that ends in .o, look # for the same thing ending in .c and run gcc on it %.o: %.c $(CC) -c $< $(CFLAGS) .PHONY: debug release clean