#
# Makefile for ADMXRC3 API shared library (Linux)
#
# (C) Copyright 2010-2016 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
#
# MAKE variables or environment variables recognized by this script:
#
#   BIARCH        - If value is yes, builds for bi-archtecture 64-bit system
#                  (i.e. both 32-bit and 64-bit binaries are created).
#   SYSROOT       - If specified, is the root of the target filesystem;
#                   typically used when cross-building.
#   CROSS_COMPILE - Prefix before tools, e.g. arm-linux-; typically used when
#                   cross-building. If cross-building, the target platform'script
#                   toolchain must be in the PATH.
#

include ../../../../driver/version.mak
-include .build_defs

VER	   = $(VERSION_0)
REL	   = $(VERSION_1).$(VERSION_2)
OBJDIR     = obj
OBJ32DIR   = obj32
TARGET     = libadmxrc3
TARGET_LIB_SO = $(TARGET).so.$(VER).$(REL)
TARGET_LIB_NO_VER = $(TARGET).so
TARGET_LIB_A = $(TARGET).a
OBJ = $(OBJDIR)/admxrc3.o $(OBJDIR)/admxrc3d.o $(OBJDIR)/combuf.o $(OBJDIR)/derror.o $(OBJDIR)/dmabus.o $(OBJDIR)/admxrc3_mmap.o $(OBJDIR)/admxrc3_platform.o $(OBJDIR)/portability.o
OBJ32 = $(OBJ32DIR)/admxrc3.o $(OBJ32DIR)/admxrc3d.o $(OBJ32DIR)/combuf.o $(OBJ32DIR)/derror.o $(OBJ32DIR)/dmabus.o $(OBJ32DIR)/admxrc3_mmap.o $(OBJ32DIR)/admxrc3_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 += -DADMXRC3_VERSION_0=$(VERSION_0)
CFLAGS += -DADMXRC3_VERSION_1=$(VERSION_1)
CFLAGS += -DADMXRC3_VERSION_2=$(VERSION_2)

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)

ifeq ($(BIARCH),yes)
	TARGETS += $(OBJ32DIR)/$(TARGET_LIB_SO) $(OBJ32DIR)/$(TARGET_LIB_A)
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)

#
# Building single architecture (typically 64-bit platform)
#

.PHONY: install dkms_install

install: $(OBJDIR)/$(TARGET_LIB_SO)
	../../../lib_install_helper.sh $(OBJDIR)/$(TARGET_LIB_SO) $(TARGET).so.$(VER) $(TARGET).so 0 $(SYSROOT)
ifeq ($(SYSROOT),)
	ldconfig
endif

dkms_install: install

$(OBJDIR)/$(TARGET_LIB_SO): $(OBJ)
	rm -f $(OBJDIR)/$(TARGET_LIB_SO)
	$(CROSS_COMPILE)$(CC) -shared -Wl,-soname,$(TARGET).so.$(VER) -o $(OBJDIR)/$(TARGET_LIB_SO) $(OBJ) $(LIBDEPS)
	(cd $(OBJDIR) && cp -f $(TARGET_LIB_SO) $(TARGET_LIB_NO_VER))

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

$(OBJDIR)/admxrc3.o: ../admxrc3.c ../ioctl_admxrc3.h admxrc3_platform.h $(INCLUDES)
	mkdir -p $(OBJDIR)
	$(CROSS_COMPILE)$(CC) -c $(CFLAGS) -o $@ ../admxrc3.c

$(OBJDIR)/admxrc3d.o: ../admxrc3d.c ../ioctl_admxrc3.h admxrc3_platform.h $(INCLUDES)
	mkdir -p $(OBJDIR)
	$(CROSS_COMPILE)$(CC) -c $(CFLAGS) -o $@ ../admxrc3d.c

$(OBJDIR)/combuf.o: ../combuf.c ../ioctl_admxrc3.h admxrc3_platform.h $(INCLUDES)
	mkdir -p $(OBJDIR)
	$(CROSS_COMPILE)$(CC) -c $(CFLAGS) -o $@ ../combuf.c

$(OBJDIR)/derror.o: ../derror.c ../ioctl_admxrc3.h admxrc3_platform.h $(INCLUDES)
	mkdir -p $(OBJDIR)
	$(CROSS_COMPILE)$(CC) -c $(CFLAGS) -o $@ ../derror.c

$(OBJDIR)/dmabus.o: ../dmabus.c ../ioctl_admxrc3.h admxrc3_platform.h $(INCLUDES)
	mkdir -p $(OBJDIR)
	$(CROSS_COMPILE)$(CC) -c $(CFLAGS) -o $@ ../dmabus.c

$(OBJDIR)/admxrc3_mmap.o: admxrc3_mmap.c admxrc3_platform.h $(INCLUDES)
	mkdir -p $(OBJDIR)
	$(CROSS_COMPILE)$(CC) -c $(CFLAGS) -o $@ admxrc3_mmap.c

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

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

else

#
# Building bi-arch (64-bit platform that can also run 32-bit binaries)
#

.PHONY: install dkms_install
install: $(OBJDIR)/$(TARGET_LIB_SO) $(OBJ32DIR)/$(TARGET_LIB_SO)
	../../../lib_install_helper.sh $(OBJDIR)/$(TARGET_LIB_SO) $(TARGET).so.$(VER) $(TARGET).so 0 $(SYSROOT)
	../../../lib_install_helper.sh $(OBJ32DIR)/$(TARGET_LIB_SO) $(TARGET).so.$(VER) $(TARGET).so 1 $(SYSROOT)
