#version static 5 out_name := okelib3 build := static64 inc_dir := inc tmp_dir := tmp bin_dir := bin src_dir := src CFLAGS := -pthread -std=c11 -fdata-sections -ffunction-sections -I$(inc_dir) CFLAGS += -pedantic -Wall -Wextra -Wcast-qual -Wstrict-aliasing -Wpointer-arith -Wstrict-prototypes -Wmissing-prototypes -Wvla -Wno-parentheses LDFLAGS := -pthread -Wl,--gc-sections LDLIBS := -lm ARFLAGS := -rcs compile = $(cc_prefix) $(CC) $(CFLAGS) -MMD -c $< -o $@ dlink = $(cc_prefix) $(CC) $(LDFLAGS) $^ -o $@ $(LDLIBS) slink = $(AR) $(ARFLAGS) $@ $^ link = $(slink) bin := $(out_name)_$(build) ifneq ($(MSYSTEM),) bin := $(bin).exe endif ifeq ($(build),static64) CFLAGS += -O3 -DNDEBUG out := lib$(out_name)64.a lib := lib$(out_name).a else ifeq ($(build),static32) CFLAGS += -O3 -m32 -DNDEBUG out := lib$(out_name)32.a lib := lib$(out_name).a else ifeq ($(build),static64d) CFLAGS += -g out := lib$(out_name)64d.a lib := lib$(out_name)d.a else ifeq ($(build),debug) src_dir += test CFLAGS += -g CFLAGS += -Wno-unused-variable -Wno-unused-function -Wno-unused-parameter -Wno-unused-label # LDLIBS += -lokeutild link = $(dlink) out := $(bin) else ifeq ($(build),release) src_dir += test CFLAGS += -O3 -DNDEBUG # LDLIBS += -lokeutil link = $(dlink) out := $(bin) else ifeq ($(build),analyze) src_dir += test CC := clang CFLAGS += --analyze -Xanalyzer -analyzer-output=text link := else $(error invalid build: "$(build)") endif #################################################################### out := $(bin_dir)/$(out) ifneq ($(run),) #run_cmd := @echo "run $(out)" run_cmd := cat /dev/null run_cmd += ; time ./$(out) endif ifneq ($(debug),) CC := gcc #run_cmd := @echo "debug $(out)" run_cmd := cat /dev/null run_cmd += ; gdb ./$(out) 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) @rm -f $@ @$(link) -include $(dep) $(build_dir)/%.o: %.c @echo "compile $<" @mkdir -p $(@D) @$(compile) .PHONY: install install: @mkdir -p $(dst_dir)/lib @mkdir -p $(dst_dir)/include @printf "copy %-24s -> %s\n" "$(out)" "$(dst_dir)/lib/$(lib)" @cp $(out) $(dst_dir)/lib/$(lib) @printf "copy %-24s -> %s\n" "$(inc_dir)/*" "$(dst_dir)/include" @cp -R $(inc_dir)/* $(dst_dir)/include .PHONY: clean clean: @-rm -rf $(tmp_dir)/*