libzstd_dep = declare_dependency(link_with: libzstd,
include_directories: libzstd_includes)
+# we link to both:
+# - the shared library (for public symbols)
+# - the static library (for private symbols)
+#
+# this is needed because internally private symbols are used all the time, and
+# -fvisibility=hidden means those cannot be found
+if get_option('default_library') == 'static'
+ libzstd_static = libzstd
+ libzstd_internal_dep = libzstd_dep
+else
+ if get_option('default_library') == 'shared'
+ libzstd_static = static_library('zstd_objlib',
+ objects: libzstd.extract_all_objects(recursive: true),
+ build_by_default: false)
+ else
+ libzstd_static = libzstd.get_static_lib()
+ endif
+
+ if cc_id == compiler_msvc
+ # msvc does not actually support linking to both, but errors out with:
+ # error LNK2005: ZSTD_<foo> already defined in zstd.lib(zstd-1.dll)
+ libzstd_internal_dep = declare_dependency(link_with: libzstd_static)
+ else
+ libzstd_internal_dep = declare_dependency(link_with: libzstd,
+ # the static library must be linked after the shared one
+ dependencies: declare_dependency(link_with: libzstd_static))
+ endif
+endif
+
pkgconfig.generate(libzstd,
name: 'libzstd',
filebase: 'libzstd',
join_paths(zstd_rootdir, 'programs/dibio.c'),
join_paths(zstd_rootdir, 'programs/zstdcli_trace.c')]
-zstd_deps = [ libzstd_dep ]
+zstd_deps = [ libzstd_internal_dep ]
zstd_c_args = libzstd_debug_cflags
-zstd_frugal_deps = [ libzstd_dep ]
+zstd_frugal_deps = [ libzstd_internal_dep ]
zstd_frugal_c_args = [ '-DZSTD_NOBENCH', '-DZSTD_NODICT', '-DZSTD_NOTRACE' ]
if use_multi_thread
zstd_programs_sources,
c_args: zstd_c_args,
dependencies: zstd_deps,
- # needed due to use of private symbol + -fvisibility=hidden
- objects: libzstd.extract_objects(
- join_paths(zstd_rootdir, 'lib/common/xxhash.c'),
- join_paths(zstd_rootdir, 'lib/common/pool.c'),
- join_paths(zstd_rootdir, 'lib/common/zstd_common.c'),
- join_paths(zstd_rootdir, 'lib/common/error_private.c')),
export_dynamic: export_dynamic_on_windows, # Since Meson 0.45.0
install: true)
executable('zstd-frugal',
zstd_frugal_sources,
dependencies: zstd_frugal_deps,
- # needed due to use of private symbol + -fvisibility=hidden
- objects: libzstd.extract_objects(
- join_paths(zstd_rootdir, 'lib/common/pool.c'),
- join_paths(zstd_rootdir, 'lib/common/zstd_common.c'),
- join_paths(zstd_rootdir, 'lib/common/error_private.c')),
c_args: zstd_frugal_c_args,
install: true)
testcommon = static_library('testcommon',
testcommon_sources,
# needed due to use of private symbol + -fvisibility=hidden
- objects: libzstd.extract_all_objects(recursive: false))
+ link_with: libzstd_static)
testcommon_dep = declare_dependency(link_with: testcommon,
dependencies: libzstd_deps,