1*01826a49SYabin Cui# ############################################################################# 2*01826a49SYabin Cui# Copyright (c) 2018-present Dima Krasner <[email protected]> 3*01826a49SYabin Cui# lzutao <taolzu(at)gmail.com> 4*01826a49SYabin Cui# All rights reserved. 5*01826a49SYabin Cui# 6*01826a49SYabin Cui# This source code is licensed under both the BSD-style license (found in the 7*01826a49SYabin Cui# LICENSE file in the root directory of this source tree) and the GPLv2 (found 8*01826a49SYabin Cui# in the COPYING file in the root directory of this source tree). 9*01826a49SYabin Cui# ############################################################################# 10*01826a49SYabin Cui 11*01826a49SYabin Cuizstd_rootdir = '../../..' 12*01826a49SYabin Cui 13*01826a49SYabin Cuilibzstd_includes = [include_directories(join_paths(zstd_rootdir,'lib'), 14*01826a49SYabin Cui join_paths(zstd_rootdir, 'lib/common'), 15*01826a49SYabin Cui join_paths(zstd_rootdir, 'lib/compress'), 16*01826a49SYabin Cui join_paths(zstd_rootdir, 'lib/decompress'), 17*01826a49SYabin Cui join_paths(zstd_rootdir, 'lib/dictBuilder'))] 18*01826a49SYabin Cui 19*01826a49SYabin Cuilibzstd_sources = [join_paths(zstd_rootdir, 'lib/common/entropy_common.c'), 20*01826a49SYabin Cui join_paths(zstd_rootdir, 'lib/common/fse_decompress.c'), 21*01826a49SYabin Cui join_paths(zstd_rootdir, 'lib/common/threading.c'), 22*01826a49SYabin Cui join_paths(zstd_rootdir, 'lib/common/pool.c'), 23*01826a49SYabin Cui join_paths(zstd_rootdir, 'lib/common/zstd_common.c'), 24*01826a49SYabin Cui join_paths(zstd_rootdir, 'lib/common/error_private.c'), 25*01826a49SYabin Cui join_paths(zstd_rootdir, 'lib/common/xxhash.c'), 26*01826a49SYabin Cui join_paths(zstd_rootdir, 'lib/compress/hist.c'), 27*01826a49SYabin Cui join_paths(zstd_rootdir, 'lib/compress/fse_compress.c'), 28*01826a49SYabin Cui join_paths(zstd_rootdir, 'lib/compress/huf_compress.c'), 29*01826a49SYabin Cui join_paths(zstd_rootdir, 'lib/compress/zstd_compress.c'), 30*01826a49SYabin Cui join_paths(zstd_rootdir, 'lib/compress/zstd_compress_literals.c'), 31*01826a49SYabin Cui join_paths(zstd_rootdir, 'lib/compress/zstd_compress_sequences.c'), 32*01826a49SYabin Cui join_paths(zstd_rootdir, 'lib/compress/zstd_compress_superblock.c'), 33*01826a49SYabin Cui join_paths(zstd_rootdir, 'lib/compress/zstdmt_compress.c'), 34*01826a49SYabin Cui join_paths(zstd_rootdir, 'lib/compress/zstd_fast.c'), 35*01826a49SYabin Cui join_paths(zstd_rootdir, 'lib/compress/zstd_double_fast.c'), 36*01826a49SYabin Cui join_paths(zstd_rootdir, 'lib/compress/zstd_lazy.c'), 37*01826a49SYabin Cui join_paths(zstd_rootdir, 'lib/compress/zstd_opt.c'), 38*01826a49SYabin Cui join_paths(zstd_rootdir, 'lib/compress/zstd_ldm.c'), 39*01826a49SYabin Cui join_paths(zstd_rootdir, 'lib/decompress/huf_decompress.c'), 40*01826a49SYabin Cui join_paths(zstd_rootdir, 'lib/decompress/zstd_decompress.c'), 41*01826a49SYabin Cui join_paths(zstd_rootdir, 'lib/decompress/zstd_decompress_block.c'), 42*01826a49SYabin Cui join_paths(zstd_rootdir, 'lib/decompress/zstd_ddict.c'), 43*01826a49SYabin Cui join_paths(zstd_rootdir, 'lib/dictBuilder/cover.c'), 44*01826a49SYabin Cui join_paths(zstd_rootdir, 'lib/dictBuilder/fastcover.c'), 45*01826a49SYabin Cui join_paths(zstd_rootdir, 'lib/dictBuilder/divsufsort.c'), 46*01826a49SYabin Cui join_paths(zstd_rootdir, 'lib/dictBuilder/zdict.c')] 47*01826a49SYabin Cui 48*01826a49SYabin Cui# really we need anything that defines __GNUC__ as that is what ZSTD_ASM_SUPPORTED is gated on 49*01826a49SYabin Cui# but these are the two compilers that are supported in tree and actually handle this correctly 50*01826a49SYabin Cui# Otherwise, explicitly disable assembly. 51*01826a49SYabin Cuiif [compiler_gcc, compiler_clang].contains(cc_id) 52*01826a49SYabin Cui libzstd_sources += join_paths(zstd_rootdir, 'lib/decompress/huf_decompress_amd64.S') 53*01826a49SYabin Cuielse 54*01826a49SYabin Cui add_project_arguments('-DZSTD_DISABLE_ASM', language: 'c') 55*01826a49SYabin Cuiendif 56*01826a49SYabin Cui 57*01826a49SYabin Cui# Explicit define legacy support 58*01826a49SYabin Cuiadd_project_arguments('-DZSTD_LEGACY_SUPPORT=@0@'.format(legacy_level), 59*01826a49SYabin Cui language: 'c') 60*01826a49SYabin Cui 61*01826a49SYabin Cuiif legacy_level == 0 62*01826a49SYabin Cui message('Legacy support: DISABLED') 63*01826a49SYabin Cuielse 64*01826a49SYabin Cui # See ZSTD_LEGACY_SUPPORT of lib/README.md 65*01826a49SYabin Cui message('Enable legacy support back to version 0.@0@'.format(legacy_level)) 66*01826a49SYabin Cui 67*01826a49SYabin Cui libzstd_includes += [ include_directories(join_paths(zstd_rootdir, 'lib/legacy')) ] 68*01826a49SYabin Cui foreach i : [1, 2, 3, 4, 5, 6, 7] 69*01826a49SYabin Cui if legacy_level <= i 70*01826a49SYabin Cui libzstd_sources += join_paths(zstd_rootdir, 'lib/legacy/zstd_v0@[email protected]'.format(i)) 71*01826a49SYabin Cui endif 72*01826a49SYabin Cui endforeach 73*01826a49SYabin Cuiendif 74*01826a49SYabin Cui 75*01826a49SYabin Cuilibzstd_deps = [] 76*01826a49SYabin Cuiif use_multi_thread 77*01826a49SYabin Cui message('Enable multi-threading support') 78*01826a49SYabin Cui add_project_arguments('-DZSTD_MULTITHREAD', language: 'c') 79*01826a49SYabin Cui libzstd_deps = [ thread_dep ] 80*01826a49SYabin Cuiendif 81*01826a49SYabin Cui 82*01826a49SYabin Cuilibzstd_c_args = [] 83*01826a49SYabin Cuiif cc_id == compiler_msvc 84*01826a49SYabin Cui if default_library_type != 'static' 85*01826a49SYabin Cui libzstd_sources += [windows_mod.compile_resources( 86*01826a49SYabin Cui join_paths(zstd_rootdir, 'build/VS2010/libzstd-dll/libzstd-dll.rc'), 87*01826a49SYabin Cui include_directories: libzstd_includes)] 88*01826a49SYabin Cui libzstd_c_args += ['-DZSTD_DLL_EXPORT=1', 89*01826a49SYabin Cui '-DZSTD_HEAPMODE=0', 90*01826a49SYabin Cui '-D_CONSOLE', 91*01826a49SYabin Cui '-D_CRT_SECURE_NO_WARNINGS'] 92*01826a49SYabin Cui else 93*01826a49SYabin Cui libzstd_c_args += ['-DZSTD_HEAPMODE=0', 94*01826a49SYabin Cui '-D_CRT_SECURE_NO_WARNINGS'] 95*01826a49SYabin Cui endif 96*01826a49SYabin Cuiendif 97*01826a49SYabin Cui 98*01826a49SYabin Cuimingw_ansi_stdio_flags = [] 99*01826a49SYabin Cuiif host_machine_os == os_windows and cc_id == compiler_gcc 100*01826a49SYabin Cui mingw_ansi_stdio_flags = [ '-D__USE_MINGW_ANSI_STDIO' ] 101*01826a49SYabin Cuiendif 102*01826a49SYabin Cuilibzstd_c_args += mingw_ansi_stdio_flags 103*01826a49SYabin Cui 104*01826a49SYabin Cuilibzstd_debug_cflags = [] 105*01826a49SYabin Cuiif use_debug 106*01826a49SYabin Cui libzstd_c_args += '-DDEBUGLEVEL=@0@'.format(debug_level) 107*01826a49SYabin Cui if cc_id == compiler_gcc or cc_id == compiler_clang 108*01826a49SYabin Cui libzstd_debug_cflags = ['-Wstrict-aliasing=1', '-Wswitch-enum', 109*01826a49SYabin Cui '-Wdeclaration-after-statement', '-Wstrict-prototypes', 110*01826a49SYabin Cui '-Wundef', '-Wpointer-arith', '-Wvla', 111*01826a49SYabin Cui '-Wformat=2', '-Winit-self', '-Wfloat-equal', '-Wwrite-strings', 112*01826a49SYabin Cui '-Wredundant-decls', '-Wmissing-prototypes', '-Wc++-compat'] 113*01826a49SYabin Cui endif 114*01826a49SYabin Cuiendif 115*01826a49SYabin Cuilibzstd_c_args += cc.get_supported_arguments(libzstd_debug_cflags) 116*01826a49SYabin Cui 117*01826a49SYabin Cuilibzstd = library('zstd', 118*01826a49SYabin Cui libzstd_sources, 119*01826a49SYabin Cui include_directories: libzstd_includes, 120*01826a49SYabin Cui c_args: libzstd_c_args, 121*01826a49SYabin Cui gnu_symbol_visibility: 'hidden', 122*01826a49SYabin Cui dependencies: libzstd_deps, 123*01826a49SYabin Cui install: true, 124*01826a49SYabin Cui version: zstd_libversion) 125*01826a49SYabin Cui 126*01826a49SYabin Cuilibzstd_dep = declare_dependency(link_with: libzstd, 127*01826a49SYabin Cui include_directories: libzstd_includes) 128*01826a49SYabin Cui 129*01826a49SYabin Cui# we link to both: 130*01826a49SYabin Cui# - the shared library (for public symbols) 131*01826a49SYabin Cui# - the static library (for private symbols) 132*01826a49SYabin Cui# 133*01826a49SYabin Cui# this is needed because internally private symbols are used all the time, and 134*01826a49SYabin Cui# -fvisibility=hidden means those cannot be found 135*01826a49SYabin Cuiif get_option('default_library') == 'static' 136*01826a49SYabin Cui libzstd_static = libzstd 137*01826a49SYabin Cui libzstd_internal_dep = libzstd_dep 138*01826a49SYabin Cuielse 139*01826a49SYabin Cui if get_option('default_library') == 'shared' 140*01826a49SYabin Cui libzstd_static = static_library('zstd_objlib', 141*01826a49SYabin Cui objects: libzstd.extract_all_objects(recursive: true), 142*01826a49SYabin Cui build_by_default: false) 143*01826a49SYabin Cui else 144*01826a49SYabin Cui libzstd_static = libzstd.get_static_lib() 145*01826a49SYabin Cui endif 146*01826a49SYabin Cui 147*01826a49SYabin Cui if cc_id == compiler_msvc 148*01826a49SYabin Cui # msvc does not actually support linking to both, but errors out with: 149*01826a49SYabin Cui # error LNK2005: ZSTD_<foo> already defined in zstd.lib(zstd-1.dll) 150*01826a49SYabin Cui libzstd_internal_dep = declare_dependency(link_with: libzstd_static) 151*01826a49SYabin Cui else 152*01826a49SYabin Cui libzstd_internal_dep = declare_dependency(link_with: libzstd, 153*01826a49SYabin Cui # the static library must be linked after the shared one 154*01826a49SYabin Cui dependencies: declare_dependency(link_with: libzstd_static)) 155*01826a49SYabin Cui endif 156*01826a49SYabin Cuiendif 157*01826a49SYabin Cui 158*01826a49SYabin Cuipkgconfig.generate(libzstd, 159*01826a49SYabin Cui name: 'libzstd', 160*01826a49SYabin Cui filebase: 'libzstd', 161*01826a49SYabin Cui description: 'fast lossless compression algorithm library', 162*01826a49SYabin Cui version: zstd_libversion, 163*01826a49SYabin Cui url: 'https://facebook.github.io/zstd/') 164*01826a49SYabin Cui 165*01826a49SYabin Cuiinstall_headers(join_paths(zstd_rootdir, 'lib/zstd.h'), 166*01826a49SYabin Cui join_paths(zstd_rootdir, 'lib/zdict.h'), 167*01826a49SYabin Cui join_paths(zstd_rootdir, 'lib/zstd_errors.h')) 168