API_VERSION ?= $(LIB_MAJOR_VERSION).$(LIB_MINOR_VERSION)

LIB_CFILES ?= $(wildcard *.c)
SYMBOL_PREFIX ?= $(PROJECT_NAME)
LIB_OBJS    += $(LIB_CFILES:.c=.o)
LIBNAME = lib$(PROJECT_NAME)
LIBEXT = so
LIB_TARGETS = $(LIBNAME).a $(LIBNAME).$(LIBEXT)
INSTALLED_HEADERS ?= *.h

LIB_CFLAGS += $(CFLAGS) 

LIB_CFLAGS += $(shell test "$(LIB_PKGMODULES)" 2>/dev/null && pkg-config $(LIB_PKGMODULES) --cflags)
LIB_LD_FLAGS += $(shell test "$(LIB_PKGMODULES)" 2>/dev/null && pkg-config $(LIB_PKGMODULES) --libs | sed 's/-Wl,--export-dynamic//' | sed 's/-pthread//')

LIBNAME_A=$(LIBNAME).a

$(LIBNAME).a: $(LIB_OBJS)
	@echo "  AR" $@;ar rcs $@ $(LIB_OBJS)

CLEAN_FILES += symbols

symbols: Makefile $(LIB_OBJS)
	@echo " gen" $@;  nm -a $(LIB_OBJS) | grep " T " | cut -f 3 -d ' ' | grep "^$(SYMBOL_PREFIX)" | grep -v "^_" | sort > $@

$(LIBNAME).$(LIBEXT): $(LIB_OBJS) symbols
	@echo "  LD" $@;$(CC) --shared $(LIB_OBJS) -o $@ $(LIB_LD_FLAGS)

# this rule is generic and could also belong with bin..
# we try to be overly generic and throw in the cflags of both lib and bin..
%.o: %.c *.h $(LIB_HFILES)
	@echo "  CC" $@;$(CC) $(SYSROOT) -c $(LIB_CFLAGS) $< -o $@

lib/%.o: lib/%.c lib/*.h $(LIB_HFILES)
	@echo "  CC" $@;$(CC) $(SYSROOT) -c $(LIB_CFLAGS) $< -o $@

LIBDIR ?= $(PREFIX)/lib
#$(P64)

all: $(LIB_TARGETS)
CLEAN_FILES += $(LIB_TARGETS) $(LIB_OBJS)
install: _install_lib
uninstall: _uninstall_lib
_uninstall_lib:
	rm -f $(DESTDIR)$(LIBDIR)/$(LIBNAME).$(LIBEXT)
	rm -f $(DESTDIR)$(LIBDIR)/$(LIBNAME).a
	rm -f $(DESTDIR)$(LIBDIR)/pkgconfig/$(PROJECT_NAME).pc
	rm -rf $(DESTDIR)$(PREFIX)/include/$(PROJECT_NAME)
_install_lib: buildapi-install-runtime buildapi-install-devel
	
buildapi-install-runtime: $(LIB_TARGETS)
	install -d $(DESTDIR)$(LIBDIR)
	install $(LIBNAME).$(LIBEXT) $(DESTDIR)$(LIBDIR)
	install $(LIBNAME).a $(DESTDIR)$(LIBDIR)
	install -d $(DESTDIR)$(LIBDIR)/pkgconfig
	@ldconfig 2> /dev/null || true
buildapi-install-devel: $(PROJECT_NAME).pc
	install -d $(DESTDIR)$(LIBDIR)/pkgconfig
	install $(PROJECT_NAME).pc $(DESTDIR)$(LIBDIR)/pkgconfig
	install -d $(DESTDIR)$(PREFIX)/include/$(PROJECT_NAME)
	install $(INSTALLED_HEADERS) $(DESTDIR)$(PREFIX)/include/$(PROJECT_NAME)


# ############ examples ################
#  the examples target do nothing if there is no examples subfolder

EXAMPLES_CFILES ?= $(wildcard examples/*.c)
EXAMPLES_BINS    = $(EXAMPLES_CFILES:.c=)

EXAMPLES_CFLAGS += -I.. -Ilib $(shell test "$(EXAMPLES_PKGMODULES)" 2>/dev/null && pkg-config $(EXAMPLES_PKGMODULES) --cflags)
EXAMPLES_LD_FLAGS += $(shell test "$(EXAMPLES_PKGMODULES)" 2>/dev/null && pkg-config $(EXAMPLES_PKGMODULES) --libs | sed 's/-Wl,--export-dynamic//' | sed 's/-pthread//')

examples/%: examples/%.c $(LIBNAME).a
	@echo "CCLD" $@; $(CC) -I.. -I. $(EXAMPLES_CFLAGS) $(LIB_CFLAGS) $(LIB_LD_FLAGS) $(EXAMPLES_LD_FLAGS) $< $(LIBNAME).a -o $@


all: $(EXAMPLES_BINS)
CLEAN_FILES += $(EXAMPLES_BINS)
help: _libhelp
_libhelp:
	@echo "$(LIBNAME).$(LIBEXT) dynamic shared library"
	@echo "$(LIBNAME).a         static library"
