Artifact [2de290ad81]

Artifact 2de290ad8139ba49d4d783d5288090f8a31e8f2b:


###################
## CONFIGURATION ##
###################

# Codecs
# You can enable or disable compilation of individual codecs here
set(USE_7Z                1)
set(USE_AR                0) # inefficient. And I've seen an infinite loop
set(USE_BCL               0) # inefficient
set(USE_BLAKE2            0) # doesn't compile with MSVC10. Requires SSE2, so you need to enable it below too.
set(USE_BLOSC             0) # inefficient
set(USE_BLZ               0) # inefficient
set(USE_BROTLI            0) # very slow compressor
set(USE_BZ2               0) # there are barely any competitors for it
set(USE_CITYHASH          0) # superseeded by farmhash
set(USE_CRAPWOW           0) # weak and while fast, there are much faster ones
set(USE_CRUSH             0) # Nothing great
set(USE_CRYPTOPP          0) # doesn't link on my FreeBSD
set(USE_DOBOZ             0) # inefficient
set(USE_ECRYPT            1)
set(USE_FARMHASH          1)
set(USE_FASTCRYPTO        1)
set(USE_FASTLZ            0) # inefficient
set(USE_FSE               0) # crashes on scc/clang 3.1; decoding fails on anything with gcc 4.2 on my FreeBSD box
set(USE_GIPFELI           0) # rarely works...
set(USE_HALIBUT           0) # inefficient
set(USE_LODEPNG           0) # inefficient
set(USE_LRRLE             1)
set(USE_LZ4               1)
set(USE_LZF               1)
set(USE_LZFX              0) # inefficient
set(USE_LZG               0) # inefficient
set(USE_LZHAM             0) # known to cause problems on some platforms
set(USE_LZMAT             1)
set(USE_LZO               1)
set(USE_LZP_DS            0) # inefficient
set(USE_LZSS_IM           0) # inefficient
set(USE_LZV1              0) # inefficient
set(USE_LZWC              0) # inefficient
set(USE_LZX_COMPRESS      0) # inefficient, no decompressor
set(USE_MINIZ             1)
set(USE_MMINI             0) # doesn't compile with MSVC10
set(USE_MURMUR            1)
set(USE_NAKAMICHI         1)
set(USE_NOBUO_ITO_LZSS    0) # inefficient
set(USE_NRV               0) # inefficient
set(USE_PG_LZ             0) # inefficient
set(USE_QUICKLZ           1)
set(USE_QUICKLZZIP        0) # quite good, but single-threaded. I may fix it one day.
set(USE_RLE64             0) # obsoleted by lrrle
set(USE_SANMAYCE_FNV      1)
set(USE_SCZ               0) # single threaded and far too inefficient to be worth fixing...
set(USE_SHA3_RND1         0) # didn't make it to the final...
set(USE_SHA3_RND2         0) # didn't make it to the final...
set(USE_SHA3_RND3         1)
set(USE_SHA3_RND3_GROESTL 0) # doesn't compile with MSVC10
set(USE_SHRINKER          0) # doesn't work on some platforms
set(USE_SIPHASH           1)
set(USE_SNAPPY            1)
set(USE_SPOOKY            1)
set(USE_TINF              0) # inefficient
set(USE_TOR               0) # doesn't compile on OSX
set(USE_WFLZ              1)
set(USE_XXHASH            1)
set(USE_YAPPY             0) # Nothing great
set(USE_Z3LIB             0) # Nothing great
set(USE_ZFS               0) # Nothing great
set(USE_ZLIB              1)
set(USE_ZLIB_INTEL        0)
set(USE_ZLING             1)
set(USE_ZOPFLI            1)
set(USE_ZSTD              1)

# This script can feed certain compilers with additional optimisation flags aside from the usual -O2 or so. Other compilers use the defaults.
# If you don't want the extra flags, set the variable below to 0
set(OPTIMIZE_COMPILER_FLAGS 0)

# Set it to 1 to enable SSE2 in codecs that support it.
# Currently it's used only by Yappy and on my machine it hurts speed slightly
# note: if you set it to 1, you may have to set CPU architecture in compiler flags
set(USE_SSE2 0)

# if 1, codecs can use inline asm
# please note that very few codecs support it and sometimes when a codec does, its implementation in fsbench doesn't
set(USE_ASM 0)

# Type of a build
set(CMAKE_BUILD_TYPE Release)

#############################################
## CODE, NORMALLY YOU SHOULDN'T EDIT BELOW ##
#############################################

cmake_minimum_required(VERSION 2.6)
project (FSBENCH) 


include_directories (${FSBENCH_SOURCE_DIR})
include_directories (${FSBENCH_SOURCE_DIR}/codecs)
#------------#
# validation #
#------------#
IF(USE_ZLIB AND USE_ZLIB_INTEL)
    message(FATAL_ERROR "This project doesn't allow you to build both intel and non-intel versions of zlib at the same time")
ENDIF(USE_ZLIB AND USE_ZLIB_INTEL)


#-------------------#
# platform-specific #
#-------------------#

# autodetect architecture
# fsbench was tested only on x86 and AMD64
# expect troubles elsewhere

IF(${CMAKE_C_SIZEOF_DATA_PTR} STREQUAL 4)
    set(ARCH "x86")
ELSEIF(${CMAKE_C_SIZEOF_DATA_PTR} STREQUAL 8)
    set(ARCH "AMD64")
ELSE(${CMAKE_C_SIZEOF_DATA_PTR} STREQUAL 4)
    message(FATAL_ERROR "CMAKE_C_SIZEOF_DATA_PTR is neither 4 nor 8. This is not supported")
