|
1 | | -set(src |
2 | | - miniz.c |
| 1 | +cmake_minimum_required(VERSION 3.0) |
| 2 | + |
| 3 | +# determine whether this is a standalone project or included by other projects |
| 4 | +set (MINIZ_STANDALONE_PROJECT ON) |
| 5 | +if(DEFINED PROJECT_NAME) |
| 6 | + set(MINIZ_STANDALONE_PROJECT OFF) |
| 7 | +endif() |
| 8 | + |
| 9 | +if(CMAKE_MINOR_VERSION LESS 12) |
| 10 | + project(miniz) |
| 11 | + # see issue https://gitlab.kitware.com/cmake/cmake/merge_requests/1799 |
| 12 | +else() |
| 13 | + project(miniz C) |
| 14 | + set(CMAKE_C_STANDARD 90) |
| 15 | + set(CMAKE_VERBOSE_MAKEFILE ON) |
| 16 | + # set(CMAKE_C_VISIBILITY_PRESET hidden) |
| 17 | + # set(CMAKE_VISIBILITY_INLINES_HIDDEN YES) |
| 18 | + |
| 19 | + if (MSVC) |
| 20 | + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W3 /Zi /permissive-") |
| 21 | + else () |
| 22 | + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wshadow -Wformat=2 -Wall -Wno-overlength-strings -pedantic") |
| 23 | + endif () |
| 24 | +endif() |
| 25 | + |
| 26 | +set(MINIZ_API_VERSION 3) |
| 27 | +set(MINIZ_MINOR_VERSION 0) |
| 28 | +set(MINIZ_PATCH_VERSION 0) |
| 29 | +set(MINIZ_VERSION |
| 30 | + ${MINIZ_API_VERSION}.${MINIZ_MINOR_VERSION}.${MINIZ_PATCH_VERSION}) |
| 31 | + |
| 32 | +if(CMAKE_BUILD_TYPE STREQUAL "") |
| 33 | + # CMake defaults to leaving CMAKE_BUILD_TYPE empty. This screws up |
| 34 | + # differentiation between debug and release builds. |
| 35 | + set(CMAKE_BUILD_TYPE "Release" CACHE STRING |
| 36 | + "Choose the type of build, options are: None (CMAKE_CXX_FLAGS or \ |
| 37 | +CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel." FORCE) |
| 38 | +endif () |
| 39 | + |
| 40 | +option(BUILD_EXAMPLES "Build examples" ${MINIZ_STANDALONE_PROJECT}) |
| 41 | +option(BUILD_FUZZERS "Build fuzz targets" OFF) |
| 42 | +option(AMALGAMATE_SOURCES "Amalgamate sources into miniz.h/c" OFF) |
| 43 | +option(BUILD_HEADER_ONLY "Build a header-only version" OFF) |
| 44 | +option(BUILD_SHARED_LIBS "Build shared library instead of static" OFF) |
| 45 | +option(INSTALL_PROJECT "Install project" ${MINIZ_STANDALONE_PROJECT}) |
| 46 | + |
| 47 | +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/bin) |
| 48 | + |
| 49 | +if(INSTALL_PROJECT) |
| 50 | + include(GNUInstallDirs) |
| 51 | +endif() |
| 52 | + |
| 53 | +if(BUILD_HEADER_ONLY) |
| 54 | + set(AMALGAMATE_SOURCES ON CACHE BOOL "Build a header-only version" FORCE) |
| 55 | +endif(BUILD_HEADER_ONLY) |
| 56 | + |
| 57 | +if(AMALGAMATE_SOURCES) |
| 58 | + # Amalgamate |
| 59 | + file(COPY miniz.h DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/amalgamation/) |
| 60 | + file(READ miniz.h MINIZ_H) |
| 61 | + file(READ miniz_common.h MINIZ_COMMON_H) |
| 62 | + file(READ miniz_tdef.h MINIZ_TDEF_H) |
| 63 | + file(READ miniz_tinfl.h MINIZ_TINFL_H) |
| 64 | + file(READ miniz_zip.h MINIZ_ZIP_H) |
| 65 | + file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/amalgamation/miniz.h |
| 66 | + "${MINIZ_COMMON_H} ${MINIZ_TDEF_H} ${MINIZ_TINFL_H} ${MINIZ_ZIP_H}") |
| 67 | + |
| 68 | + file(COPY miniz.c DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/amalgamation/) |
| 69 | + file(READ miniz_tdef.c MINIZ_TDEF_C) |
| 70 | + file(READ miniz_tinfl.c MINIZ_TINFL_C) |
| 71 | + file(READ miniz_zip.c MINIZ_ZIP_C) |
| 72 | + file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/amalgamation/miniz.c |
| 73 | + "${MINIZ_TDEF_C} ${MINIZ_TINFL_C} ${MINIZ_ZIP_C}") |
| 74 | + |
| 75 | + file(READ ${CMAKE_CURRENT_BINARY_DIR}/amalgamation/miniz.h AMAL_MINIZ_H) |
| 76 | + file(READ ${CMAKE_CURRENT_BINARY_DIR}/amalgamation/miniz.c AMAL_MINIZ_C) |
| 77 | + foreach(REPLACE_STRING miniz;miniz_common;miniz_tdef;miniz_tinfl;miniz_zip;miniz_export) |
| 78 | + string(REPLACE "#include \"${REPLACE_STRING}.h\"" "" AMAL_MINIZ_H "${AMAL_MINIZ_H}") |
| 79 | + string(REPLACE "#include \"${REPLACE_STRING}.h\"" "" AMAL_MINIZ_C "${AMAL_MINIZ_C}") |
| 80 | + endforeach() |
| 81 | + string(CONCAT AMAL_MINIZ_H "#ifndef MINIZ_EXPORT\n#define MINIZ_EXPORT\n#endif\n" "${AMAL_MINIZ_H}") |
| 82 | + if(BUILD_HEADER_ONLY) |
| 83 | + string(CONCAT AMAL_MINIZ_H "${AMAL_MINIZ_H}" "\n#ifndef MINIZ_HEADER_FILE_ONLY\n" |
| 84 | + "${AMAL_MINIZ_C}" "\n#endif // MINIZ_HEADER_FILE_ONLY\n") |
| 85 | + file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/amalgamation/miniz.h "${AMAL_MINIZ_H}") |
| 86 | + add_library(${PROJECT_NAME} INTERFACE) |
| 87 | + |
| 88 | + # Might not be a good idea to force this on the library user |
| 89 | + # as it could bloat the global namespace |
| 90 | + # https://github.com/libevent/libevent/issues/460 |
| 91 | + # target_compile_definitions(${PROJECT_NAME} |
| 92 | + # INTERFACE $<$<C_COMPILER_ID:GNU>:_GNU_SOURCE>) |
| 93 | + |
| 94 | + set_property(TARGET ${PROJECT_NAME} APPEND |
| 95 | + PROPERTY INTERFACE_INCLUDE_DIRECTORIES |
| 96 | + $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/amalgamation> |
| 97 | + $<INSTALL_INTERFACE:include> |
| 98 | + ) |
| 99 | + else(BUILD_HEADER_ONLY) |
| 100 | + string(CONCAT AMAL_MINIZ_C "#include \"miniz.h\"\n" "${AMAL_MINIZ_C}") |
| 101 | + file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/amalgamation/miniz.h "${AMAL_MINIZ_H}") |
| 102 | + file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/amalgamation/miniz.c "${AMAL_MINIZ_C}") |
| 103 | + set(miniz_SOURCE ${CMAKE_CURRENT_BINARY_DIR}/amalgamation/miniz.h |
| 104 | + ${CMAKE_CURRENT_BINARY_DIR}/amalgamation/miniz.c) |
| 105 | + add_library(${PROJECT_NAME} STATIC ${miniz_SOURCE}) |
| 106 | + target_include_directories(${PROJECT_NAME} PUBLIC |
| 107 | + $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/amalgamation> |
| 108 | + $<INSTALL_INTERFACE:include> |
| 109 | + ) |
| 110 | + endif(BUILD_HEADER_ONLY) |
| 111 | + |
| 112 | + set(INSTALL_HEADERS ${CMAKE_CURRENT_BINARY_DIR}/amalgamation/miniz.h) |
| 113 | + |
| 114 | + file(GLOB_RECURSE ZIP_FILES RELATIVE "${CMAKE_CURRENT_BINARY_DIR}/amalgamation" "${CMAKE_CURRENT_BINARY_DIR}/amalgamation/*") |
| 115 | + file(GLOB_RECURSE ZIP_FILES2 RELATIVE "${CMAKE_SOURCE_DIR}" "${CMAKE_SOURCE_DIR}/examples/*") |
| 116 | + list(APPEND ZIP_FILES ${ZIP_FILES2}) |
| 117 | + list(APPEND ZIP_FILES "ChangeLog.md") |
| 118 | + list(APPEND ZIP_FILES "readme.md") |
| 119 | + list(APPEND ZIP_FILES "LICENSE") |
| 120 | + set(ZIP_OUT_FN "${CMAKE_CURRENT_BINARY_DIR}/miniz-${MINIZ_VERSION}.zip") |
| 121 | + message(STATUS "Zip files: ${ZIP_FILES}") |
| 122 | + add_custom_command( |
| 123 | + COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_SOURCE_DIR}/examples ${CMAKE_CURRENT_BINARY_DIR}/amalgamation/examples |
| 124 | + COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/ChangeLog.md ${CMAKE_CURRENT_BINARY_DIR}/amalgamation/ChangeLog.md |
| 125 | + COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/readme.md ${CMAKE_CURRENT_BINARY_DIR}/amalgamation/readme.md |
| 126 | + COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/LICENSE ${CMAKE_CURRENT_BINARY_DIR}/amalgamation/LICENSE |
| 127 | + COMMAND ${CMAKE_COMMAND} -E tar "cf" "${ZIP_OUT_FN}" --format=zip -- ${ZIP_FILES} |
| 128 | + WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/amalgamation" |
| 129 | + OUTPUT "${ZIP_OUT_FN}" |
| 130 | + DEPENDS ${ZIP_FILES} |
| 131 | + COMMENT "Zipping to ${CMAKE_CURRENT_BINARY_DIR}/miniz.zip." |
| 132 | + ) |
| 133 | + |
| 134 | + add_custom_target( |
| 135 | + create_zip ALL |
| 136 | + DEPENDS "${ZIP_OUT_FN}" |
| 137 | + ) |
| 138 | +else(AMALGAMATE_SOURCES) |
| 139 | + include(GenerateExportHeader) |
| 140 | + set(miniz_SOURCE miniz.c miniz_zip.c miniz_tinfl.c miniz_tdef.c) |
| 141 | + add_library(${PROJECT_NAME} ${miniz_SOURCE}) |
| 142 | + generate_export_header(${PROJECT_NAME}) |
| 143 | + |
| 144 | + if(NOT BUILD_SHARED_LIBS) |
| 145 | + string(TOUPPER ${PROJECT_NAME} PROJECT_UPPER) |
| 146 | + set_target_properties(${PROJECT_NAME} |
| 147 | + PROPERTIES INTERFACE_COMPILE_DEFINITIONS ${PROJECT_UPPER}_STATIC_DEFINE) |
| 148 | + else() |
| 149 | + set_property(TARGET ${PROJECT_NAME} PROPERTY C_VISIBILITY_PRESET hidden) |
| 150 | + endif() |
| 151 | + |
| 152 | + set_property(TARGET ${PROJECT_NAME} PROPERTY VERSION ${MINIZ_VERSION}) |
| 153 | + set_property(TARGET ${PROJECT_NAME} PROPERTY SOVERSION ${MINIZ_API_VERSION}) |
| 154 | + |
| 155 | + target_include_directories(${PROJECT_NAME} PUBLIC |
| 156 | + $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}> |
| 157 | + $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}> |
| 158 | + $<INSTALL_INTERFACE:include> |
| 159 | + ) |
| 160 | + |
| 161 | + file(GLOB INSTALL_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/*.h) |
| 162 | + list(APPEND |
| 163 | + INSTALL_HEADERS ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}_export.h) |
| 164 | +endif(AMALGAMATE_SOURCES) |
| 165 | + |
| 166 | +if(NOT BUILD_HEADER_ONLY) |
| 167 | + target_compile_definitions(${PROJECT_NAME} |
| 168 | + PRIVATE $<$<C_COMPILER_ID:GNU>:_GNU_SOURCE>) |
| 169 | + |
| 170 | + # pkg-config file |
| 171 | + configure_file(miniz.pc.in ${CMAKE_CURRENT_BINARY_DIR}/miniz.pc @ONLY) |
| 172 | + |
| 173 | + if(INSTALL_PROJECT) |
| 174 | + install(FILES |
| 175 | + ${CMAKE_CURRENT_BINARY_DIR}/miniz.pc |
| 176 | + DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) |
| 177 | + endif() |
| 178 | +endif() |
| 179 | + |
| 180 | +set_property(TARGET ${PROJECT_NAME} PROPERTY |
| 181 | + INTERFACE_${PROJECT_NAME}_MAJOR_VERSION ${MINIZ_API_VERSION}) |
| 182 | +set_property(TARGET ${PROJECT_NAME} APPEND PROPERTY |
| 183 | + COMPATIBLE_INTERFACE_STRING ${PROJECT_NAME}_MAJOR_VERSION |
| 184 | +) |
| 185 | + |
| 186 | +if(INSTALL_PROJECT) |
| 187 | + install(TARGETS ${PROJECT_NAME} EXPORT ${PROJECT_NAME}Targets |
| 188 | + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} |
| 189 | + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} |
| 190 | + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} |
| 191 | + # users can use <miniz.h> or <miniz/miniz.h> |
| 192 | + INCLUDES DESTINATION include ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME} |
| 193 | + ) |
| 194 | + |
| 195 | + include(CMakePackageConfigHelpers) |
| 196 | + write_basic_package_version_file( |
| 197 | + "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}/${PROJECT_NAME}ConfigVersion.cmake" |
| 198 | + VERSION ${MINIZ_VERSION} |
| 199 | + COMPATIBILITY AnyNewerVersion |
| 200 | + ) |
| 201 | + |
| 202 | + export(EXPORT ${PROJECT_NAME}Targets |
| 203 | + FILE "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}/${PROJECT_NAME}Targets.cmake" |
| 204 | + NAMESPACE ${PROJECT_NAME}:: |
| 205 | + ) |
| 206 | + configure_file(Config.cmake.in |
| 207 | + "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}/${PROJECT_NAME}Config.cmake" |
| 208 | + @ONLY |
| 209 | + ) |
| 210 | + |
| 211 | + set(ConfigPackageLocation ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}) |
| 212 | + install(EXPORT ${PROJECT_NAME}Targets |
| 213 | + FILE |
| 214 | + ${PROJECT_NAME}Targets.cmake |
| 215 | + NAMESPACE |
| 216 | + ${PROJECT_NAME}:: |
| 217 | + DESTINATION |
| 218 | + ${ConfigPackageLocation} |
3 | 219 | ) |
| 220 | + install( |
| 221 | + FILES |
| 222 | + "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}/${PROJECT_NAME}Config.cmake" |
| 223 | + "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}/${PROJECT_NAME}ConfigVersion.cmake" |
| 224 | + DESTINATION |
| 225 | + ${ConfigPackageLocation} |
| 226 | + COMPONENT |
| 227 | + Devel |
| 228 | + ) |
| 229 | +endif() |
| 230 | + |
| 231 | +if(BUILD_EXAMPLES) |
| 232 | + set(EXAMPLE1_SRC_LIST "${CMAKE_CURRENT_SOURCE_DIR}/examples/example1.c") |
| 233 | + set(EXAMPLE2_SRC_LIST "${CMAKE_CURRENT_SOURCE_DIR}/examples/example2.c") |
| 234 | + set(EXAMPLE3_SRC_LIST "${CMAKE_CURRENT_SOURCE_DIR}/examples/example3.c") |
| 235 | + set(EXAMPLE4_SRC_LIST "${CMAKE_CURRENT_SOURCE_DIR}/examples/example4.c") |
| 236 | + set(EXAMPLE5_SRC_LIST "${CMAKE_CURRENT_SOURCE_DIR}/examples/example5.c") |
| 237 | + set(EXAMPLE6_SRC_LIST "${CMAKE_CURRENT_SOURCE_DIR}/examples/example6.c") |
| 238 | + set(MINIZ_TESTER_SRC_LIST |
| 239 | + "${CMAKE_CURRENT_SOURCE_DIR}/tests/miniz_tester.cpp" |
| 240 | + "${CMAKE_CURRENT_SOURCE_DIR}/tests/timer.cpp") |
| 241 | + |
| 242 | + add_executable(example1 ${EXAMPLE1_SRC_LIST}) |
| 243 | + target_link_libraries(example1 miniz) |
| 244 | + add_executable(example2 ${EXAMPLE2_SRC_LIST}) |
| 245 | + target_link_libraries(example2 miniz) |
| 246 | + add_executable(example3 ${EXAMPLE3_SRC_LIST}) |
| 247 | + target_link_libraries(example3 miniz) |
| 248 | + add_executable(example4 ${EXAMPLE4_SRC_LIST}) |
| 249 | + target_link_libraries(example4 miniz) |
| 250 | + add_executable(example5 ${EXAMPLE5_SRC_LIST}) |
| 251 | + target_link_libraries(example5 miniz) |
| 252 | + add_executable(example6 ${EXAMPLE6_SRC_LIST}) |
| 253 | + target_link_libraries(example6 miniz) |
| 254 | + if(${UNIX}) |
| 255 | + target_link_libraries(example6 m) |
| 256 | + endif() |
| 257 | + |
| 258 | + # add_executable(miniz_tester ${MINIZ_TESTER_SRC_LIST}) |
| 259 | + # target_link_libraries(miniz_tester miniz) |
| 260 | +endif(BUILD_EXAMPLES) |
| 261 | + |
| 262 | +if(BUILD_FUZZERS) |
| 263 | + set(FUZZ_MAIN_SRC "${CMAKE_CURRENT_SOURCE_DIR}/tests/fuzz_main.c") |
| 264 | + |
| 265 | + set(CHECKSUM_FUZZER_SRC_LIST "${FUZZ_MAIN_SRC}" "${CMAKE_CURRENT_SOURCE_DIR}/tests/checksum_fuzzer.c") |
| 266 | + set(FLUSH_FUZZER_SRC_LIST "${FUZZ_MAIN_SRC}" "${CMAKE_CURRENT_SOURCE_DIR}/tests/flush_fuzzer.c") |
| 267 | + set(UNCOMPRESS_FUZZER_SRC_LIST "${FUZZ_MAIN_SRC}" "${CMAKE_CURRENT_SOURCE_DIR}/tests/uncompress_fuzzer.c") |
| 268 | + set(UNCOMPRESS2_FUZZER_SRC_LIST "${FUZZ_MAIN_SRC}" "${CMAKE_CURRENT_SOURCE_DIR}/tests/uncompress2_fuzzer.c") |
| 269 | + set(COMPRESS_FUZZER_SRC_LIST "${FUZZ_MAIN_SRC}" "${CMAKE_CURRENT_SOURCE_DIR}/tests/compress_fuzzer.c") |
| 270 | + set(SMALL_FUZZER_SRC_LIST "${FUZZ_MAIN_SRC}" "${CMAKE_CURRENT_SOURCE_DIR}/tests/small_fuzzer.c") |
| 271 | + set(LARGE_FUZZER_SRC_LIST "${FUZZ_MAIN_SRC}" "${CMAKE_CURRENT_SOURCE_DIR}/tests/large_fuzzer.c") |
| 272 | + set(ZIP_FUZZER_SRC_LIST "${FUZZ_MAIN_SRC}" "${CMAKE_CURRENT_SOURCE_DIR}/tests/zip_fuzzer.c") |
| 273 | + |
| 274 | + add_executable(checksum_fuzzer ${CHECKSUM_FUZZER_SRC_LIST}) |
| 275 | + target_link_libraries(checksum_fuzzer miniz) |
| 276 | + |
| 277 | + add_executable(flush_fuzzer ${FLUSH_FUZZER_SRC_LIST}) |
| 278 | + target_link_libraries(flush_fuzzer miniz) |
| 279 | + |
| 280 | + add_executable(uncompress_fuzzer ${UNCOMPRESS_FUZZER_SRC_LIST}) |
| 281 | + target_link_libraries(uncompress_fuzzer miniz) |
| 282 | + |
| 283 | + add_executable(uncompress2_fuzzer ${UNCOMPRESS2_FUZZER_SRC_LIST}) |
| 284 | + target_link_libraries(uncompress2_fuzzer miniz) |
| 285 | + |
| 286 | + add_executable(compress_fuzzer ${COMPRESS_FUZZER_SRC_LIST}) |
| 287 | + target_link_libraries(compress_fuzzer miniz) |
| 288 | + |
| 289 | + add_executable(small_fuzzer ${SMALL_FUZZER_SRC_LIST}) |
| 290 | + target_link_libraries(small_fuzzer miniz) |
| 291 | + |
| 292 | + add_executable(large_fuzzer ${LARGE_FUZZER_SRC_LIST}) |
| 293 | + target_link_libraries(large_fuzzer miniz) |
| 294 | + |
| 295 | + add_executable(zip_fuzzer ${ZIP_FUZZER_SRC_LIST}) |
| 296 | + target_link_libraries(zip_fuzzer miniz) |
| 297 | +endif() |
| 298 | + |
| 299 | +set(INCLUDE_INSTALL_DIR "include") |
| 300 | + |
| 301 | +if(INSTALL_PROJECT) |
| 302 | + install(FILES ${INSTALL_HEADERS} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}) |
| 303 | +endif() |
4 | 304 |
|
5 | | -add_definitions("-DMINIZ_NO_ARCHIVE_APIS -DMINIZ_NO_STDIO -DMINIZ_NO_TIME") |
6 | | -add_library(miniz STATIC ${src}) |
7 | | -target_link_libraries(miniz ${CMAKE_DL_LIBS}) |
|
0 commit comments