cmake_minimum_required(VERSION 3.12) project(minizip VERSION 1.0.0 LANGUAGES C) option(MINIZIP_BUILD_SHARED "Enable building zlib shared library" ON) option(MINIZIP_BUILD_STATIC "Enable building zlib static library" ON) option(MINIZIP_BUILD_TESTING "Enable testing of minizip" ON) option(MINIZIP_ENABLE_BZIP2 "Build minizip withj bzip2 support" ON) option(MINIZIP_INSTALL "Enable installation of minizip" ON) if(MINGW) option(MINIZIP_INSTALL_COMPAT_DLL "Install a copy as libminizip-1.dll" ON) endif(MINGW) include(CheckFunctionExists) include(CheckIncludeFile) include(CheckCSourceCompiles) include(CMakePackageConfigHelpers) include(GNUInstallDirs) if(MINIZIP_ENABLE_BZIP2) find_package(BZip2) endif(MINIZIP_ENABLE_BZIP2) # # Check for fopen64 # check_function_exists(fopen64 HAVE_FOPEN64) # # Check for fseeko # check_function_exists(fseeko HAVE_FSEEKO) # # Check for unistd.h # check_include_file(unistd.h HAVE_UNISTD_H) # # Check to see if we have large file support # set(CMAKE_REQUIRED_DEFINITIONS -D_LARGEFILE64_SOURCE=1) check_type_size(off64_t OFF64_T) unset(CMAKE_REQUIRED_DEFINITIONS) # clear variable # # Check visibility attribute is supported if(MSVC) set(CMAKE_REQUIRED_FLAGS "-WX") else(MSVC) set(CMAKE_REQUIRED_FLAGS "-WError") endif(MSVC) check_c_source_compiles( " #include static void f(void) __attribute__ ((visibility(\"hidden\"))); int main(void) {return 0;} " HAVE___ATTR__VIS_HIDDEN) unset(CMAKE_REQUIRED_FLAGS) if(NOT TARGET ZLIB::ZLIB) find_package(zlib REQUIRED) endif(NOT TARGET ZLIB::ZLIB) set(LIBMINIZIP_SRCS ioapi.c mztools.c unzip.c zip.c) set(LIBMINIZIP_HDRS crypt.h ints.h ioapi.h mztools.h unzip.h zip.h) set(MINIZIP_SRCS ioapi.c $<$:iowin32.c> minizip.c zip.c) set(MINIZIP_HDRS crypt.h ints.h ioapi.h $<$:iowin32.h> skipset.h zip.h) set(MINIUNZIP_SRCS ioapi.c $<$:iowin32.c> miniunz.c unzip.c zip.c) set(MINIUNZIP_HDRS crypt.h ints.h ioapi.h $<$:iowin32.h> skipset.h unzip.h zip.h) if(WIN32) set(minizip_static_suffix "s") set(CMAKE_DEBUG_POSTFIX "d") endif(WIN32) if(MINIZIP_BUILD_SHARED) set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS TRUE) add_library(libminizip SHARED ${LIBMINIZIP_SRCS} ${LIBMINIZIP_HDRS}) add_library(MINIZIP::minizip ALIAS libminizip) target_include_directories(libminizip PUBLIC $ $) target_compile_definitions(libminizip PRIVATE $<$:_CRT_SECURE_NO_WARNINGS> $<$:HAVE_BZIP2=1> $<$:HAVE_HIDDEN> $<$:HAVE_UNISTD_H=1> $<$:USE_FILE32API=1> PUBLIC $<$:_LARGEFILE64_SOURCE=1>) if(NOT CYGWIN) set_target_properties(libminizip PROPERTIES SOVERSION ${minizip_VERSION_MAJOR}) endif(NOT CYGWIN) set_target_properties(libminizip PROPERTIES EXPORT_NAME minizip OUTPUT_NAME minizip VERSIOM ${minizip_VERSION} SOVERSION ${minizip_VERSION_MAJOR}) target_link_libraries(libminizip PUBLIC $<$:BZip2::BZip2> ZLIB::ZLIB) add_executable(minizip ${MINIZIP_SRCS} ${MINIZIP_HDRS}) set_target_properties(minizip PROPERTIES EXPORT_NAME minizip_executable) target_compile_definitions(minizip PRIVATE $<$:_CRT_SECURE_NO_WARNINGS> $<$:USE_FILE32API=1>) target_link_libraries(minizip PRIVATE MINIZIP::minizip) add_executable(miniunzip ${MINIUNZIP_SRCS} ${MINIUNZIP_HDRS}) set_target_properties(miniunzip PROPERTIES EXPORT_NAME miniunzip_executable) target_compile_definitions(miniunzip PRIVATE $<$:_CRT_SECURE_NO_WARNINGS> $<$:USE_FILE32API=1>) target_link_libraries(miniunzip PRIVATE MINIZIP::minizip) endif(MINIZIP_BUILD_SHARED) if(MINIZIP_BUILD_STATIC) add_library(libminizipstatic STATIC ${LIBMINIZIP_SRCS} ${LIBMINIZIP_HDRS}) add_library(MINIZIP::minizipstatic ALIAS libminizipstatic) target_include_directories(libminizipstatic PUBLIC $ $) target_compile_definitions(libminizipstatic PRIVATE $<$:_CRT_SECURE_NO_WARNINGS> $<$:HAVE_BZIP2=1> $<$:HAVE_HIDDEN> $<$:HAVE_UNISTD_H=1> $<$:USE_FILE32API=1> PUBLIC $<$:_LARGEFILE64_SOURCE=1>) set_target_properties(libminizipstatic PROPERTIES EXPORT_NAME minizipstatic OUTPUT_NAME minizip${minizip_static_suffix}) if(CYGWIN) set_target_properties(libminizipstatic PROPERTIES SUFFIX ".dll.a") endif(CYGWIN) target_link_libraries(libminizipstatic PUBLIC $<$:BZip2::BZip2> ZLIB::ZLIBSTATIC) add_executable(minizipstatic ${MINIZIP_SRCS} ${MINIZIP_HDRS}) set_target_properties(minizipstatic PROPERTIES EXPORT_NAME minizip_static_executable) target_compile_definitions(minizipstatic PRIVATE $<$:_CRT_SECURE_NO_WARNINGS> $<$:USE_FILE32API=1>) target_link_libraries(minizipstatic PRIVATE MINIZIP::minizipstatic) add_executable(miniunzipstatic ${MINIUNZIP_SRCS} ${MINIUNZIP_HDRS}) set_target_properties(miniunzipstatic PROPERTIES EXPORT_NAME miniunzip_static_executable) target_compile_definitions(miniunzipstatic PRIVATE $<$:_CRT_SECURE_NO_WARNINGS> $<$:USE_FILE32API=1>) target_link_libraries(miniunzipstatic PRIVATE MINIZIP::minizipstatic) endif(MINIZIP_BUILD_STATIC) if(MINIZIP_INSTALL) if(MINIZIP_BUILD_SHARED) install(TARGETS libminizip minizip miniunzip COMPONENT Runtime EXPORT minizipExport RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}") if(MINIZIP_INSTALL_COMPAT_DLL) install(FILES $ COMPONENT Runtime RENAME libminizip-${minizip_VERSION_MAJOR}.dll DESTINATION "${CMAKE_INSTALL_BINDIR}") endif(MINIZIP_INSTALL_COMPAT_DLL) if(MSVC) install(FILES $ COMPONENT Runtime DESTINATION ${CMAKE_INSTALL_BINDIR} CONFIGURATIONS Debug OR RelWithDebInfo OPTIONAL ) endif(MSVC) endif(MINIZIP_BUILD_SHARED) if(MINIZIP_BUILD_STATIC) install(TARGETS libminizipstatic COMPONENT Development TARGETS minizipstatic miniunzipstatic COMPONENT Runtime EXPORT minizipExport RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}") endif(MINIZIP_BUILD_STATIC) configure_package_config_file(${minizip_SOURCE_DIR}/minizipConfig.cmake.in ${minizip_BINARY_DIR}/minizipConfig.cmake INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/minizip NO_CHECK_REQUIRED_COMPONENTS_MACRO) write_basic_package_version_file( "${minizip_BINARY_DIR}/minizipConfigVersion.cmake" VERSION "${minizip_VERSION}" COMPATIBILITY AnyNewerVersion) install(FILES ${minizip_BINARY_DIR}/minizipConfig.cmake ${minizip_BINARY_DIR}/minizipConfigVersion.cmake DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/minizip) install(EXPORT minizipExport FILE minizip.cmake DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/minizip NAMESPACE MINIZIP::) install(FILES ${LIBMINIZIP_HDRS} COMPONENT Development DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}") endif(MINIZIP_INSTALL) if(MINIZIP_BUILD_TESTING) enable_testing() if(MINIZIP_BUILD_SHARED AND NOT ${CMAKE_SHARED_LIBRARY_SUFFIX} STREQUAL ".dll") add_test(NAME minizip_prepare_shared_zip COMMAND ${CMAKE_COMMAND} -DCREATE_SHARED=ON -P ${CMAKE_CURRENT_SOURCE_DIR}/test/test_helper.cm WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/test) add_test(NAME minizip_zipping_test_file_shared COMMAND minizip test_file_shared.zip test_file_shared.txt WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/test) add_test(NAME minizip_prepare_shared_unzip COMMAND ${CMAKE_COMMAND} -DMOVE_SHARED=ON -P ${CMAKE_CURRENT_SOURCE_DIR}/test/test_helper.cm WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/test) add_test(NAME minizip_miniunzipping_test_file_shared.zip COMMAND miniunzip test_file_shared.zip WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/test) add_test(NAME minizip_compare_shared COMMAND ${CMAKE_COMMAND} -E compare_files test_file_shared.txt test_file_shared.orig WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/test) add_test(NAME minizip_clean_shared_zip COMMAND ${CMAKE_COMMAND} -DDELETE_SHARED=ON -P ${CMAKE_CURRENT_SOURCE_DIR}/test/test_helper.cm WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/test) set_tests_properties(minizip_prepare_shared_zip PROPERTIES FIXTURES_SETUP prepare_shared) set_tests_properties(minizip_zipping_test_file_shared PROPERTIES FIXTURES_REQUIRED prepare_shared FIXTURES_SETUP zip_shared) set_tests_properties(minizip_prepare_shared_unzip PROPERTIES FIXTURES_REQUIRED zip_shared FIXTURES_SETUP prepare_unzip_shared) set_tests_properties(minizip_miniunzipping_test_file_shared.zip PROPERTIES FIXTURES_REQUIRED prepare_unzip_shared FIXTURES_SETUP prepare_compare_shared) set_tests_properties(minizip_compare_shared PROPERTIES FIXTURES_REQUIRED prepare_compare_shared FIXTURES_SETUP compared_shared) set_tests_properties(minizip_clean_shared_zip PROPERTIES FIXTURES_CLEANUP compared_shared) endif(MINIZIP_BUILD_SHARED AND NOT ${CMAKE_SHARED_LIBRARY_SUFFIX} STREQUAL ".dll") if(MINIZIP_BUILD_STATIC) add_test(NAME minizip_prepare_static_zip COMMAND ${CMAKE_COMMAND} -DCREATE_STATIC=ON -P ${CMAKE_CURRENT_SOURCE_DIR}/test/test_helper.cm WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/test) add_test(NAME minizip_zipping_test_file_static COMMAND minizipstatic test_file_static.zip test_file_static.txt WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/test) add_test(NAME minizip_prepare_static_unzip COMMAND ${CMAKE_COMMAND} -DMOVE_STATIC=ON -P ${CMAKE_CURRENT_SOURCE_DIR}/test/test_helper.cm WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/test) add_test(NAME minizip_miniunzipping_test_file_static.zip COMMAND miniunzipstatic test_file_static.zip WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/test) add_test(NAME minizip_compare_static COMMAND ${CMAKE_COMMAND} -E compare_files test_file_static.txt test_file_static.orig WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/test) add_test(NAME minizip_clean_static_zip COMMAND ${CMAKE_COMMAND} -DDELETE_STATIC=ON -P ${CMAKE_CURRENT_SOURCE_DIR}/test/test_helper.cm WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/test) set_tests_properties(minizip_prepare_static_zip PROPERTIES FIXTURES_SETUP prepare_static) set_tests_properties(minizip_zipping_test_file_static PROPERTIES FIXTURES_REQUIRED prepare_static FIXTURES_SETUP zip_static) set_tests_properties(minizip_prepare_static_unzip PROPERTIES FIXTURES_REQUIRED zip_static FIXTURES_SETUP prepare_unzip_static) set_tests_properties(minizip_miniunzipping_test_file_static.zip PROPERTIES FIXTURES_REQUIRED prepare_unzip_static FIXTURES_SETUP prepare_compare_static) set_tests_properties(minizip_compare_static PROPERTIES FIXTURES_REQUIRED prepare_compare_static FIXTURES_SETUP compared_static) set_tests_properties(minizip_clean_static_zip PROPERTIES FIXTURES_CLEANUP compared_static) endif(MINIZIP_BUILD_STATIC) add_subdirectory(test) endif(MINIZIP_BUILD_TESTING)