ENDIF(${CMAKE_C_SIZEOF_DATA_PTR} STREQUAL 4)

IF(${ARCH} STREQUAL "x86")
    IF(USE_SSE2)
        add_definitions( -DFSBENCH_SSE2) 
    ENDIF(USE_SSE2)
ENDIF(${ARCH} STREQUAL "x86")

IF(${ARCH} STREQUAL "AMD64")
    IF(USE_SSE2)
        add_definitions( -DFSBENCH_SSE2) 
    ENDIF(USE_SSE2)
    add_definitions(-DFREEARC_INTEL_BYTE_ORDER)
    add_definitions(-D__x86_64__)
ENDIF(${ARCH} STREQUAL "AMD64")
IF(${ARCH} STREQUAL "x86")
    add_definitions(-DFREEARC_INTEL_BYTE_ORDER)
ENDIF(${ARCH} STREQUAL "x86")

IF(MSVC) # Cmake doesn't use the strongest optimisation flags here, so I fix it myself
    string(REPLACE "/O2" "/Ox" CMAKE_CXX_FLAGS_RELEASE
    "${CMAKE_CXX_FLAGS_RELEASE}")
ENDIF(MSVC)
IF (CMAKE_HOST_APPLE)
    set(GCC_FLAGS "-fno-tree-vectorize") # the code crashes when I compile it with mingw 4.5.2 and w/out -fno-tree-vectorize
                                         # with mingw64 4.6.2 it's fine. Don't know what's up. FIXME.
ELSE (CMAKE_HOST_APPLE)
    set(GCC_FLAGS "-fno-tree-vectorize -static") # the code crashes when I compile it with mingw 4.5.2 and w/out -fno-tree-vectorize
                                                 # with mingw64 4.6.2 it's fine. Don't know what's up. FIXME.
ENDIF(CMAKE_HOST_APPLE)
set(GXX_FLAGS ${GCC_FLAGS})
set(MSVC_FLAGS "/W4")

#--------------#
# optimization #
#--------------#

IF(USE_ASM)
    add_definitions(-DFSBENCH_USE_ASM)
ENDIF(USE_ASM)

IF(OPTIMIZE_COMPILER_FLAGS)
    #gcc optimization
    set(GCC_FLAGS "${GCC_FLAGS} -fomit-frame-pointer -ffast-math -march=native -mtune=generic")
    set(GCC_LINKFLAGS "${GCC_LINKFLAGS} -s")

    set(GXX_FLAGS "${GXX_FLAGS} ${GCC_FLAGS}")

    #msvc optimization
    set(MSVC_FLAGS "${MSVC_FLAGS} /GF /GL /Gs /Gy /fp:fast /Ot")
    set(MSVC_LINK_FLAGS "${MSVC_LINK_FLAGS} /LTCG")
    IF(${ARCH} STREQUAL "x86")
        set(MSVC_FLAGS "${MSVC_FLAGS} /arch:SSE2")
    ENDIF(${ARCH} STREQUAL "x86")
ENDIF(OPTIMIZE_COMPILER_FLAGS)

#---------#
# sources #
#---------#

set(MAIN_SRC abstractCodecs.cpp benchmark.cpp codecs.cpp main.cpp scheduler.cpp simple_codecs.cpp tools.cpp)

IF(USE_7Z)
    include_directories (${FSBENCH_SOURCE_DIR}/codecs/7z/CPP) 
    include_directories (${FSBENCH_SOURCE_DIR}/codecs/7z/CPP/7zip) 
    set(7z_SRC 
        codecs/7z/7z.cpp

        codecs/7z/C/Alloc.c
        codecs/7z/C/HuffEnc.c
        codecs/7z/C/LzFind.c
        codecs/7z/C/Sort.c
        codecs/7z/CPP/7zip/Common/InBuffer.cpp
        codecs/7z/CPP/7zip/Common/OutBuffer.cpp
        codecs/7z/CPP/7zip/Compress/BitlDecoder.cpp
        codecs/7z/CPP/7zip/Compress/DeflateDecoder.cpp
        codecs/7z/CPP/7zip/Compress/DeflateEncoder.cpp
        codecs/7z/CPP/7zip/Compress/LzOutWindow.cpp

        # I didn't make the 2 below work
        #codecs/7z/CPP/7zip/Compress/Lzx86Converter.cpp
        #codecs/7z/CPP/7zip/Compress/LzxDecoder.cpp
        )

    add_definitions(-DFSBENCH_USE_7Z)
ENDIF(USE_7Z)

IF(USE_BCL)
    include_directories (${FSBENCH_SOURCE_DIR}/codecs/bcl/src)
    set(BCL_SRC 
        codecs/bcl/src/bcl.cpp

        codecs/bcl/src/huffman.c
        codecs/bcl/src/lz.c
        codecs/bcl/src/rle.c
        )

    add_definitions(-DFSBENCH_USE_BCL)
ENDIF(USE_BCL)

IF(USE_BROTLI)
    set(BROTLI_SRC
        codecs/brotli/enc/entropy_encode.cc
        codecs/brotli/enc/block_splitter.cc
        codecs/brotli/enc/prefix.cc
        codecs/brotli/enc/histogram.cc
        codecs/brotli/enc/encode.cc
        codecs/brotli/enc/literal_cost.cc
        codecs/brotli/enc/backward_references.cc
        codecs/brotli/dec/bit_reader.c
        codecs/brotli/dec/huffman.c
        codecs/brotli/dec/streams.c
        codecs/brotli/dec/safe_malloc.c
        codecs/brotli/dec/decode.c
        )

    add_definitions(-DFSBENCH_USE_BROTLI)
