Separate library code, build .a/.so
[centaur.git] / Makefile
1 LIBNAME := elfu
2 EXENAME := elfucli
3
4 LIBRARIES := libelf
5
6 BUILDDIR   := build
7 INCLUDEDIR := include
8 SRCDIR     := src
9
10 EXE       := $(BUILDDIR)/$(EXENAME)
11 STATICLIB := $(BUILDDIR)/lib$(LIBNAME).a
12
13 SHARED_VERMAJ := 0
14 SHARED_VERMIN := 0
15 SHARED_VERREV := 0
16 SHAREDLIB     := $(BUILDDIR)/lib$(LIBNAME).so.$(SHARED_VERMAJ).$(SHARED_VERMIN).$(SHARED_VERREV)
17
18 HEADERS := $(shell find $(INCLUDEDIR)/ -iname "*.h")
19 HEADERS += $(shell find $(SRCDIR)/ -iname "*.h")
20
21 ALLSRCS := $(shell find $(SRCDIR)/ -iname "*.c")
22 LIBSRCS := $(filter $(SRCDIR)/lib$(LIBNAME)/%.c, $(ALLSRCS))
23 EXESRCS := $(filter-out $(SRCDIR)/lib$(LIBNAME)/%.c, $(ALLSRCS))
24 LIBOBJS := $(patsubst %.c, $(BUILDDIR)/%.o, $(LIBSRCS))
25 EXEOBJS := $(patsubst %.c, $(BUILDDIR)/%.o, $(EXESRCS))
26
27 INCLUDES := $(patsubst %, -I%, $(INCLUDEDIR) $(SRCDIR)) $(shell pkg-config --cflags-only-I $(LIBRARIES))
28 CFLAGS   := -g -Wall -pedantic -Wno-variadic-macros -fPIC $(shell pkg-config --cflags-only-other $(LIBRARIES))
29 LDFLAGS  := $(shell pkg-config --libs $(LIBRARIES))
30
31
32
33 .PHONY: all
34 all: $(STATICLIB) $(SHAREDLIB) $(EXE)
35
36
37 .PHONY: check
38 check: $(EXE)
39         make -C tests check
40
41
42 .PHONY: debug
43 debug: $(EXE)
44         gdb $(EXE) $(shell ps -e | sed "s/^ *\([0-9]\+\) .*$(EXENAME).*$$/\1/g;te;d;:e")
45
46
47 $(EXE): $(EXEOBJS) $(STATICLIB)
48         gcc -o $@ $^ $(LDFLAGS)
49
50 $(SHAREDLIB): $(LIBOBJS)
51         gcc -shared -Wl,-soname,lib$(LIBNAME).so.$(SHARED_VERMAJ) -o $@ $^ $(LDFLAGS)
52
53 $(STATICLIB): $(LIBOBJS)
54         ar rcs $@ $^
55
56 $(BUILDDIR)/$(SRCDIR)/%.o: $(SRCDIR)/%.c $(HEADERS)
57         @if [ ! -d $(dir $@) ] ; then mkdir -p $(dir $@) ; fi
58         gcc $(INCLUDES) $(CFLAGS) -c -o $@ $<
59
60
61 .PHONY: clean
62 clean:
63         rm -rf $(BUILDDIR)/
64         make -C tests clean
65
66
67 .PHONY: distclean
68 distclean: clean
69         find . -xdev -name "*~" -exec rm {} \;
70         find . -xdev -name "core" -exec rm {} \;