TP 13 exo1: Finish the buildsystem and the directories structure
[TD_C.git] / TP_13 / exo1 / Makefile
CommitLineData
eddc018d
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=exo1
a9c4c876 15SRC_PATH:=src
eddc018d
JB
16LIBRARY_NAME=libexo1
17LIBRARY_PATH:=lib
eddc018d 18BUILD_TYPE=debug
a9c4c876 19#BUILD_TYPE=release
eddc018d
JB
20
21# ====================================
22# DO NOT CHANGE STUFF BEYOND THIS LINE
23# ====================================
24
25all: $(BINARY_NAME) $(BINARY_NAME).dynamic $(BINARY_NAME).static
26
27CC=gcc
28LD=gcc
29AR=ar
30
31WARN_FLAGS = -Wall -Wextra
32STD_FLAG = -std=c11
33
34ifeq ($(BUILD_TYPE),debug)
35BUILDDIR := .build/debug
36DEBUG_FLAG = -g
37STRIP_FLAG =
38OPTI_FLAG = -O0
39else
40BUILDDIR := .build/release
41DEBUG_FLAG =
42STRIP_FLAG = -s
43OPTI_FLAG = -O3
44endif
45
fac749d5 46# Puting header files in the source directory is not the purpose of this INCLUDES variable
a9c4c876
JB
47INCLUDES := $(INCLUDES) -I$(SRC_PATH) -I$(LIBRARY_PATH)
48CFLAGS := $(CFLAGS) $(WARN_FLAGS) $(STD_FLAG) $(OPTI_FLAG) $(DEBUG_FLAG) $(INCLUDES)
a80f64d2 49LIBCFLAGS := -fPIC $(CFLAGS)
eddc018d
JB
50LDFLAGS := $(LDFLAGS) $(STRIP_FLAG)
51LIBLDFLAGS := -shared $(LDFLAGS)
52STATICLIBLDFLAGS := -static $(LDFLAGS)
a80f64d2 53LDLIBS := $(LDLIBS) -L$(LIBRARY_PATH) -l$(BINARY_NAME)
eddc018d
JB
54
55OBJDIR := $(BUILDDIR)/objs
56$(shell mkdir -p $(OBJDIR))
57
a9c4c876 58SRCS=$(wildcard $(SRC_PATH)/*.c)
eddc018d
JB
59LIBSRCS=$(wildcard $(LIBRARY_PATH)/*.c)
60OBJS=$(patsubst %.c,$(OBJDIR)/%.o,$(notdir $(SRCS)))
61LIBOBJS=$(patsubst %.c,$(OBJDIR)/%.o,$(notdir $(LIBSRCS)))
62
63DEPDIR := $(BUILDDIR)/deps
64$(shell mkdir -p $(DEPDIR))
65DEPFLAGS = -MT $@ -MMD -MP -MF $(DEPDIR)/$(notdir $*).Td
66POSTCOMPILE = mv -f $(DEPDIR)/$(notdir $*).Td $(DEPDIR)/$(notdir $*).d
67
eddc018d
JB
68$(LIBRARY_PATH)/$(LIBRARY_NAME).a: $(LIBOBJS)
69 @echo "[AR StO] $@"
70 @$(AR) rcs $@ $^
71
72$(LIBRARY_PATH)/$(LIBRARY_NAME).so: $(LIBOBJS)
73 @echo "[LD ShO] $@"
a80f64d2 74 @$(LD) $(LIBCFLAGS) $(LIBLDFLAGS) $^ -o $@
eddc018d
JB
75
76#$(BINARY_NAME): $(OBJS) $(LIBOBJS)
77# @echo "[LD ] $@"
a80f64d2 78# @$(LD) $(CFLAGS) $(LDFLAGS) $^ $(LDLIBS) -o $@
eddc018d
JB
79
80$(BINARY_NAME): $(OBJS) $(LIBRARY_PATH)/$(LIBRARY_NAME).a
81 @echo "[LD ] $@"
a80f64d2 82 @$(LD) $(CFLAGS) $(LDFLAGS) $^ $(LDLIBS) -o $@
eddc018d 83
eddc018d
JB
84$(BINARY_NAME).static: $(OBJS) $(LIBRARY_PATH)/$(LIBRARY_NAME).a
85 @echo "[LD ] $@"
a80f64d2 86 @$(LD) $(CFLAGS) $(STATICLIBLDFLAGS) $^ $(LDLIBS) -o $@
eddc018d 87
eddc018d
JB
88$(BINARY_NAME).dynamic: $(OBJS) $(LIBRARY_PATH)/$(LIBRARY_NAME).so
89 @echo "[LD ] $@"
a80f64d2 90 @$(LD) $(CFLAGS) $(LDFLAGS) $^ $(LDLIBS) -o $@
eddc018d 91
a9c4c876 92$(OBJDIR)/%.o: $(SRC_PATH)/%.c $(DEPDIR)/%.d
a80f64d2 93 @echo "[C ] $(notdir $*)"
eddc018d
JB
94 @$(CC) $(DEPFLAGS) $(CFLAGS) -c $< -o $@
95 @$(POSTCOMPILE)
96
97include $(wildcard $(patsubst %,$(DEPDIR)/%.d,$(basename $(SRCS))))
98
a9c4c876 99$(OBJDIR)/%.o: $(LIBRARY_PATH)/%.c $(DEPDIR)/%.d
a80f64d2
JB
100 @echo "[C ] $(notdir $*)"
101 @$(CC) $(DEPFLAGS) $(LIBCFLAGS) -c $< -o $@
eddc018d
JB
102 @$(POSTCOMPILE)
103
104include $(wildcard $(patsubst %,$(DEPDIR)/%.d,$(basename $(LIBSRCS))))
105
106$(DEPDIR)/%.d: ;
107
108.PRECIOUS: $(DEPDIR)/%.d
109
a80f64d2
JB
110#FIXME: add an install target
111
eddc018d
JB
112clean:
113 @echo "[CLN]"
114 -@rm -r $(BUILDDIR)
115 -@rm $(BINARY_NAME)
116 -@rm $(BINARY_NAME).static
117 -@rm $(BINARY_NAME).dynamic
118 -@rm $(LIBRARY_PATH)/$(LIBRARY_NAME).a
119 -@rm $(LIBRARY_PATH)/$(LIBRARY_NAME).so
120
121disassemble: $(BINARY_NAME)
122 objdump -d $< | less
123
124symbols: $(BINARY_NAME)
125 objdump -t $< | sort | less