ENDIF(USE_BROTLI)

IF(USE_BZ2)
    include_directories (${FSBENCH_SOURCE_DIR}/codecs/bzip2-1.0.6)
    set(BZ2_SRC 
        codecs/bzip2-1.0.6/blocksort.c
        codecs/bzip2-1.0.6/bzlib.c
        codecs/bzip2-1.0.6/compress.c
        codecs/bzip2-1.0.6/crctable.c
        codecs/bzip2-1.0.6/decompress.c
        codecs/bzip2-1.0.6/huffman.c
        codecs/bzip2-1.0.6/randtable.c
        )

    add_definitions(-DFSBENCH_USE_BZ2)
ENDIF(USE_BZ2)

IF(USE_CRYPTOPP)
    include_directories (${FSBENCH_SOURCE_DIR}/codecs/cryptopp)
    set(CRYPTOPP_SRC 
        codecs/cryptopp/cryptopp.cpp

        codecs/cryptopp/adler32.cpp
        codecs/cryptopp/algparam.cpp
        codecs/cryptopp/cpu.cpp
        codecs/cryptopp/crc.cpp
        codecs/cryptopp/cryptlib.cpp
        codecs/cryptopp/filters.cpp
        codecs/cryptopp/fips140.cpp
        codecs/cryptopp/hrtimer.cpp
        codecs/cryptopp/iterhash.cpp
        codecs/cryptopp/md5.cpp
        codecs/cryptopp/misc.cpp
        codecs/cryptopp/mqueue.cpp
        codecs/cryptopp/queue.cpp
        codecs/cryptopp/sha.cpp
        codecs/cryptopp/vmac.cpp
        codecs/cryptopp/wait.cpp
        codecs/cryptopp/zdeflate.cpp
        codecs/cryptopp/zinflate.cpp)

    add_definitions(-DFSBENCH_USE_CRYPTOPP)
ENDIF(USE_CRYPTOPP)

IF(USE_ECRYPT)
    include_directories (${FSBENCH_SOURCE_DIR}/codecs/ecrypt/)
    set(ECRYPT_SRC
        codecs/ecrypt/fsbench_ecrypt.cpp

        codecs/ecrypt/aes-ctr-bernstein.c
        codecs/ecrypt/aes-ctr-hongjun.c
        codecs/ecrypt/chacha.c
        codecs/ecrypt/hc-128.c
        codecs/ecrypt/hc-256.c
        codecs/ecrypt/lex.c
        codecs/ecrypt/rabbit.c
        codecs/ecrypt/rc4.c
        codecs/ecrypt/salsa20-8.c
        codecs/ecrypt/salsa20-12.c
        codecs/ecrypt/salsa20.c
        codecs/ecrypt/snow-2.0.c
        codecs/ecrypt/sosemanuk.c
        codecs/ecrypt/trivium.c)
    add_definitions(-DFSBENCH_USE_ECRYPT)
ENDIF(USE_ECRYPT)

IF(USE_LZHAM)
    include_directories (${FSBENCH_SOURCE_DIR}/codecs/lzham/include) 
    include_directories (${FSBENCH_SOURCE_DIR}/codecs/lzham/lzhamcomp)
    include_directories (${FSBENCH_SOURCE_DIR}/codecs/lzham/lzhamdecomp) 
    set(LZHAM_SRC 
        codecs/lzham/lzhamcomp/lzham_lzbase.cpp codecs/lzham/lzhamcomp/lzham_lzcomp.cpp codecs/lzham/lzhamcomp/lzham_lzcomp_internal.cpp 
        codecs/lzham/lzhamcomp/lzham_lzcomp_state.cpp codecs/lzham/lzhamcomp/lzham_match_accel.cpp codecs/lzham/lzhamcomp/lzham_pthreads_threading.cpp 
        codecs/lzham/lzhamdecomp/lzham_assert.cpp codecs/lzham/lzhamdecomp/lzham_checksum.cpp codecs/lzham/lzhamdecomp/lzham_huffman_codes.cpp 
        codecs/lzham/lzhamdecomp/lzham_lzdecomp.cpp codecs/lzham/lzhamdecomp/lzham_lzdecompbase.cpp codecs/lzham/lzhamdecomp/lzham_mem.cpp 
        codecs/lzham/lzhamdecomp/lzham_platform.cpp codecs/lzham/lzhamdecomp/lzham_polar_codes.cpp codecs/lzham/lzhamdecomp/lzham_prefix_coding.cpp 
        codecs/lzham/lzhamdecomp/lzham_symbol_codec.cpp codecs/lzham/lzhamdecomp/lzham_timer.cpp codecs/lzham/lzhamdecomp/lzham_vector.cpp 
        codecs/lzham/lzhamlib/lzham_lib.cpp)

    add_definitions(-DFSBENCH_USE_LZHAM)
ENDIF(USE_LZHAM)

