#
# Build mbedtls along Gauche
#

.PHONY: mbedtls

# update these for new MbedTLS version / repo
MBEDTLS_VERSION = 3.2.1
MBEDTLS_SOURCE  = https://github.com/ARMmbed/mbedtls/archive/v$(MBEDTLS_VERSION).tar.gz


LN_S = ln -s
OBJEXT = o

FETCHED = v$(MBEDTLS_VERSION).tgz
CONFIG_GENERATED = Makefile

MBEDTLS_LIBS_XTRA = libmbedx509.a libmbedcrypto.a
MBEDTLS_LIBS = libmbedtls.a $(MBEDTLS_LIBS_XTRA)
GAUCHE_THREAD_TYPE = pthreads

all: mbedtls

mbedtls: include/mbedtls $(MBEDTLS_LIBS)

include/mbedtls: libmbedtls.a
	rm -rf include
	mkdir include
	cd include && $(LN_S) ../mbedtls-$(MBEDTLS_VERSION)/include/mbedtls .

$(MBEDTLS_LIBS_XTRA) : libmbedtls.a

libmbedtls.a: mbedtls-$(MBEDTLS_VERSION)
	cd mbedtls-$(MBEDTLS_VERSION)                \
	 && ../process-config.sh $(GAUCHE_THREAD_TYPE) include/mbedtls/mbedtls_config.h \
	 && cmake  .          \
	 && make -f CMakeFiles/Makefile2 library/all \
	 && cd library                               \
	 && cp $(MBEDTLS_LIBS) ../..

mbedtls-$(MBEDTLS_VERSION): v$(MBEDTLS_VERSION).tgz
	tar xzvf v$(MBEDTLS_VERSION).tgz
	echo 'set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")' >> mbedtls-$(MBEDTLS_VERSION)/library/CMakeLists.txt

v$(MBEDTLS_VERSION).tgz:
	curl -f -L -o v$(MBEDTLS_VERSION).tgz $(MBEDTLS_SOURCE)

# list-objects target is called by src/list-ext-objects.sh to gather
# object files to archive into static gauche library.
# NB: mbedtls is configured independently from Gauche, so our OBJEXT
# may not match the one used in mbedtls.  We need to use 'find' to collect
# objects heuristically.
list-objects:
	rm -rf objects && mkdir -p objects \
	  && for a in $(MBEDTLS_LIBS); do (cd objects; ar x ../$$a); done \
	  && find objects \( -name '*.$(OBJEXT)' -o -name '*.obj' \) \
	       -exec echo "/// `pwd`/{}" \;

clean:
	rm -rf include objects
	rm -rf $(MBEDTLS_LIBS)
	cd mbedtls-$(MBEDTLS_VERSION) && $(MAKE) -q clean ; true

distclean: clean
	rm -rf mbedtls-$(MBEDTLS_VERSION)

maintainer-clean: clean
	rm -rf mbedtls-$(MBEDTLS_VERSION) $(FETCHED) $(CONFIG_GENERATED)
