#version 5 out_name := out build := release tmp_dir := tmp bin_dir := bin lib_dir := lib src_dir := src CFLAGS := -std=c11 -fdata-sections -ffunction-sections -D_POSIX_C_SOURCE=200809L CFLAGS += -pedantic -Wall -Wextra -Wcast-qual -Wstrict-aliasing -Wpointer-arith -Wstrict-prototypes -Wmissing-prototypes -Wvla -Wno-parentheses -Wno-unused-variable -Wno-unused-function -Wno-unused-parameter -Wno-unused-label LDFLAGS := -Wl,--gc-sections LDLIBS := -lokelib2 ARFLAGS := -rcs compile = $(CC) $(CFLAGS) -MMD -c $< -o $@ link = $(CC) $(LDFLAGS) $^ -o $@ $(LDLIBS) ifeq ($(build),release) out_file := $(out_name) else out_file := $(out_name)_$(build) endif bin := $(bin_dir)/$(out_file) ifneq ($(MSYSTEM),) bin := $(bin).exe LDFLAGS += -static RELFLAGS := -mwindows else RELFLAGS := endif out := $(bin) ifeq ($(build),debug) CFLAGS += -g else ifeq ($(build),release) CFLAGS += -O3 #CFLAGS += -Wunused-variable -Wunused-function -Wunused-parameter -Wunused-label LDFLAGS += $(RELFLAGS) else ifeq ($(build),analyze) CC := clang CFLAGS += --analyze -Xanalyzer -analyzer-output=text link := else $(error invalid build: "$(build)") endif LDLIBS := -lm $(LDLIBS) #################################################################### ifneq ($(run),) run_cmd := @echo "run $(bin)" run_cmd += && cd bin run_cmd += && echo "----------------------------------------------------------------" run_cmd += && ./$(out_file) run_cmd += ; echo "----------------------------------------------------------------" run_cmd += && cd .. endif ifneq ($(debug),) CC := gcc run_cmd := @echo "debug $(bin)" run_cmd += && cd bin run_cmd += && echo "----------------------------------------------------------------" run_cmd += && gdb $(out_file) run_cmd += ; echo "----------------------------------------------------------------" run_cmd += && cd .. endif ifeq ($(PREFIX),) PREFIX := /usr/local endif ifeq ($(CC),clang) CFLAGS += -fcolor-diagnostics -fansi-escape-codes LDFLAGS := $(filter-out -pthread,$(LDFLAGS)) LDLIBS += -lpthread endif rwildcard = $(wildcard $1$2) $(foreach d,$(wildcard $1*),$(call rwildcard,$d/,$2)) build_dir := $(tmp_dir)/$(build) src := $(foreach dir,$(src_dir),$(call rwildcard,$(dir)/,*.c)) obj := $(src:.c=.o) obj := $(addprefix $(build_dir)/,$(obj)) dep := $(obj:.o=.d) dst_dir := $(DESTDIR)$(PREFIX) #################################################################### .PHONY: all all: $(out) @$(run_cmd) $(out): $(obj) @echo "link $@" @mkdir -p $(@D) @$(link) -include $(dep) $(build_dir)/%.o: %.c @echo "compile $<" @mkdir -p $(@D) @$(compile) .PHONY: clean clean: @-rm -rf $(tmp_dir)/*