--- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,15 @@ -PROJECT(miniz C) -cmake_minimum_required(VERSION 2.8) +cmake_minimum_required(VERSION 3.12) + +project(miniz) + +include(GNUInstallDirs) + +set(MINIZ_API_VERSION 2) +set(MINIZ_MINOR_VERSION 1) +set(MINIZ_PATCH_VERSION 0) +set(MINIZ_VERSION + ${MINIZ_API_VERSION}.${MINIZ_MINOR_VERSION}.${MINIZ_PATCH_VERSION}) + if(CMAKE_BUILD_TYPE STREQUAL "") # CMake defaults to leaving CMAKE_BUILD_TYPE empty. This screws up # differentiation between debug and release builds. @@ -8,45 +18,120 @@ CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel." FORCE) endif () -set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin) +option(BUILD_EXAMPLES "Build examples" ON) +option(BUILD_SHARED_LIBS "Build shared library instead of static" ON) + +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/bin) +include(GenerateExportHeader) + +set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) set(miniz_SOURCE miniz.c miniz_zip.c miniz_tinfl.c miniz_tdef.c) +add_library(${PROJECT_NAME} ${miniz_SOURCE}) +generate_export_header(${PROJECT_NAME}) + +if(NOT BUILD_SHARED_LIBS) +string(TOUPPER ${PROJECT_NAME} PROJECT_UPPER) +set_target_properties(${PROJECT_NAME} + PROPERTIES INTERFACE_COMPILE_DEFINITIONS ${PROJECT_UPPER}_STATIC_DEFINE) +endif() + +set_property(TARGET ${PROJECT_NAME} PROPERTY VERSION ${MINIZ_VERSION}) +set_property(TARGET ${PROJECT_NAME} PROPERTY SOVERSION ${MINIZ_API_VERSION}) + +file(GLOB INSTALL_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/*.h) + +target_compile_definitions(${PROJECT_NAME} + PRIVATE $<$:_GNU_SOURCE>) -add_library(miniz ${miniz_SOURCE}) -target_include_directories(miniz PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}") +# pkg-config file +configure_file(miniz.pc.in ${CMAKE_BINARY_DIR}/miniz.pc @ONLY) -set(EXAMPLE1_SRC_LIST "${CMAKE_CURRENT_SOURCE_DIR}/examples/example1.c") -set(EXAMPLE2_SRC_LIST "${CMAKE_CURRENT_SOURCE_DIR}/examples/example2.c") -set(EXAMPLE3_SRC_LIST "${CMAKE_CURRENT_SOURCE_DIR}/examples/example3.c") -set(EXAMPLE4_SRC_LIST "${CMAKE_CURRENT_SOURCE_DIR}/examples/example4.c") -set(EXAMPLE5_SRC_LIST "${CMAKE_CURRENT_SOURCE_DIR}/examples/example5.c") -set(EXAMPLE6_SRC_LIST "${CMAKE_CURRENT_SOURCE_DIR}/examples/example6.c") -set(MINIZ_TESTER_SRC_LIST - "${CMAKE_CURRENT_SOURCE_DIR}/tests/miniz_tester.cpp" - "${CMAKE_CURRENT_SOURCE_DIR}/tests/timer.cpp") +install(FILES + ${CMAKE_BINARY_DIR}/miniz.pc + DESTINATION ${CMAKE_INSTALL_DATADIR}/pkgconfig) + + +set_property(TARGET ${PROJECT_NAME} PROPERTY + INTERFACE_${PROJECT_NAME}_MAJOR_VERSION ${MINIZ_API_VERSION}) +set_property(TARGET ${PROJECT_NAME} APPEND PROPERTY + COMPATIBLE_INTERFACE_STRING ${PROJECT_NAME}_MAJOR_VERSION +) + +install(TARGETS ${PROJECT_NAME} EXPORT ${PROJECT_NAME}Targets + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + # users can use or + INCLUDES DESTINATION include ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME} +) + +include(CMakePackageConfigHelpers) +write_basic_package_version_file( + "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}/${PROJECT_NAME}ConfigVersion.cmake" + VERSION ${MINIZ_VERSION} + COMPATIBILITY AnyNewerVersion +) + +export(EXPORT ${PROJECT_NAME}Targets + FILE "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}/${PROJECT_NAME}Targets.cmake" + NAMESPACE ${PROJECT_NAME}:: +) +configure_file(Config.cmake.in + "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}/${PROJECT_NAME}Config.cmake" + @ONLY +) + +set(ConfigPackageLocation ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}) +install(EXPORT ${PROJECT_NAME}Targets + FILE + ${PROJECT_NAME}Targets.cmake + NAMESPACE + ${PROJECT_NAME}:: + DESTINATION + ${ConfigPackageLocation} +) +install( + FILES + "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}/${PROJECT_NAME}Config.cmake" + "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}/${PROJECT_NAME}ConfigVersion.cmake" + DESTINATION + ${ConfigPackageLocation} + COMPONENT + Devel +) + +if(BUILD_EXAMPLES) + set(EXAMPLE1_SRC_LIST "${CMAKE_CURRENT_SOURCE_DIR}/examples/example1.c") + set(EXAMPLE2_SRC_LIST "${CMAKE_CURRENT_SOURCE_DIR}/examples/example2.c") + set(EXAMPLE3_SRC_LIST "${CMAKE_CURRENT_SOURCE_DIR}/examples/example3.c") + set(EXAMPLE4_SRC_LIST "${CMAKE_CURRENT_SOURCE_DIR}/examples/example4.c") + set(EXAMPLE5_SRC_LIST "${CMAKE_CURRENT_SOURCE_DIR}/examples/example5.c") + set(EXAMPLE6_SRC_LIST "${CMAKE_CURRENT_SOURCE_DIR}/examples/example6.c") + set(MINIZ_TESTER_SRC_LIST + "${CMAKE_CURRENT_SOURCE_DIR}/tests/miniz_tester.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/tests/timer.cpp") -add_executable(example1 ${EXAMPLE1_SRC_LIST}) -target_link_libraries(example1 miniz) -add_executable(example2 ${EXAMPLE2_SRC_LIST}) -target_link_libraries(example2 miniz) -add_executable(example3 ${EXAMPLE3_SRC_LIST}) -target_link_libraries(example3 miniz) -add_executable(example4 ${EXAMPLE4_SRC_LIST}) -target_link_libraries(example4 miniz) -add_executable(example5 ${EXAMPLE5_SRC_LIST}) -target_link_libraries(example5 miniz) -add_executable(example6 ${EXAMPLE6_SRC_LIST}) -target_link_libraries(example6 miniz) -if(${UNIX}) - target_link_libraries(example6 m) -endif() + add_executable(example1 ${EXAMPLE1_SRC_LIST}) + target_link_libraries(example1 miniz) + add_executable(example2 ${EXAMPLE2_SRC_LIST}) + target_link_libraries(example2 miniz) + add_executable(example3 ${EXAMPLE3_SRC_LIST}) + target_link_libraries(example3 miniz) + add_executable(example4 ${EXAMPLE4_SRC_LIST}) + target_link_libraries(example4 miniz) + add_executable(example5 ${EXAMPLE5_SRC_LIST}) + target_link_libraries(example5 miniz) + add_executable(example6 ${EXAMPLE6_SRC_LIST}) + target_link_libraries(example6 miniz) + if(${UNIX}) + target_link_libraries(example6 m) + endif() -# add_executable(miniz_tester ${MINIZ_TESTER_SRC_LIST}) -# target_link_libraries(miniz_tester miniz) + # add_executable(miniz_tester ${MINIZ_TESTER_SRC_LIST}) + # target_link_libraries(miniz_tester miniz) +endif(BUILD_EXAMPLES) -install(TARGETS ${PROJECT_NAME} EXPORT ${PROJECT_NAME}Targets - ARCHIVE DESTINATION lib - LIBRARY DESTINATION lib - ) -file(GLOB INSTALL_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/*.h) -install(FILES ${INSTALL_HEADERS} DESTINATION include/${PROJECT_NAME}) \ No newline at end of file +set(INCLUDE_INSTALL_DIR "include") + +install(FILES ${INSTALL_HEADERS} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME})