cmake_minimum_required(VERSION 3.10) project(zlib LANGUAGES C VERSION 1.3.1.1 HOMEPAGE_URL "https://zlib.net/" DESCRIPTION "a general-purpose lossless data-compression library") #============================================================================ # CPack #============================================================================ set(CPACK_PACKAGE_VENDOR "zlib-Project") set(CPACK_PACKAGE_DESCRIPTION_FILE ${zlib_SOURCE_DIR}/README) set(CPACK_RESOURCE_FILE_LICENSE ${zlib_SOURCE_DIR}/LICENSE) set(CPACK_RESOURCE_FILE_README ${zlib_SOURCE_DIR}/README) #============================================================================ # configuration #============================================================================ option(ZLIB_BUILD_TESTING "Enable Zlib Examples as tests" ON) option(ZLIB_BUILD_SHARED "Enable building zlib shared library" ON) option(ZLIB_BUILD_STATIC "Enable building zlib static library" ON) option(ZLIB_BUILD_MINIZIP "Enable building libminizip contrib library" OFF) option(ZLIB_INSTALL_LIBRARIES "Enable installation of zlib" ON) option(ZLIB_PREFIX "prefix for all types and library functions, see zconf.h.in" OFF) mark_as_advanced(ZLIB_PREFIX) if(WIN32) option(ZLIB_INSTALL_COMPAT_DLL "Install a copy as zlib1.dll" ON) endif(WIN32) get_property(IS_MULTI GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) if(NOT DEFINED CMAKE_BUILD_TYPE AND NOT IS_MULTI) message(STATUS "No CMAKE_BUILD_TYPE set -- using Release") set(CMAKE_BUILD_TYPE Release) endif(NOT DEFINED CMAKE_BUILD_TYPE AND NOT IS_MULTI) include(CheckTypeSize) include(CheckFunctionExists) include(CheckIncludeFile) include(CheckCSourceCompiles) include(CMakePackageConfigHelpers) include(CPack) include(GNUInstallDirs) if(NOT ZLIB_CONF_WRITTEN) set(Z_PREFIX ${ZLIB_PREFIX}) set(CONF_OUT_FILE ${zlib_BINARY_DIR}/zconf.h.cmakein) file(READ ${zlib_SOURCE_DIR}/zconf.h.in ZCONF_CONTENT LIMIT 245) file(WRITE ${CONF_OUT_FILE} ${ZCONF_CONTENT}) file(APPEND ${CONF_OUT_FILE} "#cmakedefine Z_PREFIX 1\n") file(APPEND ${CONF_OUT_FILE} "#cmakedefine HAVE_STDARG_H 1\n") file(APPEND ${CONF_OUT_FILE} "#cmakedefine HAVE_UNISTD_H 1\n") file(READ ${zlib_SOURCE_DIR}/zconf.h.in ZCONF_CONTENT OFFSET 244) set(FIRST_ITEM TRUE) foreach(item IN LISTS ZCONF_CONTENT) if(FIRST_ITEM) string(APPEND OUT_CONTENT ${item}) set(FIRST_ITEM FALSE) else(FIRST_ITEM) string(APPEND OUT_CONTENT "\;" ${item}) endif(FIRST_ITEM) endforeach(item IN LISTS ${ZCONF_CONTENT}) file(APPEND ${CONF_OUT_FILE} ${OUT_CONTENT}) set(ZLIB_CONF_WRITTEN TRUE CACHE BOOL "zconf.h.cmakein was created") mark_as_advanced(ZLIB_CONF_WRITTEN) endif(NOT ZLIB_CONF_WRITTEN) # # 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 for fseeko # check_function_exists(fseeko HAVE_FSEEKO) # # Check for stdarg.h # check_include_file(stdarg.h HAVE_STDARG_H) # # Check for unistd.h # check_include_file(unistd.h HAVE_UNISTD_H) # # 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_COMPILE_FLAGS) set(ZLIB_PC ${zlib_BINARY_DIR}/zlib.pc) configure_file(${zlib_SOURCE_DIR}/zlib.pc.cmakein ${ZLIB_PC} @ONLY) configure_file(${zlib_BINARY_DIR}/zconf.h.cmakein ${zlib_BINARY_DIR}/zconf.h) include_directories(${zlib_BINARY_DIR} ${zlib_SOURCE_DIR}) #============================================================================ # zlib #============================================================================ set(ZLIB_PUBLIC_HDRS ${zlib_BINARY_DIR}/zconf.h zlib.h) set(ZLIB_PRIVATE_HDRS crc32.h deflate.h gzguts.h inffast.h inffixed.h inflate.h inftrees.h trees.h zutil.h) set(ZLIB_SRCS adler32.c compress.c crc32.c deflate.c gzclose.c gzlib.c gzread.c gzwrite.c inflate.c infback.c inftrees.c inffast.c trees.c uncompr.c zutil.c) set_source_files_properties(win32/zlib1.rc PROPERTIES COMPILE_FLAGS $<$:-DGCC_WINDRES>) if(WIN32) set(zlib_static_suffix "s") set(CMAKE_DEBUG_POSTFIX "d") endif(WIN32) if(ZLIB_BUILD_SHARED) add_library(zlib SHARED ${ZLIB_SRCS} ${ZLIB_DLL_SRCS} ${ZLIB_PUBLIC_HDRS} ${ZLIB_PRIVATE_HDRS} $<$,$>:win32/zlib1.rc>) add_library(ZLIB::ZLIB ALIAS zlib) target_include_directories(zlib PUBLIC $ $ $) target_compile_definitions(zlib PRIVATE $<$:NO_FSEEKO> $<$:HAVE_HIDDEN> $<$:_CRT_SECURE_NO_DEPRECATE> $<$:_CRT_NONSTDC_NO_DEPRECATE> PUBLIC $<$:_LARGEFILE64_SOURCE=1>) set(INSTALL_VERSION ${zlib_VERSION}) if(NOT CYGWIN) set_target_properties(zlib PROPERTIES SOVERSION ${zlib_VERSION_MAJOR} VERSION ${INSTALL_VERSION}) endif(NOT CYGWIN) set_target_properties(zlib PROPERTIES DEFINE_SYMBOL ZLIB_DLL EXPORT_NAME ZLIB OUTPUT_NAME z) if(UNIX AND NOT APPLE AND NOT(CMAKE_SYSTEM_NAME STREQUAL AIX)) # On unix-like platforms the library is almost always called libz set_target_properties(zlib PROPERTIES LINK_FLAGS "-Wl,--version-script,\"${zlib_SOURCE_DIR}/zlib.map\"") endif(UNIX AND NOT APPLE AND NOT(CMAKE_SYSTEM_NAME STREQUAL AIX)) endif(ZLIB_BUILD_SHARED) if(ZLIB_BUILD_STATIC) add_library(zlibstatic STATIC ${ZLIB_SRCS} ${ZLIB_PUBLIC_HDRS} ${ZLIB_PRIVATE_HDRS}) add_library(ZLIB::ZLIBSTATIC ALIAS zlibstatic) target_include_directories(zlibstatic PUBLIC $ $ $) target_compile_definitions(zlibstatic PRIVATE $<$:NO_FSEEKO> $<$:HAVE_HIDDEN> $<$:_CRT_SECURE_NO_DEPRECATE> $<$:_CRT_NONSTDC_NO_DEPRECATE> PUBLIC $<$:_LARGEFILE64_SOURCE=1>) set_target_properties(zlibstatic PROPERTIES EXPORT_NAME ZLIBSTATIC OUTPUT_NAME z${zlib_static_suffix}) endif(ZLIB_BUILD_STATIC) if(ZLIB_INSTALL_LIBRARIES) if(ZLIB_BUILD_SHARED) install(TARGETS zlib COMPONENT Runtime EXPORT zlibExport RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}") if(ZLIB_INSTALL_COMPAT_DLL) install(FILES $ COMPONENT Runtime RENAME zlib1.dll DESTINATION "${CMAKE_INSTALL_BINDIR}") endif(ZLIB_INSTALL_COMPAT_DLL) if(MSVC) install(FILES $ COMPONENT Runtime DESTINATION ${CMAKE_INSTALL_BINDIR} CONFIGURATIONS Debug OR RelWithDebInfo OPTIONAL ) endif(MSVC) endif(ZLIB_BUILD_SHARED) if(ZLIB_BUILD_STATIC) install(TARGETS zlibstatic COMPONENT Development EXPORT zlibExport RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}") if(ZLIB_INSTALL_COMPAT_DLL AND MINGW) install(FILES $ COMPONENT Development RENAME libz.dll.a DESTINATION "${CMAKE_INSTALL_LIBDIR}") endif(ZLIB_INSTALL_COMPAT_DLL AND MINGW) endif(ZLIB_BUILD_STATIC) configure_package_config_file(${zlib_SOURCE_DIR}/zlibConfig.cmake.in ${zlib_BINARY_DIR}/ZLIBConfig.cmake INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/zlib NO_CHECK_REQUIRED_COMPONENTS_MACRO) write_basic_package_version_file( "${zlib_BINARY_DIR}/ZLIBConfigVersion.cmake" VERSION "${zlib_VERSION}" COMPATIBILITY AnyNewerVersion) install(FILES ${zlib_BINARY_DIR}/ZLIBConfig.cmake ${zlib_BINARY_DIR}/ZLIBConfigVersion.cmake DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/zlib) install(EXPORT zlibExport FILE ZLIB.cmake DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/zlib NAMESPACE ZLIB::) install(FILES ${ZLIB_PUBLIC_HDRS} COMPONENT Development DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}") install(FILES zlib.3 COMPONENT Docs DESTINATION "${CMAKE_INSTALL_MANDIR}/man3") install(FILES LICENSE doc/algorithm.txt doc/crc-doc.1.0.pdf doc/rfc1950.txt doc/rfc1951.txt doc/rfc1952.txt doc/txtvsbin.txt COMPONENT Docs DESTINATION "${CMAKE_INSTALL_DOCDIR}/zlib") install(FILES ${ZLIB_PC} COMPONENT Development DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig") endif(ZLIB_INSTALL_LIBRARIES) #============================================================================ # Tests #============================================================================ if(ZLIB_BUILD_TESTING) enable_testing() add_subdirectory(test) endif(ZLIB_BUILD_TESTING) if(ZLIB_BUILD_MINIZIP) add_subdirectory(contrib/minizip/) endif(ZLIB_BUILD_MINIZIP)