# SPDX-License-Identifier: AGPL-3.0-or-later # Source-only build rules for the in-tree libzuptsdk compatibility SDK. 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_BUILD_DIR = sdk/build SDK_PKGCONFIGDIR ?= $(LIBDIR)/pkgconfig SDK_LICENSEDIR ?= $(PREFIX)/share/licenses/libzuptsdk SDK_LICENSE_FILES = LICENSE LICENSE-AGPL-3.0 LICENSE-GPL-3.0 \ LICENSE-BSD-2-Clause LICENSE-BSD-3-Clause LICENSE-CC0-1.0 \ NOTICE THIRD-PARTY-NOTICES.md # All implementation sources are rebuilt from source as PIC. Objects are kept # separate from the CLI build so `make -j` may build both safely. 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_PROJECT_CPPFLAGS = -DZUPT_BUILDING_SDK=1 -Isdk/include SDK_PROJECT_CFLAGS = -fPIC SDK_SHARED_LDFLAGS ?= -shared \ -Wl,-soname,libzuptsdk.so.$(SDK_SOVERSION) \ -Wl,--version-script,$(SDK_MAP) SDK_PC_PRIVATE_LIBS ?= $(PROJECT_LDLIBS) SDK_SHARED = $(SDK_BUILD_DIR)/libzuptsdk.so.$(SDK_FULLVERSION) SDK_SHARED_SO = $(SDK_BUILD_DIR)/libzuptsdk.so.$(SDK_SOVERSION) SDK_SHARED_LINK = $(SDK_BUILD_DIR)/libzuptsdk.so SDK_STATIC = $(SDK_BUILD_DIR)/libzuptsdk.a SDK_PC = $(SDK_BUILD_DIR)/zuptsdk.pc $(SDK_BUILD_DIR): $(Q)mkdir -p "$@" # Keep ISA flags on the SHA-NI translation unit only. Runtime dispatch in the # baseline SHA-256 implementation prevents execution on unsupported CPUs. $(SDK_BUILD_DIR)/zupt_sha256_shani.o: src/zupt_sha256_shani.c $(HEADERS) | $(SDK_BUILD_DIR) $(Q)$(CC) $(CPPFLAGS) $(PROJECT_CPPFLAGS) $(SDK_PROJECT_CPPFLAGS) \ $(CFLAGS) $(PROJECT_CFLAGS) $(SDK_PROJECT_CFLAGS) $(SHANI_FLAGS) -c -o $@ $< $(SDK_BUILD_DIR)/vv_%.o: src/vv_%.c $(HEADERS) | $(SDK_BUILD_DIR) $(Q)$(CC) $(CPPFLAGS) $(PROJECT_CPPFLAGS) $(SDK_PROJECT_CPPFLAGS) \ $(CFLAGS) $(PROJECT_CFLAGS) $(SDK_PROJECT_CFLAGS) $(VV_WARNING_FLAGS) \ $(if $(filter $(SDK_BUILD_DIR)/vv_decoder.o,$@),$(VV_DECODER_WARNING_FLAGS)) -c -o $@ $< $(SDK_BUILD_DIR)/vaptvupt_api.o: src/vaptvupt_api.c $(HEADERS) | $(SDK_BUILD_DIR) $(Q)$(CC) $(CPPFLAGS) $(PROJECT_CPPFLAGS) $(SDK_PROJECT_CPPFLAGS) \ $(CFLAGS) $(PROJECT_CFLAGS) $(SDK_PROJECT_CFLAGS) $(VV_WARNING_FLAGS) -c -o $@ $< $(SDK_BUILD_DIR)/%.o: src/%.c $(HEADERS) | $(SDK_BUILD_DIR) $(Q)$(CC) $(CPPFLAGS) $(PROJECT_CPPFLAGS) $(SDK_PROJECT_CPPFLAGS) \ $(CFLAGS) $(PROJECT_CFLAGS) $(SDK_PROJECT_CFLAGS) -c -o $@ $< $(SDK_BUILD_DIR)/zuptsdk.o: $(SDK_SRC) $(SDK_HDR) $(HEADERS) | $(SDK_BUILD_DIR) $(Q)$(CC) $(CPPFLAGS) $(PROJECT_CPPFLAGS) $(SDK_PROJECT_CPPFLAGS) \ $(CFLAGS) $(PROJECT_CFLAGS) $(SDK_PROJECT_CFLAGS) -c -o $@ $< $(SDK_SHARED): $(SDK_PIC_OBJS) $(SDK_MAP) $(JAZZ_O) @echo "[sdk-shared] $@" $(Q)$(CC) $(CFLAGS) $(PROJECT_CFLAGS) $(SDK_PROJECT_CFLAGS) \ $(LDFLAGS) $(PROJECT_LDFLAGS) $(SDK_SHARED_LDFLAGS) \ $(SDK_PIC_OBJS) $(JAZZ_O) -o $@ $(PROJECT_LDLIBS) $(LDLIBS) $(Q)cd "$(SDK_BUILD_DIR)" && ln -sf "$(notdir $(SDK_SHARED))" "$(notdir $(SDK_SHARED_SO))" $(Q)cd "$(SDK_BUILD_DIR)" && ln -sf "$(notdir $(SDK_SHARED_SO))" "$(notdir $(SDK_SHARED_LINK))" $(SDK_STATIC): $(SDK_PIC_OBJS) $(JAZZ_O) @echo "[sdk-static] $@" $(Q)$(AR) $(ARFLAGS) $@ $(SDK_PIC_OBJS) $(JAZZ_O) $(Q)$(RANLIB) $@ $(SDK_PC): $(SDK_HDR) | $(SDK_BUILD_DIR) @echo "[sdk-pc] $@" $(Q)printf '%s\n' \ 'prefix=$(PREFIX)' \ 'exec_prefix=$${prefix}' \ 'libdir=$(LIBDIR)' \ 'includedir=$(INCLUDEDIR)' \ '' \ 'Name: zuptsdk' \ 'Description: ZUPT source-built compatibility SDK' \ 'URL: https://github.com/cristiancmoises/zupt' \ 'Version: $(SDK_FULLVERSION)' \ 'Libs: -L$${libdir} -lzuptsdk' \ 'Libs.private: $(SDK_PC_PRIVATE_LIBS)' \ 'Cflags: -I$${includedir}' > "$@" .PHONY: sdk sdk-shared sdk-static sdk-pkgconfig sdk-clean sdk-install \ sdk-uninstall 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)" sdk-verify-symbols: $(SDK_SHARED) @echo "[sdk-verify] checking exported symbols in $(SDK_SHARED)" $(Q)set -eu; \ tmp=$$(mktemp -d "$${TMPDIR:-/tmp}/zupt-sdk-symbols.XXXXXXXX"); \ trap 'rm -rf -- "$$tmp"' EXIT HUP INT TERM; \ nm -D --defined-only "$(SDK_SHARED)" | awk '$$2 == "T" { print $$3 }' | \ sed 's/@.*//' | sort > "$$tmp/exported"; \ grep '^ zuptsdk_' "$(SDK_MAP)" | tr -d ' ;' | sort > "$$tmp/declared"; \ if grep -v '^zuptsdk_' "$$tmp/exported"; then \ echo "FAIL: non-zuptsdk symbols exported" >&2; exit 1; \ fi; \ diff -u "$$tmp/declared" "$$tmp/exported"; \ echo " PASS: no symbol leakage and all declared symbols are exported" # Link and execute without embedding an RPATH. LD_LIBRARY_PATH is scoped to the # disposable test process and never enters an installed binary. sdk-test: $(SDK_SHARED) @echo "[sdk-test] building and running roundtrip" $(Q)$(CC) $(CPPFLAGS) $(PROJECT_CPPFLAGS) -Isdk/include \ $(CFLAGS) $(PROJECT_CFLAGS) $(LDFLAGS) $(PROJECT_LDFLAGS) \ sdk/tests/test_sdk_roundtrip.c -L"$(SDK_BUILD_DIR)" -lzuptsdk \ -o "$(SDK_BUILD_DIR)/test_sdk_roundtrip" $(PROJECT_LDLIBS) $(LDLIBS) $(Q)cd sdk && LD_LIBRARY_PATH=build "$$(pwd)/build/test_sdk_roundtrip" sdk-install: sdk $(Q)install -d "$(DESTDIR)$(LIBDIR)" "$(DESTDIR)$(INCLUDEDIR)" \ "$(DESTDIR)$(SDK_PKGCONFIGDIR)" "$(DESTDIR)$(SDK_LICENSEDIR)" $(Q)install -m 0644 "$(SDK_HDR)" "$(DESTDIR)$(INCLUDEDIR)/" $(Q)install -m 0755 "$(SDK_SHARED)" "$(DESTDIR)$(LIBDIR)/" $(Q)cd "$(DESTDIR)$(LIBDIR)" && \ ln -sf "libzuptsdk.so.$(SDK_FULLVERSION)" "libzuptsdk.so.$(SDK_SOVERSION)" && \ ln -sf "libzuptsdk.so.$(SDK_SOVERSION)" libzuptsdk.so $(Q)install -m 0644 "$(SDK_STATIC)" "$(DESTDIR)$(LIBDIR)/" $(Q)install -m 0644 "$(SDK_PC)" "$(DESTDIR)$(SDK_PKGCONFIGDIR)/" $(Q)install -m 0644 $(SDK_LICENSE_FILES) "$(DESTDIR)$(SDK_LICENSEDIR)/" $(Q)install -m 0644 sdk/LICENSE "$(DESTDIR)$(SDK_LICENSEDIR)/SDK-LICENSE" sdk-uninstall: $(Q)rm -f "$(DESTDIR)$(LIBDIR)/libzuptsdk.so.$(SDK_FULLVERSION)" \ "$(DESTDIR)$(LIBDIR)/libzuptsdk.so.$(SDK_SOVERSION)" \ "$(DESTDIR)$(LIBDIR)/libzuptsdk.so" \ "$(DESTDIR)$(LIBDIR)/libzuptsdk.a" \ "$(DESTDIR)$(INCLUDEDIR)/$(notdir $(SDK_HDR))" \ "$(DESTDIR)$(SDK_PKGCONFIGDIR)/$(notdir $(SDK_PC))" $(Q)set -eu; for license_file in $(SDK_LICENSE_FILES); do \ rm -f "$(DESTDIR)$(SDK_LICENSEDIR)/$${license_file##*/}"; \ done $(Q)rm -f "$(DESTDIR)$(SDK_LICENSEDIR)/SDK-LICENSE"