# #############################################################################
# Copyright (c) 2018-present     Dima Krasner <dima@dimakrasner.com>
#                                lzutao <taolzu(at)gmail.com>
# All rights reserved.
#
# This source code is licensed under both the BSD-style license (found in the
# LICENSE file in the root directory of this source tree) and the GPLv2 (found
# in the COPYING file in the root directory of this source tree).
# #############################################################################

zstd_rootdir = '../../..'

zstd_programs_sources = [join_paths(zstd_rootdir, 'programs/zstdcli.c'),
  join_paths(zstd_rootdir, 'programs/util.c'),
  join_paths(zstd_rootdir, 'programs/timefn.c'),
  join_paths(zstd_rootdir, 'programs/fileio.c'),
  join_paths(zstd_rootdir, 'programs/fileio_asyncio.c'),
  join_paths(zstd_rootdir, 'programs/benchfn.c'),
  join_paths(zstd_rootdir, 'programs/benchzstd.c'),
  join_paths(zstd_rootdir, 'programs/datagen.c'),
  join_paths(zstd_rootdir, 'programs/dibio.c'),
  join_paths(zstd_rootdir, 'programs/zstdcli_trace.c')]

zstd_deps = [ libzstd_internal_dep ]
zstd_c_args = libzstd_debug_cflags

zstd_frugal_deps = [ libzstd_internal_dep ]
zstd_frugal_c_args = [ '-DZSTD_NOBENCH', '-DZSTD_NODICT', '-DZSTD_NOTRACE' ]

if use_multi_thread
  zstd_deps += [ thread_dep ]
  zstd_c_args += [ '-DZSTD_MULTITHREAD' ]
  zstd_frugal_deps += [ thread_dep ]
  zstd_frugal_c_args += [ '-DZSTD_MULTITHREAD' ]
endif

if use_zlib
  zstd_deps += [ zlib_dep ]
  zstd_c_args += [ '-DZSTD_GZCOMPRESS', '-DZSTD_GZDECOMPRESS' ]
endif

if use_lzma
  zstd_deps += [ lzma_dep ]
  zstd_c_args += [ '-DZSTD_LZMACOMPRESS', '-DZSTD_LZMADECOMPRESS' ]
endif

if use_lz4
  zstd_deps += [ lz4_dep ]
  zstd_c_args += [ '-DZSTD_LZ4COMPRESS', '-DZSTD_LZ4DECOMPRESS' ]
endif

export_dynamic_on_windows = false
# explicit backtrace enable/disable for Linux & Darwin
have_execinfo = cc.has_header('execinfo.h', required: use_backtrace)
if not have_execinfo
  zstd_c_args += '-DBACKTRACE_ENABLE=0'
elif use_debug and host_machine_os == os_windows  # MinGW target
  zstd_c_args += '-DBACKTRACE_ENABLE=1'
  export_dynamic_on_windows = true
endif

if cc_id == compiler_msvc
  if default_library_type != 'static'
    zstd_programs_sources += [windows_mod.compile_resources(
      join_paths(zstd_rootdir, 'build/VS2010/zstd/zstd.rc'),
      include_directories: libzstd_includes)]
  endif
endif

zstd = executable('zstd',
  zstd_programs_sources,
  c_args: zstd_c_args,
  dependencies: zstd_deps,
  export_dynamic: export_dynamic_on_windows, # Since Meson 0.45.0
  build_by_default: bin_programs,
  install: bin_programs)

if not bin_programs
  # we generate rules to build the programs, but don't install anything
  # so do not continue to installing scripts and manpages
  subdir_done()
endif

zstd_frugal_sources = [join_paths(zstd_rootdir, 'programs/zstdcli.c'),
  join_paths(zstd_rootdir, 'programs/timefn.c'),
  join_paths(zstd_rootdir, 'programs/util.c'),
  join_paths(zstd_rootdir, 'programs/fileio.c'),
  join_paths(zstd_rootdir, 'programs/fileio_asyncio.c')]

# Minimal target, with only zstd compression and decompression.
# No bench. No legacy.
executable('zstd-frugal',
  zstd_frugal_sources,
  dependencies: zstd_frugal_deps,
  c_args: zstd_frugal_c_args,
  install: true)

install_data(join_paths(zstd_rootdir, 'programs/zstdgrep'),
  join_paths(zstd_rootdir, 'programs/zstdless'),
  install_dir: zstd_bindir)

# =============================================================================
# Programs and manpages installing
# =============================================================================

install_man(join_paths(zstd_rootdir, 'programs/zstd.1'),
  join_paths(zstd_rootdir, 'programs/zstdgrep.1'),
  join_paths(zstd_rootdir, 'programs/zstdless.1'))

InstallSymlink_py = '../InstallSymlink.py'
zstd_man1_dir = join_paths(zstd_mandir, 'man1')
bin_EXT = host_machine_os == os_windows ? '.exe' : ''
man1_EXT = meson.version().version_compare('>=0.49.0') ? '.1' : '.1.gz'

foreach f : ['zstdcat', 'unzstd']
  meson.add_install_script(InstallSymlink_py, 'zstd' + bin_EXT, f + bin_EXT, zstd_bindir)
  meson.add_install_script(InstallSymlink_py, 'zstd' + man1_EXT, f + man1_EXT, zstd_man1_dir)
endforeach

if use_multi_thread
  meson.add_install_script(InstallSymlink_py, 'zstd' + bin_EXT, 'zstdmt' + bin_EXT, zstd_bindir)
  meson.add_install_script(InstallSymlink_py, 'zstd' + man1_EXT, 'zstdmt' + man1_EXT, zstd_man1_dir)
endif
