forked from CSCI-442-Mines/project-2-starter
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMakefile
88 lines (71 loc) · 2.61 KB
/
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
SHELL:=/bin/bash
CC=clang
LIBS:=-lreadline -lhistory
FLAGS_release:=-O2 -flto
FLAGS_debug:=-O0 -ggdb3 -DTEST_BUILD -fsanitize=address
CFLAGS:=-std=gnu17 -Werror -Wall -Wstrict-prototypes -Wmissing-prototypes \
-Wundef -Wmissing-declarations -Iinclude
OUTDIR:=build
LD:=$(CC)
LDFLAGS:=$(CFLAGS)
# Recursive wildcard function, stackoverflow.com/questions/2483182
rwildcard=$(foreach d,$(wildcard $(1:=/*)),$(call rwildcard,$d,$2) $(filter $(subst *,%,$2),$d))
# Collect the source files
HEADERS:=$(call rwildcard,include,*.h)
SRCS:=$(call rwildcard,src,*.c)
MAINSRCS:=$(call rwildcard,mains,*.c)
OBJFILES_SRC:=$(patsubst %.c,%.o,$(SRCS))
OBJFILES_SRC_debug:=$(foreach o,$(OBJFILES_SRC),$(OUTDIR)/debug/$(o))
OBJFILES_SRC_release:=$(foreach o,$(OBJFILES_SRC),$(OUTDIR)/release/$(o))
OBJFILES_MAINS:=$(patsubst %.c,%.o,$(MAINSRCS))
OBJFILES_MAINS_debug:=$(foreach o,$(OBJFILES_MAINS),$(OUTDIR)/debug/$(o))
OBJFILES_MAINS_release:=$(foreach o,$(OBJFILES_MAINS),$(OUTDIR)/release/$(o))
BINS:=$(patsubst mains/%.c,%,$(MAINSRCS))
BINS_debug:=$(foreach f,$(BINS),$(f).debug)
BINS_release:=$(foreach f,$(BINS),$(f))
OUTPUTS_debug:=$(OBJFILES_SRC_debug) $(OBJFILES_MAINS_debug) $(BINS_debug) \
$(CINCLUDES_debug)
OUTPUTS_release:=$(OBJFILES_SRC_release) $(OBJFILES_MAINS_release) \
$(BINS_release) $(CINCLUDES_release)
OUTPUTS:=$(OUTPUTS_debug) $(OUTPUTS_release)
DIRS:=$(sort $(dir $(OUTPUTS)))
_create_dirs := $(foreach d,$(DIRS),$(shell [ -d $(d) ] || mkdir -p $(d)))
ifeq ($(V),)
cmd = @printf ' %-6s %s\n' $(cmd_$(1)_name) "$(if $(2),$(2),"$@")" ; $(call cmd_$(1),$(2))
else
ifeq ($(V),1)
cmd = $(call cmd_$(1),$(2))
else
cmd = @$(call cmd_$(1),$(2))
endif
endif
get_target = $(word 2,$(subst /, ,$@))
target_flags = $(FLAGS_$(get_target))
DEPFLAGS = -MMD -MP -MF [email protected]
cmd_c_to_o_name = CC
cmd_c_to_o = $(CC) $(CFLAGS) $(target_flags) $(DEPFLAGS) -c $< -o $@
cmd_o_to_elf_release_name = LD
cmd_o_to_elf_release = $(LD) $(LDFLAGS) $(FLAGS_release) $^ $(LIBS) -o $@
cmd_o_to_elf_debug_name = LD
cmd_o_to_elf_debug = $(LD) $(LDFLAGS) $(FLAGS_debug) $^ $(LIBS) -o $@
cmd_clean_name = CLEAN
cmd_clean = rm -rf $(1)
cmd_gdb_name = GDB
cmd_gdb = $(MAKE) $(1) && gdb $(1)
cmd_run_name = RUN
cmd_run = $(MAKE) $(1) && ./$(1)
.SECONDARY:
.PHONY: all
all: $(BINS_debug) $(BINS_release)
-include $(call rwildcard,$(OUTDIR),*.d)
%.debug: $(OUTDIR)/debug/mains/%.o $(OBJFILES_SRC_debug)
$(call cmd,o_to_elf_debug)
%: $(OUTDIR)/release/mains/%.o $(OBJFILES_SRC_release)
$(call cmd,o_to_elf_release)
$(OUTDIR)/debug/%.o: %.c
$(call cmd,c_to_o)
$(OUTDIR)/release/%.o: %.c
$(call cmd,c_to_o)
.PHONY: clean
clean:
$(call cmd,clean,$(OUTDIR) $(BINS_debug) $(BINS_release))