IF(USE_LZO)
    include_directories (${FSBENCH_SOURCE_DIR}/codecs/lzo) 
    set(LZO_SRC 
        codecs/lzo/lzo1.c
        codecs/lzo/lzo1a.c codecs/lzo/lzo1a_99.c
        codecs/lzo/lzo1b_1.c codecs/lzo/lzo1b_2.c codecs/lzo/lzo1b_3.c codecs/lzo/lzo1b_4.c codecs/lzo/lzo1b_5.c codecs/lzo/lzo1b_6.c codecs/lzo/lzo1b_7.c
        codecs/lzo/lzo1b_8.c codecs/lzo/lzo1b_9.c codecs/lzo/lzo1b_99.c codecs/lzo/lzo1b_9x.c codecs/lzo/lzo1b_cc.c codecs/lzo/lzo1b_d1.c codecs/lzo/lzo1b_rr.c
        codecs/lzo/lzo1c_1.c codecs/lzo/lzo1c_2.c codecs/lzo/lzo1c_3.c codecs/lzo/lzo1c_4.c codecs/lzo/lzo1c_5.c codecs/lzo/lzo1c_6.c codecs/lzo/lzo1c_7.c
        codecs/lzo/lzo1c_8.c codecs/lzo/lzo1c_9.c codecs/lzo/lzo1c_99.c codecs/lzo/lzo1c_9x.c codecs/lzo/lzo1c_cc.c codecs/lzo/lzo1c_d1.c codecs/lzo/lzo1c_rr.c
        codecs/lzo/lzo1f_1.c codecs/lzo/lzo1f_9x.c codecs/lzo/lzo1f_d1.c
        codecs/lzo/lzo1x_1.c codecs/lzo/lzo1x_1k.c codecs/lzo/lzo1x_1l.c codecs/lzo/lzo1x_1o.c
        codecs/lzo/lzo1x_9x.c codecs/lzo/lzo1x_d1.c codecs/lzo/lzo1x_o.c 
        codecs/lzo/lzo1y_1.c codecs/lzo/lzo1y_9x.c codecs/lzo/lzo1y_d1.c codecs/lzo/lzo1y_o.c codecs/lzo/lzo1z_9x.c codecs/lzo/lzo1z_d1.c
        codecs/lzo/lzo1_99.c codecs/lzo/lzo2a_9x.c codecs/lzo/lzo2a_d1.c codecs/lzo/lzo_init.c)

    add_definitions(-DFSBENCH_USE_LZO)
ENDIF(USE_LZO)

IF(USE_NRV)
    set(NRV_SRC 
        codecs/ucl/alloc.c
        codecs/ucl/n2b_99.c codecs/ucl/n2b_d.c
        codecs/ucl/n2d_99.c codecs/ucl/n2d_d.c
        codecs/ucl/n2e_99.c codecs/ucl/n2e_d.c)

    add_definitions(-DFSBENCH_USE_NRV)
ENDIF(USE_NRV)

IF(USE_ZOPFLI)
    include_directories (${FSBENCH_SOURCE_DIR}/codecs/zopfli) 
    set(ZOPFLI_SRC
        codecs/zopfli/blocksplitter.c
        codecs/zopfli/cache.c
        codecs/zopfli/deflate.c
        codecs/zopfli/hash.c
        codecs/zopfli/katajainen.c
        codecs/zopfli/lz77.c
        codecs/zopfli/squeeze.c
        codecs/zopfli/tree.c
        codecs/zopfli/util.c)
    add_definitions(-DFSBENCH_USE_ZOPFLI)
ENDIF(USE_ZOPFLI)

IF(USE_ZLIB)
    include_directories (${FSBENCH_SOURCE_DIR}/codecs/zlib) 
    set(ZLIB_SRC 
        codecs/zlib/adler32.c
        codecs/zlib/crc32.c
        codecs/zlib/deflate.c
        codecs/zlib/inffast.c
        codecs/zlib/inflate.c
        codecs/zlib/inftrees.c
        codecs/zlib/trees.c
        codecs/zlib/zutil.c)

    add_definitions(-DFSBENCH_USE_ZLIB)

    add_definitions(-DNO_VIZ) # Lack of this definition causes troubles sometimes
ENDIF(USE_ZLIB)

IF(USE_ZLIB_INTEL)
    include_directories (${FSBENCH_SOURCE_DIR}/codecs/zlib-intel) 
    set(ZLIB_SRC codecs/zlib-intel/adler32.c
                 codecs/zlib-intel/compress.c
                 codecs/zlib-intel/crc32.c
                 codecs/zlib-intel/crc_folding.c
                 codecs/zlib-intel/deflate.c
                 codecs/zlib-intel/fill_window_sse.c
                 codecs/zlib-intel/infback.c
                 codecs/zlib-intel/inffast.c
                 codecs/zlib-intel/inflate.c
                 codecs/zlib-intel/inftrees.c
                 codecs/zlib-intel/match.c
                 codecs/zlib-intel/trees.c
                 codecs/zlib-intel/uncompr.c
                 codecs/zlib-intel/x86.c
                 codecs/zlib-intel/zutil.c)

    add_definitions(-DFSBENCH_USE_ZLIB_INTEL)

    # quick mode doesn't compile on clang 3.1
    # add_definitions(-DUSE_QUICK)
    add_definitions(-DUSE_MEDIUM)
    IF(USE_SSE2)
        add_definitions(-DHAVE_SSE2)
    ENDIF(USE_SSE2)

    add_definitions(-DNO_VIZ) # Lack of this definition causes troubles sometimes
ENDIF(USE_ZLIB_INTEL)

IF(USE_ZLING)
    set(ZLING_SRC 
        codecs/zling/fsbench_zling.cpp

        codecs/zling/libzling.cpp
        codecs/zling/libzling_huffman.cpp
        codecs/zling/libzling_lz.cpp
        codecs/zling/libzling_utils.cpp)

    add_definitions(-DFSBENCH_USE_ZLING)
ENDIF(USE_ZLING)

