CMakeLists.txt 5.9 KB
Newer Older
M
Mark Adler 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
cmake_minimum_required(VERSION 2.4.4)
set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS ON)

project(zlib C)

if(NOT DEFINED BUILD_SHARED_LIBS)
    option(BUILD_SHARED_LIBS "Build a shared library form of zlib" ON)
endif()

include(CheckTypeSize)
include(CheckFunctionExists)
include(CheckIncludeFile)
include(CheckCSourceCompiles)
enable_testing()

check_include_file(sys/types.h HAVE_SYS_TYPES_H)
check_include_file(stdint.h    HAVE_STDINT_H)
check_include_file(stddef.h    HAVE_STDDEF_H)

#
# Check to see if we have large file support
#
M
Mark Adler 已提交
23
set(CMAKE_REQUIRED_DEFINITIONS -D_LARGEFILE64_SOURCE=1)
M
Mark Adler 已提交
24 25 26 27 28 29 30 31 32 33 34 35 36 37
# We add these other definitions here because CheckTypeSize.cmake
# in CMake 2.4.x does not automatically do so and we want
# compatibility with CMake 2.4.x.
if(HAVE_SYS_TYPES_H)
    list(APPEND CMAKE_REQUIRED_DEFINITIONS -DHAVE_SYS_TYPES_H)
endif()
if(HAVE_STDINT_H)
    list(APPEND CMAKE_REQUIRED_DEFINITIONS -DHAVE_STDINT_H)
endif()
if(HAVE_STDDEF_H)
    list(APPEND CMAKE_REQUIRED_DEFINITIONS -DHAVE_STDDEF_H)
endif()
check_type_size(off64_t OFF64_T)
if(HAVE_OFF64_T)
M
Mark Adler 已提交
38
   add_definitions(-D_LARGEFILE64_SOURCE=1)
M
Mark Adler 已提交
39 40 41 42 43 44 45 46 47 48 49 50 51 52
endif()
set(CMAKE_REQUIRED_DEFINITIONS) # clear variable

#
# Check for fseeko
#
check_function_exists(fseeko HAVE_FSEEKO)
if(NOT HAVE_FSEEKO)
    add_definitions(-DNO_FSEEKO)
endif()

#
# Check for unistd.h
#
M
Mark Adler 已提交
53
check_include_file(unistd.h Z_HAVE_UNISTD_H)
M
Mark Adler 已提交
54 55

if(MSVC)
M
Mark Adler 已提交
56
    set(CMAKE_DEBUG_POSTFIX "d")
M
Mark Adler 已提交
57 58 59 60
    add_definitions(-D_CRT_SECURE_NO_DEPRECATE)
    add_definitions(-D_CRT_NONSTDC_NO_DEPRECATE)
endif()

M
Mark Adler 已提交
61
if(NOT CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_CURRENT_BINARY_DIR)
M
Mark Adler 已提交
62 63 64 65 66 67 68 69
    # If we're doing an out of source build and the user has a zconf.h
    # in their source tree...
    if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/zconf.h)
        message(FATAL_ERROR
            "You must remove ${CMAKE_CURRENT_SOURCE_DIR}/zconf.h "
            "from the source tree.  This file is included with zlib "
            "but CMake generates this file for you automatically "
            "in the build directory.")
M
Mark Adler 已提交
70 71 72
  endif()
endif()

M
Mark Adler 已提交
73 74
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/zconf.h.cmakein
               ${CMAKE_CURRENT_BINARY_DIR}/zconf.h @ONLY)
M
Mark Adler 已提交
75 76 77
include_directories(${CMAKE_CURRENT_BINARY_DIR})


M
Mark Adler 已提交
78 79 80 81 82
#============================================================================
# zlib
#============================================================================

set(ZLIB_PUBLIC_HDRS
M
Mark Adler 已提交
83
    ${CMAKE_CURRENT_BINARY_DIR}/zconf.h
M
Mark Adler 已提交
84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
    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
)

115 116 117 118 119 120
if(NOT MINGW)
    set(ZLIB_SRCS ${ZLIB_SRCS}
        win32/zlib1.rc # If present will override custom build rule below.
    )
endif()

M
Mark Adler 已提交
121 122 123 124 125 126 127
# parse the full version number from zlib.h and include in ZLIB_FULL_VERSION
file(READ ${CMAKE_CURRENT_SOURCE_DIR}/zlib.h _zlib_h_contents)
string(REGEX REPLACE ".*#define[ \t]+ZLIB_VERSION[ \t]+\"([0-9A-Za-z.]+)\".*"
    "\\1" ZLIB_FULL_VERSION ${_zlib_h_contents})

