# LIMAN SDK Core Library
# Baroks Inc.
# 
# $ make all
# $ make PRODUCT=TESTAPP product
#
 
LIMAN_ROOT=../..
PLATFORM=mingw32
LIB_PREFIX=lib
CORE_SUFFIX=_core
WRAP_SUFFIX=_wrap
LIMAN_CORELIB=$(LIB_PREFIX)liman$(CORE_SUFFIX).a
LIMAN_WRAPLIB=$(LIB_PREFIX)liman$(WRAP_SUFFIX).a

AHOSTID_SRC=$(LIMAN_ROOT)/apps/c/ahostid
LIMUTIL_SRC=$(LIMAN_ROOT)/apps/c/limutil
LIMGEN_SRC=$(LIMAN_ROOT)/apps/c/limgen
TESTAPP_SRC=$(LIMAN_ROOT)/apps/c/testapp

SDK_SUFFIX=_sdk
LIMAN_SDK_LIB=$(LIB_PREFIX)liman$(SDK_SUFFIX).a
LIMAN_SDK_DLL=$(LIB_PREFIX)liman$(SDK_SUFFIX).dll
LIMAN_SDK_IMP=$(LIB_PREFIX)liman$(SDK_SUFFIX).dll.a

LIMAN_PRODUCT_LIB=libliman_$(PRODUCT)$(SDK_SUFFIX).a
LIMAN_PRODUCT_DLL=libliman_$(PRODUCT)$(SDK_SUFFIX).dll
LIMAN_PRODUCT_IMP=libliman_$(PRODUCT)$(SDK_SUFFIX).dll.a
#MINGW32=i686-w64-mingw32-
AR=$(MINGW32)ar
CC=$(MINGW32)gcc -m32
LINK=$(MINGW32)gcc -shared -m32
LFLAGS=-lm -liphlpapi
#DLFLAGS=-Wl,--subsystem,windows,--out-implib,$(LIMAN_SDK_IMP) -Wl,-soname,$(LIMAN_SDK_DLL),--version-script,liman.def
DLFLAGS=-Wl,--subsystem,windows,--out-implib,$(LIMAN_SDK_IMP) -Wl,--enable-stdcall-fixup
#DLFLAGS=-Wl,--subsystem,windows,--kill-at

all: $(LIMAN_SDK_LIB) $(LIMAN_SDK_DLL) limutil ahostid limgen

product: check-env $(PRODUCT)/$(LIMAN_PRODUCT_LIB) $(PRODUCT)/$(LIMAN_PRODUCT_DLL)

$(LIMAN_SDK_LIB): usr_liman_lic.o $(LIMAN_CORELIB)
	cp $(LIMAN_CORELIB) $(LIMAN_SDK_LIB)
	$(AR) r $(LIMAN_SDK_LIB) usr_liman_lic.o
	@echo
	@echo "LIMAN SDK static library has been built and license has been enabled."
	@echo