IF(USE_AR)
    set(OTHER_SRC ${OTHER_SRC} codecs/ar/lzhclib.c codecs/ar/lzhxlib.c)
    add_definitions(-DFSBENCH_USE_AR)
ENDIF(USE_AR)

IF(USE_BLAKE2 AND USE_SSE2)
    # sadly, it's needed
    # Never tested on other compilers
    set(GCC_FLAGS "${GCC_FLAGS} -std=c99")

    include_directories (${FSBENCH_SOURCE_DIR}/codecs/blake2)
    set(OTHER_SRC ${OTHER_SRC} codecs/blake2/blake2b.c codecs/blake2/blake2bp.c codecs/blake2/blake2s.c codecs/blake2/blake2sp.c)
    add_definitions(-DFSBENCH_USE_BLAKE2)
ENDIF(USE_BLAKE2 AND USE_SSE2)

IF(USE_BLOSC)
    set(OTHER_SRC ${OTHER_SRC} codecs/blosc/blosclz.c)
    add_definitions(-DFSBENCH_USE_BLOSC)
ENDIF(USE_BLOSC)
IF(USE_BLZ)
    set(OTHER_SRC ${OTHER_SRC} codecs/brieflz/brieflz.c codecs/brieflz/blz_depack.c codecs/brieflz/blz_crc32.c)
    add_definitions(-DFSBENCH_USE_BLZ)
ENDIF(USE_BLZ)
IF(USE_CITYHASH)
    include_directories (${FSBENCH_SOURCE_DIR}/codecs/CityHash)
    set(OTHER_SRC ${OTHER_SRC} codecs/CityHash/city.cc)
    add_definitions(-DFSBENCH_USE_CITYHASH)
ENDIF(USE_CITYHASH)
IF(USE_CRAPWOW)
    set(OTHER_SRC ${OTHER_SRC} codecs/CrapWow.c)
    add_definitions(-DFSBENCH_USE_CRAPWOW)
ENDIF(USE_CRAPWOW)
IF(USE_CRUSH)
    include_directories (${FSBENCH_SOURCE_DIR}/codecs/crush) 
    set(OTHER_SRC ${OTHER_SRC} codecs/crush/crush.cpp)
    add_definitions(-DFSBENCH_USE_CRUSH)
ENDIF(USE_CRUSH)
IF(USE_DOBOZ)
    set(OTHER_SRC ${OTHER_SRC} codecs/Doboz/Compressor.cpp codecs/Doboz/Decompressor.cpp codecs/Doboz/Dictionary.cpp)
    add_definitions(-DFSBENCH_USE_DOBOZ)
ENDIF(USE_DOBOZ)
IF(USE_FARMHASH)
    include_directories (${FSBENCH_SOURCE_DIR}/codecs/farmhash/)
    set(OTHER_SRC ${OTHER_SRC} codecs/farmhash/farmhash.cc)
    add_definitions(-DFSBENCH_USE_FARMHASH)
ENDIF(USE_FARMHASH)
IF(USE_FASTCRYPTO)
    include_directories (${FSBENCH_SOURCE_DIR}/codecs/fastcrypto)
    set(OTHER_SRC ${OTHER_SRC} codecs/fastcrypto/rijndael-alg-fst.c codecs/fastcrypto/umac.c codecs/fastcrypto/vmac.c)
    add_definitions(-DFSBENCH_USE_FASTCRYPTO -DNAMESPACE_FOR_HASH_FUNCTIONS=farmhash)
ENDIF(USE_FASTCRYPTO)
IF(USE_FASTLZ)
    set(OTHER_SRC ${OTHER_SRC} codecs/fastlz.c)
    add_definitions(-DFSBENCH_USE_FASTLZ)
ENDIF(USE_FASTLZ)
IF(USE_FSE)
    include_directories (${FSBENCH_SOURCE_DIR}/codecs/fse)
    set(OTHER_SRC ${OTHER_SRC} codecs/fse/fse.c)
    add_definitions(-DFSBENCH_USE_FSE)
ENDIF(USE_FSE)
IF(USE_GIPFELI)
    include_directories (${FSBENCH_SOURCE_DIR}/codecs/gipfeli)
    set(OTHER_SRC ${OTHER_SRC} codecs/gipfeli/fsbench_gipfeli.cpp codecs/gipfeli/decompress.cc codecs/gipfeli/entropy.cc codecs/gipfeli/entropy_code_builder.cc codecs/gipfeli/gipfeli.cc codecs/gipfeli/lz77.cc)
    add_definitions(-DFSBENCH_USE_GIPFELI)
ENDIF(USE_GIPFELI)
IF(USE_HALIBUT)
    set(OTHER_SRC ${OTHER_SRC} codecs/halibut-deflate.c)
    add_definitions(-DFSBENCH_USE_HALIBUT)
ENDIF(USE_HALIBUT)
IF(USE_LODEPNG)
    set(OTHER_SRC ${OTHER_SRC} codecs/lodepng.cpp)
    add_definitions(-DFSBENCH_USE_LODEPNG)
ENDIF(USE_LODEPNG)
IF(USE_LZ4)
    include_directories (${FSBENCH_SOURCE_DIR}/codecs/lz4)
    set(OTHER_SRC ${OTHER_SRC} codecs/lz4/lz4.c codecs/lz4/lz4hc.c)
    add_definitions(-DFSBENCH_USE_LZ4)
ENDIF(USE_LZ4)
IF(USE_LZF)
    include_directories (${FSBENCH_SOURCE_DIR}/codecs/lzf) 
    set(OTHER_SRC ${OTHER_SRC} codecs/lzf/lzf_c.c codecs/lzf/lzf_c_ultra.c codecs/lzf/lzf_c_very.c codecs/lzf/lzf_d.c)
    add_definitions(-DFSBENCH_USE_LZF)
