Buildsystem: be more friendly with cygwin environment
[TD_C.git] / TP_13 / exo2 / 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 # $(SRC_PATH) directory.
5 #
6 # This Makefile expect all embedded library source files (.c) to be at the same level, in the
7 # $(LIBRARY_PATH) directory.
8 #
9 # It will automatically generate dependencies, compile all files, and produce a
10 # binary using the provided name linked against the library if necessary.
11 #
12 # Set BINARY_NAME to the name of the binary file to build.
13 # Set LIBRARY_NAME to the name of the library file to build.
14 # The default path for the library code and object is lib.
15 # By default the linker will look for $(BINARY_NAME) library name.
16 # Set BUILD_TYPE to either debug or release.
17 #
18 # Automatic dependencies code from:
19 # http://make.mad-scientist.net/papers/advanced-auto-dependency-generation/#tldr
20 BINARY_NAME=exo2
21 SRC_PATH:=src
22 LIBRARY_NAME=libexo2
23 LIBRARY_PATH:=lib
24 LDLIBS=-lncurses -ltinfo
25 BUILD_TYPE=debug
26 #BUILD_TYPE=release
27
28 # ====================================
29 # DO NOT CHANGE STUFF BEYOND THIS LINE
30 # ====================================
31
32 all: $(BINARY_NAME) $(BINARY_NAME).dynamic $(BINARY_NAME).static
33
34 CC=gcc
35 LD=gcc
36 AR=ar
37
38 WARN_FLAGS = -Wall -Wextra
39 STD_FLAG = -std=c11
40 UNAME := $(shell uname -o)
41
42 ifeq ($(BUILD_TYPE),debug)
43 BUILDDIR := .build/debug
44 DEBUG_FLAG = -g
45 STRIP_FLAG =
46 OPTI_FLAG = -O0
47 LTO_SUPPORT = yes
48 GOLD_SUPPORT = yes
49 else
50 BUILDDIR := .build/release
51 DEBUG_FLAG =
52 STRIP_FLAG = -s
53 OPTI_FLAG = -O3
54 LTO_SUPPORT = yes
55 GOLD_SUPPORT = yes
56 endif
57
58 ifeq ($(UNAME),Cygwin)
59 GOLD_SUPPORT = no
60 endif
61
62 ifeq ($(LTO_SUPPORT),yes)
63 CFLAGS_LTO = -flto -ffat-lto-objects
64 LDFLAGS_LTO = -fuse-linker-plugin -flto
65 endif
66
67 ifeq ($(GOLD_SUPPORT),yes)
68 LDFLAGS_GOLD = -fuse-ld=gold
69 endif
70
71 # Putting header files in the source directory is not the purpose of this INCLUDES variable
72 INCLUDES := $(INCLUDES) -I$(LIBRARY_PATH)
73 CFLAGS := $(CFLAGS) $(CFLAGS_LTO) $(WARN_FLAGS) $(STD_FLAG) $(OPTI_FLAG) $(DEBUG_FLAG) $(INCLUDES)
74 LIBCFLAGS := -fPIC $(CFLAGS)
75 LDFLAGS := $(LDFLAGS) $(LDFLAGS_LTO) $(LDFLAGS_GOLD) $(STRIP_FLAG)
76 LIBLDFLAGS := -shared $(LDFLAGS)
77 STATICLIBLDFLAGS := -static $(LDFLAGS)
78 LDLIBS := $(LDLIBS) -L$(LIBRARY_PATH) -l$(BINARY_NAME)
79
80 OBJDIR := $(BUILDDIR)/objs
81 $(shell mkdir -p $(OBJDIR))
82
83 SRCS=$(wildcard $(SRC_PATH)/*.c)
84 LIBSRCS=$(wildcard $(LIBRARY_PATH)/*.c)
85 OBJS=$(patsubst %.c,$(OBJDIR)/%.o,$(notdir $(SRCS)))
86 LIBOBJS=$(patsubst %.c,$(OBJDIR)/%.o,$(notdir $(LIBSRCS)))
87
88 DEPDIR := $(BUILDDIR)/deps
89 $(shell mkdir -p $(DEPDIR))
90 DEPFLAGS = -MT $@ -MMD -MP -MF $(DEPDIR)/$(notdir $*).Td
91 POSTCOMPILE = mv -f $(DEPDIR)/$(notdir $*).Td $(DEPDIR)/$(notdir $*).d
92
93 $(LIBRARY_PATH)/$(LIBRARY_NAME).a: $(LIBOBJS)
94 @echo "[AR StO] $@"
95 @$(AR) rcs $@ $^
96
97 $(LIBRARY_PATH)/$(LIBRARY_NAME).so: $(LIBOBJS)
98 @echo "[LD ShO] $@"
99 @$(LD) $(LIBCFLAGS) $(LIBLDFLAGS) $^ -o $@
100
101 #$(BINARY_NAME): $(OBJS) $(LIBOBJS)
102 # @echo "[LD ] $@"
103 # @$(LD) $(CFLAGS) $(LDFLAGS) $^ $(LDLIBS) -o $@
104
105 $(BINARY_NAME): $(OBJS) $(LIBRARY_PATH)/$(LIBRARY_NAME).a
106 @echo "[LD ] $@"
107 @$(LD) $(CFLAGS) $(LDFLAGS) $^ $(LDLIBS) -o $@
108
109 $(BINARY_NAME).static: $(OBJS) $(LIBRARY_PATH)/$(LIBRARY_NAME).a
110 @echo "[LD ] $@"
111 @$(LD) $(CFLAGS) $(STATICLIBLDFLAGS) $^ $(LDLIBS) -o $@
112
113 $(BINARY_NAME).dynamic: $(OBJS) $(LIBRARY_PATH)/$(LIBRARY_NAME).so
114 @echo "[LD ] $@"
115 @$(LD) $(CFLAGS) $(LDFLAGS) $^ $(LDLIBS) -o $@
116
117 $(OBJDIR)/%.o: $(SRC_PATH)/%.c $(DEPDIR)/%.d
118 @echo "[C ] $(notdir $*)"
119 @$(CC) $(DEPFLAGS) $(CFLAGS) -c $< -o $@
120 @$(POSTCOMPILE)
121
122 include $(wildcard $(patsubst %,$(DEPDIR)/%.d,$(basename $(SRCS))))
123
124 $(OBJDIR)/%.o: $(LIBRARY_PATH)/%.c $(DEPDIR)/%.d
125 @echo "[C ] $(notdir $*)"
126 @$(CC) $(DEPFLAGS) $(LIBCFLAGS) -c $< -o $@
127 @$(POSTCOMPILE)
128
129 include $(wildcard $(patsubst %,$(DEPDIR)/%.d,$(basename $(LIBSRCS))))
130
131 $(DEPDIR)/%.d: ;
132
133 .PRECIOUS: $(DEPDIR)/%.d
134
135 #FIXME: add an install target
136
137 clean:
138 @echo "[CLN]"
139 -@rm -r $(BUILDDIR)
140 -@rm $(BINARY_NAME)
141 -@rm $(BINARY_NAME).static
142 -@rm $(BINARY_NAME).dynamic
143 -@rm $(LIBRARY_PATH)/$(LIBRARY_NAME).a
144 -@rm $(LIBRARY_PATH)/$(LIBRARY_NAME).so
145
146 disassemble: $(BINARY_NAME)
147 objdump -d $< | less
148
149 symbols: $(BINARY_NAME)
150 objdump -t $< | sort | less