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