TP 11 exo1: Makefile: differenciate the compiliator flags for libraries
[TD_C.git] / TP_11 / exo2 / Makefile
CommitLineData
a5a96953
JB
1# Sample Makefile to build simple project.
2#
3# This Makefile expect all source files (.c) to be at the same level, in the
4# current working directory.
5#
6# It will automatically generate dependencies, compile all files, and produce a
7# binary using the provided name.
8#
9# Set BINARY_NAME to the name of the binary file to build.
10# Set BUILD_TYPE to either debug or release
11#
12# Automatic dependencies code from:
13# http://make.mad-scientist.net/papers/advanced-auto-dependency-generation/#tldr
14BINARY_NAME=exo2
a80f64d2 15LIBOBJS=clist.o ui.o # object to put in the library
a5a96953 16LIBRARY_NAME=libtpC
a5a96953
JB
17BUILD_TYPE=debug
18
19# ====================================
20# DO NOT CHANGE STUFF BEYOND THIS LINE
21# ====================================
22
5553a759 23all: $(BINARY_NAME) $(BINARY_NAME).static $(BINARY_NAME).staticlocal $(BINARY_NAME).dynamic
a5a96953
JB
24
25CC=gcc
26LD=gcc
27AR=ar
28
29WARN_FLAGS = -Wall -Wextra
30STD_FLAG = -std=c11
31
32ifeq ($(BUILD_TYPE),debug)
33BUILDDIR := .build/debug
34DEBUG_FLAG = -g
35STRIP_FLAG =
36OPTI_FLAG = -O0
37else
38BUILDDIR := .build/release
39DEBUG_FLAG =
40STRIP_FLAG = -s
bb39798e 41OPTI_FLAG = -O3
a5a96953
JB
42endif
43
44#FIXME: Add a way to better control the library build
45CFLAGS := -fPIC $(CFLAGS) $(WARN_FLAGS) $(STD_FLAG) $(OPTI_FLAG) $(DEBUG_FLAG)
46LDFLAGS := $(LDFLAGS) $(STRIP_FLAG)
47LIBLDFLAGS := -shared $(LDFLAGS)
5553a759 48STATICLDFLAGS := -static $(LDFLAGS)
a5a96953
JB
49
50OBJDIR := $(BUILDDIR)/objs
51$(shell mkdir -p $(OBJDIR))
52
53SRCS=$(wildcard *.c)
54OBJS=$(patsubst %.c,$(OBJDIR)/%.o,$(SRCS))
55OBJSLIB=$(addprefix $(OBJDIR)/,$(LIBOBJS))
56
57DEPDIR := $(BUILDDIR)/deps
58$(shell mkdir -p $(DEPDIR))
59DEPFLAGS = -MT $@ -MMD -MP -MF $(DEPDIR)/$*.Td
60POSTCOMPILE = mv -f $(DEPDIR)/$*.Td $(DEPDIR)/$*.d
61
62$(LIBRARY_NAME).a: $(OBJSLIB)
63 @echo "[AR StO] $@"
64 @$(AR) rcs $@ $^
65
66$(LIBRARY_NAME).so: $(OBJSLIB)
67 @echo "[LD ShO] $@"
a80f64d2 68 @$(LD) $(CFLAGS) $(LIBLDFLAGS) $^ -o $@
a5a96953
JB
69
70$(BINARY_NAME): $(OBJS)
71 @echo "[LD ] $@"
72 @$(LD) $(CFLAGS) $(LDFLAGS) $^ $(LDLIBS) -o $@
73
74LOCALLDLIBS=-L. -ltpC
5553a759
JB
75$(BINARY_NAME).static: $(OBJDIR)/$(BINARY_NAME).o $(LIBRARY_NAME).a
76 @echo "[LD ] $@"
77 @$(LD) $(CFLAGS) $(STATICLDFLAGS) $^ $(LOCALLDLIBS) $(LDLIBS) -o $@
78
f1294ffe 79$(BINARY_NAME).staticlocal: $(OBJDIR)/$(BINARY_NAME).o $(LIBRARY_NAME).a
a5a96953
JB
80 @echo "[LD ] $@"
81 @$(LD) $(CFLAGS) $(LDFLAGS) $^ $(LOCALLDLIBS) $(LDLIBS) -o $@
82
83$(BINARY_NAME).dynamic: $(OBJDIR)/$(BINARY_NAME).o $(LIBRARY_NAME).so
84 @echo "[LD ] $@"
85 @$(LD) $(CFLAGS) $(LDFLAGS) $^ $(LOCALLDLIBS) $(LDLIBS) -o $@
86
87$(OBJDIR)/%.o: %.c $(DEPDIR)/%.d
88 @echo "[C ] $*"
89 @$(CC) $(DEPFLAGS) $(CFLAGS) -c $< -o $@
90 @$(POSTCOMPILE)
91
92$(DEPDIR)/%.d: ;
93
94.PRECIOUS: $(DEPDIR)/%.d
95
96include $(wildcard $(patsubst %,$(DEPDIR)/%.d,$(basename $(SRCS))))
97
98clean:
99 @echo "[CLN]"
100 -@rm -r $(BUILDDIR)
101 -@rm $(BINARY_NAME)
5553a759 102 -@rm $(BINARY_NAME).static
f1294ffe 103 -@rm $(BINARY_NAME).staticlocal
a5a96953 104 -@rm $(BINARY_NAME).dynamic
a5a96953 105 -@rm $(LIBRARY_NAME).a
5553a759 106 -@rm $(LIBRARY_NAME).so
a5a96953
JB
107
108disassemble: $(BINARY_NAME)
109 objdump -d $< | less
110
111symbols: $(BINARY_NAME)
112 objdump -t $< | sort | less