# ───────────────────────────────────────────────────────────────────── # libzuptsdk — public C ABI for Zupt # ───────────────────────────────────────────────────────────────────── SDK_VERSION_MAJOR = 1 SDK_VERSION_MINOR = 0 SDK_VERSION_PATCH = 0 SDK_SOVERSION = $(SDK_VERSION_MAJOR) SDK_FULLVERSION = $(SDK_VERSION_MAJOR).$(SDK_VERSION_MINOR).$(SDK_VERSION_PATCH) SDK_HDR = sdk/include/zuptsdk.h SDK_SRC = sdk/src/zuptsdk.c SDK_MAP = sdk/zuptsdk.map SDK_PREFIX ?= /usr/local # All zupt sources except main.c get rebuilt with -fPIC for the SDK. # Object files go to sdk/build/ to avoid colliding with the CLI build. SDK_BUILD_DIR = sdk/build SDK_PIC_OBJS = $(patsubst src/%.c,$(SDK_BUILD_DIR)/%.o,$(filter-out src/zupt_main.c,$(ZUPT_SOURCES))) SDK_PIC_OBJS += $(patsubst src/%.c,$(SDK_BUILD_DIR)/%.o,$(VV_SOURCES)) SDK_PIC_OBJS += $(SDK_BUILD_DIR)/zuptsdk.o SDK_PIC_FLAGS = -fPIC -DZUPT_BUILDING_SDK=1 # VV files need SIMD flags too SDK_PIC_VV_FLAGS = $(SDK_PIC_FLAGS) $(VV_SIMD_FLAGS) SDK_SHARED = sdk/build/libzuptsdk.so.$(SDK_FULLVERSION) SDK_SHARED_SO = sdk/build/libzuptsdk.so.$(SDK_SOVERSION) SDK_SHARED_LINK = sdk/build/libzuptsdk.so SDK_STATIC = sdk/build/libzuptsdk.a SDK_PC = sdk/build/zuptsdk.pc # Compile rule for SDK PIC objects (vv_* files need SIMD flags) $(SDK_BUILD_DIR)/vv_%.o: src/vv_%.c | $(SDK_BUILD_DIR) $(Q)$(CC) $(CFLAGS) $(SDK_PIC_VV_FLAGS) -I include -c $< -o $@ $(SDK_BUILD_DIR)/vaptvupt_api.o: src/vaptvupt_api.c | $(SDK_BUILD_DIR) $(Q)$(CC) $(CFLAGS) $(SDK_PIC_FLAGS) -I include -c $< -o $@ $(SDK_BUILD_DIR)/%.o: src/%.c | $(SDK_BUILD_DIR) $(Q)$(CC) $(CFLAGS) $(SDK_PIC_FLAGS) -I include -c $< -o $@ $(SDK_BUILD_DIR)/zuptsdk.o: $(SDK_SRC) $(SDK_HDR) | $(SDK_BUILD_DIR) $(Q)$(CC) $(CFLAGS) $(SDK_PIC_FLAGS) -I sdk/include -I include -I src -c $< -o $@ $(SDK_BUILD_DIR): $(Q)mkdir -p $(SDK_BUILD_DIR) # Shared library $(SDK_SHARED): $(SDK_PIC_OBJS) $(SDK_MAP) $(JAZZ_O) @echo "[sdk-shared] $@" $(Q)$(CC) -shared -fPIC \ -Wl,-soname,libzuptsdk.so.$(SDK_SOVERSION) \ -Wl,--version-script,$(SDK_MAP) \ $(LDFLAGS) \ $(SDK_PIC_OBJS) $(JAZZ_O) \ -o $@ $(LDLIBS) $(Q)cd $(SDK_BUILD_DIR) && ln -sf $(notdir $(SDK_SHARED)) libzuptsdk.so.$(SDK_SOVERSION) $(Q)cd $(SDK_BUILD_DIR) && ln -sf libzuptsdk.so.$(SDK_SOVERSION) libzuptsdk.so # Static library $(SDK_STATIC): $(SDK_PIC_OBJS) $(JAZZ_O) @echo "[sdk-static] $@" $(Q)$(AR) rcs $@ $(SDK_PIC_OBJS) $(JAZZ_O) # pkg-config file $(SDK_PC): $(SDK_HDR) @echo "[sdk-pc] $@" $(Q)mkdir -p $(SDK_BUILD_DIR) $(Q)printf 'prefix=$(SDK_PREFIX)\n' > $@ $(Q)printf 'exec_prefix=$${prefix}\n' >> $@ $(Q)printf 'libdir=$${exec_prefix}/lib\n' >> $@ $(Q)printf 'includedir=$${prefix}/include\n\n' >> $@ $(Q)printf 'Name: zuptsdk\n' >> $@ $(Q)printf 'Description: Zupt backup compression SDK\n' >> $@ $(Q)printf 'URL: https://git.securityops.co/cristiancmoises/zupt\n' >> $@ $(Q)printf 'Version: $(SDK_FULLVERSION)\n' >> $@ $(Q)printf 'Libs: -L$${libdir} -lzuptsdk\n' >> $@ $(Q)printf 'Libs.private: -lpthread\n' >> $@ $(Q)printf 'Cflags: -I$${includedir}\n' >> $@ # Convenience targets .PHONY: sdk sdk-shared sdk-static sdk-pkgconfig sdk-clean sdk-install \ sdk-verify-symbols sdk-test sdk: sdk-shared sdk-static sdk-pkgconfig sdk-shared: $(SDK_SHARED) sdk-static: $(SDK_STATIC) sdk-pkgconfig: $(SDK_PC) sdk-clean: $(Q)rm -rf $(SDK_BUILD_DIR) # Symbol leakage verification. # Pass: every exported text symbol starts with `zuptsdk_`. # Fail: any symbol that doesn't. sdk-verify-symbols: $(SDK_SHARED) @echo "[sdk-verify] checking exported symbols in $(SDK_SHARED)" $(Q)leaked=$$(nm -D --defined-only $(SDK_SHARED) | grep ' T ' | awk '{print $$3}' | grep -v '^zuptsdk_' || true); \ if [ -n "$$leaked" ]; then \ echo "FAIL: non-zuptsdk symbols exported:"; \ echo "$$leaked"; \ exit 1; \ fi; \ expected=$$(grep -c '^ zuptsdk_' $(SDK_MAP)); \ exported=$$(nm -D --defined-only $(SDK_SHARED) | grep ' T ' | grep -c '^.* T zuptsdk_' || true); \ echo " $$exported exported / $$expected declared in version script"; \ if [ "$$exported" -lt "$$expected" ]; then \ echo "FAIL: $$((expected - exported)) declared symbols are missing from the .so"; \ nm -D --defined-only $(SDK_SHARED) | grep ' T ' | grep '^.* T zuptsdk_' | awk '{print $$3}' | sort > /tmp/exp; \ grep '^ zuptsdk_' $(SDK_MAP) | tr -d ' ;' | sort > /tmp/decl; \ diff /tmp/decl /tmp/exp; \ exit 1; \ fi; \ echo " PASS: no symbol leakage, all declared symbols exported" # Build & run roundtrip test sdk-test: $(SDK_SHARED) @echo "[sdk-test] building and running roundtrip" $(Q)$(CC) $(CFLAGS) -I sdk/include sdk/tests/test_sdk_roundtrip.c \ -Lsdk/build -lzuptsdk \ -Wl,-rpath,'$$ORIGIN/build' \ -o sdk/build/test_sdk_roundtrip $(LDLIBS) $(Q)cd sdk && LD_LIBRARY_PATH=build ./build/test_sdk_roundtrip sdk-install: sdk install -d $(DESTDIR)$(SDK_PREFIX)/lib install -d $(DESTDIR)$(SDK_PREFIX)/include install -d $(DESTDIR)$(SDK_PREFIX)/lib/pkgconfig install -m 0644 $(SDK_HDR) $(DESTDIR)$(SDK_PREFIX)/include/ install -m 0755 $(SDK_SHARED) $(DESTDIR)$(SDK_PREFIX)/lib/ cd $(DESTDIR)$(SDK_PREFIX)/lib && \ ln -sf libzuptsdk.so.$(SDK_FULLVERSION) libzuptsdk.so.$(SDK_SOVERSION) && \ ln -sf libzuptsdk.so.$(SDK_SOVERSION) libzuptsdk.so install -m 0644 $(SDK_STATIC) $(DESTDIR)$(SDK_PREFIX)/lib/ install -m 0644 $(SDK_PC) $(DESTDIR)$(SDK_PREFIX)/lib/pkgconfig/