From 8e7f7b44069ff9b742e1b528cd4de6a08680dd9c Mon Sep 17 00:00:00 2001 From: Sayani Halder Date: Mon, 1 Jun 2026 11:48:57 +0100 Subject: [PATCH] build: add option to build a single libopencsd_c_api.so Adds OCSD_CAPI_SINGLE_SO=1 for Unix Makefile builds to create a single unversioned libopencsd_c_api.so with libopencsd.a statically linked into the shared object. This removes the runtime dependency on libopencsd.so and avoids the versioned symlink chain in the build output. The option is intended for packaging workflows that copy the generated libopencsd_c_api.so directly from the build output. Default Linux build/install behavior remains unchanged. Signed-off-by: Sayani Halder --- decoder/build/unix_common/makefile.common | 4 +++ .../unix_common/rctdl_c_api_lib/makefile | 32 ++++++++++++++----- decoder/docs/build_libs.md | 21 ++++++++++++ 3 files changed, 49 insertions(+), 8 deletions(-) diff --git a/decoder/build/unix_common/makefile.common b/decoder/build/unix_common/makefile.common index 96206943a249..db098f891a30 100644 --- a/decoder/build/unix_common/makefile.common +++ b/decoder/build/unix_common/makefile.common @@ -42,6 +42,10 @@ export LIB_BASE_NAME LIB_CAPI_NAME=$(LIB_BASE_NAME)_c_api export LIB_CAPI_NAME +# Optional: build a single C-API shared object that statically links libopencsd.a. +OCSD_CAPI_SINGLE_SO ?= 0 +export OCSD_CAPI_SINGLE_SO + # source root directories export OCSD_LIB_ROOT=$(OCSD_ROOT)/lib diff --git a/decoder/build/unix_common/rctdl_c_api_lib/makefile b/decoder/build/unix_common/rctdl_c_api_lib/makefile index 2a535f151930..efcf782d397f 100644 --- a/decoder/build/unix_common/rctdl_c_api_lib/makefile +++ b/decoder/build/unix_common/rctdl_c_api_lib/makefile @@ -35,7 +35,13 @@ LINKER := $(MASTER_LINKER) LIB := $(MASTER_LIB) LIB_NAME = lib$(LIB_CAPI_NAME) -SO_LIB_DEPS= -L$(LIB_TARGET_DIR) -l$(LIB_BASE_NAME) +ifeq ($(OCSD_CAPI_SINGLE_SO),1) +SO_LIB_DEPS := $(LIB_TARGET_DIR)/lib$(LIB_BASE_NAME).a +BASE_LIB_DEP := $(LIB_TARGET_DIR)/lib$(LIB_BASE_NAME).a +else +SO_LIB_DEPS := -L$(LIB_TARGET_DIR) -l$(LIB_BASE_NAME) +BASE_LIB_DEP := +endif BUILD_DIR=./$(PLAT_DIR) @@ -53,11 +59,6 @@ INST_INC_DST=$(INSTALL_INCLUDE_DIR)/$(LIB_UAPI_INC_DIR) all: links -links: $(LIB_TARGET_DIR)/$(LIB_NAME).$(SHARED_LIB_SUFFIX).$(SO_MAJOR_VER) $(LIB_TARGET_DIR)/$(LIB_NAME).$(SHARED_LIB_SUFFIX) -.PHONY: links - -LIBS:= $(LIB_TARGET_DIR)/$(LIB_NAME).a $(LIB_TARGET_DIR)/$(LIB_NAME).$(SHARED_LIB_SUFFIX).$(SO_VER) - $(LIB_TARGET_DIR): mkdir -p $(LIB_TARGET_DIR) @@ -67,6 +68,19 @@ $(BUILD_DIR): $(LIB_TARGET_DIR)/$(LIB_NAME).a: $(OBJECTS) | $(BUILD_DIR) $(LIB_TARGET_DIR) $(LIB) $(ARFLAGS) $(LIB_TARGET_DIR)/$(LIB_NAME).a $(OBJECTS) +ifeq ($(OCSD_CAPI_SINGLE_SO),1) + +links: $(LIB_TARGET_DIR)/$(LIB_NAME).a $(LIB_TARGET_DIR)/$(LIB_NAME).$(SHARED_LIB_SUFFIX) + +$(LIB_TARGET_DIR)/$(LIB_NAME).$(SHARED_LIB_SUFFIX): $(OBJECTS) $(BASE_LIB_DEP) | $(BUILD_DIR) $(LIB_TARGET_DIR) + $(LINKER) $(LDFLAGS) -shared -o $(LIB_TARGET_DIR)/$(LIB_NAME).$(SHARED_LIB_SUFFIX) -Wl,$(SONAME_FLAG),$(LIB_NAME).$(SHARED_LIB_SUFFIX) $(OBJECTS) $(SO_LIB_DEPS) + +else + +links: $(LIB_TARGET_DIR)/$(LIB_NAME).$(SHARED_LIB_SUFFIX).$(SO_MAJOR_VER) $(LIB_TARGET_DIR)/$(LIB_NAME).$(SHARED_LIB_SUFFIX) + +LIBS:= $(LIB_TARGET_DIR)/$(LIB_NAME).a $(LIB_TARGET_DIR)/$(LIB_NAME).$(SHARED_LIB_SUFFIX).$(SO_VER) + $(LIB_TARGET_DIR)/$(LIB_NAME).$(SHARED_LIB_SUFFIX).$(SO_VER): $(OBJECTS) | $(BUILD_DIR) $(LIB_TARGET_DIR) $(LINKER) $(LDFLAGS) -shared -o $(LIB_TARGET_DIR)/$(LIB_NAME).$(SHARED_LIB_SUFFIX).$(SO_VER) -Wl,$(SONAME_FLAG),$(LIB_NAME).$(SHARED_LIB_SUFFIX).$(SO_MAJOR_VER) $(OBJECTS) $(SO_LIB_DEPS) @@ -76,6 +90,10 @@ $(LIB_TARGET_DIR)/$(LIB_NAME).$(SHARED_LIB_SUFFIX).$(SO_MAJOR_VER): $(LIBS) | $( $(LIB_TARGET_DIR)/$(LIB_NAME).$(SHARED_LIB_SUFFIX): $(LIB_TARGET_DIR)/$(LIB_NAME).$(SHARED_LIB_SUFFIX).$(SO_MAJOR_VER) | $(LIB_TARGET_DIR) ( cd $(LIB_TARGET_DIR); ln -sf $(LIB_NAME).$(SHARED_LIB_SUFFIX).$(SO_MAJOR_VER) $(LIB_NAME).$(SHARED_LIB_SUFFIX) ) +endif + +.PHONY: links + ##### build rules @@ -119,5 +137,3 @@ install_inc: $(INSTALL) --mode=0644 $(INST_INC_SRC)/c_api/ocsd_c_api_types.h $(INST_INC_DST)/c_api/ $(INSTALL) --mode=0644 $(INST_INC_SRC)/c_api/opencsd_c_api.h $(INST_INC_DST)/c_api/ $(INSTALL) --mode=0644 $(INST_INC_SRC)/c_api/ocsd_c_api_custom.h $(INST_INC_DST)/c_api/ - - diff --git a/decoder/docs/build_libs.md b/decoder/docs/build_libs.md index 9717dcfc3cb0..01dfa32e7932 100644 --- a/decoder/docs/build_libs.md +++ b/decoder/docs/build_libs.md @@ -172,6 +172,27 @@ This is the `snapshot_parser_lib.lib` library, delivered to the `./tests/lib/win ### Additional Build Options ### +__Single Linux C-API Shared Library__ + +By default, Linux builds create versioned `libopencsd_c_api.so` libraries and symbolic links. +The C API library also requires `libopencsd.so` at runtime. + +To build a single shared library instead, use: + +`make OCSD_CAPI_SINGLE_SO=1` + +This creates a single, unversioned `libopencsd_c_api.so` by statically linking `libopencsd.a`. +As a result, no versioned libraries or symbolic links are created, and there is no runtime dependency on `libopencsd.so`. + +This option is intended for cases where `libopencsd_c_api.so` is copied directly from the build output into another package. + +The standard `make install` target continues to install the versioned shared libraries and symlink chain. + +This configuration mirrors the Windows delivery model and removes the runtime dependency on `libopencsd.so`. + +This option is available only for Unix Makefile builds. + + __Library Virtual Address Size__ The ocsd_if_types.h file includes a #define that controls the size of the virtual addresses