#
# Makefile for ADMXRC2 API shared library (Linux)
#
# (C) Copyright 2013 Alpha Data
#
# Requires GNUMake.
#
# Available targets:
# ------------------
#
#   all      - builds shared library and static library
#   clean    - removes object files
#   install  - installs shared library (but NOT static library) in system
#              library directory and runs ldconfig.
#   tidy     - removes EMACS ~ backup files
#

include ../../../../driver/admxrc_version.mak

VER	   = 2
REL	   = $(VERSION_0).$(VERSION_1).$(VERSION_2)
OBJDIR     = obj
OBJ32DIR   = obj32
TARGET     = libadmxrc2
TARGET_LIB_SO = $(TARGET).so.$(VER).$(REL)
TARGET_LIB_A = $(TARGET).a
OBJ = $(OBJDIR)/admxrc2.o $(OBJDIR)/debugts.o $(OBJDIR)/admxrc2_mmap.o $(OBJDIR)/admxrc2_platform.o $(OBJDIR)/portability.o
OBJ32 = $(OBJ32DIR)/admxrc2.o $(OBJ32DIR)/debugts.o $(OBJ32DIR)/admxrc2_mmap.o $(OBJ32DIR)/admxrc2_platform.o $(OBJ32DIR)/portability.o
LIBDEPS = -lpthread -lc

CFLAGS  = -Wall -O6 -fPIC
CFLAGS += -Wstrict-prototypes -DLINUX
CFLAGS += -I../../../../include -I. -I../../../platform -I../../../platform/linux
CFLAGS += -DADMXRC2_VERSION_0=$(VERSION_0)
CFLAGS += -DADMXRC2_VERSION_1=$(VERSION_1)
CFLAGS += -DADMXRC2_VERSION_2=$(VERSION_2)
CFLAGS += -DADMXRC2_VERSION_3=$(VERSION_BUILD)

include .build_defs

ifdef SYSROOT
	CFLAGS += --sysroot $(SYSROOT)
	LDFLAGS += --sysroot $(SYSROOT)
endif

TARGETS_A = $(OBJDIR)/$(TARGET_LIB_A)
TARGETS_SO = $(OBJDIR)/$(TARGET_LIB_SO)
TARGETS = $(TARGETS_SO) $(TARGETS_A)

INSTALL = install_native
ifeq ($(BIARCH),yes)
	TARGETS += $(OBJ32DIR)/$(TARGET_LIB_SO) $(OBJ32DIR)/$(TARGET_LIB_A)
	INSTALL += install_compat
endif

INCLUDES = \
	../../../platform/linux/portability.h \
	../../../platform/portable_file.h \
	../../../platform/portable_string.h \
	../../../platform/portable_wstring.h

.PHONY: all clean tidy

all: $(TARGETS)

