1 # Sample Makefile to build simple project.
3 # This Makefile expect all source files (.c) to be at the same level, in the
4 # current working directory.
6 # It will automatically generate dependencies, compile all files, and produce a
7 # binary using the provided name.
9 # Set BINARY_NAME to the name of the binary file to build.
10 # Set LIBRARY_NAME to the name of the library file to build.
11 # The default path for the library code and object is lib.
12 # By default the linker will look for $(BINARY_NAME) library name.
13 # Set BUILD_TYPE to either debug or release.
15 # Automatic dependencies code from:
16 # http://make.mad-scientist.net/papers/advanced-auto-dependency-generation/#tldr
24 # ====================================
25 # DO NOT CHANGE STUFF BEYOND THIS LINE
26 # ====================================
28 all: $(BINARY_NAME
) $(BINARY_NAME
).dynamic
$(BINARY_NAME
).static
34 WARN_FLAGS
= -Wall
-Wextra
37 ifeq ($(BUILD_TYPE
),debug
)
38 BUILDDIR
:= .build
/debug
43 BUILDDIR
:= .build
/release
49 # Putting header files in the source directory is not the purpose of this INCLUDES variable
50 INCLUDES
:= $(INCLUDES
) -I
$(SRC_PATH
) -I
$(LIBRARY_PATH
)
51 CFLAGS
:= $(CFLAGS
) $(WARN_FLAGS
) $(STD_FLAG
) $(OPTI_FLAG
) $(DEBUG_FLAG
) $(INCLUDES
)
52 LIBCFLAGS
:= -fPIC
$(CFLAGS
)
53 LDFLAGS
:= $(LDFLAGS
) $(STRIP_FLAG
)
54 LIBLDFLAGS
:= -shared
$(LDFLAGS
)
55 STATICLIBLDFLAGS
:= -static
$(LDFLAGS
)
56 LDLIBS
:= $(LDLIBS
) -L
$(LIBRARY_PATH
) -l
$(BINARY_NAME
)
58 OBJDIR
:= $(BUILDDIR
)/objs
59 $(shell mkdir
-p
$(OBJDIR
))
61 SRCS
=$(wildcard $(SRC_PATH
)/*.c
)
62 LIBSRCS
=$(wildcard $(LIBRARY_PATH
)/*.c
)
63 OBJS
=$(patsubst %.c
,$(OBJDIR
)/%.o
,$(notdir $(SRCS
)))
64 LIBOBJS
=$(patsubst %.c
,$(OBJDIR
)/%.o
,$(notdir $(LIBSRCS
)))
66 DEPDIR
:= $(BUILDDIR
)/deps
67 $(shell mkdir
-p
$(DEPDIR
))
68 DEPFLAGS
= -MT
$@
-MMD
-MP
-MF
$(DEPDIR
)/$(notdir $*).Td
69 POSTCOMPILE
= mv
-f
$(DEPDIR
)/$(notdir $*).Td
$(DEPDIR
)/$(notdir $*).d
71 $(LIBRARY_PATH
)/$(LIBRARY_NAME
).a
: $(LIBOBJS
)
75 $(LIBRARY_PATH
)/$(LIBRARY_NAME
).so
: $(LIBOBJS
)
77 @
$(LD
) $(LIBCFLAGS
) $(LIBLDFLAGS
) $^
-o
$@
79 #$(BINARY_NAME): $(OBJS) $(LIBOBJS)
81 # @$(LD) $(CFLAGS) $(LDFLAGS) $^ $(LDLIBS) -o $@
83 $(BINARY_NAME
): $(OBJS
) $(LIBRARY_PATH
)/$(LIBRARY_NAME
).a
85 @
$(LD
) $(CFLAGS
) $(LDFLAGS
) $^
$(LDLIBS
) -o
$@
87 $(BINARY_NAME
).static
: $(OBJS
) $(LIBRARY_PATH
)/$(LIBRARY_NAME
).a
89 @
$(LD
) $(CFLAGS
) $(STATICLIBLDFLAGS
) $^
$(LDLIBS
) -o
$@
91 $(BINARY_NAME
).dynamic
: $(OBJS
) $(LIBRARY_PATH
)/$(LIBRARY_NAME
).so
93 @
$(LD
) $(CFLAGS
) $(LDFLAGS
) $^
$(LDLIBS
) -o
$@
95 $(OBJDIR
)/%.o
: $(SRC_PATH
)/%.c
$(DEPDIR
)/%.d
96 @echo
"[C ] $(notdir $*)"
97 @
$(CC
) $(DEPFLAGS
) $(CFLAGS
) -c
$< -o
$@
100 include $(wildcard $(patsubst %,$(DEPDIR
)/%.d
,$(basename $(SRCS
))))
102 $(OBJDIR
)/%.o
: $(LIBRARY_PATH
)/%.c
$(DEPDIR
)/%.d
103 @echo
"[C ] $(notdir $*)"
104 @
$(CC
) $(DEPFLAGS
) $(LIBCFLAGS
) -c
$< -o
$@
107 include $(wildcard $(patsubst %,$(DEPDIR
)/%.d
,$(basename $(LIBSRCS
))))
111 .PRECIOUS
: $(DEPDIR
)/%.d
113 #FIXME: add an install target
119 -@
rm $(BINARY_NAME
).static
120 -@
rm $(BINARY_NAME
).dynamic
121 -@
rm $(LIBRARY_PATH
)/$(LIBRARY_NAME
).a
122 -@
rm $(LIBRARY_PATH
)/$(LIBRARY_NAME
).so
124 disassemble
: $(BINARY_NAME
)
127 symbols
: $(BINARY_NAME
)
128 objdump
-t
$< |
sort | less