CMakeLists.txt 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. cmake_minimum_required(VERSION 3.14)
  2. project(zip
  3. LANGUAGES C
  4. VERSION "0.3.0")
  5. set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake" ${CMAKE_MODULE_PATH})
  6. set(CMAKE_VERBOSE_MAKEFILE ON)
  7. # Enable building tests only if the project is being built as a standalone one
  8. if (CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR)
  9. option(CMAKE_DISABLE_TESTING "Disable test creation" OFF)
  10. else ()
  11. option(CMAKE_DISABLE_TESTING "Disable test creation" ON)
  12. endif ()
  13. option(CMAKE_ENABLE_SANITIZERS "Enable zip sanitizers" OFF)
  14. option(ZIP_STATIC_PIC "Build static zip with PIC" ON)
  15. option(ZIP_BUILD_DOCS "Generate API documentation with Doxygen" OFF)
  16. if(ZIP_ENABLE_SHARABLE_FILE_OPEN)
  17. add_definitions(-DZIP_ENABLE_SHARABLE_FILE_OPEN)
  18. endif()
  19. if(CMAKE_SIZEOF_VOID_P EQUAL 4)
  20. # large file support
  21. add_definitions(-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64)
  22. endif()
  23. # zip
  24. set(SRC src/miniz.h src/zip.h src/zip.c)
  25. add_library(${PROJECT_NAME} ${SRC})
  26. add_library(${PROJECT_NAME}::${PROJECT_NAME} ALIAS ${PROJECT_NAME})
  27. if(ZIP_STATIC_PIC)
  28. set_property(TARGET ${PROJECT_NAME} PROPERTY POSITION_INDEPENDENT_CODE 1)
  29. endif()
  30. set_property(TARGET ${PROJECT_NAME} PROPERTY C_VISIBILITY_PRESET hidden)
  31. if(BUILD_SHARED_LIBS)
  32. target_compile_definitions(${PROJECT_NAME}
  33. PUBLIC ZIP_SHARED
  34. PRIVATE ZIP_BUILD_SHARED
  35. )
  36. endif()
  37. target_include_directories(${PROJECT_NAME} PUBLIC
  38. $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>
  39. $<INSTALL_INTERFACE:include>
  40. )
  41. # test
  42. if (NOT CMAKE_DISABLE_TESTING)
  43. enable_testing()
  44. add_subdirectory(test)
  45. endif()
  46. if (CMAKE_ENABLE_SANITIZERS)
  47. find_package(Sanitizers)
  48. add_sanitizers(${PROJECT_NAME})
  49. endif()
  50. set(CMAKE_C_STANDARD 90)
  51. if (MSVC)
  52. # Use secure functions by default and suppress warnings about "deprecated" functions
  53. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /D _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1")
  54. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /D _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1")
  55. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /D _CRT_NONSTDC_NO_WARNINGS=1 /D _CRT_SECURE_NO_WARNINGS=1")
  56. elseif ("${CMAKE_C_COMPILER_ID}" STREQUAL "GNU" OR
  57. "${CMAKE_C_COMPILER_ID}" STREQUAL "Clang" OR
  58. "${CMAKE_C_COMPILER_ID}" STREQUAL "AppleClang")
  59. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Werror -pedantic")
  60. endif (MSVC)
  61. ####
  62. set(CONFIG_INSTALL_DIR "lib/cmake/${PROJECT_NAME}")
  63. set(INCLUDE_INSTALL_DIR "include")
  64. set(GENERATED_DIR "${CMAKE_CURRENT_BINARY_DIR}/generated")
  65. # Configuration
  66. set(VERSION_CONFIG "${GENERATED_DIR}/${PROJECT_NAME}ConfigVersion.cmake")
  67. set(PROJECT_CONFIG "${GENERATED_DIR}/${PROJECT_NAME}Config.cmake")
  68. set(TARGETS_EXPORT_NAME "${PROJECT_NAME}Targets")
  69. set(NAMESPACE "${PROJECT_NAME}::")
  70. # Include module with function 'write_basic_package_version_file'
  71. include(CMakePackageConfigHelpers)
  72. # Note: PROJECT_VERSION is used as a VERSION
  73. write_basic_package_version_file(
  74. "${VERSION_CONFIG}" COMPATIBILITY SameMajorVersion
  75. )
  76. # Use variables:
  77. # * TARGETS_EXPORT_NAME
  78. # * PROJECT_NAME
  79. configure_package_config_file(
  80. "cmake/Config.cmake.in"
  81. "${PROJECT_CONFIG}"
  82. INSTALL_DESTINATION "${CONFIG_INSTALL_DIR}"
  83. )
  84. install(
  85. FILES "${PROJECT_CONFIG}" "${VERSION_CONFIG}"
  86. DESTINATION "${CONFIG_INSTALL_DIR}"
  87. )
  88. install(
  89. EXPORT "${TARGETS_EXPORT_NAME}"
  90. NAMESPACE "${NAMESPACE}"
  91. DESTINATION "${CONFIG_INSTALL_DIR}"
  92. )
  93. install(TARGETS ${PROJECT_NAME}
  94. EXPORT ${TARGETS_EXPORT_NAME}
  95. RUNTIME DESTINATION bin
  96. ARCHIVE DESTINATION lib
  97. LIBRARY DESTINATION lib
  98. INCLUDES DESTINATION ${INCLUDE_INSTALL_DIR}
  99. )
  100. install(FILES ${PROJECT_SOURCE_DIR}/src/zip.h DESTINATION ${INCLUDE_INSTALL_DIR}/zip)
  101. # uninstall target (https://gitlab.kitware.com/cmake/community/wikis/FAQ#can-i-do-make-uninstall-with-cmake)
  102. if(NOT TARGET uninstall)
  103. configure_file(
  104. "${CMAKE_CURRENT_SOURCE_DIR}/cmake/cmake_uninstall.cmake.in"
  105. "${CMAKE_CURRENT_BINARY_DIR}/cmake/cmake_uninstall.cmake"
  106. IMMEDIATE @ONLY)
  107. add_custom_target(uninstall
  108. COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake/cmake_uninstall.cmake)
  109. endif()
  110. if(ZIP_BUILD_DOCS)
  111. find_package(Doxygen REQUIRED)
  112. configure_file(${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile @ONLY)
  113. add_custom_target(doc
  114. ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile
  115. WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
  116. COMMENT "Generating API documentation with Doxygen" VERBATIM)
  117. endif()