# makefile для сборки примера с помощью компиляторов mingw (под Windows)
# или GCC (под Linux). Необходимо определить 3 переменные:
#
# CC                      - имя команды для вызова компилятора
# X502API_LIBRARIES_DIR   - путь к файлм .a или .so библиотек l502api, e502api, x502api (если не стандартный)
# X502API_INCLUDE_DIR     - путь к заголовочным файлам l502api.h, e502api.h, x502api.h
#
# Ниже приведено несколько примеров в закоментированном виде

#--- Linux с заголовками и библиотекой в стандартных директориях: компилятор GCC
#CC = gcc

#--- Вариант запуска из MSYS со стандартным 32-битным mingw 
#CC = gcc
#X502API_LIBRARIES_DIR = "/c/Program Files/L-Card/lpcie/lib/mingw"
#X502API_INCLUDE_DIR = "/c/Program Files/L-Card/lpcie/include"


#---  64-битный вариант mingw w64, идущий вместе с cygwin  --------
#CC = x86_64-w64-mingw32-gcc
#X502API_LIBRARIES_DIR = "/cygdrive/c/Program Files (x86)/L-Card/lpcie/lib/mingw64"
#X502API_INCLUDE_DIR = "/cygdrive/c/Program Files (x86)/L-Card/lpcie/include"

#---  32-битный вариант mingw w64, идущий вместе с cygwin  --------
#CC = i686-w64-mingw32-gcc
#X502API_LIBRARIES_DIR = "/cygdrive/c/Program Files (x86)/L-Card/lpcie/lib/mingw"
#X502API_INCLUDE_DIR = "/cygdrive/c/Program Files (x86)/L-Card/lpcie/include"

#---  32-битный вариант mingw, идущий вместе с cygwin  --------
#CC = i686-pc-mingw32-gcc
#X502API_LIBRARIES_DIR = "/cygdrive/c/Program Files (x86)/L-Card/lpcie/lib/mingw"
#X502API_INCLUDE_DIR = "/cygdrive/c/Program Files (x86)/L-Card/lpcie/include"


CC ?= gcc
CFLAGS ?= -O2 -g
BUILD_DIR ?= build

X502API_ROOT := lib/x502api-1.1.34
X502_SRC_DIR := $(X502API_ROOT)/src
L502_SRC_DIR := $(X502API_ROOT)/devs/l502
E502_SRC_DIR := $(X502API_ROOT)/devs/e502
OSSPEC_DIR   := $(X502API_ROOT)/lib/osspec
LTIMER_DIR   := $(X502API_ROOT)/lib/ltimer
LCSPEC_DIR   := $(X502API_ROOT)/lib/lcspec
CRC_DIR      := $(X502API_ROOT)/lib/crc
LCSPEC_COMPILER ?= gcc
LTIMER_PORT  := linux

INCLUDES := \
	-I$(X502_SRC_DIR) \
	-I$(L502_SRC_DIR) \
	-I$(E502_SRC_DIR) \
	-I$(OSSPEC_DIR) \
	-I$(LTIMER_DIR) \
	-I$(LTIMER_DIR)/ports/$(LTIMER_PORT) \
	-I$(LCSPEC_DIR) \
	-I$(LCSPEC_DIR)/$(LCSPEC_COMPILER) \
	-I$(CRC_DIR) \
	-Ilib

DEFINES := -DOSSPEC_USE_MUTEX -DOSSPEC_USE_EVENTS -DOSSPEC_USE_THREADS \
	-DX502API_VER_MAJOR=1 -DX502API_VER_MINOR=1 -DX502API_VER_PATCH=34 \
	-DENABLE_USB

X502_SRCS := \
	x502api.c \
	x502api_streams.c \
	x502api_async.c \
	x502api_bf.c \
	x502api_config.c \
	x502api_eeprom.c \
	x502api_errs.c

L502_SRCS := \
	l502api.c \
	l502api_compat.c \
	l502api_eeprom.c \
	l502api_bf.c \
	linux/l502_spec.c

E502_SRCS := \
	e502api.c \
	e502api_usb.c \
	e502api_tcp.c \
	e502api_dnssd.c \
	e502api_eth_config.c

OSSPEC_SRCS := $(OSSPEC_DIR)/osspec.c
LTIMER_SRCS := $(LTIMER_DIR)/ports/$(LTIMER_PORT)/lclock.c
CRC_SRCS := $(CRC_DIR)/fast_crc.c

SRCS := \
	main.c \
	$(addprefix $(X502_SRC_DIR)/,$(X502_SRCS)) \
	$(addprefix $(L502_SRC_DIR)/,$(L502_SRCS)) \
	$(addprefix $(E502_SRC_DIR)/,$(E502_SRCS)) \
	$(OSSPEC_SRCS) \
	$(LTIMER_SRCS) \
	$(CRC_SRCS)

OBJS := $(addprefix $(BUILD_DIR)/,$(SRCS:.c=.o))

$(BUILD_DIR)/%.o: %.c
	@mkdir -p $(dir $@)
	$(CC) $(CFLAGS) $(DEFINES) $(INCLUDES) -c $< -o $@

all: BF_companion

BF_companion: $(OBJS)
	$(CC) $(CFLAGS) $^ -lpthread -lusb-1.0 -lm -o $@

clean:
	rm -rf $(BUILD_DIR) BF_companion
