#
# Build mbedtls along Gauche
#

.PHONY: mbedtls

# update these for new MbedTLS version / repo
# for 3.6.4
MBEDTLS_VERSION = 3.6.4
MBEDTLS_SOURCE_URL = https://github.com/Mbed-TLS/mbedtls/releases/download/mbedtls-$(MBEDTLS_VERSION)/mbedtls-$(MBEDTLS_VERSION).tar.bz2
## for 3.6.0
#MBEDTLS_VERSION = 3.6.0
#MBEDTLS_SOURCE_URL = https://github.com/Mbed-TLS/mbedtls/releases/download/v$(MBEDTLS_VERSION)/mbedtls-$(MBEDTLS_VERSION).tar.bz2
## for 3.5.2
#MBEDTLS_VERSION = 3.5.2
#MBEDTLS_SOURCE_URL = https://github.com/Mbed-TLS/mbedtls/archive/refs/tags/v$(MBEDTLS_VERSION).tar.gz

MBEDTLS_SOURCE_TYPE = $(suffix $(MBEDTLS_SOURCE_URL))
MBEDTLS_SOURCE_FILE = mbedtls-$(MBEDTLS_VERSION).tar$(MBEDTLS_SOURCE_TYPE)

LN_S = ln -s
OBJEXT = o

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 .
	cd include && $(LN_S) ../mbedtls-$(MBEDTLS_VERSION)/include/psa .

$(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):
	if ! curl -f -L -o $(MBEDTLS_SOURCE_FILE) $(MBEDTLS_SOURCE_URL); then \
	  echo "Couldn't fetch MbedTLS $(MBEDTLS_VERSION)";                   \
	  exit 1;                                                             \
	fi
	if [ $(MBEDTLS_SOURCE_TYPE) = ".bz2" ]; then \
	  tar xjvf $(MBEDTLS_SOURCE_FILE);           \
	else                                         \
	  tar xzvf $(MBEDTLS_SOURCE_FILE);           \
	fi
	echo 'set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")' >> mbedtls-$(MBEDTLS_VERSION)/library/CMakeLists.txt

# 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) $(MBEDTLS_SOURCE_FILE) $(CONFIG_GENERATED)
