ifeq (${DEBUG},y)
	DEBFLAGS = -O0 -g -ggdb -DDEBUG
	CONFIGURATION = debug
else
	DEBFLAGS = -O2 -DNDEBUG
	CONFIGURATION = release
endif

ARCH_CFLAGS_LINUX32 = -m32 -march=i486 -mtune=i486
ARCH_CFLAGS_LINUX64 = -m64 -march=nocona -mtune=generic
ARCH_CFLAGS_MAC = -Wno-deprecated-declarations -Wno-format-extra-args -arch x86_64
ARCH_CFLAGS_BSD32 = -m32 -march=i486 -mtune=i486
ARCH_CFLAGS_BSD64 = -m64 -march=nocona -mtune=generic

ARCH_LDFLAGS = -ldl -lpthread
ARCH_LDFLAGS_BSD = -lpthread

TARGET = CreateGOST34.10-2001-PINPad  CreateGOST34.10-2012-256-PINPad CreateGOST34.10-2012-512-PINPad
TARGET += DeleteGOST34.10-2001-PINPad DeleteGOST34.10-2012-256-PINPad DeleteGOST34.10-2012-512-PINPad
TARGET += JournalParse-PINPad Journal-PINPad SignGOST34.10-2001-PINPad SignGOST34.10-2012-256-PINPad SignGOST34.10-2012-512-PINPad
TARGET += SignAttrGOST34.10-2001-PINPad SignAttrGOST34.10-2012-256-PINPad SignAttrGOST34.10-2012-512-PINPad

SYS = $(shell ${CC} -dumpmachine)
ARCH = ${SYS}

ifneq (, ${CROSS})
	ARCH = ${CROSS}
endif

ifneq (, $(findstring linux, ${SYS}))
	ifneq (, $(findstring x86_64, ${ARCH}))
		ARCH_CFLAGS = ${ARCH_CFLAGS_LINUX64}
		PLATFORM = linux_glibc-x86_64
	else
		ARCH_CFLAGS = ${ARCH_CFLAGS_LINUX32}
		PLATFORM = linux_glibc-x86
	endif
endif

ifneq (, $(findstring freebsd, ${SYS}))
	ifneq (, $(findstring x86_64, ${ARCH}))
		ARCH_CFLAGS = ${ARCH_CFLAGS_BSD64}
		PLATFORM = freebsd-x86_64
	else
		ARCH_CFLAGS = ${ARCH_CFLAGS_BSD32}
		PLATFORM = freebsd-x86
	endif
	ARCH_LDFLAGS = ${ARCH_LDFLAGS_BSD}
endif

ifneq (, $(findstring darwin, ${SYS}))
	ARCH_CFLAGS = ${ARCH_CFLAGS_MAC}
	PLATFORM = macos-x86_64
endif

OUTDIR = ./../out/${PLATFORM}-${CONFIGURATION}

CFLAGS += -x c
CFLAGS += -Werror -Wall -Wextra -Wno-unused-parameter -Wno-unused-variable -Wno-unused-function
CFLAGS += -I./../../include -I./../include
CFLAGS += $(DEBFLAGS)
CFLAGS += $(ARCH_CFLAGS)

LDFLAGS += $(ARCH_LDFLAGS) -Wl,-rpath,\$$ORIGIN

CLEANFILES = ${TARGET}

.PHONY: ${TARGET}

all:	${TARGET}

CreateGOST34.10-2001-PINPad: CopyLib
	@mkdir -p ${OUTDIR}
	${CC} ${CFLAGS} -o ${OUTDIR}/$@  ./CreateGOST34.10-2001/*.c ${LDFLAGS}
CreateGOST34.10-2012-256-PINPad: CopyLib
	@mkdir -p ${OUTDIR}
	${CC} ${CFLAGS} -o ${OUTDIR}/$@  ./CreateGOST34.10-2012-256/*.c ${LDFLAGS}
CreateGOST34.10-2012-512-PINPad: CopyLib
	@mkdir -p ${OUTDIR}
	${CC} ${CFLAGS} -o ${OUTDIR}/$@  ./CreateGOST34.10-2012-512/*.c ${LDFLAGS}
DeleteGOST34.10-2001-PINPad: CopyLib
	@mkdir -p ${OUTDIR}
	${CC} ${CFLAGS} -o ${OUTDIR}/$@  ./DeleteGOST34.10-2001/*.c ${LDFLAGS}
DeleteGOST34.10-2012-256-PINPad: CopyLib
	@mkdir -p ${OUTDIR}
	${CC} ${CFLAGS} -o ${OUTDIR}/$@  ./DeleteGOST34.10-2012-256/*.c ${LDFLAGS}
DeleteGOST34.10-2012-512-PINPad: CopyLib
	@mkdir -p ${OUTDIR}
	${CC} ${CFLAGS} -o ${OUTDIR}/$@  ./DeleteGOST34.10-2012-512/*.c ${LDFLAGS}
JournalParse-PINPad: CopyLib
	@mkdir -p ${OUTDIR}
	${CC} ${CFLAGS} -o ${OUTDIR}/$@  ./JournalParse/*.c ${LDFLAGS}
Journal-PINPad: CopyLib
	@mkdir -p ${OUTDIR}
	${CC} ${CFLAGS} -o ${OUTDIR}/$@  ./Journal/*.c ${LDFLAGS}
SignGOST34.10-2001-PINPad: CopyLib
	@mkdir -p ${OUTDIR}
	${CC} ${CFLAGS} -o ${OUTDIR}/$@  ./SignGOST34.10-2001/*.c ${LDFLAGS}
SignGOST34.10-2012-256-PINPad: CopyLib
	@mkdir -p ${OUTDIR}
	${CC} ${CFLAGS} -o ${OUTDIR}/$@  ./SignGOST34.10-2012-256/*.c ${LDFLAGS}
SignGOST34.10-2012-512-PINPad: CopyLib
	@mkdir -p ${OUTDIR}
	${CC} ${CFLAGS} -o ${OUTDIR}/$@  ./SignGOST34.10-2012-512/*.c ${LDFLAGS}
SignAttrGOST34.10-2001-PINPad: CopyLib
	@mkdir -p ${OUTDIR}
	${CC} ${CFLAGS} -o ${OUTDIR}/$@  ./SignAttrGOST34.10-2001/*.c ${LDFLAGS}
SignAttrGOST34.10-2012-256-PINPad: CopyLib
	@mkdir -p ${OUTDIR}
	${CC} ${CFLAGS} -o ${OUTDIR}/$@  ./SignAttrGOST34.10-2012-256/*.c ${LDFLAGS}
SignAttrGOST34.10-2012-512-PINPad: CopyLib
	@mkdir -p ${OUTDIR}
	${CC} ${CFLAGS} -o ${OUTDIR}/$@  ./SignAttrGOST34.10-2012-512/*.c ${LDFLAGS}
CopyLib:
	@mkdir -p ${OUTDIR}
	cp -f ./../../lib/${PLATFORM}/librtpkcs11* ${OUTDIR}

clean:
	rm -r ${OUTDIR} || true