Home | History | Annotate | Line # | Download | only in zlib
      1  1.1.1.3  christos cmake_minimum_required(VERSION 2.4.4...3.15.0)
      2      1.1  christos set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS ON)
      3      1.1  christos 
      4      1.1  christos project(zlib C)
      5      1.1  christos 
      6  1.1.1.3  christos set(VERSION "1.3.1")
      7  1.1.1.3  christos 
      8  1.1.1.3  christos option(ZLIB_BUILD_EXAMPLES "Enable Zlib Examples" ON)
      9      1.1  christos 
     10      1.1  christos set(INSTALL_BIN_DIR "${CMAKE_INSTALL_PREFIX}/bin" CACHE PATH "Installation directory for executables")
     11      1.1  christos set(INSTALL_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib" CACHE PATH "Installation directory for libraries")
     12      1.1  christos set(INSTALL_INC_DIR "${CMAKE_INSTALL_PREFIX}/include" CACHE PATH "Installation directory for headers")
     13      1.1  christos set(INSTALL_MAN_DIR "${CMAKE_INSTALL_PREFIX}/share/man" CACHE PATH "Installation directory for manual pages")
     14      1.1  christos set(INSTALL_PKGCONFIG_DIR "${CMAKE_INSTALL_PREFIX}/share/pkgconfig" CACHE PATH "Installation directory for pkgconfig (.pc) files")
     15      1.1  christos 
     16      1.1  christos include(CheckTypeSize)
     17      1.1  christos include(CheckFunctionExists)
     18      1.1  christos include(CheckIncludeFile)
     19      1.1  christos include(CheckCSourceCompiles)
     20      1.1  christos enable_testing()
     21      1.1  christos 
     22      1.1  christos check_include_file(sys/types.h HAVE_SYS_TYPES_H)
     23      1.1  christos check_include_file(stdint.h    HAVE_STDINT_H)
     24      1.1  christos check_include_file(stddef.h    HAVE_STDDEF_H)
     25      1.1  christos 
     26      1.1  christos #
     27      1.1  christos # Check to see if we have large file support
     28      1.1  christos #
     29      1.1  christos set(CMAKE_REQUIRED_DEFINITIONS -D_LARGEFILE64_SOURCE=1)
     30      1.1  christos # We add these other definitions here because CheckTypeSize.cmake
     31      1.1  christos # in CMake 2.4.x does not automatically do so and we want
     32      1.1  christos # compatibility with CMake 2.4.x.
     33      1.1  christos if(HAVE_SYS_TYPES_H)
     34      1.1  christos     list(APPEND CMAKE_REQUIRED_DEFINITIONS -DHAVE_SYS_TYPES_H)
     35      1.1  christos endif()
     36      1.1  christos if(HAVE_STDINT_H)
     37      1.1  christos     list(APPEND CMAKE_REQUIRED_DEFINITIONS -DHAVE_STDINT_H)
     38      1.1  christos endif()
     39      1.1  christos if(HAVE_STDDEF_H)
     40      1.1  christos     list(APPEND CMAKE_REQUIRED_DEFINITIONS -DHAVE_STDDEF_H)
     41      1.1  christos endif()
     42      1.1  christos check_type_size(off64_t OFF64_T)
     43      1.1  christos if(HAVE_OFF64_T)
     44      1.1  christos    add_definitions(-D_LARGEFILE64_SOURCE=1)
     45      1.1  christos endif()
     46      1.1  christos set(CMAKE_REQUIRED_DEFINITIONS) # clear variable
     47      1.1  christos 
     48      1.1  christos #
     49      1.1  christos # Check for fseeko
     50      1.1  christos #
     51      1.1  christos check_function_exists(fseeko HAVE_FSEEKO)
     52      1.1  christos if(NOT HAVE_FSEEKO)
     53      1.1  christos     add_definitions(-DNO_FSEEKO)
     54      1.1  christos endif()
     55      1.1  christos 
     56      1.1  christos #
     57      1.1  christos # Check for unistd.h
     58      1.1  christos #
     59      1.1  christos check_include_file(unistd.h Z_HAVE_UNISTD_H)
     60      1.1  christos 
     61      1.1  christos if(MSVC)
     62      1.1  christos     set(CMAKE_DEBUG_POSTFIX "d")
     63      1.1  christos     add_definitions(-D_CRT_SECURE_NO_DEPRECATE)
     64      1.1  christos     add_definitions(-D_CRT_NONSTDC_NO_DEPRECATE)
     65      1.1  christos     include_directories(${CMAKE_CURRENT_SOURCE_DIR})
     66      1.1  christos endif()
     67      1.1  christos 
     68      1.1  christos if(NOT CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_CURRENT_BINARY_DIR)
     69      1.1  christos     # If we're doing an out of source build and the user has a zconf.h
     70      1.1  christos     # in their source tree...
     71      1.1  christos     if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/zconf.h)
     72      1.1  christos         message(STATUS "Renaming")
     73      1.1  christos         message(STATUS "    ${CMAKE_CURRENT_SOURCE_DIR}/zconf.h")
     74      1.1  christos         message(STATUS "to 'zconf.h.included' because this file is included with zlib")
     75      1.1  christos         message(STATUS "but CMake generates it automatically in the build directory.")
     76      1.1  christos         file(RENAME ${CMAKE_CURRENT_SOURCE_DIR}/zconf.h ${CMAKE_CURRENT_SOURCE_DIR}/zconf.h.included)
     77      1.1  christos   endif()
     78      1.1  christos endif()
     79      1.1  christos 
     80      1.1  christos set(ZLIB_PC ${CMAKE_CURRENT_BINARY_DIR}/zlib.pc)
     81      1.1  christos configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/zlib.pc.cmakein
     82      1.1  christos 		${ZLIB_PC} @ONLY)
     83      1.1  christos configure_file(	${CMAKE_CURRENT_SOURCE_DIR}/zconf.h.cmakein
     84      1.1  christos 		${CMAKE_CURRENT_BINARY_DIR}/zconf.h @ONLY)
     85      1.1  christos include_directories(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_SOURCE_DIR})
     86      1.1  christos 
     87      1.1  christos 
     88      1.1  christos #============================================================================
     89      1.1  christos # zlib
     90      1.1  christos #============================================================================
     91      1.1  christos 
     92      1.1  christos set(ZLIB_PUBLIC_HDRS
     93      1.1  christos     ${CMAKE_CURRENT_BINARY_DIR}/zconf.h
     94      1.1  christos     zlib.h
     95      1.1  christos )
     96      1.1  christos set(ZLIB_PRIVATE_HDRS
     97      1.1  christos     crc32.h
     98      1.1  christos     deflate.h
     99      1.1  christos     gzguts.h
    100      1.1  christos     inffast.h
    101      1.1  christos     inffixed.h
    102      1.1  christos     inflate.h
    103      1.1  christos     inftrees.h
    104      1.1  christos     trees.h
    105      1.1  christos     zutil.h
    106      1.1  christos )
    107      1.1  christos set(ZLIB_SRCS
    108      1.1  christos     adler32.c
    109      1.1  christos     compress.c
    110      1.1  christos     crc32.c
    111      1.1  christos     deflate.c
    112      1.1  christos     gzclose.c
    113      1.1  christos     gzlib.c
    114      1.1  christos     gzread.c
    115      1.1  christos     gzwrite.c
    116      1.1  christos     inflate.c
    117      1.1  christos     infback.c
    118      1.1  christos     inftrees.c
    119      1.1  christos     inffast.c
    120      1.1  christos     trees.c
    121      1.1  christos     uncompr.c
    122      1.1  christos     zutil.c
    123      1.1  christos )
    124      1.1  christos 
    125      1.1  christos if(NOT MINGW)
    126      1.1  christos     set(ZLIB_DLL_SRCS
    127      1.1  christos         win32/zlib1.rc # If present will override custom build rule below.
    128      1.1  christos     )
    129      1.1  christos endif()
    130      1.1  christos 
    131      1.1  christos # parse the full version number from zlib.h and include in ZLIB_FULL_VERSION
    132      1.1  christos file(READ ${CMAKE_CURRENT_SOURCE_DIR}/zlib.h _zlib_h_contents)
    133      1.1  christos string(REGEX REPLACE ".*#define[ \t]+ZLIB_VERSION[ \t]+\"([-0-9A-Za-z.]+)\".*"
    134      1.1  christos     "\\1" ZLIB_FULL_VERSION ${_zlib_h_contents})
    135      1.1  christos 
    136      1.1  christos if(MINGW)
    137      1.1  christos     # This gets us DLL resource information when compiling on MinGW.
    138      1.1  christos     if(NOT CMAKE_RC_COMPILER)
    139      1.1  christos         set(CMAKE_RC_COMPILER windres.exe)
    140      1.1  christos     endif()
    141      1.1  christos 
    142      1.1  christos     add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/zlib1rc.obj
    143      1.1  christos                        COMMAND ${CMAKE_RC_COMPILER}
    144      1.1  christos                             -D GCC_WINDRES
    145      1.1  christos                             -I ${CMAKE_CURRENT_SOURCE_DIR}
    146      1.1  christos                             -I ${CMAKE_CURRENT_BINARY_DIR}
    147      1.1  christos                             -o ${CMAKE_CURRENT_BINARY_DIR}/zlib1rc.obj
    148      1.1  christos                             -i ${CMAKE_CURRENT_SOURCE_DIR}/win32/zlib1.rc)
    149      1.1  christos     set(ZLIB_DLL_SRCS ${CMAKE_CURRENT_BINARY_DIR}/zlib1rc.obj)
    150      1.1  christos endif(MINGW)
    151      1.1  christos 
    152  1.1.1.2  christos add_library(zlib SHARED ${ZLIB_SRCS} ${ZLIB_DLL_SRCS} ${ZLIB_PUBLIC_HDRS} ${ZLIB_PRIVATE_HDRS})
    153  1.1.1.3  christos target_include_directories(zlib PUBLIC ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR})
    154  1.1.1.2  christos add_library(zlibstatic STATIC ${ZLIB_SRCS} ${ZLIB_PUBLIC_HDRS} ${ZLIB_PRIVATE_HDRS})
    155  1.1.1.3  christos target_include_directories(zlibstatic PUBLIC ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR})
    156      1.1  christos set_target_properties(zlib PROPERTIES DEFINE_SYMBOL ZLIB_DLL)
    157      1.1  christos set_target_properties(zlib PROPERTIES SOVERSION 1)
    158      1.1  christos 
    159      1.1  christos if(NOT CYGWIN)
    160      1.1  christos     # This property causes shared libraries on Linux to have the full version
    161      1.1  christos     # encoded into their final filename.  We disable this on Cygwin because
    162      1.1  christos     # it causes cygz-${ZLIB_FULL_VERSION}.dll to be created when cygz.dll
    163      1.1  christos     # seems to be the default.
    164      1.1  christos     #
    165      1.1  christos     # This has no effect with MSVC, on that platform the version info for
    166      1.1  christos     # the DLL comes from the resource file win32/zlib1.rc
    167      1.1  christos     set_target_properties(zlib PROPERTIES VERSION ${ZLIB_FULL_VERSION})
    168      1.1  christos endif()
    169      1.1  christos 
    170      1.1  christos if(UNIX)
    171      1.1  christos     # On unix-like platforms the library is almost always called libz
    172      1.1  christos    set_target_properties(zlib zlibstatic PROPERTIES OUTPUT_NAME z)
    173  1.1.1.3  christos    if(NOT APPLE AND NOT(CMAKE_SYSTEM_NAME STREQUAL AIX))
    174      1.1  christos      set_target_properties(zlib PROPERTIES LINK_FLAGS "-Wl,--version-script,\"${CMAKE_CURRENT_SOURCE_DIR}/zlib.map\"")
    175      1.1  christos    endif()
    176      1.1  christos elseif(BUILD_SHARED_LIBS AND WIN32)
    177      1.1  christos     # Creates zlib1.dll when building shared library version
    178      1.1  christos     set_target_properties(zlib PROPERTIES SUFFIX "1.dll")
    179      1.1  christos endif()
    180      1.1  christos 
    181      1.1  christos if(NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL )
    182      1.1  christos     install(TARGETS zlib zlibstatic
    183      1.1  christos         RUNTIME DESTINATION "${INSTALL_BIN_DIR}"
    184      1.1  christos         ARCHIVE DESTINATION "${INSTALL_LIB_DIR}"
    185      1.1  christos         LIBRARY DESTINATION "${INSTALL_LIB_DIR}" )
    186      1.1  christos endif()
    187      1.1  christos if(NOT SKIP_INSTALL_HEADERS AND NOT SKIP_INSTALL_ALL )
    188      1.1  christos     install(FILES ${ZLIB_PUBLIC_HDRS} DESTINATION "${INSTALL_INC_DIR}")
    189      1.1  christos endif()
    190      1.1  christos if(NOT SKIP_INSTALL_FILES AND NOT SKIP_INSTALL_ALL )
    191      1.1  christos     install(FILES zlib.3 DESTINATION "${INSTALL_MAN_DIR}/man3")
    192      1.1  christos endif()
    193      1.1  christos if(NOT SKIP_INSTALL_FILES AND NOT SKIP_INSTALL_ALL )
    194      1.1  christos     install(FILES ${ZLIB_PC} DESTINATION "${INSTALL_PKGCONFIG_DIR}")
    195      1.1  christos endif()
    196      1.1  christos 
    197      1.1  christos #============================================================================
    198      1.1  christos # Example binaries
    199      1.1  christos #============================================================================
    200  1.1.1.3  christos if(ZLIB_BUILD_EXAMPLES)
    201  1.1.1.3  christos     add_executable(example test/example.c)
    202  1.1.1.3  christos     target_link_libraries(example zlib)
    203  1.1.1.3  christos     add_test(example example)
    204  1.1.1.3  christos 
    205  1.1.1.3  christos     add_executable(minigzip test/minigzip.c)
    206  1.1.1.3  christos     target_link_libraries(minigzip zlib)
    207  1.1.1.3  christos 
    208  1.1.1.3  christos     if(HAVE_OFF64_T)
    209  1.1.1.3  christos         add_executable(example64 test/example.c)
    210  1.1.1.3  christos         target_link_libraries(example64 zlib)
    211  1.1.1.3  christos         set_target_properties(example64 PROPERTIES COMPILE_FLAGS "-D_FILE_OFFSET_BITS=64")
    212  1.1.1.3  christos         add_test(example64 example64)
    213  1.1.1.3  christos 
    214  1.1.1.3  christos         add_executable(minigzip64 test/minigzip.c)
    215  1.1.1.3  christos         target_link_libraries(minigzip64 zlib)
    216  1.1.1.3  christos         set_target_properties(minigzip64 PROPERTIES COMPILE_FLAGS "-D_FILE_OFFSET_BITS=64")
    217  1.1.1.3  christos     endif()
    218      1.1  christos endif()
    219