CMakeLists.txt 7.9 KB
Newer Older
M
Mark Adler 已提交
1 2 3 4 5
cmake_minimum_required(VERSION 2.4.4)
set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS ON)

project(zlib C)

S
shuaiyutao 已提交
6
set(VERSION "1.2.12")
7

8 9 10
option(ASM686 "Enable building i686 assembly implementation")
option(AMD64 "Enable building amd64 assembly implementation")

11 12 13 14
set(INSTALL_BIN_DIR "${CMAKE_INSTALL_PREFIX}/bin" CACHE PATH "Installation directory for executables")
set(INSTALL_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib" CACHE PATH "Installation directory for libraries")
set(INSTALL_INC_DIR "${CMAKE_INSTALL_PREFIX}/include" CACHE PATH "Installation directory for headers")
set(INSTALL_MAN_DIR "${CMAKE_INSTALL_PREFIX}/share/man" CACHE PATH "Installation directory for manual pages")
15
set(INSTALL_PKGCONFIG_DIR "${CMAKE_INSTALL_PREFIX}/share/pkgconfig" CACHE PATH "Installation directory for pkgconfig (.pc) files")
16

M
Mark Adler 已提交
17 18 19 20 21 22 23 24 25 26 27 28 29
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 已提交
30
set(CMAKE_REQUIRED_DEFINITIONS -D_LARGEFILE64_SOURCE=1)
M
Mark Adler 已提交
31 32 33 34 35 36 37 38 39 40 41 42 43 44
# 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 已提交
45
   add_definitions(-D_LARGEFILE64_SOURCE=1)
M
Mark Adler 已提交
46 47 48 49 50 51 52 53 54 55 56 57 58 59
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 已提交
60
check_include_file(unistd.h Z_HAVE_UNISTD_H)
M
Mark Adler 已提交
61 62

if(MSVC)
M
Mark Adler 已提交
63
    set(CMAKE_DEBUG_POSTFIX "d")
M
Mark Adler 已提交
64 65
    add_definitions(-D_CRT_SECURE_NO_DEPRECATE)
    add_definitions(-D_CRT_NONSTDC_NO_DEPRECATE)
66
    include_directories(${CMAKE_CURRENT_SOURCE_DIR})
M
Mark Adler 已提交
67 68
endif()

M
Mark Adler 已提交
69
if(NOT CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_CURRENT_BINARY_DIR)
M
Mark Adler 已提交
70 71 72
    # 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)
73 74 75 76 77
        message(STATUS "Renaming")
        message(STATUS "    ${CMAKE_CURRENT_SOURCE_DIR}/zconf.h")
        message(STATUS "to 'zconf.h.included' because this file is included with zlib")
        message(STATUS "but CMake generates it automatically in the build directory.")
        file(RENAME ${CMAKE_CURRENT_SOURCE_DIR}/zconf.h ${CMAKE_CURRENT_SOURCE_DIR}/zconf.h.included)
M
Mark Adler 已提交
78 79 80
  endif()
endif()

81
set(ZLIB_PC ${CMAKE_CURRENT_BINARY_DIR}/zlib.pc)
82
configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/zlib.pc.cmakein
83
		${ZLIB_PC} @ONLY)
84 85
configure_file(	${CMAKE_CURRENT_SOURCE_DIR}/zconf.h.cmakein
		${CMAKE_CURRENT_BINARY_DIR}/zconf.h @ONLY)
86
include_directories(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_SOURCE_DIR})
M
Mark Adler 已提交
87 88


M
Mark Adler 已提交
89 90 91 92 93
#============================================================================
# zlib
#============================================================================

set(ZLIB_PUBLIC_HDRS
M
Mark Adler 已提交
94
    ${CMAKE_CURRENT_BINARY_DIR}/zconf.h
M
Mark Adler 已提交
95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
    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
)

126
if(NOT MINGW)
127
    set(ZLIB_DLL_SRCS
128 129 130 131
        win32/zlib1.rc # If present will override custom build rule below.
    )
endif()

132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164
if(CMAKE_COMPILER_IS_GNUCC)
    if(ASM686)
        set(ZLIB_ASMS contrib/asm686/match.S)
    elseif (AMD64)
        set(ZLIB_ASMS contrib/amd64/amd64-match.S)
    endif ()

	if(ZLIB_ASMS)
		add_definitions(-DASMV)
		set_source_files_properties(${ZLIB_ASMS} PROPERTIES LANGUAGE C COMPILE_FLAGS -DNO_UNDERLINE)
	endif()
endif()

if(MSVC)
    if(ASM686)
		ENABLE_LANGUAGE(ASM_MASM)
        set(ZLIB_ASMS
			contrib/masmx86/inffas32.asm
			contrib/masmx86/match686.asm
		)
    elseif (AMD64)
		ENABLE_LANGUAGE(ASM_MASM)
        set(ZLIB_ASMS
			contrib/masmx64/gvmat64.asm
			contrib/masmx64/inffasx64.asm
		)
    endif()

	if(ZLIB_ASMS)
		add_definitions(-DASMV -DASMINF)
	endif()
