diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..a514e49 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,34 @@ +name: build +on: + - push + - pull_request + +jobs: + build: + name: "${{ matrix.os }} - BUILD_SHARED_LIBS=${{ matrix.shared_lib }}" + strategy: + fail-fast: false + matrix: + os: + - macos-latest + - ubuntu-latest + - windows-latest + shared_lib: + - ON + - OFF + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v4 + - uses: lukka/get-cmake@v3.28.4 + - uses: lukka/run-vcpkg@v11 + - name: Build with -DBUILD_SHARED_LIBS=${{ matrix.shared_lib }} + uses: lukka/run-cmake@v10 + with: + configurePreset: "vcpkg" + configurePresetAdditionalArgs: "[ + '-DBUILD_SHARED_LIBS=${{ matrix.shared_lib }}', + '-DBUILD_DEMO=ON' + ]" + buildPreset: "vcpkg" + buildPresetAdditionalArgs: "[ '--config Release' ]" + diff --git a/CMakeLists.txt b/CMakeLists.txt index 1d153ca..77ab14d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,187 +1,86 @@ -cmake_minimum_required(VERSION 3.10) - -project(TinyEXIF) -include(GNUInstallDirs) - -find_package(tinyxml2 REQUIRED) - -#CMAKE_BUILD_TOOL +cmake_minimum_required(VERSION 3.15) ################################ # set lib version here - -set(GENERIC_LIB_VERSION "1.0.3") +project(TinyEXIF VERSION 1.0.3) set(GENERIC_LIB_SOVERSION "1") +include(GNUInstallDirs) +include(CMakePackageConfigHelpers) + +find_package(tinyxml2 CONFIG REQUIRED) + ################################ # Add definitions - set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_STANDARD_REQUIRED True) set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DDEBUG") ################################ # Add targets # By Default shared libray is being built -# To build static libs also - Do cmake . -DBUILD_STATIC_LIBS:BOOL=ON -# User can choose not to build shared library by using cmake -DBUILD_SHARED_LIBS:BOOL=OFF -# To build only static libs use cmake . -DBUILD_SHARED_LIBS:BOOL=OFF -DBUILD_STATIC_LIBS:BOOL=ON +# User can choose to build static library by using cmake -DBUILD_SHARED_LIBS:BOOL=OFF # To build the demo binary, use cmake . -DBUILD_DEMO:BOOL=ON - option(BUILD_SHARED_LIBS "build as shared library" ON) -option(BUILD_STATIC_LIBS "build as static library" OFF) option(LINK_CRT_STATIC_LIBS "link CRT static library" OFF) option(BUILD_DEMO "build demo binary" ON) -# set MSVC runtime linkage to static or dynamic -# as in: https://stackoverflow.com/questions/10113017/setting-the-msvc-runtime-in-cmake -macro(configure_runtime CRT_RUNTIME) - if(MSVC) - # Default to statically-linked runtime. - if("${CRT_RUNTIME}" STREQUAL "") - set(CRT_RUNTIME "static") - endif() - # Set compiler options. - set(variables - CMAKE_C_FLAGS_DEBUG - CMAKE_C_FLAGS_MINSIZEREL - CMAKE_C_FLAGS_RELEASE - CMAKE_C_FLAGS_RELWITHDEBINFO - CMAKE_CXX_FLAGS_DEBUG - CMAKE_CXX_FLAGS_MINSIZEREL - CMAKE_CXX_FLAGS_RELEASE - CMAKE_CXX_FLAGS_RELWITHDEBINFO - ) - if(${CRT_RUNTIME} STREQUAL "static") - message(STATUS "MSVC -> forcing use of statically-linked runtime.") - foreach(variable ${variables}) - if(${variable} MATCHES "/MD") - string(REGEX REPLACE "/MD" "/MT" ${variable} "${${variable}}") - endif() - endforeach() - else() - message(STATUS "MSVC -> forcing use of dynamically-linked runtime.") - foreach(variable ${variables}) - if(${variable} MATCHES "/MT") - string(REGEX REPLACE "/MT" "/MD" ${variable} "${${variable}}") - endif() - endforeach() - endif() - endif() -endmacro() +add_library(TinyEXIF TinyEXIF.cpp TinyEXIF.h) +add_library(TinyEXIF::TinyEXIF ALIAS TinyEXIF) -if(LINK_CRT_STATIC_LIBS) - # set MSVC runtime linkage to static - configure_runtime("static") +if(MSVC_VERSION GREATER 1300) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4251") # needs to have dll-interface endif() -# to distinguish between debug and release lib -set(CMAKE_DEBUG_POSTFIX "d") +target_link_libraries(TinyEXIF tinyxml2::tinyxml2) +set_target_properties(TinyEXIF PROPERTIES + DEFINE_SYMBOL "TINYEXIF_EXPORT" + VERSION "${TinyEXIF_VERSION}" + SOVERSION "${GENERIC_LIB_SOVERSION}" + # set MSVC runtime linkage to static if LINK_CRT_STATIC_LIBS is TRUE + # LINK_CRT_STATIC_LIBS -> /MT or /MTd with Debug + # NOT LINK_CRT_STATIC_LIBS -> /MD or /MDd with Debug + MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>$<$>:DLL>" +) -if(BUILD_SHARED_LIBS) - add_library(TinyEXIF SHARED TinyEXIF.cpp TinyEXIF.h) +target_include_directories(TinyEXIF PUBLIC + "$" + "$" +) - if(MSVC_VERSION GREATER 1300) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4251") # needs to have dll-interface - endif() - - target_link_libraries(TinyEXIF tinyxml2::tinyxml2) - set_target_properties(TinyEXIF PROPERTIES - COMPILE_DEFINITIONS "TINYEXIF_EXPORT" - VERSION "${GENERIC_LIB_VERSION}" - SOVERSION "${GENERIC_LIB_SOVERSION}") - - - if(DEFINED CMAKE_VERSION AND NOT "${CMAKE_VERSION}" VERSION_LESS "2.8.11") - target_include_directories(TinyEXIF PUBLIC - $ - $) - - if(MSVC) - target_compile_definitions(TinyEXIF PUBLIC _CRT_SECURE_NO_WARNINGS) - endif() - else() - include_directories(${PROJECT_SOURCE_DIR}) - - if(MSVC) - add_definitions(-D_CRT_SECURE_NO_WARNINGS) - endif() - endif() - - # export targets for find_package config mode - export(TARGETS TinyEXIF - FILE ${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}Targets.cmake) - - install(TARGETS TinyEXIF - EXPORT ${CMAKE_PROJECT_NAME}Targets - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}) -endif() - -if(BUILD_STATIC_LIBS) - add_library(TinyEXIFstatic STATIC TinyEXIF.cpp TinyEXIF.h) - - target_link_libraries(TinyEXIFstatic tinyxml2::tinyxml2) - set_target_properties(TinyEXIFstatic PROPERTIES - OUTPUT_NAME TinyEXIF - VERSION "${GENERIC_LIB_VERSION}" - SOVERSION "${GENERIC_LIB_SOVERSION}") - - if(DEFINED CMAKE_VERSION AND NOT "${CMAKE_VERSION}" VERSION_LESS "2.8.11") - target_include_directories(TinyEXIFstatic PUBLIC - $ - $) - - if(MSVC) - target_compile_definitions(TinyEXIFstatic PUBLIC _CRT_SECURE_NO_WARNINGS) - endif() - else() - include_directories(${PROJECT_SOURCE_DIR}) - - if(MSVC) - add_definitions(-D_CRT_SECURE_NO_WARNINGS) - endif() - endif() - - # export targets for find_package config mode - export(TARGETS TinyEXIFstatic - FILE ${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}Targets.cmake) - - install(TARGETS TinyEXIFstatic - EXPORT ${CMAKE_PROJECT_NAME}Targets - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}) -endif() +target_compile_definitions(TinyEXIF + INTERFACE $<$:TINYEXIF_IMPORT> + PRIVATE $<$:_CRT_SECURE_NO_WARNINGS> +) if(BUILD_DEMO) add_executable(TinyEXIFdemo main.cpp) - if(BUILD_SHARED_LIBS) - add_dependencies(TinyEXIFdemo TinyEXIF) - target_link_libraries(TinyEXIFdemo TinyEXIF) - target_compile_definitions(TinyEXIFdemo PRIVATE TINYEXIF_IMPORT) - else(BUILD_STATIC_LIBS) - add_dependencies(TinyEXIFdemo TinyEXIFstatic) - target_link_libraries(TinyEXIFdemo TinyEXIFstatic tinyxml2::tinyxml2) - endif() + target_link_libraries(TinyEXIFdemo TinyEXIF) endif() +################################ +# Install targets +install(TARGETS TinyEXIF + EXPORT TinyEXIFTargets + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} +) + install(FILES TinyEXIF.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) -foreach(p LIB INCLUDE) - set(var CMAKE_INSTALL_${p}DIR) - if(NOT IS_ABSOLUTE "${${var}}") - set(${var} "${CMAKE_INSTALL_PREFIX}/${${var}}") - endif() -endforeach() +install(EXPORT TinyEXIFTargets + FILE TinyEXIFTargets.cmake + NAMESPACE TinyEXIF:: + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/TinyEXIF +) -file(WRITE - ${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}Config.cmake - "include(\${CMAKE_CURRENT_LIST_DIR}/${CMAKE_PROJECT_NAME}Targets.cmake)\n") +configure_package_config_file(${CMAKE_CURRENT_SOURCE_DIR}/cmake/Config.cmake.in + "${CMAKE_CURRENT_BINARY_DIR}/TinyEXIFConfig.cmake" + INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/TinyEXIF +) -install(FILES - ${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}Config.cmake - DESTINATION lib/cmake/${CMAKE_PROJECT_NAME}) - -install(EXPORT ${CMAKE_PROJECT_NAME}Targets - DESTINATION lib/cmake/${CMAKE_PROJECT_NAME}) +install(FILES "${CMAKE_CURRENT_BINARY_DIR}/TinyEXIFConfig.cmake" + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/TinyEXIF +) diff --git a/CMakePresets.json b/CMakePresets.json new file mode 100644 index 0000000..d256bed --- /dev/null +++ b/CMakePresets.json @@ -0,0 +1,28 @@ +{ + "version": 6, + "cmakeMinimumRequired": { + "major": 3, + "minor": 15, + "patch": 0 + }, + "configurePresets": [ + { + "name": "vcpkg", + "binaryDir": "${sourceDir}/builds/${presetName}", + "generator": "Ninja Multi-Config", + "cacheVariables": { + "CMAKE_TOOLCHAIN_FILE": { + "type": "FILEPATH", + "value": "$env{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake" + } + } + } + ], + "buildPresets": [ + { + "name": "vcpkg", + "configurePreset": "vcpkg" + } + ] +} + diff --git a/cmake/Config.cmake.in b/cmake/Config.cmake.in new file mode 100644 index 0000000..1bdf393 --- /dev/null +++ b/cmake/Config.cmake.in @@ -0,0 +1,8 @@ +@PACKAGE_INIT@ + +include(CMakeFindDependencyMacro) +find_dependency(tinyxml2) + +include("${CMAKE_CURRENT_LIST_DIR}/TinyEXIFTargets.cmake") + +check_required_components(TinyEXIF) diff --git a/vcpkg.json b/vcpkg.json new file mode 100644 index 0000000..d37f177 --- /dev/null +++ b/vcpkg.json @@ -0,0 +1,9 @@ +{ + "name": "tinyexif", + "version-string": "1.0.3", + "builtin-baseline": "74e6536215718009aae747d86d84b78376bf9e09", + "dependencies": [ + "tinyxml2" + ] +} +