ref: main
./Makefile
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 |
ifneq ($(OS),Windows_NT) PLAT := $(shell uname -s | tr '[:upper:]' '[:lower:]') else PLAT := win32 endif SRCDIR ?= src OBJDIR ?= obj OUTDIR ?= . SYSROOT ?= /usr SYSBIN ?= $(SYSROOT)/bin ifneq ($(DEBUG),y) OBJDIR := $(OBJDIR)/release else OBJDIR := $(OBJDIR)/debug ifeq ($(ASAN),y) OBJDIR := $(OBJDIR)_asan endif endif SOURCES := $(wildcard $(SRCDIR)/*.c) OBJECTS := $(patsubst $(SRCDIR)/%.c,$(OBJDIR)/%.o,$(SOURCES)) BIN := $(OUTDIR)/fabricate ifeq ($(PLAT),win32) BIN := $(BIN).exe endif CC ?= gcc LD := $(CC) _CC := $(TOOLCHAIN)$(CC) _LD := $(TOOLCHAIN)$(LD) _CFLAGS := $(CFLAGS) -std=c99 -Wall -Wextra -Wuninitialized -Wundef _CPPFLAGS := $(CPPFLAGS) _LDFLAGS := $(LDFLAGS) _LDLIBS := $(LDLIBS) ifneq ($(DEBUG),y) _CPPFLAGS += -DNDEBUG else _CFLAGS += -g -Wdouble-promotion O ?= g ifeq ($(ASAN),y) _CFLAGS += -fsanitize=address -fno-omit-frame-pointer _LDFLAGS += -fsanitize=address endif endif _CFLAGS += -O$(O) .SECONDEXPANSION: define mkdir if [ ! -d '$(1)' ]; then echo 'Creating $(1)/...'; mkdir -p '$(1)'; fi; true endef define rm if [ -f '$(1)' ]; then echo 'Removing $(1)...'; rm -f '$(1)'; fi; true endef define rmdir if [ -d '$(1)' ]; then echo 'Removing $(1)/...'; rm -rf '$(1)'; fi; true endef deps.filter := %.c %.h deps.option := -MM define deps $$(filter $$(deps.filter),,$$(shell $(_CC) $(CFLAGS) $(CPPFLAGS) -E $(deps.option) $(1))) endef build: $(BIN) @: $(OUTDIR) $(OBJDIR): @$(call mkdir,$@) $(OBJDIR)/%.o: $(SRCDIR)/%.c $(call deps,$(SRCDIR)/%.c) | $(OBJDIR) @echo Compiling $<... @$(_CC) -c $(_CFLAGS) $(_CPPFLAGS) $< -o $@ @echo Compiled $< $(BIN): $(OBJECTS) | $(OUTDIR) @echo Linking $@... @$(_LD) $(_LDFLAGS) $^ $(_LDLIBS) -o $@ -@cd -- $(OUTDIR); [ -e fab ] || ln -s -- fabricate fab @echo Linked $@ clean: @$(call rmdir,$(OBJDIR)) distclean: clean @$(call rm,$(BIN)) .PHONY: build clean distclean |