From d76de77abb66076f036ab221a53540e86e575353 Mon Sep 17 00:00:00 2001 From: tytan652 Date: Thu, 20 Apr 2023 14:51:37 +0200 Subject: [PATCH] cmake: Add finder for Libqrcodengencpp --- cmake/Modules/FindLibqrcodegencpp.cmake | 174 ++++++++++++++++++++++++ cmake/finders/FindLibqrcodegencpp.cmake | 174 ++++++++++++++++++++++++ 2 files changed, 348 insertions(+) create mode 100644 cmake/Modules/FindLibqrcodegencpp.cmake create mode 100644 cmake/finders/FindLibqrcodegencpp.cmake diff --git a/cmake/Modules/FindLibqrcodegencpp.cmake b/cmake/Modules/FindLibqrcodegencpp.cmake new file mode 100644 index 000000000..5ecdb3aa6 --- /dev/null +++ b/cmake/Modules/FindLibqrcodegencpp.cmake @@ -0,0 +1,174 @@ +#[=======================================================================[.rst +FindLibqrcodegencpp +------------------- + +FindModule for Libqrcodegencpp and associated libraries + +Imported Targets +^^^^^^^^^^^^^^^^ + +.. versionadded:: 3.0 + +This module defines the :prop_tgt:`IMPORTED` target ``Libqrcodegencpp::Libqrcodegencpp``. + +Result Variables +^^^^^^^^^^^^^^^^ + +This module sets the following variables: + +``Libqrcodegencpp_FOUND`` + True, if all required components and the core library were found. +``Libqrcodegencpp_VERSION`` + Detected version of found Libqrcodegencpp libraries. + +Cache variables +^^^^^^^^^^^^^^^ + +The following cache variables may also be set: + +``Libqrcodegencpp_LIBRARY`` + Path to the library component of Libqrcodegencpp. +``Libqrcodegencpp_INCLUDE_DIR`` + Directory containing ``qrcodegen.hpp``. + +#]=======================================================================] + +# cmake-format: off +# cmake-lint: disable=C0103 +# cmake-lint: disable=C0301 +# cmake-format: on + +include(FindPackageHandleStandardArgs) + +find_package(PkgConfig QUIET) +if(PKG_CONFIG_FOUND) + pkg_search_module(PC_Libqrcodegencpp QUIET qrcodegencpp) +endif() + +# Libqrcodegencpp_set_soname: Set SONAME on imported library target +macro(Libqrcodegencpp_set_soname) + if(CMAKE_HOST_SYSTEM_NAME MATCHES "Darwin") + execute_process( + COMMAND sh -c "otool -D '${Libqrcodegencpp_LIBRARY}' | grep -v '${Libqrcodegencpp_LIBRARY}'" + OUTPUT_VARIABLE _output + RESULT_VARIABLE _result) + + if(_result EQUAL 0 AND _output MATCHES "^@rpath/") + set_property(TARGET Libqrcodegencpp::Libqrcodegencpp PROPERTY IMPORTED_SONAME "${_output}") + endif() + elseif(CMAKE_HOST_SYSTEM_NAME MATCHES "Linux|FreeBSD") + execute_process( + COMMAND sh -c "${CMAKE_OBJDUMP} -p '${Libqrcodegencpp_LIBRARY}' | grep SONAME" + OUTPUT_VARIABLE _output + RESULT_VARIABLE _result) + + if(_result EQUAL 0) + string(REGEX REPLACE "[ \t]+SONAME[ \t]+([^ \t]+)" "\\1" _soname "${_output}") + set_property(TARGET Libqrcodegencpp::Libqrcodegencpp PROPERTY IMPORTED_SONAME "${_soname}") + unset(_soname) + endif() + endif() + unset(_output) + unset(_result) +endmacro() + +# Libqrcodegencpp_find_dll: Find DLL for corresponding import library +macro(Libqrcodegencpp_find_dll) + cmake_path(GET Libqrcodegencpp_IMPLIB PARENT_PATH _implib_path) + cmake_path(SET _bin_path NORMALIZE "${_implib_path}/../bin") + + string(REGEX REPLACE "[0-9]+\\.([0-9]+)\\.[0-9]+" "\\1" _dll_version "${Libqrcodegencpp_VERSION}") + + find_program( + Libqrcodegencpp_LIBRARY + NAMES qrcodegencpp.dll + HINTS ${_implib_path} ${_bin_path} + DOC "Libqrcodegencpp DLL location") + + if(NOT Libqrcodegencpp_LIBRARY) + set(Libqrcodegencpp_LIBRARY "${Libqrcodegencpp_IMPLIB}") + endif() + unset(_implib_path) + unset(_bin_path) + unset(_dll_version) +endmacro() + +find_path( + Libqrcodegencpp_INCLUDE_DIR + NAMES qrcodegen.hpp + HINTS ${PC_Libqrcodegencpp_INCLUDE_DIRS} + PATHS /usr/include /usr/local/include + PATH_SUFFIXES qrcodegencpp qrcodegen + DOC "Libqrcodegencpp include directory") + +if(PC_Libqrcodegencpp_VERSION VERSION_GREATER 0) + set(Libqrcodegencpp_VERSION ${PC_Libqrcodegencpp_VERSION}) +else() + if(NOT Libqrcodegencpp_FIND_QUIETLY) + message(AUTHOR_WARNING "Failed to find Libqrcodegencpp version.") + endif() + set(Libqrcodegencpp_VERSION 0.0.0) +endif() + +if(CMAKE_HOST_SYSTEM_NAME MATCHES "Windows") + find_library( + Libqrcodegencpp_IMPLIB + NAMES libqrcodegencpp qrcodegencpp + DOC "Libqrcodegencpp import library location") + + libqrcodegencpp_find_dll() +else() + find_library( + Libqrcodegencpp_LIBRARY + NAMES libqrcodegencpp qrcodegencpp + HINTS ${PC_Libqrcodegencpp_LIBRARY_DIRS} + PATHS /usr/lib /usr/local/lib + DOC "Libqrcodegencpp location") +endif() + +if(CMAKE_HOST_SYSTEM_NAME MATCHES "Darwin|Windows") + set(Libqrcodegencpp_ERROR_REASON "Ensure that a qrcodegencpp distribution is provided as part of CMAKE_PREFIX_PATH.") +elseif(CMAKE_HOST_SYSTEM_NAME MATCHES "Linux|FreeBSD") + set(Libqrcodegencpp_ERROR_REASON "Ensure that qrcodegencpp is installed on the system.") +endif() + +find_package_handle_standard_args( + Libqrcodegencpp + REQUIRED_VARS Libqrcodegencpp_LIBRARY Libqrcodegencpp_INCLUDE_DIR + VERSION_VAR Libqrcodegencpp_VERSION REASON_FAILURE_MESSAGE "${Libqrcodegencpp_ERROR_REASON}") +mark_as_advanced(Libqrcodegencpp_INCLUDE_DIR Libqrcodegencpp_LIBRARY Libqrcodegencpp_IMPLIB) +unset(Libqrcodegencpp_ERROR_REASON) + +if(Libqrcodegencpp_FOUND) + if(NOT TARGET Libqrcodegencpp::Libqrcodegencpp) + if(IS_ABSOLUTE "${Libqrcodegencpp_LIBRARY}") + if(DEFINED Libqrcodegencpp_IMPLIB) + if(Libqrcodegencpp_IMPLIB STREQUAL Libqrcodegencpp_LIBRARY) + add_library(Libqrcodegencpp::Libqrcodegencpp STATIC IMPORTED) + else() + add_library(Libqrcodegencpp::Libqrcodegencpp SHARED IMPORTED) + set_property(TARGET Libqrcodegencpp::Libqrcodegencpp PROPERTY IMPORTED_IMPLIB "${Libqrcodegencpp_IMPLIB}") + endif() + else() + add_library(Libqrcodegencpp::Libqrcodegencpp UNKNOWN IMPORTED) + endif() + set_property(TARGET Libqrcodegencpp::Libqrcodegencpp PROPERTY IMPORTED_LOCATION "${Libqrcodegencpp_LIBRARY}") + else() + add_library(Libqrcodegencpp::Libqrcodegencpp INTERFACE IMPORTED) + set_property(TARGET Libqrcodegencpp::Libqrcodegencpp PROPERTY IMPORTED_LIBNAME "${Libqrcodegencpp_LIBRARY}") + endif() + + libqrcodegencpp_set_soname() + set_target_properties( + Libqrcodegencpp::Libqrcodegencpp + PROPERTIES INTERFACE_COMPILE_OPTIONS "${PC_Libqrcodegencpp_CFLAGS_OTHER}" + INTERFACE_INCLUDE_DIRECTORIES "${Libqrcodegencpp_INCLUDE_DIR}" + VERSION ${Libqrcodegencpp_VERSION}) + endif() +endif() + +include(FeatureSummary) +set_package_properties( + Libqrcodegencpp PROPERTIES + URL "https://www.nayuki.io/page/qr-code-generator-library" + DESCRIPTION "This project aims to be the best, clearest library for generating QR Codes in C++.") diff --git a/cmake/finders/FindLibqrcodegencpp.cmake b/cmake/finders/FindLibqrcodegencpp.cmake new file mode 100644 index 000000000..5ecdb3aa6 --- /dev/null +++ b/cmake/finders/FindLibqrcodegencpp.cmake @@ -0,0 +1,174 @@ +#[=======================================================================[.rst +FindLibqrcodegencpp +------------------- + +FindModule for Libqrcodegencpp and associated libraries + +Imported Targets +^^^^^^^^^^^^^^^^ + +.. versionadded:: 3.0 + +This module defines the :prop_tgt:`IMPORTED` target ``Libqrcodegencpp::Libqrcodegencpp``. + +Result Variables +^^^^^^^^^^^^^^^^ + +This module sets the following variables: + +``Libqrcodegencpp_FOUND`` + True, if all required components and the core library were found. +``Libqrcodegencpp_VERSION`` + Detected version of found Libqrcodegencpp libraries. + +Cache variables +^^^^^^^^^^^^^^^ + +The following cache variables may also be set: + +``Libqrcodegencpp_LIBRARY`` + Path to the library component of Libqrcodegencpp. +``Libqrcodegencpp_INCLUDE_DIR`` + Directory containing ``qrcodegen.hpp``. + +#]=======================================================================] + +# cmake-format: off +# cmake-lint: disable=C0103 +# cmake-lint: disable=C0301 +# cmake-format: on + +include(FindPackageHandleStandardArgs) + +find_package(PkgConfig QUIET) +if(PKG_CONFIG_FOUND) + pkg_search_module(PC_Libqrcodegencpp QUIET qrcodegencpp) +endif() + +# Libqrcodegencpp_set_soname: Set SONAME on imported library target +macro(Libqrcodegencpp_set_soname) + if(CMAKE_HOST_SYSTEM_NAME MATCHES "Darwin") + execute_process( + COMMAND sh -c "otool -D '${Libqrcodegencpp_LIBRARY}' | grep -v '${Libqrcodegencpp_LIBRARY}'" + OUTPUT_VARIABLE _output + RESULT_VARIABLE _result) + + if(_result EQUAL 0 AND _output MATCHES "^@rpath/") + set_property(TARGET Libqrcodegencpp::Libqrcodegencpp PROPERTY IMPORTED_SONAME "${_output}") + endif() + elseif(CMAKE_HOST_SYSTEM_NAME MATCHES "Linux|FreeBSD") + execute_process( + COMMAND sh -c "${CMAKE_OBJDUMP} -p '${Libqrcodegencpp_LIBRARY}' | grep SONAME" + OUTPUT_VARIABLE _output + RESULT_VARIABLE _result) + + if(_result EQUAL 0) + string(REGEX REPLACE "[ \t]+SONAME[ \t]+([^ \t]+)" "\\1" _soname "${_output}") + set_property(TARGET Libqrcodegencpp::Libqrcodegencpp PROPERTY IMPORTED_SONAME "${_soname}") + unset(_soname) + endif() + endif() + unset(_output) + unset(_result) +endmacro() + +# Libqrcodegencpp_find_dll: Find DLL for corresponding import library +macro(Libqrcodegencpp_find_dll) + cmake_path(GET Libqrcodegencpp_IMPLIB PARENT_PATH _implib_path) + cmake_path(SET _bin_path NORMALIZE "${_implib_path}/../bin") + + string(REGEX REPLACE "[0-9]+\\.([0-9]+)\\.[0-9]+" "\\1" _dll_version "${Libqrcodegencpp_VERSION}") + + find_program( + Libqrcodegencpp_LIBRARY + NAMES qrcodegencpp.dll + HINTS ${_implib_path} ${_bin_path} + DOC "Libqrcodegencpp DLL location") + + if(NOT Libqrcodegencpp_LIBRARY) + set(Libqrcodegencpp_LIBRARY "${Libqrcodegencpp_IMPLIB}") + endif() + unset(_implib_path) + unset(_bin_path) + unset(_dll_version) +endmacro() + +find_path( + Libqrcodegencpp_INCLUDE_DIR + NAMES qrcodegen.hpp + HINTS ${PC_Libqrcodegencpp_INCLUDE_DIRS} + PATHS /usr/include /usr/local/include + PATH_SUFFIXES qrcodegencpp qrcodegen + DOC "Libqrcodegencpp include directory") + +if(PC_Libqrcodegencpp_VERSION VERSION_GREATER 0) + set(Libqrcodegencpp_VERSION ${PC_Libqrcodegencpp_VERSION}) +else() + if(NOT Libqrcodegencpp_FIND_QUIETLY) + message(AUTHOR_WARNING "Failed to find Libqrcodegencpp version.") + endif() + set(Libqrcodegencpp_VERSION 0.0.0) +endif() + +if(CMAKE_HOST_SYSTEM_NAME MATCHES "Windows") + find_library( + Libqrcodegencpp_IMPLIB + NAMES libqrcodegencpp qrcodegencpp + DOC "Libqrcodegencpp import library location") + + libqrcodegencpp_find_dll() +else() + find_library( + Libqrcodegencpp_LIBRARY + NAMES libqrcodegencpp qrcodegencpp + HINTS ${PC_Libqrcodegencpp_LIBRARY_DIRS} + PATHS /usr/lib /usr/local/lib + DOC "Libqrcodegencpp location") +endif() + +if(CMAKE_HOST_SYSTEM_NAME MATCHES "Darwin|Windows") + set(Libqrcodegencpp_ERROR_REASON "Ensure that a qrcodegencpp distribution is provided as part of CMAKE_PREFIX_PATH.") +elseif(CMAKE_HOST_SYSTEM_NAME MATCHES "Linux|FreeBSD") + set(Libqrcodegencpp_ERROR_REASON "Ensure that qrcodegencpp is installed on the system.") +endif() + +find_package_handle_standard_args( + Libqrcodegencpp + REQUIRED_VARS Libqrcodegencpp_LIBRARY Libqrcodegencpp_INCLUDE_DIR + VERSION_VAR Libqrcodegencpp_VERSION REASON_FAILURE_MESSAGE "${Libqrcodegencpp_ERROR_REASON}") +mark_as_advanced(Libqrcodegencpp_INCLUDE_DIR Libqrcodegencpp_LIBRARY Libqrcodegencpp_IMPLIB) +unset(Libqrcodegencpp_ERROR_REASON) + +if(Libqrcodegencpp_FOUND) + if(NOT TARGET Libqrcodegencpp::Libqrcodegencpp) + if(IS_ABSOLUTE "${Libqrcodegencpp_LIBRARY}") + if(DEFINED Libqrcodegencpp_IMPLIB) + if(Libqrcodegencpp_IMPLIB STREQUAL Libqrcodegencpp_LIBRARY) + add_library(Libqrcodegencpp::Libqrcodegencpp STATIC IMPORTED) + else() + add_library(Libqrcodegencpp::Libqrcodegencpp SHARED IMPORTED) + set_property(TARGET Libqrcodegencpp::Libqrcodegencpp PROPERTY IMPORTED_IMPLIB "${Libqrcodegencpp_IMPLIB}") + endif() + else() + add_library(Libqrcodegencpp::Libqrcodegencpp UNKNOWN IMPORTED) + endif() + set_property(TARGET Libqrcodegencpp::Libqrcodegencpp PROPERTY IMPORTED_LOCATION "${Libqrcodegencpp_LIBRARY}") + else() + add_library(Libqrcodegencpp::Libqrcodegencpp INTERFACE IMPORTED) + set_property(TARGET Libqrcodegencpp::Libqrcodegencpp PROPERTY IMPORTED_LIBNAME "${Libqrcodegencpp_LIBRARY}") + endif() + + libqrcodegencpp_set_soname() + set_target_properties( + Libqrcodegencpp::Libqrcodegencpp + PROPERTIES INTERFACE_COMPILE_OPTIONS "${PC_Libqrcodegencpp_CFLAGS_OTHER}" + INTERFACE_INCLUDE_DIRECTORIES "${Libqrcodegencpp_INCLUDE_DIR}" + VERSION ${Libqrcodegencpp_VERSION}) + endif() +endif() + +include(FeatureSummary) +set_package_properties( + Libqrcodegencpp PROPERTIES + URL "https://www.nayuki.io/page/qr-code-generator-library" + DESCRIPTION "This project aims to be the best, clearest library for generating QR Codes in C++.")