##
# exmseed
#
# @file
# @version 0.1
# 
# Environment variables passed via elixir_make
# ERTS_INCLUDE_DIR
MIX_APP_PATH ?= $(realpath .)
TEMP ?= $(HOME)/.cache
MSEED_SO = $(PRIV_DIR)/exmseed.so
MSEED_VERSION ?= 3.5.4
MSEED_RELEASE ?= https://github.com/EarthScope/libmseed/archive/refs/tags/v$(MSEED_VERSION).tar.gz
MSEED_LIB_DIR = $(TEMP)/libmseed-$(MSEED_VERSION)
MSEED_LOCAL_ARCHIVE = $(TEMP)/libmseed-$(MSEED_VERSION).tar.gz
MSEED_LIB_DIR_FLAG = $(MSEED_LIB_DIR)/exmseed.ok


# Private config
PRIV_DIR = $(MIX_APP_PATH)/priv
EXMSEED_DIR = $(realpath c/exmseed)
EXMSEED_CACHE_SO = cache/libexmseed.so
EXMSEED_CACHE_LIB_DIR = cache/lib
EXMSEED_SO = $(PRIV_DIR)/libexmseed.so
EXMSEED_LIB_DIR = $(PRIV_DIR)/lib


CFLAGS = -I$(EXMSEED_DIR)/include -I$(MSEED_LIB_DIR) -I$(ERTS_INCLUDE_DIR) -fPIC -O3 -shared -std=c11
C_SRCS = $(wildcard $(EXMSEED_DIR)/src/*.c) $(wildcard $(EXMSEED_DIR)/include/*.h)
LDFLAGS = -L$(EXMSEED_CACHE_LIB_DIR) -lmseed -Wl,-rpath,'$$ORIGIN/lib' -Wl,-z,origin

# Test configuration
TEST_DIR = $(EXMSEED_DIR)/test
TEST_CFLAGS = -I$(EXMSEED_DIR)/include -I$(MSEED_LIB_DIR) -std=c11 -O0 -g -coverage
TEST_LDFLAGS = -L$(MSEED_LIB_DIR) -lmseed -Wl,-rpath,$(MSEED_LIB_DIR) -coverage
TEST_BIN = $(TEST_DIR)/exmseed_test
TEST_COVERAGE_DIR = $(MIX_APP_PATH)/cover/c

.PHONY: all clean clean_cache test-c test-c-coverage

$(EXMSEED_SO): $(EXMSEED_CACHE_SO)
	@ mkdir -p $(PRIV_DIR)
	cp -a $(abspath $(EXMSEED_CACHE_LIB_DIR)) $(EXMSEED_LIB_DIR) ; \
	cp -a $(abspath $(EXMSEED_CACHE_SO)) $(EXMSEED_SO) ;

$(EXMSEED_CACHE_SO): $(MSEED_LIB_DIR_FLAG) $(C_SRCS)
	@ mkdir -p cache/lib
	cp $(MSEED_LIB_DIR)/libmseed.so* $(EXMSEED_CACHE_LIB_DIR)
	$(CC) $(CFLAGS) $(wildcard $(EXMSEED_DIR)/src/*.c) $(LDFLAGS) -o $(EXMSEED_CACHE_SO)
	$(POST_INSTALL)

# Téléchargement de la libmseed + décompilation et compilation en "shared"
$(MSEED_LIB_DIR_FLAG): 
	@echo "Fetching libmseed version 3.2.4"
	mkdir -p $(MSEED_LIB_DIR) && \
		wget -qO $(MSEED_LOCAL_ARCHIVE) $(MSEED_RELEASE) && \
		tar -C $(TEMP) -xzf $(MSEED_LOCAL_ARCHIVE) && \
	 	make -C $(MSEED_LIB_DIR) shared 
	touch $@

# Compile and run C unit tests
$(TEST_BIN): $(MSEED_LIB_DIR_FLAG) $(TEST_DIR)/test.c $(EXMSEED_DIR)/src/helpers.c
	$(CC) $(TEST_CFLAGS) $(TEST_DIR)/test.c $(EXMSEED_DIR)/src/helpers.c $(TEST_LDFLAGS) -o $(TEST_BIN)

test-c: $(TEST_BIN)
	$(TEST_BIN)

test-c-coverage: $(TEST_BIN)
	@mkdir -p $(TEST_COVERAGE_DIR)
	$(TEST_BIN)
	# Generate coverage report for each source file.
	# With multiple sources in one binary, gcc names the gcno files
	# <binary>-<source_basename>.gcno, so gcov -o needs that pattern.
	gcov $(TEST_DIR)/test.c -o $(TEST_BIN)-test
	gcov $(EXMSEED_DIR)/src/helpers.c -o $(TEST_BIN)-helpers
	# Move coverage data to cover directory
	@mkdir -p $(TEST_COVERAGE_DIR)
	mv *.gcov $(TEST_COVERAGE_DIR)/ 2>/dev/null; true
	# Generate coverage info for CI (lcov text format)
	lcov --capture --directory $(TEST_DIR) --output-file $(TEST_COVERAGE_DIR)/coverage.info > /dev/null; true
	lcov --summary $(TEST_COVERAGE_DIR)/coverage.info; true

clean:
	rm -rf $(EXMSEED_CACHE_SO)
	rm -rf $(EXMSEED_CACHE_LIB_DIR)
	rm -rf $(EXMSEED_SO)
	rm -rf $(EXMSEED_LIB_DIR)
	rm -rf $(MSEED_LIB_DIR)
	rm -f $(TEST_BIN)
	rm -f $(TEST_DIR)/*.gcda $(TEST_DIR)/*.gcno $(EXMSEED_DIR)/src/*.gcda $(EXMSEED_DIR)/src/*.gcno
	rm -rf $(TEST_COVERAGE_DIR)
	@echo "All clean"
# end
