summaryrefslogtreecommitdiff
path: root/Makefile
blob: c027c3645a06e5b42a335297fd8f29d4524130b5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
LIBNAME := elfu
EXENAME := elfucli

BUILDDIR   := build
INCLUDEDIR := include
SRCDIR     := src

EXE       := $(BUILDDIR)/$(EXENAME)
STATICLIB := $(BUILDDIR)/lib$(LIBNAME).a

SHARED_VERMAJ := 0
SHARED_VERMIN := 0
SHARED_VERREV := 0
SHAREDLIB     := $(BUILDDIR)/lib$(LIBNAME).so.$(SHARED_VERMAJ).$(SHARED_VERMIN).$(SHARED_VERREV)

HEADERS := $(shell find $(INCLUDEDIR)/ -iname "*.h")
HEADERS += $(shell find $(SRCDIR)/ -iname "*.h")

ALLSRCS := $(shell find $(SRCDIR)/ -iname "*.c")
LIBSRCS := $(filter $(SRCDIR)/lib$(LIBNAME)/%.c, $(ALLSRCS))
EXESRCS := $(filter-out $(SRCDIR)/lib$(LIBNAME)/%.c, $(ALLSRCS))
LIBOBJS := $(patsubst %.c, $(BUILDDIR)/%.o, $(LIBSRCS))
EXEOBJS := $(patsubst %.c, $(BUILDDIR)/%.o, $(EXESRCS))


ifeq ($(shell pkg-config --exists libelf > /dev/null 2> /dev/null ; echo $$?),0)
	LIBELF_INCLUDES := $(shell pkg-config --cflags-only-I libelf)
	LIBELF_CFLAGS   := $(shell pkg-config --cflags-only-other libelf)
	LIBELF_LDFLAGS  := $(shell pkg-config --libs libelf)
else
	LIBELF_INCLUDES :=
	LIBELF_CFLAGS   :=
	LIBELF_LDFLAGS  := -lelf
endif


INCLUDES := $(patsubst %, -I%, $(INCLUDEDIR) $(SRCDIR)) $(LIBELF_INCLUDES)
CFLAGS   := -g -Wall -std=gnu99 -pedantic $(LIBELF_CFLAGS)
LDFLAGS  := $(LIBELF_LDFLAGS)




.PHONY: all
all: $(STATICLIB) $(SHAREDLIB) $(EXE)


.PHONY: check
check: $(EXE)
	make -C tests check


.PHONY: debug
debug: $(EXE)
	gdb $(EXE) $(shell ps -e | sed "s/^ *\([0-9]\+\) .*$(EXENAME).*$$/\1/g;te;d;:e")


$(EXE): $(EXEOBJS) $(STATICLIB)
	gcc -o $@ $^ $(LDFLAGS)

$(SHAREDLIB): $(LIBSRCS)
	gcc $(INCLUDES) $(CFLAGS) -shared -fPIC -Wl,-soname,lib$(LIBNAME).so.$(SHARED_VERMAJ) -o $@ $^ $(LDFLAGS)

$(STATICLIB): $(LIBOBJS)
	ar rcs $@ $^

$(BUILDDIR)/$(SRCDIR)/%.o: $(SRCDIR)/%.c $(HEADERS)
	@if [ ! -d $(dir $@) ] ; then mkdir -p $(dir $@) ; fi
	gcc $(INCLUDES) $(CFLAGS) -c -o $@ $<


.PHONY: clean
clean:
	rm -rf $(BUILDDIR)/
	make -C tests clean


.PHONY: distclean
distclean: clean
	find . -xdev -name "*~" -exec rm {} \;
	find . -xdev -name "core" -exec rm {} \;