ifeq ($(SYSROOT),)
	ldconfig
endif

dkms_install: install

$(OBJDIR)/$(TARGET_LIB_SO): $(OBJ)
	rm -f $(OBJDIR)/$(TARGET_LIB_SO)
	$(CROSS_COMPILE)$(CC) -shared -Wl,-soname,$(TARGET).so.$(VER) -m64 -o $(OBJDIR)/$(TARGET_LIB_SO) $(OBJ) $(LIBDEPS)
	(cd $(OBJDIR) && cp -f $(TARGET_LIB_SO) $(TARGET_LIB_NO_VER))

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

$(OBJ32DIR)/$(TARGET_LIB_SO): $(OBJ32)
	rm -f $(OBJ32DIR)/$(TARGET_LIB_SO)
	$(CROSS_COMPILE)$(CC) -shared -Wl,-soname,$(TARGET).so.$(VER) -m32 -o $(OBJ32DIR)/$(TARGET_LIB_SO) $(OBJ32) $(LIBDEPS)
	(cd $(OBJ32DIR) && cp -f $(TARGET_LIB_SO) $(TARGET_LIB_NO_VER))

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

$(OBJDIR)/admxrc3.o: ../admxrc3.c ../ioctl_admxrc3.h admxrc3_platform.h $(INCLUDES)
	mkdir -p $(OBJDIR)
	$(CROSS_COMPILE)$(CC) -c $(CFLAGS) -m64 -o $@ ../admxrc3.c

$(OBJDIR)/admxrc3d.o: ../admxrc3d.c ../ioctl_admxrc3.h admxrc3_platform.h $(INCLUDES)
	mkdir -p $(OBJDIR)
	$(CROSS_COMPILE)$(CC) -c $(CFLAGS) -m64 -o $@ ../admxrc3d.c

$(OBJDIR)/combuf.o: ../combuf.c ../ioctl_admxrc3.h admxrc3_platform.h $(INCLUDES)
	mkdir -p $(OBJDIR)
	$(CROSS_COMPILE)$(CC) -c $(CFLAGS) -m64 -o $@ ../combuf.c

$(OBJDIR)/derror.o: ../derror.c ../ioctl_admxrc3.h admxrc3_platform.h $(INCLUDES)
	mkdir -p $(OBJDIR)
	$(CROSS_COMPILE)$(CC) -c $(CFLAGS) -m64 -o $@ ../derror.c

$(OBJDIR)/dmabus.o: ../dmabus.c ../ioctl_admxrc3.h admxrc3_platform.h $(INCLUDES)
	mkdir -p $(OBJDIR)
	$(CROSS_COMPILE)$(CC) -c $(CFLAGS) -m64 -o $@ ../dmabus.c

$(OBJDIR)/admxrc3_mmap.o: admxrc3_mmap.c admxrc3_platform.h $(INCLUDES)
	mkdir -p $(OBJDIR)
	$(CROSS_COMPILE)$(CC) -c $(CFLAGS) -m64 -o $@ admxrc3_mmap.c

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

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

$(OBJ32DIR)/admxrc3.o: ../admxrc3.c ../ioctl_admxrc3.h admxrc3_platform.h $(INCLUDES)
	mkdir -p $(OBJ32DIR)
	$(CROSS_COMPILE)$(CC) -c $(CFLAGS) -m32 -o $@ ../admxrc3.c

$(OBJ32DIR)/admxrc3d.o: ../admxrc3d.c ../ioctl_admxrc3.h admxrc3_platform.h $(INCLUDES)
	mkdir -p $(OBJ32DIR)
	$(CROSS_COMPILE)$(CC) -c $(CFLAGS) -m32 -o $@ ../admxrc3d.c

$(OBJ32DIR)/combuf.o: ../combuf.c ../ioctl_admxrc3.h admxrc3_platform.h $(INCLUDES)
	mkdir -p $(OBJ32DIR)
	$(CROSS_COMPILE)$(CC) -c $(CFLAGS) -m32 -o $@ ../combuf.c

$(OBJ32DIR)/derror.o: ../derror.c ../ioctl_admxrc3.h admxrc3_platform.h $(INCLUDES)
	mkdir -p $(OBJ32DIR)
	$(CROSS_COMPILE)$(CC) -c $(CFLAGS) -m32 -o $@ ../derror.c

$(OBJ32DIR)/dmabus.o: ../dmabus.c ../ioctl_admxrc3.h admxrc3_platform.h $(INCLUDES)
	mkdir -p $(OBJ32DIR)
	$(CROSS_COMPILE)$(CC) -c $(CFLAGS) -m32 -o $@ ../dmabus.c

$(OBJ32DIR)/admxrc3_mmap.o: admxrc3_mmap.c admxrc3_platform.h $(INCLUDES)
	mkdir -p $(OBJ32DIR)
	$(CROSS_COMPILE)$(CC) -c $(CFLAGS) -m32 -o $@ admxrc3_mmap.c

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

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

endif

# This requires root privileges
uninstall:
	../../../lib_uninstall_helper.sh $(TARGET) $(SYSROOT)
ifeq ($(SYSROOT),)
	ldconfig
endif