ENDIF(USE_LZF)
IF(USE_LZFX)
    set(OTHER_SRC ${OTHER_SRC} codecs/lzfx.c)
    add_definitions(-DFSBENCH_USE_LZFX)
ENDIF(USE_LZFX)
IF(USE_LZG)
    set(OTHER_SRC ${OTHER_SRC} codecs/liblzg/lib/checksum.c codecs/liblzg/lib/decode.c codecs/liblzg/lib/encode.c)
    add_definitions(-DFSBENCH_USE_LZG)
ENDIF(USE_LZG)
IF(USE_LZMAT)
    set(OTHER_SRC ${OTHER_SRC} codecs/lzmat_dec.c codecs/lzmat_enc.c)
    add_definitions(-DFSBENCH_USE_LZMAT)
ENDIF(USE_LZMAT)
IF(USE_LZP_DS)
    set(OTHER_SRC ${OTHER_SRC} codecs/LZP_ds.cpp)
    add_definitions(-DFSBENCH_USE_LZP_DS)
ENDIF(USE_LZP_DS)
IF(USE_LZSS_IM)
    set(OTHER_SRC ${OTHER_SRC} codecs/lzss.cpp)
    add_definitions(-DFSBENCH_USE_LZSS_IM)
ENDIF(USE_LZSS_IM)
IF(USE_LZV1)
    set(OTHER_SRC ${OTHER_SRC} codecs/lzv1.c)
    add_definitions(-DFSBENCH_USE_LZV1)
ENDIF(USE_LZV1)
IF(USE_LZWC)
    set(OTHER_SRC ${OTHER_SRC} codecs/LZWC.c)
    add_definitions(-DFSBENCH_USE_LZWC)
ENDIF(USE_LZWC)
IF(USE_LZX_COMPRESS)
    set(OTHER_SRC ${OTHER_SRC} codecs/lzx_compress/lz_nonslide.c codecs/lzx_compress/lzx_layer.c)
    add_definitions(-DFSBENCH_USE_LZX_COMPRESS)
ENDIF(USE_LZX_COMPRESS)
IF(USE_MINIZ)
    set(OTHER_SRC ${OTHER_SRC} codecs/miniz.cpp)
    add_definitions(-DFSBENCH_USE_MINIZ)
ENDIF(USE_MINIZ)
IF(USE_MMINI)
    include_directories (${FSBENCH_SOURCE_DIR}/codecs/mmini)
    set(OTHER_SRC ${OTHER_SRC} codecs/mmini/huffman.c codecs/mmini/lzl.c)
    add_definitions(-DFSBENCH_USE_MMINI)
ENDIF(USE_MMINI)
IF(USE_MURMUR)
    set(OTHER_SRC ${OTHER_SRC} codecs/MurmurHash3.cpp)
    add_definitions(-DFSBENCH_USE_MURMUR)
ENDIF(USE_MURMUR)
IF(USE_NAKAMICHI)
    include_directories (${FSBENCH_SOURCE_DIR}/codecs/nakamichi)
    include_directories (${FSBENCH_SOURCE_DIR}/codecs/nakamichi/divsufsort)
    set(OTHER_SRC ${OTHER_SRC} codecs/nakamichi/Nakamichi_r1-RSSBO_1GB_Wordfetcher_TRIAD_NOmemcpy_FIX_Kaidanji_FIX.c
                               codecs/nakamichi/Nakamichi_Aratama.c
                               codecs/nakamichi/Nakamichi_Butsuhira.c
                               codecs/nakamichi/Nakamichi_Butsuhira_branchless.c
                               codecs/nakamichi/Nakamichi_Daikuni.c
                               codecs/nakamichi/Nakamichi_Hanabi.c
                               codecs/nakamichi/Nakamichi_Hanazakari.c
                               codecs/nakamichi/Nakamichi_Hitomi.c
                               codecs/nakamichi/Nakamichi_Inazuma.c
                               codecs/nakamichi/Nakamichi_Jiten.c
                               codecs/nakamichi/Nakamichi_Kaibutsu.c
                               codecs/nakamichi/Nakamichi_Kaiko.c
                               codecs/nakamichi/Nakamichi_Kinezumi.c
                               codecs/nakamichi/Nakamichi_Kinroba.c
                               codecs/nakamichi/Nakamichi_Kinutora.c
                               codecs/nakamichi/Nakamichi_Kitsune.c
                               codecs/nakamichi/Nakamichi_Kumataka.c
                               codecs/nakamichi/Nakamichi_Nekomata.c
                               codecs/nakamichi/Nakamichi_Nin.c
                               codecs/nakamichi/Nakamichi_Nirenpatsu.c
                               codecs/nakamichi/Nakamichi_Sanbashi.c
                               codecs/nakamichi/Nakamichi_Sanagi.c
                               codecs/nakamichi/Nakamichi_Sanrenpatsu.c
                               codecs/nakamichi/Nakamichi_Sanshi.c
                               codecs/nakamichi/Nakamichi_Suiken.c
                               codecs/nakamichi/Nakamichi_Washi.c
                               codecs/nakamichi/Nakamichi_Yoko.c
                               codecs/nakamichi/Nakamichi_Zangetsu.c
                               codecs/nakamichi/nakamichi.c
                               codecs/nakamichi/divsufsort/divsufsort.c
                               codecs/nakamichi/divsufsort/sssort.c
                               codecs/nakamichi/divsufsort/trsort.c
                               codecs/nakamichi/divsufsort/utils.c)
    add_definitions(-DFSBENCH_USE_NAKAMICHI)
    add_definitions(-DNAKAMICHI_DIVSUFSORT_HAVE_CONFIG_H=1)
