# Define object library zstd
add_library(zstd_objs OBJECT
  zstd_src/bitstream.h
  zstd_src/entropy_common.c
  zstd_src/error_private.c
  zstd_src/error_private.h
  zstd_src/fse_compress.c
  zstd_src/fse_decompress.c
  zstd_src/fse.h
  zstd_src/huf_compress.c
  zstd_src/huf_decompress.c
  zstd_src/huf.h
  zstd_src/mem.h
  zstd_src/xxhash.c
  zstd_src/xxhash.h
  zstd_src/zbuff_compress.c
  zstd_src/zbuff_decompress.c
  zstd_src/zbuff.h
  zstd_src/zstd_common.c
  zstd_src/zstd_compress.c
  zstd_src/zstd_decompress.c
  zstd_src/zstd_errors.h
  zstd_src/zstd.h
  zstd_src/zstd_internal.h
  zstd_src/zstd_legacy.h
  zstd_src/zstd_opt.h
  zstd_src/zstd_v01.c
  zstd_src/zstd_v01.h
  zstd_src/zstd_v02.c
  zstd_src/zstd_v02.h
  zstd_src/zstd_v03.c
  zstd_src/zstd_v03.h
  zstd_src/zstd_v04.c
  zstd_src/zstd_v04.h
  zstd_src/zstd_v05.c
  zstd_src/zstd_v05.h
  zstd_src/zstd_v06.c
  zstd_src/zstd_v06.h
  zstd_src/zstd_v07.c
  zstd_src/zstd_v07.h
  ob_zstd_wrapper.cpp
  ob_zstd_wrapper.h)

if(NOT WIN32)
  target_compile_options(zstd_objs PRIVATE -fvisibility=hidden)
endif()
target_link_libraries(zstd_objs PUBLIC oblib_base)

if(WIN32)
  # On Windows, use llvm-lib to create a static library from COFF object files
  add_custom_command(
    OUTPUT zstd_objs.lib
    COMMAND llvm-lib /OUT:zstd_objs.lib $<TARGET_OBJECTS:zstd_objs>
    DEPENDS zstd_objs
    COMMAND_EXPAND_LISTS
    )
  oblib_add_extra_objects(${CMAKE_CURRENT_BINARY_DIR}/zstd_objs.lib)
  set_source_files_properties(zstd_objs.lib PROPERTIES GENERATED TRUE)
  oblib_add_library(zstd zstd_objs.lib)
else()
  # On Unix/Linux/macOS, use ld -r for partial linking
  add_custom_command(
    OUTPUT zstd_objs.o
    COMMAND ${OB_LD_BIN} ${ARCH_ARGS} ${OB_DEPLOY} -r $<TARGET_OBJECTS:zstd_objs> -o zstd_objs.tmp.o
    COMMAND ${OB_OBJCOPY_BIN} --localize-hidden zstd_objs.tmp.o zstd_objs.o
    DEPENDS zstd_objs
    COMMAND_EXPAND_LISTS
    )
  oblib_add_extra_objects(${CMAKE_CURRENT_BINARY_DIR}/zstd_objs.o)
  set_source_files_properties(zstd_objs.o PROPERTIES GENERATED TRUE)
  oblib_add_library(zstd zstd_objs.o)
endif()

set_target_properties(zstd PROPERTIES LINKER_LANGUAGE C)
