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