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 = CreateGOST28147-89 CreateGOST34.10-2001 CreateGOST34.10-2012-256 CreateGOST34.10-2012-512 CreateRSA
TARGET += DeleteGOST28147-89 DeleteGOST34.10-2001 DeleteGOST34.10-2012-256 DeleteGOST34.10-2012-512 DeleteRSA
TARGET += VKO-GOST34.10-2001 VKO-GOST34.10-2012-256 VKO-GOST34.10-2012-512 EncDecRSA
TARGET += EncDecGOST28147-89 EncDecGOST28147-89-CBC EncDecGOST28147-89-Stream
TARGET += HashGOST34.11-94 HashGOST34.11-2012-512
TARGET += SignVerifyGOST28147-89-MAC SignVerifyGOST34.11-94-HMAC
TARGET += Info InitToken SignVerifyGOST34.10-2001 SignVerifyGOST34.10-2012-256 SignVerifyGOST34.10-2012-512 SignVerifyRSA
TARGET += SignGOST34.10-2001WithInternalHash SignGOST34.10-2012-256WithInternalHash SignGOST34.10-2012-512WithInternalHash
TARGET += WaitForSlotEvent

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}

CreateGOST28147-89: CopyLib
	@mkdir -p ${OUTDIR}
	${CC} ${CFLAGS} -o ${OUTDIR}/$@  ./CreateGOST28147-89/*.c ${LDFLAGS}
CreateGOST34.10-2001: CopyLib
	@mkdir -p ${OUTDIR}
	${CC} ${CFLAGS} -o ${OUTDIR}/$@  ./CreateGOST34.10-2001/*.c ${LDFLAGS}
CreateGOST34.10-2012-256: CopyLib
	@mkdir -p ${OUTDIR}
	${CC} ${CFLAGS} -o ${OUTDIR}/$@  ./CreateGOST34.10-2012-256/*.c ${LDFLAGS}
CreateGOST34.10-2012-512: CopyLib
	@mkdir -p ${OUTDIR}
	${CC} ${CFLAGS} -o ${OUTDIR}/$@  ./CreateGOST34.10-2012-512/*.c ${LDFLAGS}
CreateRSA: CopyLib
	@mkdir -p ${OUTDIR}
	${CC} ${CFLAGS} -o ${OUTDIR}/$@  ./CreateRSA/*.c ${LDFLAGS}
DeleteGOST28147-89: CopyLib
	@mkdir -p ${OUTDIR}
	${CC} ${CFLAGS} -o ${OUTDIR}/$@  ./DeleteGOST28147-89/*.c ${LDFLAGS}
DeleteGOST34.10-2001: CopyLib
	@mkdir -p ${OUTDIR}
	${CC} ${CFLAGS} -o ${OUTDIR}/$@  ./DeleteGOST34.10-2001/*.c ${LDFLAGS}
DeleteGOST34.10-2012-256: CopyLib
	@mkdir -p ${OUTDIR}
	${CC} ${CFLAGS} -o ${OUTDIR}/$@  ./DeleteGOST34.10-2012-256/*.c ${LDFLAGS}
DeleteGOST34.10-2012-512: CopyLib
	@mkdir -p ${OUTDIR}
	${CC} ${CFLAGS} -o ${OUTDIR}/$@  ./DeleteGOST34.10-2012-512/*.c ${LDFLAGS}
DeleteRSA: CopyLib
	@mkdir -p ${OUTDIR}
	${CC} ${CFLAGS} -o ${OUTDIR}/$@  ./DeleteRSA/*.c ${LDFLAGS}
VKO-GOST34.10-2001: CopyLib
	@mkdir -p ${OUTDIR}
	${CC} ${CFLAGS} -o ${OUTDIR}/$@  ./VKO-GOST34.10-2001/*.c ${LDFLAGS}
VKO-GOST34.10-2012-256: CopyLib
	@mkdir -p ${OUTDIR}
	${CC} ${CFLAGS} -o ${OUTDIR}/$@  ./VKO-GOST34.10-2012-256/*.c ${LDFLAGS}
VKO-GOST34.10-2012-512: CopyLib
	@mkdir -p ${OUTDIR}
	${CC} ${CFLAGS} -o ${OUTDIR}/$@  ./VKO-GOST34.10-2012-512/*.c ${LDFLAGS}
EncDecGOST28147-89: CopyLib
	@mkdir -p ${OUTDIR}
	${CC} ${CFLAGS} -o ${OUTDIR}/$@  ./EncDecGOST28147-89/*.c ${LDFLAGS}
EncDecGOST28147-89-CBC: CopyLib
	@mkdir -p ${OUTDIR}
	${CC} ${CFLAGS} -o ${OUTDIR}/$@  ./EncDecGOST28147-89-CBC/*.c ${LDFLAGS}
EncDecGOST28147-89-Stream: CopyLib
	@mkdir -p ${OUTDIR}
	${CC} ${CFLAGS} -o ${OUTDIR}/$@  ./EncDecGOST28147-89-Stream/*.c ${LDFLAGS}
EncDecRSA: CopyLib
	@mkdir -p ${OUTDIR}
	${CC} ${CFLAGS} -o ${OUTDIR}/$@  ./EncDecRSA/*.c ${LDFLAGS}
HashGOST34.11-94: CopyLib
	@mkdir -p ${OUTDIR}
	${CC} ${CFLAGS} -o ${OUTDIR}/$@  ./HashGOST34.11-94/*.c ${LDFLAGS}
HashGOST34.11-2012-512: CopyLib
	@mkdir -p ${OUTDIR}
	${CC} ${CFLAGS} -o ${OUTDIR}/$@  ./HashGOST34.11-2012-512/*.c ${LDFLAGS}
Info: CopyLib
	@mkdir -p ${OUTDIR}
	${CC} ${CFLAGS} -o ${OUTDIR}/$@  ./Info/*.c ${LDFLAGS}
InitToken: CopyLib
	@mkdir -p ${OUTDIR}
	${CC} ${CFLAGS} -o ${OUTDIR}/$@  ./InitToken/*.c ${LDFLAGS}
SignVerifyGOST28147-89-MAC: CopyLib
	@mkdir -p ${OUTDIR}
	${CC} ${CFLAGS} -o ${OUTDIR}/$@  ./SignVerifyGOST28147-89-MAC/*.c ${LDFLAGS}
SignVerifyGOST34.11-94-HMAC: CopyLib
	@mkdir -p ${OUTDIR}
	${CC} ${CFLAGS} -o ${OUTDIR}/$@  ./SignVerifyGOST34.11-94-HMAC/*.c ${LDFLAGS}
SignVerifyGOST34.10-2001: CopyLib
	@mkdir -p ${OUTDIR}
	${CC} ${CFLAGS} -o ${OUTDIR}/$@  ./SignVerifyGOST34.10-2001/*.c ${LDFLAGS}
SignVerifyGOST34.10-2012-256: CopyLib
	@mkdir -p ${OUTDIR}
	${CC} ${CFLAGS} -o ${OUTDIR}/$@  ./SignVerifyGOST34.10-2012-256/*.c ${LDFLAGS}
SignVerifyGOST34.10-2012-512: CopyLib
	@mkdir -p ${OUTDIR}
	${CC} ${CFLAGS} -o ${OUTDIR}/$@  ./SignVerifyGOST34.10-2012-512/*.c ${LDFLAGS}
SignVerifyRSA: CopyLib
	@mkdir -p ${OUTDIR}
	${CC} ${CFLAGS} -o ${OUTDIR}/$@  ./SignVerifyRSA/*.c ${LDFLAGS}
SignGOST34.10-2001WithInternalHash: CopyLib
	@mkdir -p ${OUTDIR}
	${CC} ${CFLAGS} -o ${OUTDIR}/$@  ./SignGOST34.10-2001WithInternalHash/*.c ${LDFLAGS}
SignGOST34.10-2012-256WithInternalHash: CopyLib
	@mkdir -p ${OUTDIR}
	${CC} ${CFLAGS} -o ${OUTDIR}/$@  ./SignGOST34.10-2012-256WithInternalHash/*.c ${LDFLAGS}
SignGOST34.10-2012-512WithInternalHash: CopyLib
	@mkdir -p ${OUTDIR}
	${CC} ${CFLAGS} -o ${OUTDIR}/$@  ./SignGOST34.10-2012-512WithInternalHash/*.c ${LDFLAGS}
WaitForSlotEvent: CopyLib
	@mkdir -p ${OUTDIR}
	${CC} ${CFLAGS} -o ${OUTDIR}/$@  ./WaitForSlotEvent/*.c ${LDFLAGS}
CopyLib:
	@mkdir -p ${OUTDIR}
	cp -f ./../../lib/${PLATFORM}/librtpkcs11* ${OUTDIR}
clean:
	rm -r ${OUTDIR} || true