ENDIF(USE_NAKAMICHI)
IF(USE_NOBUO_ITO_LZSS)
    set(OTHER_SRC ${OTHER_SRC} codecs/Nobuo-Ito-LZSS.c)
    add_definitions(-DFSBENCH_USE_NOBUO_ITO_LZSS)
ENDIF(USE_NOBUO_ITO_LZSS)
IF(USE_PG_LZ)
    include_directories (${FSBENCH_SOURCE_DIR}/codecs/pg_lz)
    set(OTHER_SRC ${OTHER_SRC} codecs/pg_lz/pg_lzcompress.c)
    add_definitions(-DFSBENCH_USE_PG_LZ)
ENDIF(USE_PG_LZ)
IF(USE_QUICKLZ)
    include_directories (${FSBENCH_SOURCE_DIR}/codecs/quicklz) 
    set(OTHER_SRC ${OTHER_SRC} codecs/quicklz/quicklz1.c codecs/quicklz/quicklz2.c codecs/quicklz/quicklz3.c )
    add_definitions(-DFSBENCH_USE_QUICKLZ)
ENDIF(USE_QUICKLZ)
IF(USE_QUICKLZZIP)
    include_directories (${FSBENCH_SOURCE_DIR}/codecs/quicklz) 
    set(OTHER_SRC ${OTHER_SRC} codecs/quicklzzip.c)
    add_definitions(-DFSBENCH_USE_QUICKLZZIP)
ENDIF(USE_QUICKLZZIP)
IF(USE_RLE64)
    set(OTHER_SRC ${OTHER_SRC} codecs/RLE64.cpp)
    add_definitions(-DFSBENCH_USE_RLE64)
ENDIF(USE_RLE64)
IF(USE_LRRLE)
    set(OTHER_SRC ${OTHER_SRC} codecs/lrrle.c)
    add_definitions(-DFSBENCH_USE_LRRLE)
ENDIF(USE_LRRLE)
IF(USE_SANMAYCE_FNV)
    set(OTHER_SRC ${OTHER_SRC} codecs/sanmayce.c)
    add_definitions(-DFSBENCH_USE_SANMAYCE_FNV)
ENDIF(USE_SANMAYCE_FNV)
IF(USE_SCZ)
    include_directories (${FSBENCH_SOURCE_DIR}/codecs/scz_compress)
    set(OTHER_SRC ${OTHER_SRC} codecs/scz_compress/scz_compress_lib.c codecs/scz_compress/scz_decompress_lib.c codecs/scz_compress/scz.cpp)
    add_definitions(-DFSBENCH_USE_SCZ)
ENDIF(USE_SCZ)
IF(USE_SHA3_RND1 OR USE_SHA3_RND2 OR USE_SHA3_RND3 OR USE_SHA3_RND3_GROESTL)
    include_directories (${FSBENCH_SOURCE_DIR}/codecs/SHA3) 
    set(OTHER_SRC ${OTHER_SRC} codecs/SHA3/fsbench_SHA3.cpp)
    IF(USE_SHA3_RND1)
        add_definitions(-DFSBENCH_USE_SHA3_RND1)
    ENDIF(USE_SHA3_RND1)
    IF(USE_SHA3_RND2)
        add_definitions(-DFSBENCH_USE_SHA3_RND2)
    ENDIF(USE_SHA3_RND2)
    IF(USE_SHA3_RND3)
        add_definitions(-DFSBENCH_USE_SHA3_RND3)
    ENDIF(USE_SHA3_RND3)
    IF(USE_SHA3_RND3_GROESTL)
        add_definitions(-DFSBENCH_USE_SHA3_RND3_GROESTL)
    ENDIF(USE_SHA3_RND3_GROESTL)
ENDIF(USE_SHA3_RND1 OR USE_SHA3_RND2 OR USE_SHA3_RND3 OR USE_SHA3_RND3_GROESTL)
IF(USE_SHRINKER)
    set(OTHER_SRC ${OTHER_SRC} codecs/Shrinker.c)
    add_definitions(-DFSBENCH_USE_SHRINKER)
ENDIF(USE_SHRINKER)
IF(USE_SIPHASH)
    include_directories (${FSBENCH_SOURCE_DIR}/codecs/siphash) 
    set(OTHER_SRC ${OTHER_SRC} codecs/siphash/siphash24.c)
    add_definitions(-DFSBENCH_USE_SIPHASH)
ENDIF(USE_SIPHASH)
IF(USE_SNAPPY)
    include_directories (${FSBENCH_SOURCE_DIR}/codecs/snappy) 
    set(OTHER_SRC ${OTHER_SRC} codecs/snappy/snappy-sinksource.cc codecs/snappy/snappy-stubs-internal.cc codecs/snappy/snappy.cc)
    add_definitions(-DFSBENCH_USE_SNAPPY)
ENDIF(USE_SNAPPY)
IF(USE_SPOOKY)
    set(OTHER_SRC ${OTHER_SRC} codecs/SpookyV2.cpp)
    add_definitions(-DFSBENCH_USE_SPOOKY)
ENDIF(USE_SPOOKY)
IF(USE_TINF)
    include_directories (${FSBENCH_SOURCE_DIR}/codecs/tinf/src)
    set(OTHER_SRC ${OTHER_SRC} codecs/tinf/tinf.cpp codecs/tinf/src/tinflate.c)
    add_definitions(-DFSBENCH_USE_TINF)
