# LIMAN SDK Core Library
# Baroks Inc.
# 
# $ make all
# $ make PRODUCT=TESTAPP product
#

LIMAN_ROOT=../..
# Detect official license: usr_<SERIAL>_lic.c (e.g. usr_18D08C987E7C5A04_lic.c) or legacy usr_liman_lic.c
USR_LIC_SRC := $(firstword $(filter-out %_mock.c %_copy.c, $(wildcard $(LIMAN_ROOT)/license/usr_*_lic.c)))
PLATFORM=osx64x86
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).jnilib
LIMAN_SDK_IMP=$(LIB_PREFIX)liman$(SDK_SUFFIX).jnilib

LIMAN_PRODUCT_LIB=libliman_$(PRODUCT)$(SDK_SUFFIX).a
LIMAN_PRODUCT_DLL=libliman_$(PRODUCT)$(SDK_SUFFIX).jnilib
LIMAN_PRODUCT_IMP=libliman_$(PRODUCT)$(SDK_SUFFIX).x   ##placeholder, not an active target 

AR=ar
CC=cc -m64 -fpic
LINK=cc -dynamiclib
LFLAGS=-framework CoreFoundation -framework IOKit
DLFLAGS=-Xlinker -bind_at_load -single_module -install_name @loader_path/$(LIMAN_SDK_DLL) -exported_symbols_list liman.def

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)
	rm -rf .cache
	#install_name_tool -id "@loader_path/$(LIMAN_SDK_DLL)" $(LIMAN_SDK_DLL)
	@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)
	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 ($(USR_LIC_SRC),)
	@echo Using official license: $(USR_LIC_SRC)
	cp -v $(USR_LIC_SRC) $@
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 $@
	@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)
	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*
    