$(LIMAN_SDK_DLL): usr_liman_lic.o $(LIMAN_CORELIB) $(LIMAN_WRAPLIB)
	mkdir .cache; cd .cache;  $(AR) x ../$(LIMAN_WRAPLIB); $(AR) x ../$(LIMAN_CORELIB); cd ..
	#$(LINK) usr_liman_lic.o $(LIMAN_CORELIB) $(LIMAN_WRAPLIB) -o $@ $(LFLAGS) $(DLFLAGS)
	$(LINK) usr_liman_lic.o .cache/*.o* -o $@ $(LFLAGS) $(DLFLAGS) liman.def
	rm -rf .cache
	@echo
	@echo "LIMAN SDK dynamic library for managing all products has been built."
	
$(PRODUCT)/$(LIMAN_PRODUCT_LIB): $(PRODUCT)/$(PRODUCT)_public_key.o $(LIMAN_SDK_LIB)
	cp $(LIMAN_SDK_LIB) $(PRODUCT)/$(LIMAN_PRODUCT_LIB)
	$(AR) r $@ $(PRODUCT)/$(PRODUCT)_public_key.o 
	@echo
	@echo "LIMAN SDK static library for use with product $(PRODUCT) has been built."
	@echo "Rebuild $(PRODUCT) linking against '$@'"
ifeq ($(PRODUCT),"TESTAPP")
	@echo "Type 'nmake testapp' to build the TESTAPP"
	@echo "You can use 'LIMAN_ROOT/bin/lg_testapp.bat' to generate license keys for $(PRODUCT)"
else
	@echo "You can use 'LIMAN_ROOT/bin/lg_product.bat' to generate license keys for $(PRODUCT)"
endif
	@echo 



$(PRODUCT)/$(LIMAN_PRODUCT_DLL): $(PRODUCT)/$(LIMAN_PRODUCT_LIB) $(LIMAN_WRAPLIB)
	mkdir .cache; cd .cache; $(AR) x ../$(LIMAN_WRAPLIB); $(AR) x ../$(PRODUCT)/$(LIMAN_PRODUCT_LIB); cd ..
	#$(LINK) $(PRODUCT)/$(LIMAN_PRODUCT_LIB) $(LIMAN_WRAPLIB) $(LFLAGS) -o $@ $(LFLAGS) $(DLFLAGS)
	$(LINK) .cache/*.o* -o $@ $(LFLAGS) $(DLFLAGS) liman.def
	rm -rf .cache
	@echo ""
	@echo "LIMAN $(PRODUCT) dynamic library has been built."



limutil: limutil.o $(LIMAN_CORELIB)
	$(CC) -o $@ limutil.o  $(LIMAN_CORELIB) $(LFLAGS)
	@echo
	@echo limutil has been built successfully.
	@echo Run command "limutil -g -P <PRODUCT_CODE>" to create a new product-id 
	@echo " and a random keypair associated with it."
	@echo
	@echo Type "limutil -h" for help
	@echo 
    
limutil.o: $(LIMUTIL_SRC)/limutil.c $(LIMAN_ROOT)/include/liman.h
	$(CC) -o $@ -c $(LIMUTIL_SRC)/limutil.c -I$(LIMAN_ROOT)/include -I$(LIMAN_ROOT)/license -I$(LIMAN_ROOT)/apps/c/getopt

limgen: limgen.o $(LIMAN_SDK_LIB)
	$(CC) -o $@ limgen.o $(LIMAN_SDK_LIB) $(LFLAGS)

limgen.o: $(LIMGEN_SRC)/limgen.c $(LIMAN_ROOT)/include/liman.h
	$(CC) -o $@ -c $(LIMGEN_SRC)/limgen.c -I$(LIMAN_ROOT)/include -I$(LIMAN_ROOT)/license -I$(LIMAN_ROOT)/apps/c/getopt -DREAD_PUBLIC_KEY

ahostid: ahostid.o $(LIMAN_CORELIB)
	$(CC) -o $@ ahostid.o $(LIMAN_CORELIB) $(LFLAGS)
    
ahostid.o: $(AHOSTID_SRC)/ahostid.c  $(LIMAN_ROOT)/include/liman.h 
	$(CC) -o $@ -c $(AHOSTID_SRC)/ahostid.c -I$(LIMAN_ROOT)/include -I$(LIMAN_ROOT)/license
    
$(PRODUCT)/$(PRODUCT)_public_key.o: $(PRODUCT)/$(PRODUCT)_public_key.c
	$(CC) -o $@ -c $(PRODUCT)/$(PRODUCT)_public_key.c -I$(LIMAN_ROOT)/include

usr_liman_lic.o: $(LIMAN_ROOT)/license/usr_liman_lic_copy.c $(LIMAN_ROOT)/include/liman.h  
	$(CC) -o $@ -c $(LIMAN_ROOT)/license/usr_liman_lic_copy.c -I$(LIMAN_ROOT)/include

$(PRODUCT)/$(PRODUCT)_public_key.c:
ifeq ($(PRODUCT),)
	@echo ERROR: Variable PRODUCT has not been set.
	@echo ERROR: Refer to Step 3 in README.txt.
	@echo
else
	@echo ERROR: Public key file '$@' is required to continue.
	@echo ERROR: Make sure you have generated a keypair associated with $(PRODUCT).
	@echo ERROR: Refer to Step 2 in README.txt.
	@echo
endif
	exit 1

$(LIMAN_ROOT)/license/usr_liman_lic_copy.c:
ifneq (,$(wildcard $(LIMAN_ROOT)/license/usr_liman_lic.c))
	cp -v $(LIMAN_ROOT)/license/usr_liman_lic.c $(LIMAN_ROOT)/license/usr_liman_lic_copy.c
else
	@echo "WARNING: A valid LIMAN-SDK license ('$$@') is required to continue."
	@echo "WARNING: Make sure to obtain it from http://www.baroks.com/sales and place it in the license folder."
	@echo ""
	@echo "WARNING: Creating a dummy license file for demo purposes."
	@echo ""
	cp -v $(LIMAN_ROOT)/license/usr_liman_lic_mock.c $(LIMAN_ROOT)/license/usr_liman_lic_copy.c
	@echo "Dummy license is created!"
	@echo ""
endif

.PHONY: clean cleankeys

check-env:
ifeq ($(PRODUCT),)
	$(error Variable 'PRODUCT' is not set. This should be one of the product-ids generated previously.)
endif

clean:
	rm -vf *.o limutil* limgen* ahostid* $(LIMAN_SDK_LIB) $(LIMAN_SDK_DLL) $(LIMAN_SDK_IMP)
	rm -vf $(LIMAN_ROOT)/license/usr_liman_lic_copy.c
ifneq ($(PRODUCT),)	
	rm -vf *.o limutil* limgen* ahostid* $(LIMAN_SDK_LIB) $(LIMAN_SDK_DLL) $(PRODUCT)/$(LIMAN_PRODUCT_LIB) $(PRODUCT)/$(LIMAN_PRODUCT_DLL) $(PRODUCT)/$(PRODUCT)_public_key.o
endif
cleankeys:
	rm -f *key*
    