fabricate

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