README.md: x86-32/64 support
[centaur.git] / Makefile
index df5f59fc4e95f672bdfc7ba4ca52ea4433d5b21f..5dbb7287d381368a36b4468f00b453a26cfc9af1 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,46 +1,91 @@
-PROJ := elfedit
+LIBNAME := elfu
+EXENAME := elfucli
 
 BUILDDIR   := build
 INCLUDEDIR := include
 SRCDIR     := src
 
-EXE     := $(BUILDDIR)/$(PROJ)
+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")
 
-SOURCES := $(shell find $(SRCDIR)/ -iname "*.c")
-OBJS    := $(patsubst %.c, $(BUILDDIR)/%.o, $(SOURCES))
+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)
+
 
-INCLUDES := $(patsubst %, -I%, $(INCLUDEDIR) $(SRCDIR)) -I /usr/include/libelf
-CFLAGS   := -g -Wall
-LDFLAGS  := -lelf
 
 
+.PHONY: all
+all: $(STATICLIB) $(SHAREDLIB) $(EXE)
 
-.PHONY: default
-default: $(EXE)
 
+.PHONY: check
+check: $(EXE)
+       make -C tests check
 
 
-$(EXE): $(OBJS)
-       @if [ ! -d $(BUILDDIR) ] ; then echo "Error: Build dir '$(BUILDDIR)' does not exist." ; false ; fi
-       gcc $(LDFLAGS) -o $@ $^
+.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: docs
+docs: doxygen-doc
+
+.PHONY: doxygen-doc
+doxygen-doc:
+       mkdir -p docs
+       doxygen
+
+
 .PHONY: clean
 clean:
-       rm -f $(STATICLIB)
-       rm -f $(OBJS)
-       rm -f $(TESTEXES)
        rm -rf $(BUILDDIR)/
+       make -C tests clean
 
 
 .PHONY: distclean
 distclean: clean
        find . -xdev -name "*~" -exec rm {} \;
        find . -xdev -name "core" -exec rm {} \;
+       rm -rf docs/doxygen/