#*************************************************************************** # Copyright (C) 2017-2019 Nathan Moinvaziri # https://github.com/nmoinvaz/minizip # Copyright (C) 2016 Matthias Schmieder # schmieder.matthias@gmail.com #*************************************************************************** cmake_minimum_required(VERSION 3.0.2) message(STATUS "Using CMake version ${CMAKE_VERSION}") option(MZ_COMPAT "Enables compatibility layer" ON) option(MZ_ZLIB "Enables ZLIB compression" ON) option(MZ_ZLIB_STATIC "Links with ZLIB statically" ON) option(MZ_BZIP2 "Enables BZIP2 compression" ON) option(MZ_BZIP2_STATIC "Links with BZIP2 statically" ON) option(MZ_LZMA "Enables LZMA compression" ON) option(MZ_PKCRYPT "Enables PKWARE traditional encryption" ON) option(MZ_WZAES "Enables WinZIP AES encryption" ON) option(MZ_LIBCOMP "Enables Apple compression" OFF) option(MZ_OPENSSL "Enables OpenSSL for encryption" OFF) option(MZ_BRG "Enables Brian Gladman's encryption library" OFF) option(MZ_SIGNING "Enables zip signing support" ON) option(MZ_COMPRESS_ONLY "Only support compression" OFF) option(MZ_DECOMPRESS_ONLY "Only support decompression" OFF) option(MZ_BUILD_TEST "Builds minizip test executable" OFF) option(MZ_BUILD_UNIT_TEST "Builds minizip unit test project" OFF) option(MZ_BUILD_FUZZ_TEST "Builds minizip fuzzer executables" OFF) if(POLICY CMP0074) cmake_policy(SET CMP0074 OLD) endif() # ZLIB_ROOT - Parent directory of zlib installation # BZIP2_ROOT - Parent directory of BZip2 installation # OPENSSL_ROOT - Parent directory of OpenSSL installation enable_language(C) # Minizip library version set(VERSION "2.9.0") # Minizip api version set(SOVERSION "2.5") include(CheckLibraryExists) include(CheckSymbolExists) include(CheckFunctionExists) include(CheckIncludeFile) include(CheckTypeSize) include(GNUInstallDirs) include(ExternalProject) set(INSTALL_BIN_DIR ${CMAKE_INSTALL_FULL_BINDIR} CACHE PATH "Installation directory for executables") set(INSTALL_LIB_DIR ${CMAKE_INSTALL_FULL_LIBDIR} CACHE PATH "Installation directory for libraries") set(INSTALL_INC_DIR ${CMAKE_INSTALL_FULL_INCLUDEDIR} CACHE PATH "Installation directory for headers") set(INSTALL_MAN_DIR ${CMAKE_INSTALL_FULL_MANDIR} CACHE PATH "Installation directory for manual pages") set(INSTALL_PKGCONFIG_DIR "${CMAKE_INSTALL_FULL_LIBDIR}/pkgconfig" CACHE PATH "Installation directory for pkgconfig (.pc) files") set(INSTALL_CMAKE_DIR "${CMAKE_INSTALL_FULL_LIBDIR}/cmake/minizip" CACHE PATH "Installation directory for cmake files.") set(MINIZIP_PC ${CMAKE_CURRENT_BINARY_DIR}/minizip.pc) configure_file(minizip.pc.cmakein ${MINIZIP_PC} @ONLY) # Check if zlib installation is present if((NOT MZ_ZLIB_STATIC) AND MZ_ZLIB AND NOT MZ_LIBCOMP) find_package(ZLIB) if(ZLIB_FOUND) message(STATUS "Using ZLIB ${ZLIB_VERSION_STRING}") include_directories(${ZLIB_INCLUDE_DIRS}) else() if (NOT ZLIB_TAG) set(ZLIB_TAG master) endif() if (NOT ZLIB_REPOSITORY) set(ZLIB_REPOSITORY https://github.com/madler/zlib) endif() message(STATUS "Using ZLIB ${ZLIB_REPOSITORY} ${ZLIB_TAG}") set(ZLIB_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/lib/zlib) set(ZLIB_INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/install/zlib) set(ZLIB_INCLUDE_DIRS ${ZLIB_INSTALL_DIR}/include) if(WIN32) set(ZLIB_LIBRARIES ${ZLIB_INSTALL_DIR}/lib/zlibstatic$<$:d>.lib) set(ZLIB_BYPRODUCTS ${ZLIB_INSTALL_DIR}/lib/zlibstatic.lib ${ZLIB_INSTALL_DIR}/lib/zlibstaticd.lib) else() set(ZLIB_LIBRARIES ${ZLIB_INSTALL_DIR}/lib/libz.a) set(ZLIB_BYPRODUCTS ${ZLIB_INSTALL_DIR}/lib/libz.a) endif() # Build args variable based on cache variables unset(CMAKE_ARGS) get_cmake_property(CACHE_VARS CACHE_VARIABLES) foreach(CACHE_VAR ${CACHE_VARS}) get_property(CACHE_VAR_HELPSTRING CACHE ${CACHE_VAR} PROPERTY HELPSTRING) if(CACHE_VAR_HELPSTRING STREQUAL "No help, variable specified on the command line.") get_property(CACHE_VAR_TYPE CACHE ${CACHE_VAR} PROPERTY TYPE) if(CACHE_VAR_TYPE STREQUAL "UNINITIALIZED") set(CACHE_VAR_TYPE) else() set(CACHE_VAR_TYPE :${CACHE_VAR_TYPE}) endif() if (NOT CACHE_VAR MATCHES "^MZ_") list(APPEND CMAKE_ARGS "-D${CACHE_VAR}${CACHE_VAR_TYPE}=${${CACHE_VAR}}") endif() endif() endforeach() ExternalProject_Add(zlib PREFIX zlib GIT_REPOSITORY ${ZLIB_REPOSITORY} GIT_TAG ${ZLIB_TAG} SOURCE_DIR ${ZLIB_SOURCE_DIR} BUILD_IN_SOURCE 1 INSTALL_DIR ${ZLIB_INSTALL_DIR} BUILD_BYPRODUCTS ${ZLIB_BYPRODUCTS} UPDATE_COMMAND "" CMAKE_ARGS "${CMAKE_ARGS};-DCMAKE_INSTALL_PREFIX:STRING=${ZLIB_INSTALL_DIR}") include_directories(${ZLIB_INCLUDE_DIRS}) endif() endif() # Check if bzip2 installation is present if(MZ_BZIP2 AND NOT MZ_ZLIB_STATIC) find_package(BZip2) if(BZIP2_FOUND) message(STATUS "Using BZIP2 ${BZIP2_VERSION_STRING}") include_directories(${BZIP2_INCLUDE_DIRS}) add_definitions(-DHAVE_BZIP2) endif() endif() # Check to see if openssl installation is present if(MZ_OPENSSL) find_package(OpenSSL) if (OPENSSL_FOUND) message(STATUS "Using OpenSSL ${OPENSSL_VERSION}") include_directories(${OPENSSL_INCLUDE_DIR}) if(OPENSSL_INCLUDE_DIRS) include_directories(${OPENSSL_INCLUDE_DIRS}) endif() endif() endif() # Check for system includes check_include_file(stdint.h HAVE_STDINT_H) check_include_file(inttypes.h HAVE_INTTYPES_H) if(HAVE_STDINT_H) add_definitions(-DHAVE_STDINT_H) endif() if(HAVE_INTTYPES_H) add_definitions(-DHAVE_INTTYPES_H) endif() # Check for large file support check_type_size(off64_t OFF64_T) if(HAVE_OFF64_T) add_definitions(-D__USE_FILE_OFFSET64) add_definitions(-D__USE_LARGEFILE64) add_definitions(-D_LARGEFILE64_SOURCE) add_definitions(-D_FILE_OFFSET_BITS=64) endif() # Check for fseeko support check_function_exists(fseeko HAVE_FSEEKO) if(NOT HAVE_FSEEKO) add_definitions(-DNO_FSEEKO) endif() # Enable compiler warnings if(CMAKE_C_COMPILER_ID MATCHES "MSVC") add_compile_options(/W3) else() add_compile_options(-W -Wall) endif() # Enable x86 optimizations if supported if(CMAKE_C_COMPILER_ID MATCHES "Clang") include(CheckCCompilerFlag) macro(enable_option_if_supported option variable) check_c_compiler_flag( "-Werror=unused-command-line-argument ${option}" ${variable}) if(${variable}) add_compile_options("$<$:${option}>") endif() endmacro() enable_option_if_supported(-msse3 check_opt_sse3) enable_option_if_supported(-msse4.1 check_opt_sse41) enable_option_if_supported(-maes check_opt_aes) endif() # Set compiler options if(CMAKE_C_COMPILER_ID MATCHES "MSVC") add_compile_options( $<$:/Zi> $<$:/Od> $<$:/Ox> $<$:/Os>) else() add_compile_options( $<$:-g> $<$:-Os>) endif() # Initial source files set(MINIZIP_SRC mz_crypt.c mz_os.c mz_strm.c mz_strm_buf.c mz_strm_mem.c mz_strm_split.c mz_zip.c mz_zip_rw.c) # Initial header files set(MINIZIP_PUBLIC_HEADERS mz.h mz_os.h mz_crypt.h mz_strm.h mz_strm_buf.h mz_strm_mem.h mz_strm_split.h mz_strm_os.h mz_zip.h mz_zip_rw.h) include_directories(${CMAKE_CURRENT_SOURCE_DIR}) # Setup predefined macros if(MZ_COMPRESS_ONLY) add_definitions(-DMZ_ZIP_NO_DECOMPRESSION) endif() if(MZ_DECOMPRESS_ONLY) add_definitions(-DMZ_ZIP_NO_COMPRESSION) endif() if(NOT MZ_PKCRYPT AND NOT MZ_WZAES) add_definitions(-DMZ_ZIP_NO_ENCRYPTION) endif() if(MZ_SIGNING) add_definitions(-DMZ_ZIP_SIGNING) endif() # Windows specific if(WIN32) add_definitions(-D_CRT_SECURE_NO_DEPRECATE) list(APPEND MINIZIP_SRC "mz_os_win32.c" "mz_strm_os_win32.c") if (MZ_PKCRYPT OR MZ_WZAES) if (NOT MZ_OPENSSL AND NOT OPENSSL_FOUND AND NOT MZ_BRG) list(APPEND MINIZIP_SRC "mz_crypt_win32.c") endif() endif() endif() if(CMAKE_SYSTEM_NAME STREQUAL "WindowsStore") add_definitions(-DMZ_WINRT_API) endif() # Unix specific if(UNIX) add_definitions(-D_POSIX_C_SOURCE=200112L) list(APPEND MINIZIP_SRC "mz_os_posix.c" "mz_strm_os_posix.c") if ((MZ_PKCRYPT OR MZ_WZAES) AND NOT (MZ_OPENSSL AND OPENSSL_FOUND)) if (APPLE AND NOT MZ_BRG) check_include_file(CommonCrypto/CommonCrypto.h COMMONCRYPTO_FOUND) if (COMMONCRYPTO_FOUND) list(APPEND MINIZIP_SRC "mz_crypt_apple.c") else() message(STATUS "CommonCrypto not found, using BRG instead") set(MZ_BRG TRUE) endif() else() set(MZ_BRG TRUE) endif() # Check to see which random generation functions we have check_symbol_exists("getrandom" "sys/random.h" HAVE_GETRANDOM) if (HAVE_GETRANDOM) add_definitions(-DHAVE_GETRANDOM) endif() check_symbol_exists("arc4random_buf" "stdlib.h" HAVE_ARC4RANDOM_BUF) if (HAVE_ARC4RANDOM_BUF) add_definitions(-DHAVE_ARC4RANDOM_BUF) else() check_symbol_exists("arc4random" "stdlib.h" HAVE_ARC4RANDOM) if (HAVE_ARC4RANDOM) add_definitions(-DHAVE_ARC4RANDOM) endif() endif() if(NOT HAVE_ARC4RANDOM_BUF) find_package(PkgConfig REQUIRED) pkg_check_modules(LIBBSD libbsd) if (LIBBSD_FOUND) check_library_exists("${LIBBSD_LIBRARIES}" "arc4random_buf" "${LIBBSD_LIBRARY_DIRS}" HAVE_LIBBSD_ARC4RANDOM_BUF) if (HAVE_LIBBSD_ARC4RANDOM_BUF) add_definitions(-DHAVE_LIBBSD) add_definitions(-DHAVE_ARC4RANDOM_BUF) include_directories(${LIBBSD_INCLUDE_DIRS}) link_directories(${LIBBSD_LIBRARY_DIRS}) endif() endif() endif() endif() find_package(Iconv QUIET) if (Iconv_FOUND) message(STATUS "Using Iconv") include_directories(${Iconv_INCLUDE_DIRS}) endif() endif() # Include compatibility layer if(MZ_COMPAT) list(APPEND MINIZIP_SRC "mz_compat.c") list(APPEND MINIZIP_PUBLIC_HEADERS "mz_compat.h") set(COMPAT_HEADER "\ /* file.h -- Compatibility layer shim\n\ part of the MiniZip project\n\n\ This program is distributed under the terms of the same license as zlib.\n\ See the accompanying LICENSE file for the full text of the license.\n\ */\n\n\ #ifndef MZ_COMPAT_FILE\n\ #define MZ_COMPAT_FILE\n\n\ #include \"mz_compat.h\"\n\n\ #endif\n") string(REPLACE "file.h" "zip.h" ZIP_COMPAT_HEADER ${COMPAT_HEADER}) string(REPLACE "MZ_COMPAT_FILE" "MZ_COMPAT_ZIP" ZIP_COMPAT_HEADER ${ZIP_COMPAT_HEADER}) file(WRITE "zip.h" ${ZIP_COMPAT_HEADER}) list(APPEND MINIZIP_PUBLIC_HEADERS "zip.h") string(REPLACE "file.h" "unzip.h" UNZIP_COMPAT_HEADER ${COMPAT_HEADER}) string(REPLACE "MZ_COMPAT_FILE" "MZ_COMPAT_UNZIP" UNZIP_COMPAT_HEADER ${UNZIP_COMPAT_HEADER}) file(WRITE "unzip.h" ${UNZIP_COMPAT_HEADER}) list(APPEND MINIZIP_PUBLIC_HEADERS "unzip.h") if(MZ_COMPAT_VERSION) add_definitions(-DMZ_COMPAT_VERSION=${MZ_COMPAT_VERSION}) endif() endif() # Include PKCRYPT if(MZ_PKCRYPT) add_definitions(-DHAVE_PKCRYPT) list(APPEND MINIZIP_SRC "mz_strm_pkcrypt.c") list(APPEND MINIZIP_PUBLIC_HEADERS "mz_strm_pkcrypt.h") endif() # Include WinZIP AES if(MZ_WZAES) add_definitions(-DHAVE_WZAES) list(APPEND MINIZIP_SRC "mz_strm_wzaes.c") list(APPEND MINIZIP_PUBLIC_HEADERS "mz_strm_wzaes.h") endif() # Include BRG if(MZ_BRG) list(APPEND MINIZIP_SRC "mz_crypt_brg.c") set(BRG_SRC lib/brg/aescrypt.c lib/brg/aeskey.c lib/brg/aestab.c lib/brg/hmac.c lib/brg/sha1.c lib/brg/sha2.c) set(BRG_PUBLIC_HEADERS lib/brg/aes.h lib/brg/aesopt.h lib/brg/aestab.h lib/brg/brg_endian.h lib/brg/brg_types.h lib/brg/hmac.h lib/brg/sha1.h lib/brg/sha2.h) include_directories(lib/brg) source_group("BRG" FILES ${BRG_SRC} ${BRG_PUBLIC_HEADERS}) endif() # Include OpenSSL if(MZ_OPENSSL AND OPENSSL_FOUND) list(APPEND MINIZIP_SRC "mz_crypt_openssl.c") endif() # Include ZLIB if(MZ_ZLIB) if(MZ_LIBCOMP) add_definitions(-DHAVE_LIBCOMP) list(APPEND MINIZIP_SRC "mz_strm_libcomp.c") list(APPEND MINIZIP_PUBLIC_HEADERS "mz_strm_libcomp.h") else() add_definitions(-DHAVE_ZLIB) if(ZLIB_COMPAT) add_definitions(-DZLIB_COMPAT) endif() list(APPEND MINIZIP_SRC "mz_strm_zlib.c") list(APPEND MINIZIP_PUBLIC_HEADERS "mz_strm_zlib.h") endif() endif() # Include BZIP2 if(MZ_BZIP2) add_definitions(-DHAVE_BZIP2) list(APPEND MINIZIP_SRC "mz_strm_bzip.c") list(APPEND MINIZIP_PUBLIC_HEADERS "mz_strm_bzip.h") if(NOT BZIP2_FOUND OR MZ_BZIP2_STATIC) add_definitions(-DBZ_NO_STDIO) set(BZIP2_SRC lib/bzip2/blocksort.c lib/bzip2/bzlib.c lib/bzip2/compress.c lib/bzip2/crctable.c lib/bzip2/decompress.c lib/bzip2/huffman.c lib/bzip2/randtable.c) set(BZIP2_PUBLIC_HEADERS lib/bzip2/bzlib.h lib/bzip2/bzlib_private.h) include_directories(lib/bzip2) source_group("BZip2" FILES ${BZIP2_SRC} ${BZIP2_PUBLIC_HEADERS}) endif() endif() # Include LZMA if(MZ_LZMA) add_definitions(-DHAVE_LZMA) add_definitions(-DLZMA_API_STATIC) add_definitions(-DHAVE_CONFIG_H) check_include_file(limits.h HAVE_LIMITS_H) check_include_file(string.h HAVE_STRING_H) check_include_file(strings.h HAVE_STRINGS_H) check_include_file(memory.h HAVE_MEMORY_H) check_include_file(stdbool.h HAVE_STDBOOL_H) check_include_file(immintrin.h HAVE_IMMINTRIN_H) if(HAVE_LIMITS_H) add_definitions(-DHAVE_LIMITS_H) endif() if(HAVE_STRING_H) add_definitions(-DHAVE_STRING_H) endif() if(HAVE_STRINGS_H) add_definitions(-DHAVE_STRINGS_H) endif() if(HAVE_MEMORY_H) add_definitions(-DHAVE_MEMORY_H) endif() if(HAVE_STDBOOL_H) add_definitions(-DHAVE_STDBOOL_H) endif() if(HAVE_IMMINTRIN_H) add_definitions(-DHAVE_IMMINTRIN_H) endif() list(APPEND MINIZIP_SRC "mz_strm_lzma.c") list(APPEND MINIZIP_PUBLIC_HEADERS "mz_strm_lzma.h") set(LZMA_CHECK_SRC lib/liblzma/check/check.c lib/liblzma/check/crc32_fast.c lib/liblzma/check/crc32_table.c) set(LZMA_COMMON_SRC lib/liblzma/common/alone_decoder.c lib/liblzma/common/alone_encoder.c lib/liblzma/common/common.c lib/liblzma/common/filter_encoder.c) set(LZMA_LZ_SRC lib/liblzma/lz/lz_decoder.c lib/liblzma/lz/lz_encoder.c lib/liblzma/lz/lz_encoder_mf.c) set(LZMA_LZMA_SRC lib/liblzma/lzma/fastpos.h lib/liblzma/lzma/fastpos_table.c lib/liblzma/lzma/lzma_decoder.c lib/liblzma/lzma/lzma_encoder.c lib/liblzma/lzma/lzma_encoder_optimum_fast.c lib/liblzma/lzma/lzma_encoder_optimum_normal.c lib/liblzma/lzma/lzma_encoder_presets.c) set(LZMA_RANGECODER_SRC lib/liblzma/rangecoder/price_table.c) set(LZMA_CONFIG_HEADERS lib/liblzma/config.h) set(LZMA_API_HEADERS lib/liblzma/api/lzma.h lib/liblzma/api/lzma/base.h lib/liblzma/api/lzma/check.h lib/liblzma/api/lzma/container.h lib/liblzma/api/lzma/filter.h lib/liblzma/api/lzma/lzma12.h lib/liblzma/api/lzma/version.h lib/liblzma/api/lzma/vli.h) set(LZMA_CHECK_HEADERS lib/liblzma/check/check.h lib/liblzma/check/crc32_table_be.h lib/liblzma/check/crc32_table_le.h lib/liblzma/check/crc_macros.h) set(LZMA_COMMON_HEADERS lib/liblzma/common/alone_decoder.h lib/liblzma/common/common.h lib/liblzma/common/filter_encoder.h lib/liblzma/common/index.h lib/liblzma/common/memcmplen.h lib/liblzma/common/sysdefs.h lib/liblzma/common/tuklib_common.h lib/liblzma/common/tuklib_config.h lib/liblzma/common/tuklib_integer.h) set(LZMA_LZ_HEADERS lib/liblzma/lz/lz_decoder.h lib/liblzma/lz/lz_encoder.h lib/liblzma/lz/lz_encoder_hash.h lib/liblzma/lz/lz_encoder_hash_table.h) set(LZMA_LZMA_HEADERS lib/liblzma/lzma/lzma2_encoder.h lib/liblzma/lzma/lzma_common.h lib/liblzma/lzma/lzma_decoder.h lib/liblzma/lzma/lzma_encoder.h lib/liblzma/lzma/lzma_encoder_private.h) set(LZMA_RANGECODER_HEADERS lib/liblzma/rangecoder/price.h lib/liblzma/rangecoder/range_common.h lib/liblzma/rangecoder/range_decoder.h lib/liblzma/rangecoder/range_encoder.h) set(LZMA_PUBLIC_HEADERS ${LZMA_CONFIG_HEADERS} ${LZMA_API_HEADERS} ${LZMA_CHECK_HEADERS} ${LZMA_COMMON_HEADERS} ${LZMA_LZ_HEADERS} ${LZMA_LZMA_HEADERS} ${LZMA_RANGECODER_HEADERS}) set(LZMA_SRC ${LZMA_CHECK_SRC} ${LZMA_COMMON_SRC} ${LZMA_LZ_SRC} ${LZMA_LZMA_SRC} ${LZMA_RANGECODER_SRC}) include_directories(lib/liblzma lib/liblzma/api lib/liblzma/check lib/liblzma/common lib/liblzma/lz lib/liblzma/lzma lib/liblzma/rangecoder) source_group("LZMA" FILES ${LZMA_CONFIG_HEADERS}) source_group("LZMA\\API" FILES ${LZMA_API_HEADERS}) source_group("LZMA\\Check" FILES ${LZMA_CHECK_SRC} ${LZMA_CHECK_HEADERS}) source_group("LZMA\\Common" FILES ${LZMA_COMMON_SRC} ${LZMA_COMMON_HEADERS}) source_group("LZMA\\LZ" FILES ${LZMA_LZ_SRC} ${LZMA_LZ_HEADERS}) source_group("LZMA\\LZMA" FILES ${LZMA_LZMA_SRC} ${LZMA_LZMA_HEADERS}) source_group("LZMA\\RangeCoder" FILES ${LZMA_RANGECODER_SRC} ${LZMA_RANGECODER_HEADERS}) endif() # Create minizip library source_group("Minizip" FILES ${MINIZIP_SRC} ${MINIZIP_PUBLIC_HEADERS}) project(minizip) add_library(${PROJECT_NAME} STATIC ${MINIZIP_SRC} ${MINIZIP_PUBLIC_HEADERS} ${BRG_SRC} ${BRG_PUBLIC_HEADERS} ${BZIP2_SRC} ${BZIP2_PUBLIC_HEADERS} ${LZMA_SRC} ${LZMA_PUBLIC_HEADERS}) set_target_properties(${PROJECT_NAME} PROPERTIES VERSION ${VERSION} SOVERSION ${SOVERSION} LINKER_LANGUAGE C DEFINE_SYMBOL "MZ_EXPORTS") # Use embeded zlib add_subdirectory(lib/zlib) if(NOT RISCOS) set_target_properties(${PROJECT_NAME} PROPERTIES POSITION_INDEPENDENT_CODE 1) endif() if(MZ_LZMA) set_target_properties(${PROJECT_NAME} PROPERTIES C_STANDARD 99) endif() # Link with external libraries if(MZ_ZLIB AND NOT MZ_LIBCOMP) if(MZ_ZLIB_STATIC) target_link_libraries(${PROJECT_NAME} zlibstatic) else() add_dependencies(${PROJECT_NAME} zlib) endif() endif() if(MZ_BZIP2 AND BZIP2_FOUND) target_link_libraries(${PROJECT_NAME} ${BZIP2_LIBRARIES}) endif() if(MZ_LIBCOMP) target_link_libraries(${PROJECT_NAME} compression) endif() if(Iconv_FOUND AND NOT Iconv_IS_BUILT_IN) target_link_libraries(${PROJECT_NAME} ${Iconv_LIBRARIES}) endif() if(MZ_OPENSSL AND OPENSSL_FOUND) target_link_libraries(${PROJECT_NAME} ${OPENSSL_LIBRARIES}) elseif(UNIX) if(APPLE AND NOT MZ_BRG) message(STATUS "Using CoreFoundation Framework") find_library(COREFOUNDATION_LIBRARY CoreFoundation) target_link_libraries(${PROJECT_NAME} ${COREFOUNDATION_LIBRARY}) message(STATUS "Using Security Framework") find_library(SECURITY_LIBRARY Security) target_link_libraries(${PROJECT_NAME} ${SECURITY_LIBRARY}) set_target_properties(${PROJECT_NAME} PROPERTIES LINK_FLAGS "-Wl,-F/Library/Frameworks") else() target_link_libraries(${PROJECT_NAME} ${LIBBSD_LIBRARIES}) endif() endif() target_include_directories(${PROJECT_NAME} PUBLIC $) # Install files if(NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL) install(TARGETS ${PROJECT_NAME} "zlibstatic" EXPORT ${PROJECT_NAME} INCLUDES DESTINATION "${INSTALL_INC_DIR}" RUNTIME DESTINATION "${INSTALL_BIN_DIR}" ARCHIVE DESTINATION "${INSTALL_LIB_DIR}" LIBRARY DESTINATION "${INSTALL_LIB_DIR}") install(EXPORT ${PROJECT_NAME} DESTINATION "${INSTALL_CMAKE_DIR}" NAMESPACE "MINIZIP::") endif() if(NOT SKIP_INSTALL_HEADERS AND NOT SKIP_INSTALL_ALL) install(FILES ${MINIZIP_PUBLIC_HEADERS} DESTINATION "${INSTALL_INC_DIR}") endif() if(NOT SKIP_INSTALL_FILES AND NOT SKIP_INSTALL_ALL) install(FILES ${MINIZIP_PC} DESTINATION "${INSTALL_PKGCONFIG_DIR}") endif() # Build test executables if(MZ_BUILD_TEST) if(MZ_ZLIB AND NOT MZ_LIBCOMP) add_executable(minigzip_cmd "minigzip.c") set_target_properties(minigzip_cmd PROPERTIES OUTPUT_NAME minigzip) target_link_libraries(minigzip_cmd ${PROJECT_NAME}) if(NOT SKIP_INSTALL_BINARIES AND NOT SKIP_INSTALL_ALL) install(TARGETS minigzip_cmd RUNTIME DESTINATION "bin") endif() endif() add_executable(minizip_cmd "minizip.c" "test/test.c" "test/test.h") set_target_properties(minizip_cmd PROPERTIES OUTPUT_NAME ${PROJECT_NAME}) target_link_libraries(minizip_cmd ${PROJECT_NAME}) if(NOT SKIP_INSTALL_BINARIES AND NOT SKIP_INSTALL_ALL) install(TARGETS minizip_cmd RUNTIME DESTINATION "bin") endif() endif() if(MZ_BUILD_UNIT_TEST) enable_testing() function(create_compress_tests EXTRA_NAME EXTRA_ARGS) if(MZ_DECOMPRESS_ONLY) return() endif() list(FIND EXTRA_ARGS "-z" ZIPCD_IDX) if(${ZIPCD_IDX} EQUAL -1) set(COMPRESS_METHOD_NAMES "raw") set(COMPRESS_METHOD_ARGS "-0") endif() if (MZ_ZLIB OR MZ_LIBCOMP) list(APPEND COMPRESS_METHOD_NAMES "deflate") list(APPEND COMPRESS_METHOD_ARGS "-9") endif() if (MZ_BZIP2) list(APPEND COMPRESS_METHOD_NAMES "bzip2") list(APPEND COMPRESS_METHOD_ARGS "-b") endif() if (MZ_LZMA) list(APPEND COMPRESS_METHOD_NAMES "lzma") list(APPEND COMPRESS_METHOD_ARGS "-m") endif() list(LENGTH COMPRESS_METHOD_NAMES COMPRESS_METHOD_COUNT) math(EXPR COMPRESS_METHOD_COUNT "${COMPRESS_METHOD_COUNT}-1") foreach(INDEX RANGE ${COMPRESS_METHOD_COUNT}) list(GET COMPRESS_METHOD_NAMES ${INDEX} COMPRESS_METHOD_NAME) list(GET COMPRESS_METHOD_ARGS ${INDEX} COMPRESS_METHOD_ARG) add_test(NAME ${COMPRESS_METHOD_NAME}-zip-${EXTRA_NAME} COMMAND minizip_cmd ${COMPRESS_METHOD_ARG} -o ${EXTRA_ARGS} result.zip test.c test.h empty.txt random.bin uniform.bin fuzz WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test) add_test(NAME ${COMPRESS_METHOD_NAME}-list-${EXTRA_NAME} COMMAND minizip_cmd -l ${EXTRA_ARGS} result.zip WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test) if(NOT MZ_COMPRESS_ONLY) add_test(NAME ${COMPRESS_METHOD_NAME}-unzip-${EXTRA_NAME} COMMAND minizip_cmd -x -o ${EXTRA_ARGS} -d out result.zip WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test) endif() add_test(NAME ${COMPRESS_METHOD_NAME}-append-${EXTRA_NAME} COMMAND minizip_cmd ${COMPRESS_METHOD_ARG} -a ${EXTRA_ARGS} result.zip single.txt WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test) if(NOT MZ_COMPRESS_ONLY) add_test(NAME ${COMPRESS_METHOD_NAME}-append-unzip-${EXTRA_NAME} COMMAND minizip_cmd -x -o ${EXTRA_ARGS} -d out result.zip WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test) endif() add_test(NAME ${COMPRESS_METHOD_NAME}-erase-${EXTRA_NAME} COMMAND minizip_cmd -o -e result.zip test.c test.h WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test) if(NOT MZ_COMPRESS_ONLY) add_test(NAME ${COMPRESS_METHOD_NAME}-erase-unzip-${EXTRA_NAME} COMMAND minizip_cmd -x -o ${EXTRA_ARGS} -d out result.zip WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test) endif() endforeach() endfunction() # Perform tests against ourself create_compress_tests("generic" "") create_compress_tests("span" "-k;1024") create_compress_tests("zipcd" "-z") if(MZ_PKCRYPT) create_compress_tests("pkcrypt" "-p;test123") endif() if(MZ_WZAES) create_compress_tests("wzaes" "-s;-p;test123") endif() if(MZ_OPENSSL AND OPENSSL_FOUND) create_compress_tests("signed" "-h;ia.p12;-w;test") create_compress_tests("secure" "-z;-h;ia.p12;-w;test") endif() # Perform tests on others if(NOT MZ_COMPRESS_ONLY) if(MZ_ZLIB) add_test(NAME unzip-tiny COMMAND minizip_cmd -x -o ${EXTRA_ARGS} -d out fuzz/unzip_fuzzer_seed_corpus/tiny.zip WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test) endif() if(MZ_BZIP2) add_test(NAME unzip-bzip2 COMMAND minizip_cmd -x -o ${EXTRA_ARGS} -d out fuzz/unzip_fuzzer_seed_corpus/bzip2.zip WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test) endif() if(MZ_LZMA) add_test(NAME unzip-lzma COMMAND minizip_cmd -x -o ${EXTRA_ARGS} -d out fuzz/unzip_fuzzer_seed_corpus/lzma.zip WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test) endif() if(MZ_PKCRYPT) add_test(NAME unzip-pkcrypt COMMAND minizip_cmd -x -o ${EXTRA_ARGS} -d out -p test123 fuzz/unzip_fuzzer_seed_corpus/encrypted_pkcrypt.zip WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test) endif() if(MZ_WZAES) add_test(NAME unzip-wzaes COMMAND minizip_cmd -x -o ${EXTRA_ARGS} -d out -p test123 fuzz/unzip_fuzzer_seed_corpus/encrypted_wzaes.zip WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test) endif() endif() if(NOT MZ_COMPRESS_ONLY AND NOT MZ_DECOMPRESS_ONLY) if(MZ_ZLIB AND NOT MZ_LIBCOMP) add_test(NAME gz COMMAND minigzip_cmd random.bin WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test) add_test(NAME ungz COMMAND minigzip_cmd -x -d out random.bin.gz WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test) endif() endif() endif() #Build fuzzer executables if(MZ_BUILD_FUZZ_TEST) if (NOT CMAKE_C_COMPILER_ID STREQUAL "Clang") set(FUZZER_SRC "test/fuzz/standalone.c") endif() add_executable(zip_fuzzer "test/fuzz/zip_fuzzer.c" ${FUZZER_SRC}) add_executable(unzip_fuzzer "test/fuzz/unzip_fuzzer.c" ${FUZZER_SRC}) if (CMAKE_C_COMPILER_ID STREQUAL "Clang") enable_language(CXX) target_link_libraries(zip_fuzzer "FuzzingEngine") set_target_properties(zip_fuzzer PROPERTIES LINKER_LANGUAGE CXX) target_link_libraries(unzip_fuzzer "FuzzingEngine") set_target_properties(unzip_fuzzer PROPERTIES LINKER_LANGUAGE CXX) endif() target_link_libraries(zip_fuzzer ${PROJECT_NAME}) target_link_libraries(unzip_fuzzer ${PROJECT_NAME}) if(NOT SKIP_INSTALL_BINARIES AND NOT SKIP_INSTALL_ALL) install(TARGETS zip_fuzzer RUNTIME DESTINATION "bin") install(TARGETS unzip_fuzzer RUNTIME DESTINATION "bin") endif() endif()