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 BUILD_TYPE to either debug or release
12 # Automatic dependencies code from:
13 # http://make.mad-scientist.net/papers/advanced-auto-dependency-generation/#tldr
18 #LDLIBS=-L$(LIBRARY_PATH) -l$(BINARY_NAME)
21 # ====================================
22 # DO NOT CHANGE STUFF BEYOND THIS LINE
23 # ====================================
25 all: $(BINARY_NAME
) $(BINARY_NAME
).dynamic
$(BINARY_NAME
).static
31 WARN_FLAGS
= -Wall
-Wextra
34 ifeq ($(BUILD_TYPE
),debug
)
35 BUILDDIR
:= .build
/debug
40 BUILDDIR
:= .build
/release
46 #FIXME: Add a way to better control the library build flag
47 CFLAGS
:= -fPIC
$(CFLAGS
) $(WARN_FLAGS
) $(STD_FLAG
) $(OPTI_FLAG
) $(DEBUG_FLAG
)
48 LDFLAGS
:= $(LDFLAGS
) $(STRIP_FLAG
)
49 LIBLDFLAGS
:= -shared
$(LDFLAGS
)
50 STATICLIBLDFLAGS
:= -static
$(LDFLAGS
)
52 OBJDIR
:= $(BUILDDIR
)/objs
53 $(shell mkdir
-p
$(OBJDIR
))
55 SRCS
=$(wildcard $(BINARY_PATH
)/*.c
)
56 LIBSRCS
=$(wildcard $(LIBRARY_PATH
)/*.c
)
57 OBJS
=$(patsubst %.c
,$(OBJDIR
)/%.o
,$(notdir $(SRCS
)))
58 LIBOBJS
=$(patsubst %.c
,$(OBJDIR
)/%.o
,$(notdir $(LIBSRCS
)))
60 DEPDIR
:= $(BUILDDIR
)/deps
61 $(shell mkdir
-p
$(DEPDIR
))
62 DEPFLAGS
= -MT
$@
-MMD
-MP
-MF
$(DEPDIR
)/$(notdir $*).Td
63 POSTCOMPILE
= mv
-f
$(DEPDIR
)/$(notdir $*).Td
$(DEPDIR
)/$(notdir $*).d
66 @echo
$(basename $(notdir $(SRCS
)))
67 @echo
$(notdir $(SRCS
))
69 @echo
$(wildcard $(patsubst %,$(DEPDIR
)/%.d
,$(basename $(SRCS
))))
70 @echo
$(OBJS
) $(LIBOBJS
)
71 @echo
$(SRCS
) $(LIBSRCS
)
74 $(LIBRARY_PATH
)/$(LIBRARY_NAME
).a
: $(LIBOBJS
)
78 $(LIBRARY_PATH
)/$(LIBRARY_NAME
).so
: $(LIBOBJS
)
80 @
$(LD
) $(CFLAGS
) $(LIBLDFLAGS
) $^
$(LDLIBS
) -o
$@
82 #$(BINARY_NAME): $(OBJS) $(LIBOBJS)
84 # $(LD) $(CFLAGS) $(LDFLAGS) $^ $(LDLIBS) -o $@
86 $(BINARY_NAME
): $(OBJS
) $(LIBRARY_PATH
)/$(LIBRARY_NAME
).a
88 @
$(LD
) $(CFLAGS
) $(LDFLAGS
) $^
$(LOCALLDLIBS
) $(LDLIBS
) -o
$@
90 LOCALLDLIBS
=-L
$(LIBRARY_PATH
) -l
$(BINARY_NAME
)
91 $(BINARY_NAME
).static
: $(OBJS
) $(LIBRARY_PATH
)/$(LIBRARY_NAME
).a
93 @
$(LD
) $(CFLAGS
) $(STATICLIBLDFLAGS
) $^
$(LOCALLDLIBS
) $(LDLIBS
) -o
$@
95 #$(BINARY_NAME).staticlocal: $(OBJS) $(LIBRARY_PATH)/$(LIBRARY_NAME).a
97 # @$(LD) $(CFLAGS) $(LDFLAGS) $^ $(LOCALLDLIBS) $(LDLIBS) -o $@
99 $(BINARY_NAME
).dynamic
: $(OBJS
) $(LIBRARY_PATH
)/$(LIBRARY_NAME
).so
101 @
$(LD
) $(CFLAGS
) $(LDFLAGS
) $^
$(LOCALLDLIBS
) $(LDLIBS
) -o
$@
103 $(OBJS
): $(SRCS
) $(DEPDIR
)/%.d
105 @
$(CC
) $(DEPFLAGS
) $(CFLAGS
) -c
$< -o
$@
108 include $(wildcard $(patsubst %,$(DEPDIR
)/%.d
,$(basename $(SRCS
))))
110 $(LIBOBJS
): $(LIBSRCS
) $(DEPDIR
)/%.d
112 @
$(CC
) $(DEPFLAGS
) $(CFLAGS
) -c
$< -o
$@
115 include $(wildcard $(patsubst %,$(DEPDIR
)/%.d
,$(basename $(LIBSRCS
))))
119 .PRECIOUS
: $(DEPDIR
)/%.d
125 -@
rm $(BINARY_NAME
).static
126 -@
rm $(BINARY_NAME
).dynamic
127 -@
rm $(LIBRARY_PATH
)/$(LIBRARY_NAME
).a
128 -@
rm $(LIBRARY_PATH
)/$(LIBRARY_NAME
).so
130 disassemble
: $(BINARY_NAME
)
133 symbols
: $(BINARY_NAME
)
134 objdump
-t
$< |
sort | less