if(MINGW)
    # This gets us DLL resource information when compiling on MinGW.
128 129 130 131
    if(NOT CMAKE_RC_COMPILER)
        SET(CMAKE_RC_COMPILER windres.exe)
    endif()

M
Mark Adler 已提交
132
    add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/zlib1rc.obj
133
                       COMMAND ${CMAKE_RC_COMPILER}
M
Mark Adler 已提交
134 135
                            -D GCC_WINDRES
                            -I ${CMAKE_CURRENT_SOURCE_DIR}
M
Mark Adler 已提交
136
                            -I ${CMAKE_CURRENT_BINARY_DIR}
M
Mark Adler 已提交
137 138 139 140 141
                            -o ${CMAKE_CURRENT_BINARY_DIR}/zlib1rc.obj
                            -i ${CMAKE_CURRENT_SOURCE_DIR}/win32/zlib1.rc)
    set(ZLIB_SRCS ${ZLIB_SRCS} ${CMAKE_CURRENT_BINARY_DIR}/zlib1rc.obj)
endif(MINGW)

M
Mark Adler 已提交
142 143
add_library(zlib ${ZLIB_SRCS} ${ZLIB_PUBLIC_HDRS} ${ZLIB_PRIVATE_HDRS})
set_target_properties(zlib PROPERTIES DEFINE_SYMBOL ZLIB_DLL)
M
Mark Adler 已提交
144

M
Mark Adler 已提交
145
set_target_properties(zlib PROPERTIES SOVERSION 1)
M
Mark Adler 已提交
146 147 148 149 150 151 152 153 154 155 156 157

if(NOT CYGWIN)
    # This property causes shared libraries on Linux to have the full version
    # encoded into their final filename.  We disable this on Cygwin because
    # it causes cygz-${ZLIB_FULL_VERSION}.dll to be created when cygz.dll
    # seems to be the default.
    #
    # This has no effect with MSVC, on that platform the version info for
    # the DLL comes from the resource file win32/zlib1.rc
    set_target_properties(zlib PROPERTIES VERSION ${ZLIB_FULL_VERSION})
endif()

M
Mark Adler 已提交
158
if(UNIX)
M
Mark Adler 已提交
159
    # On unix-like platforms the library is almost always called libz
M
Mark Adler 已提交
160
   set_target_properties(zlib PROPERTIES OUTPUT_NAME z)
M
Mark Adler 已提交
161 162 163
elseif(BUILD_SHARED_LIBS AND WIN32)
    # Creates zlib1.dll when building shared library version
    set_target_properties(zlib PROPERTIES SUFFIX "1.dll")
M
Mark Adler 已提交
164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182
endif()

if(NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL )
    install(TARGETS zlib
        RUNTIME DESTINATION bin
        ARCHIVE DESTINATION lib
        LIBRARY DESTINATION lib )
endif()
if(NOT SKIP_INSTALL_HEADERS AND NOT SKIP_INSTALL_ALL )
    install(FILES ${ZLIB_PUBLIC_HDRS} DESTINATION include)
endif()
if(NOT SKIP_INSTALL_FILES AND NOT SKIP_INSTALL_ALL )
    install(FILES zlib.3 DESTINATION share/man/man3)
endif()

#============================================================================
# Example binaries
#============================================================================

183
add_executable(example test/example.c)
M
Mark Adler 已提交
184 185 186
target_link_libraries(example zlib)
add_test(example example)

187
add_executable(minigzip test/minigzip.c)
M
Mark Adler 已提交
188 189 190
target_link_libraries(minigzip zlib)

if(HAVE_OFF64_T)
191
    add_executable(example64 test/example.c)
M
Mark Adler 已提交
192 193 194 195
    target_link_libraries(example64 zlib)
    set_target_properties(example64 PROPERTIES COMPILE_FLAGS "-D_FILE_OFFSET_BITS=64")
    add_test(example64 example64)

196
    add_executable(minigzip64 test/minigzip.c)
M
Mark Adler 已提交
197 198 199
    target_link_libraries(minigzip64 zlib)
    set_target_properties(minigzip64 PROPERTIES COMPILE_FLAGS "-D_FILE_OFFSET_BITS=64")
endif()