endif()

M
Mark Adler 已提交
165 166
# 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)
167
string(REGEX REPLACE ".*#define[ \t]+ZLIB_VERSION[ \t]+\"([-0-9A-Za-z.]+)\".*"
M
Mark Adler 已提交
168 169 170 171
    "\\1" ZLIB_FULL_VERSION ${_zlib_h_contents})

if(MINGW)
    # This gets us DLL resource information when compiling on MinGW.
172
    if(NOT CMAKE_RC_COMPILER)
173
        set(CMAKE_RC_COMPILER windres.exe)
174 175
    endif()

M
Mark Adler 已提交
176
    add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/zlib1rc.obj
177
                       COMMAND ${CMAKE_RC_COMPILER}
M
Mark Adler 已提交
178 179
                            -D GCC_WINDRES
                            -I ${CMAKE_CURRENT_SOURCE_DIR}
M
Mark Adler 已提交
180
                            -I ${CMAKE_CURRENT_BINARY_DIR}
M
Mark Adler 已提交
181 182
                            -o ${CMAKE_CURRENT_BINARY_DIR}/zlib1rc.obj
                            -i ${CMAKE_CURRENT_SOURCE_DIR}/win32/zlib1.rc)
183
    set(ZLIB_DLL_SRCS ${CMAKE_CURRENT_BINARY_DIR}/zlib1rc.obj)
M
Mark Adler 已提交
184 185
endif(MINGW)

186 187
add_library(zlib SHARED ${ZLIB_SRCS} ${ZLIB_ASMS} ${ZLIB_DLL_SRCS} ${ZLIB_PUBLIC_HDRS} ${ZLIB_PRIVATE_HDRS})
add_library(zlibstatic STATIC ${ZLIB_SRCS} ${ZLIB_ASMS} ${ZLIB_PUBLIC_HDRS} ${ZLIB_PRIVATE_HDRS})
M
Mark Adler 已提交
188 189
set_target_properties(zlib PROPERTIES DEFINE_SYMBOL ZLIB_DLL)
set_target_properties(zlib PROPERTIES SOVERSION 1)
M
Mark Adler 已提交
190 191 192 193 194 195 196 197 198 199 200 201

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 已提交
202
if(UNIX)
M
Mark Adler 已提交
203
    # On unix-like platforms the library is almost always called libz
204
   set_target_properties(zlib zlibstatic PROPERTIES OUTPUT_NAME z)
205 206 207
   if(NOT APPLE)
     set_target_properties(zlib PROPERTIES LINK_FLAGS "-Wl,--version-script,\"${CMAKE_CURRENT_SOURCE_DIR}/zlib.map\"")
   endif()
M
Mark Adler 已提交
208 209 210
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 已提交
211 212 213
endif()

if(NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL )
214
    install(TARGETS zlib zlibstatic
215 216 217
        RUNTIME DESTINATION "${INSTALL_BIN_DIR}"
        ARCHIVE DESTINATION "${INSTALL_LIB_DIR}"
        LIBRARY DESTINATION "${INSTALL_LIB_DIR}" )
M
Mark Adler 已提交
218 219
endif()
if(NOT SKIP_INSTALL_HEADERS AND NOT SKIP_INSTALL_ALL )
220
    install(FILES ${ZLIB_PUBLIC_HDRS} DESTINATION "${INSTALL_INC_DIR}")
M
Mark Adler 已提交
221 222
endif()
if(NOT SKIP_INSTALL_FILES AND NOT SKIP_INSTALL_ALL )
223
    install(FILES zlib.3 DESTINATION "${INSTALL_MAN_DIR}/man3")
M
Mark Adler 已提交
224
endif()
225
if(NOT SKIP_INSTALL_FILES AND NOT SKIP_INSTALL_ALL )
226
    install(FILES ${ZLIB_PC} DESTINATION "${INSTALL_PKGCONFIG_DIR}")
227
endif()
M
Mark Adler 已提交
228 229 230 231 232

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

233
add_executable(example test/example.c)
M
Mark Adler 已提交
234 235 236
target_link_libraries(example zlib)
add_test(example example)

237
add_executable(minigzip test/minigzip.c)
M
Mark Adler 已提交
238 239 240
target_link_libraries(minigzip zlib)

if(HAVE_OFF64_T)
241
    add_executable(example64 test/example.c)
M
Mark Adler 已提交
242 243 244 245
    target_link_libraries(example64 zlib)
    set_target_properties(example64 PROPERTIES COMPILE_FLAGS "-D_FILE_OFFSET_BITS=64")
    add_test(example64 example64)

246
    add_executable(minigzip64 test/minigzip.c)
M
Mark Adler 已提交
247 248 249
    target_link_libraries(minigzip64 zlib)
    set_target_properties(minigzip64 PROPERTIES COMPILE_FLAGS "-D_FILE_OFFSET_BITS=64")
endif()