TP 11 exo1: Fix the Makefile to produce the shared and the static
[TD_C.git] / TP_11 / exo1 / Makefile
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
14 BINARY_NAME=exo1
15 LIBOBJS=clist.o # object to put in the library
16 LIBRARY_NAME=libtpC
17 BUILD_TYPE=debug
18
19 # ====================================
20 # DO NOT CHANGE STUFF BEYOND THIS LINE
21 # ====================================
22
23 all: $(LIBRARY_NAME).a $(LIBRARY_NAME).so $(BINARY_NAME)
24
25 CC=gcc
26 LD=gcc
27 AR=ar
28
29 WARN_FLAGS = -Wall -Wextra
30 STD_FLAG = -std=c11
31
32 ifeq ($(BUILD_TYPE),debug)
33 BUILDDIR := .build/debug
34 DEBUG_FLAG = -g
35 STRIP_FLAG =
36 OPTI_FLAG = -O0
37 else
38 BUILDDIR := .build/release
39 DEBUG_FLAG =
40 STRIP_FLAG = -s
41 OPTIFLAG = -O3
42 endif
43
44 #FIXME: Add a way to better control the library build
45 CFLAGS := -fPIC $(CFLAGS) $(WARN_FLAGS) $(STD_FLAG) $(OPTI_FLAG) $(DEBUG_FLAG)
46 LDFLAGS := $(LDFLAGS) $(STRIP_FLAG)
47 LIBLDFLAGS := -shared $(LDFLAGS)
48
49 OBJDIR := $(BUILDDIR)/objs
50 $(shell mkdir -p $(OBJDIR))
51
52 SRCS=$(wildcard *.c)
53 OBJS=$(patsubst %.c,$(OBJDIR)/%.o,$(SRCS))
54 OBJSLIB=$(addprefix $(OBJDIR)/,$(LIBOBJS))
55
56 DEPDIR := $(BUILDDIR)/deps
57 $(shell mkdir -p $(DEPDIR))
58 DEPFLAGS = -MT $@ -MMD -MP -MF $(DEPDIR)/$*.Td
59 POSTCOMPILE = mv -f $(DEPDIR)/$*.Td $(DEPDIR)/$*.d
60
61 $(LIBRARY_NAME).a: $(OBJSLIB)
62 @echo "[AR StO] $@"
63 @$(AR) rcs $@ $^
64
65 $(LIBRARY_NAME).so: $(OBJSLIB)
66 @echo "[LD ShO] $@"
67 @$(LD) $(CFLAGS) $(LIBLDFLAGS) $^ -o $@
68
69 $(BINARY_NAME): $(OBJS)
70 @echo "[LD ] $@"
71 @$(LD) $(CFLAGS) $(LDFLAGS) $^ $(LDLIBS) -o $@
72
73 $(OBJDIR)/%.o: %.c $(DEPDIR)/%.d
74 @echo "[C ] $*"
75 @$(CC) $(DEPFLAGS) $(CFLAGS) -c $< -o $@
76 @$(POSTCOMPILE)
77
78 $(DEPDIR)/%.d: ;
79
80 .PRECIOUS: $(DEPDIR)/%.d
81
82 include $(wildcard $(patsubst %,$(DEPDIR)/%.d,$(basename $(SRCS))))
83
84 clean:
85 @echo "[CLN]"
86 -@rm -r $(BUILDDIR)
87 -@rm $(BINARY_NAME)
88 -@rm $(LIBRARY_NAME).so
89 -@rm $(LIBRARY_NAME).a
90
91 disassemble: $(BINARY_NAME)
92 objdump -d $< | less
93
94 symbols: $(BINARY_NAME)
95 objdump -t $< | sort | less