141 lines
5.6 KiB
Text
141 lines
5.6 KiB
Text
# ─────────────────────────────────────────────────────────────────────
|
|
# 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/
|