CMakeLists.txt 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. cmake_minimum_required(VERSION 3.4)
  2. project(zip
  3. LANGUAGES C
  4. VERSION "0.1.19")
  5. set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake" ${CMAKE_MODULE_PATH})
  6. set(CMAKE_VERBOSE_MAKEFILE ON)
  7. option(CMAKE_DISABLE_TESTING "Disable test creation" OFF)
  8. # zip
  9. set(SRC src/miniz.h src/zip.h src/zip.c)
  10. # this is the "object library" target: compiles the sources only once
  11. add_library(OBJLIB OBJECT ${SRC})
  12. # shared libraries need PIC
  13. set_property(TARGET OBJLIB PROPERTY POSITION_INDEPENDENT_CODE 1)
  14. # static and shared libraries built from the same object files
  15. if (BUILD_SHARED_LIBS)
  16. add_library(${PROJECT_NAME} SHARED $<TARGET_OBJECTS:OBJLIB>)
  17. include(GenerateExportHeader)
  18. generate_export_header(${PROJECT_NAME})
  19. else()
  20. add_library(${PROJECT_NAME} STATIC $<TARGET_OBJECTS:OBJLIB>)
  21. endif()
  22. target_include_directories(${PROJECT_NAME} PUBLIC
  23. $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>
  24. $<INSTALL_INTERFACE:include>
  25. )
  26. # test
  27. if (NOT CMAKE_DISABLE_TESTING)
  28. enable_testing()
  29. add_subdirectory(test)
  30. find_package(Sanitizers)
  31. add_sanitizers(${PROJECT_NAME} ${test_out})
  32. endif()
  33. if (MSVC)
  34. # Use secure functions by default and suppress warnings about "deprecated" functions
  35. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /D _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1")
  36. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /D _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1")
  37. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /D _CRT_NONSTDC_NO_WARNINGS=1 /D _CRT_SECURE_NO_WARNINGS=1")
  38. elseif ("${CMAKE_C_COMPILER_ID}" STREQUAL "GNU" OR
  39. "${CMAKE_C_COMPILER_ID}" STREQUAL "Clang" OR
  40. "${CMAKE_C_COMPILER_ID}" STREQUAL "AppleClang")
  41. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99 -Wall -Wextra -Werror -pedantic -Wno-deprecated")
  42. endif (MSVC)
  43. ####
  44. # Installation (https://github.com/forexample/package-example) {
  45. set(CONFIG_INSTALL_DIR "lib/cmake/${PROJECT_NAME}")
  46. set(INCLUDE_INSTALL_DIR "include")
  47. set(GENERATED_DIR "${CMAKE_CURRENT_BINARY_DIR}/generated")
  48. # Configuration
  49. set(VERSION_CONFIG "${GENERATED_DIR}/${PROJECT_NAME}ConfigVersion.cmake")
  50. set(PROJECT_CONFIG "${GENERATED_DIR}/${PROJECT_NAME}Config.cmake")
  51. set(TARGETS_EXPORT_NAME "${PROJECT_NAME}Targets")
  52. set(NAMESPACE "${PROJECT_NAME}::")
  53. # Include module with fuction 'write_basic_package_version_file'
  54. include(CMakePackageConfigHelpers)
  55. # Note: PROJECT_VERSION is used as a VERSION
  56. write_basic_package_version_file(
  57. "${VERSION_CONFIG}" COMPATIBILITY SameMajorVersion
  58. )
  59. # Use variables:
  60. # * TARGETS_EXPORT_NAME
  61. # * PROJECT_NAME
  62. configure_package_config_file(
  63. "cmake/Config.cmake.in"
  64. "${PROJECT_CONFIG}"
  65. INSTALL_DESTINATION "${CONFIG_INSTALL_DIR}"
  66. )
  67. install(
  68. FILES "${PROJECT_CONFIG}" "${VERSION_CONFIG}"
  69. DESTINATION "${CONFIG_INSTALL_DIR}"
  70. )
  71. install(
  72. EXPORT "${TARGETS_EXPORT_NAME}"
  73. NAMESPACE "${NAMESPACE}"
  74. DESTINATION "${CONFIG_INSTALL_DIR}"
  75. )
  76. # }
  77. install(TARGETS ${PROJECT_NAME}
  78. EXPORT ${TARGETS_EXPORT_NAME}
  79. RUNTIME DESTINATION bin
  80. ARCHIVE DESTINATION lib
  81. LIBRARY DESTINATION lib
  82. INCLUDES DESTINATION ${INCLUDE_INSTALL_DIR}
  83. )
  84. install(FILES ${PROJECT_SOURCE_DIR}/src/zip.h DESTINATION ${INCLUDE_INSTALL_DIR}/zip)
  85. # uninstall target (https://gitlab.kitware.com/cmake/community/wikis/FAQ#can-i-do-make-uninstall-with-cmake)
  86. if(NOT TARGET uninstall)
  87. configure_file(
  88. "${CMAKE_CURRENT_SOURCE_DIR}/cmake/cmake_uninstall.cmake.in"
  89. "${CMAKE_CURRENT_BINARY_DIR}/cmake/cmake_uninstall.cmake"
  90. IMMEDIATE @ONLY)
  91. add_custom_target(uninstall
  92. COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake/cmake_uninstall.cmake)
  93. endif()
  94. find_package(Doxygen)
  95. if(DOXYGEN_FOUND)
  96. configure_file(${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile @ONLY)
  97. add_custom_target(doc
  98. ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile
  99. WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
  100. COMMENT "Generating API documentation with Doxygen" VERBATIM)
  101. endif()