ENDIF(USE_TINF)
IF(USE_TOR)
    IF(WIN32)
        add_definitions( -DFREEARC_WIN)
    ENDIF(WIN32)
    IF(UNIX)
        add_definitions(-DFREEARC_UNIX)
    ENDIF(UNIX)
    set(OTHER_SRC ${OTHER_SRC} codecs/tornado/tor_test.cpp)
    add_definitions(-DFSBENCH_USE_TOR)
    add_definitions(-D_UNICODE -DUNICODE)
ENDIF(USE_TOR)
IF(USE_WFLZ)
    include_directories (${FSBENCH_SOURCE_DIR}/codecs/wfLZ)
    set(OTHER_SRC ${OTHER_SRC} codecs/wfLZ/wfLZ.c)
    add_definitions(-DFSBENCH_USE_WFLZ)
ENDIF(USE_WFLZ)
IF(USE_XXHASH)
    set(OTHER_SRC ${OTHER_SRC} codecs/xxhash.c)
    add_definitions(-DFSBENCH_USE_XXHASH)
ENDIF(USE_XXHASH)
IF(USE_YAPPY)
    set(OTHER_SRC ${OTHER_SRC} codecs/Yappy.cpp)
    add_definitions(-DFSBENCH_USE_YAPPY)
ENDIF(USE_YAPPY)
IF(USE_ZFS)
    set(OTHER_SRC ${OTHER_SRC} codecs/zfs/zfs_fletcher.c codecs/zfs/zfs_lzjb2010.c)
    add_definitions(-DFSBENCH_USE_ZFS)
ENDIF(USE_ZFS)
IF(USE_Z3LIB)
    include_directories (${FSBENCH_SOURCE_DIR}/codecs/z3lib)
    set(OTHER_SRC ${OTHER_SRC} codecs/z3lib/fsbench_z3lib.cpp codecs/z3lib/z3blib.c codecs/z3lib/z3dlib.c)
    add_definitions(-DFSBENCH_USE_Z3LIB)
ENDIF(USE_Z3LIB)
IF(USE_ZSTD)
    include_directories (${FSBENCH_SOURCE_DIR}/codecs/zstd)
    set(OTHER_SRC ${OTHER_SRC} codecs/zstd/zstd.c)
    add_definitions(-DFSBENCH_USE_ZSTD)
ENDIF(USE_ZSTD)


set(SRC ${MAIN_SRC}
        ${7z_SRC}
        ${BCL_SRC}
        ${BROTLI_SRC}
        ${BZ2_SRC}
        ${CRYPTOPP_SRC}
        ${ECRYPT_SRC}
        ${LZHAM_SRC}
        ${LZO_SRC}
        ${NRV_SRC}
        ${ZLIB_SRC}
        ${ZLING_SRC}
        ${ZOPFLI_SRC}
        ${OTHER_SRC})



#----------------#
# compiler flags #
#----------------#


IF(CMAKE_COMPILER_IS_GNUCXX OR ${CMAKE_CXX_COMPILER_ID} STREQUAL Clang)
    set_source_files_properties(${MAIN_SRC} PROPERTIES COMPILE_FLAGS "-Wall -Wextra")
    set(CXX_FLAGS ${GXX_FLAGS})
    set(EXE_LINKER_FLAGS ${EXE_LINKER_FLAGS} ${GCC_LINKFLAGS})
ENDIF(CMAKE_COMPILER_IS_GNUCXX OR ${CMAKE_CXX_COMPILER_ID} STREQUAL Clang)

IF(CMAKE_COMPILER_IS_GNUCC OR ${CMAKE_C_COMPILER_ID} STREQUAL Clang)
    set(C_FLAGS   ${GCC_FLAGS})
    set(EXE_LINKER_FLAGS ${EXE_LINKER_FLAGS} ${GCC_LINKFLAGS})
ENDIF(CMAKE_COMPILER_IS_GNUCC OR ${CMAKE_C_COMPILER_ID} STREQUAL Clang)

IF(MSVC)
    set(CXX_FLAGS ${MSVC_FLAGS})
    set(C_FLAGS   ${MSVC_FLAGS})
    set(EXE_LINKER_FLAGS ${EXE_LINKER_FLAGS} ${MSVC_LINK_FLAGS})
ENDIF(MSVC)

#-------------#
# compilation #
#-------------#

set(CMAKE_CXX_FLAGS        "${CMAKE_CXX_FLAGS}        ${CXX_FLAGS}")
set(CMAKE_C_FLAGS          "${CMAKE_C_FLAGS}          ${C_FLAGS}")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${EXE_LINKER_FLAGS}")

add_executable (fsbench ${SRC})
IF (CMAKE_HOST_APPLE)
    target_link_libraries (fsbench -lpthread)
ELSEIF (UNIX)
    target_link_libraries (fsbench -lrt -lpthread)
ENDIF(CMAKE_HOST_APPLE)


#---------------#
# documentation #
#---------------#
find_package(Doxygen)

if(DOXYGEN_FOUND)
configure_file(${PROJECT_SOURCE_DIR}/../doc/Doxyfile.in ${PROJECT_SOURCE_DIR}/../doc/Doxyfile @ONLY)
add_custom_target(doc ${DOXYGEN_EXECUTABLE} ${PROJECT_SOURCE_DIR}/../doc/Doxyfile COMMENT "Generating API documentation with Doxygen" VERBATIM)
endif(DOXYGEN_FOUND)