Makefile
ZVEC_SRC = c_src/zvec
ZVEC_BUILD = _build/zvec
PRIV_DIR = $(MIX_APP_PATH)/priv
ZVEX_VERSION ?= 0.4.0
ZVEC_REPO ?= https://github.com/alibaba/zvec.git
ZVEC_TAG ?= v$(ZVEX_VERSION)
UNAME_S := $(shell uname -s)
ifeq ($(UNAME_S),Darwin)
SHARED_LIB = libzvec_c_api.dylib
BUILD_LIB_DIR = lib
else ifneq (,$(filter MINGW% MSYS% CYGWIN%,$(UNAME_S)))
SHARED_LIB = zvec_c_api.dll
BUILD_LIB_DIR = bin
else
SHARED_LIB = libzvec_c_api.so
BUILD_LIB_DIR = lib
endif
CMAKE_FLAGS ?= -DCMAKE_BUILD_TYPE=Release \
-DBUILD_C_BINDINGS=ON \
-DBUILD_PYTHON_BINDINGS=OFF \
-DBUILD_TOOLS=OFF \
-DCMAKE_POLICY_VERSION_MINIMUM=3.5
NPROC := $(shell nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || echo 4)
.PHONY: all build clean force
all:
@if [ -f $(PRIV_DIR)/.zvex_precompiled ]; then \
echo "[zvex] using precompiled libzvec_c_api"; \
else \
$(MAKE) --no-print-directory build; \
fi
build: $(PRIV_DIR)/lib/$(SHARED_LIB) $(PRIV_DIR)/include/zvec/c_api.h
$(ZVEC_SRC)/CMakeLists.txt:
@if [ ! -f "$@" ]; then \
if ! command -v git >/dev/null 2>&1; then \
echo "[zvex] git is required to fetch zvec sources but was not found in PATH" >&2; \
exit 1; \
fi; \
echo "[zvex] fetching zvec $(ZVEC_TAG) from $(ZVEC_REPO)"; \
rm -rf $(ZVEC_SRC); \
git clone --depth 1 --branch $(ZVEC_TAG) --recurse-submodules $(ZVEC_REPO) $(ZVEC_SRC); \
fi
$(ZVEC_BUILD)/CMakeCache.txt: $(ZVEC_SRC)/CMakeLists.txt
cmake -S $(ZVEC_SRC) -B $(ZVEC_BUILD) $(CMAKE_FLAGS)
$(ZVEC_BUILD)/$(BUILD_LIB_DIR)/$(SHARED_LIB): $(ZVEC_BUILD)/CMakeCache.txt force
cmake --build $(ZVEC_BUILD) --config Release --target zvec_c_api -j $(NPROC)
$(PRIV_DIR)/lib/$(SHARED_LIB): $(ZVEC_BUILD)/$(BUILD_LIB_DIR)/$(SHARED_LIB)
@mkdir -p $(PRIV_DIR)/lib
cp $(ZVEC_BUILD)/$(BUILD_LIB_DIR)/$(SHARED_LIB) $(PRIV_DIR)/lib/
ifeq ($(UNAME_S),Darwin)
install_name_tool -id @rpath/$(SHARED_LIB) $(PRIV_DIR)/lib/$(SHARED_LIB)
endif
$(PRIV_DIR)/include/zvec/c_api.h: $(ZVEC_SRC)/CMakeLists.txt
@mkdir -p $(PRIV_DIR)/include/zvec
cp $(ZVEC_SRC)/src/include/zvec/c_api.h $(PRIV_DIR)/include/zvec/
clean:
rm -rf $(ZVEC_BUILD)
rm -f $(PRIV_DIR)/lib/$(SHARED_LIB)
rm -rf $(PRIV_DIR)/include/zvec
rm -f $(PRIV_DIR)/.zvex_precompiled