clean:
	rm -f $(OBJDIR)/*
	rm -f $(OBJ32DIR)/*

tidy:
	rm -f *~

ifneq ($(BIARCH),yes)

.PHONY: install
install: $(OBJDIR)/$(TARGET_LIB_SO)
	../../../lib_install_helper.sh $(OBJDIR)/$(TARGET_LIB_SO) $(TARGET).so.$(VER) $(TARGET).so $(SYSROOT)
	ldconfig -n $(INSTALL_PATH)

#
# Building single architecture (typically 32-bit platform)
#
$(OBJDIR)/$(TARGET_LIB_SO): $(OBJ)
	rm -f $(OBJDIR)/$(TARGET_LIB_SO)
	$(LD) -shared -soname $(TARGET).so.$(VER) -o $(OBJDIR)/$(TARGET_LIB_SO) $(OBJ) $(LIBDEPS)

$(OBJDIR)/$(TARGET_LIB_A): $(OBJ)
	rm -f $(OBJDIR)/$(TARGET_LIB_A)
	ar r $(OBJDIR)/$(TARGET_LIB_A) $(OBJ)

$(OBJDIR)/admxrc2.o: ../admxrc2.c ../ioctl_admxrc2.h admxrc2_platform.h $(INCLUDES)
	mkdir -p $(OBJDIR)
	$(CC) -c $(CFLAGS) -o $@ ../admxrc2.c

$(OBJDIR)/debugts.o: ../debugts.c ../ioctl_admxrc2.h admxrc2_platform.h $(INCLUDES)
	mkdir -p $(OBJDIR)
	$(CC) -c $(CFLAGS) -o $@ ../debugts.c

$(OBJDIR)/admxrc2_mmap.o: admxrc2_mmap.c admxrc2_platform.h $(INCLUDES)
	mkdir -p $(OBJDIR)
	$(CC) -c $(CFLAGS) -o $@ admxrc2_mmap.c

$(OBJDIR)/admxrc2_platform.o: admxrc2_platform.c admxrc2_platform.h ../../../platform/linux/ioctl_dflinux.h $(INCLUDES)
	mkdir -p $(OBJDIR)
	$(CC) -c $(CFLAGS) -o $@ admxrc2_platform.c

$(OBJDIR)/portability.o: ../../../platform/linux/portability.c $(INCLUDES)
	mkdir -p $(OBJDIR)
	$(CC) -c $(CFLAGS) -o $@ ../../../platform/linux/portability.c

else

#
# Building bi-arch (typically 64-bit platform)
#

.PHONY: install
install: $(OBJDIR)/$(TARGET_LIB_SO) $(OBJ32DIR)/$(TARGET_LIB_SO)
	../../../lib_install_helper.sh $(OBJDIR)/$(TARGET_LIB_SO) $(TARGET).so.$(VER) $(TARGET).so $(SYSROOT)
	../../../lib32_install_helper.sh $(OBJ32DIR)/$(TARGET_LIB_SO) $(TARGET).so.$(VER) $(TARGET).so $(SYSROOT)

$(OBJDIR)/$(TARGET_LIB_SO): $(OBJ)
	rm -f $(OBJDIR)/$(TARGET_LIB_SO)
	$(LD) -shared -soname $(TARGET).so.$(VER) -o $(OBJDIR)/$(TARGET_LIB_SO) -m$(ARCH64) $(OBJ) $(LIBDEPS)

$(OBJDIR)/$(TARGET_LIB_A): $(OBJ)
	rm -f $(OBJDIR)/$(TARGET_LIB_A)
	ar r $(OBJDIR)/$(TARGET_LIB_A) $(OBJ)

$(OBJ32DIR)/$(TARGET_LIB_SO): $(OBJ32)
	rm -f $(OBJ32DIR)/$(TARGET_LIB_SO)
	$(LD) -shared -soname $(TARGET).so.$(VER) -o $(OBJ32DIR)/$(TARGET_LIB_SO) -m$(ARCH32) $(OBJ32) $(LIBDEPS)

$(OBJ32DIR)/$(TARGET_LIB_A): $(OBJ32)
	rm -f $(OBJ32DIR)/$(TARGET_LIB_A)
	ar r $(OBJ32DIR)/$(TARGET_LIB_A) $(OBJ32)

$(OBJDIR)/admxrc2.o: ../admxrc2.c ../ioctl_admxrc2.h admxrc2_platform.h $(INCLUDES)
	mkdir -p $(OBJDIR)
	$(CC) -c $(CFLAGS) -m64 -o $@ ../admxrc2.c

$(OBJDIR)/debugts.o: ../debugts.c ../ioctl_admxrc2.h admxrc2_platform.h $(INCLUDES)
	mkdir -p $(OBJDIR)
	$(CC) -c $(CFLAGS) -m64 -o $@ ../debugts.c

$(OBJDIR)/admxrc2_mmap.o: admxrc2_mmap.c admxrc2_platform.h $(INCLUDES)
	mkdir -p $(OBJDIR)
	$(CC) -c $(CFLAGS) -m64 -o $@ admxrc2_mmap.c

$(OBJDIR)/admxrc2_platform.o: admxrc2_platform.c admxrc2_platform.h ../../../platform/linux/ioctl_dflinux.h $(INCLUDES)
	mkdir -p $(OBJDIR)
	$(CC) -c $(CFLAGS) -m64 -o $@ admxrc2_platform.c

$(OBJDIR)/portability.o: ../../../platform/linux/portability.c $(INCLUDES)
	mkdir -p $(OBJDIR)
	$(CC) -c $(CFLAGS) -m64 -o $@ ../../../platform/linux/portability.c

$(OBJ32DIR)/admxrc2.o: ../admxrc2.c ../ioctl_admxrc2.h admxrc2_platform.h $(INCLUDES)
	mkdir -p $(OBJ32DIR)
	$(CC) -c $(CFLAGS) -m32 -o $@ ../admxrc2.c

$(OBJ32DIR)/debugts.o: ../debugts.c ../ioctl_admxrc2.h admxrc2_platform.h $(INCLUDES)
	mkdir -p $(OBJ32DIR)
	$(CC) -c $(CFLAGS) -m32 -o $@ ../debugts.c

$(OBJ32DIR)/admxrc2_mmap.o: admxrc2_mmap.c admxrc2_platform.h $(INCLUDES)
	mkdir -p $(OBJ32DIR)
	$(CC) -c $(CFLAGS) -m32 -o $@ admxrc2_mmap.c

$(OBJ32DIR)/admxrc2_platform.o: admxrc2_platform.c admxrc2_platform.h ../../../platform/linux/ioctl_dflinux.h $(INCLUDES)
	mkdir -p $(OBJ32DIR)
	$(CC) -c $(CFLAGS) -m32 -o $@ admxrc2_platform.c

$(OBJ32DIR)/portability.o: ../../../platform/linux/portability.c $(INCLUDES)
	mkdir -p $(OBJ32DIR)
	$(CC) -c $(CFLAGS) -m32 -o $@ ../../../platform/linux/portability.c

endif
