include ../buildconf.mk

CFLAGS := -Wall -g -fPIC -fstack-protector -fstack-protector-all -pthread -Wno-unused-variable -Wno-unused-but-set-variable
INC := $(INC) -I$(BUILD_LIBVDEV_HEADERS)
DEFS := $(DEFS) -D_POSIX_C_SOURCE=200809L -D_DEFAULT_SOURCE -D_GNU_SOURCE
CC   := cc

C_SRCS:= $(wildcard *.c)

HEADERS := $(wildcard *.h)
OBJ := $(patsubst %.c,$(BUILD_LIBVDEV)/%.o,$(C_SRCS))
LIB :=

VERSION_MAJOR := 1
VERSION_MINOR := 0
VERSION_PATCH := 0

LIBVDEV := $(BUILD_LIBVDEV)/libvdev.so
LIBVDEV_SONAME := libvdev.so.$(VERSION_MAJOR)
LIBVDEV_LIB := $(BUILD_LIBVDEV)/libvdev.so.$(VERSION_MAJOR).$(VERSION_MINOR).$(VERSION_PATCH)

LIBVDEV_FILES := $(LIBVDEV) $(BUILD_LIBVDEV)/$(LIBVDEV_SONAME) $(LIBVDEV_LIB)

LIBVDEV_HEADERS := $(patsubst %.h,$(BUILD_LIBVDEV_HEADERS)/%.h,$(HEADERS))

LIBVDEV_INSTALL_HEADERS := $(patsubst $(BUILD_LIBVDEV_HEADERS)/%,$(INSTALL_LIBVDEV_HEADERS)/%,$(LIBVDEV_HEADERS))

LIBVDEV_FILES_INSTALL := $(patsubst $(BUILD_LIBVDEV)/%,$(INSTALL_LIBVDEV)/%,$(LIBVDEV_FILES))

LIBVDEV_HEADERS_INSTALL := $(patsubst $(BUILD_LIBVDEV_HEADERS)/%.h,$(INSTALL_LIBVDEV_HEADERS)/%.h,$(LIBVDEV_INSTALL_HEADERS))

LIBVDEV_PC_IN := libvdev.pc.in
BUILD_LIBVDEV_PC := $(BUILD_PKGCONFIG)/libvdev.pc
INSTALL_LIBVDEV_PC := $(DESTDIR)$(PKGCONFIG)/libvdev.pc

all: $(LIBVDEV_FILES) $(LIBVDEV_HEADERS) $(BUILD_LIBVDEV_PC)

$(LIBVDEV_LIB): $(OBJ)
	@mkdir -p "$(shell dirname "$@")"
	$(CC) $(CFLAGS) $(INC) $(DEFS) -shared -Wl,-soname,$(LIBVDEV_SONAME) -o "$@" $(OBJ) $(LIBINC) $(LIB)

$(BUILD_LIBVDEV)/$(LIBVDEV_SONAME): $(LIBVDEV_LIB)
	@mkdir -p "$(shell dirname "$@")"
	@ln -sf "$(shell basename "$<")" "$@"

$(LIBVDEV): $(BUILD_LIBVDEV)/$(LIBVDEV_SONAME)
	@mkdir -p "$(shell dirname "$@")"
	@ln -sf "$(shell basename "$<")" "$@"

$(BUILD_LIBVDEV_HEADERS)/%.h: %.h
	@mkdir -p "$(shell dirname "$@")"
	cp -a "$<" "$@"

$(BUILD_LIBVDEV)/%.o: %.c $(LIBVDEV_HEADERS)
	@mkdir -p "$(shell dirname "$@")"
	$(CC) $(CFLAGS) $(INC) $(DEFS) -o "$@" -c "$<"

$(BUILD_LIBVDEV_PC): $(LIBVDEV_PC_IN)
	@mkdir -p "$(shell dirname "$@")"
	@cat "$<" | \
		sed -e 's~@prefix@~/$(PREFIX)~g; ' \
			 -e 's~//~/~g; ' \
			 -e 's~@libdir@~$(LIBDIR)~g; ' \
			 -e 's~@includedir@~$(INCLUDEDIR)~g; ' \
			 -e 's~@VERSION@~$(LIBUDEV_VERSION)~g; ' > "$@"

install: $(LIBVDEV_FILES_INSTALL) $(LIBVDEV_HEADERS_INSTALL) $(INSTALL_LIBVDEV_PC)

$(INSTALL_LIBVDEV)/%: $(BUILD_LIBVDEV)/%
	@mkdir -p "$(shell dirname "$@")"
	@rm -f "$@"
	cp -a "$<" "$@"
	SO_EXISTS="$(shell test -L $(BUILD_LIBVDEV)/libvdev.so && echo 1 || echo 0)"
ifeq ($(SO_EXISTS), 0)
	cp -as --preserve=links $(BUILD_LIBVDEV)/libvdev.so $(INSTALL_LIBVDEV)
endif	

$(INSTALL_LIBVDEV_HEADERS)/%.h: $(BUILD_LIBVDEV_HEADERS)/%.h
	@mkdir -p "$(shell dirname "$@")"
	cp -a "$<" "$@"

$(INSTALL_LIBVDEV_PC): $(BUILD_LIBVDEV_PC)
	@mkdir -p "$(shell dirname "$@")"
	cp -a "$<" "$@"

.PHONY: uninstall
uninstall:
	rm -f $(LIBVDEV_FILES_INSTALL) $(LIBVDEV_HEADERS_INSTALL) $(INSTALL_LIBVDEV_PC) $(DESTDIR)$(LIBDIR)/libvdev.so

.PHONY: clean
clean:
	rm -f $(LIBVDEV_FILES) $(LIBVDEV_HEADERS) $(OBJ) $(BUILD_LIBVDEV_PC) $(LIBVDEV)

.SILENT: print_version_major
print_version_major:
	@echo $(VERSION_MAJOR)
