Use Find*.cmake files for backend discovery

This commit is contained in:
luisangelsm
2026-03-29 23:15:24 +02:00
parent 52dd4e4c3c
commit 268b23376b
6 changed files with 221 additions and 144 deletions

View File

@ -15,7 +15,7 @@ endfunction()
function(yacreader_add_imported_library target_name) function(yacreader_add_imported_library target_name)
set(options) set(options)
set(oneValueArgs TYPE LOCATION IMPORTED_IMPLIB INCLUDE_DIR) set(oneValueArgs TYPE LOCATION IMPORTED_IMPLIB INCLUDE_DIR)
set(multiValueArgs LINK_LIBRARIES) set(multiValueArgs LINK_LIBRARIES COMPILE_DEFINITIONS)
cmake_parse_arguments(YR "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) cmake_parse_arguments(YR "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
if(NOT YR_TYPE) if(NOT YR_TYPE)
@ -41,4 +41,8 @@ function(yacreader_add_imported_library target_name)
if(YR_LINK_LIBRARIES) if(YR_LINK_LIBRARIES)
set_property(TARGET "${target_name}" PROPERTY INTERFACE_LINK_LIBRARIES "${YR_LINK_LIBRARIES}") set_property(TARGET "${target_name}" PROPERTY INTERFACE_LINK_LIBRARIES "${YR_LINK_LIBRARIES}")
endif() endif()
if(YR_COMPILE_DEFINITIONS)
set_property(TARGET "${target_name}" PROPERTY INTERFACE_COMPILE_DEFINITIONS "${YR_COMPILE_DEFINITIONS}")
endif()
endfunction() endfunction()

View File

@ -0,0 +1,43 @@
include(BackendHelpers)
include(FindPackageHandleStandardArgs)
set(PopplerQt6_PROVIDER "")
set(PopplerQt6_TARGET "")
set(PopplerQt6_INCLUDE_DIRS "")
set(PopplerQt6_LIBRARIES "")
if(NOT TARGET Poppler::Qt6)
find_package(PkgConfig QUIET)
if(PkgConfig_FOUND)
pkg_check_modules(POPPLERQT6 QUIET IMPORTED_TARGET poppler-qt6)
if(TARGET PkgConfig::POPPLERQT6)
yacreader_add_imported_library(Poppler::Qt6
TYPE INTERFACE
LINK_LIBRARIES "PkgConfig::POPPLERQT6")
set(PopplerQt6_PROVIDER "pkg-config")
set(PopplerQt6_INCLUDE_DIRS "${POPPLERQT6_INCLUDE_DIRS}")
endif()
endif()
endif()
if(NOT TARGET Poppler::Qt6)
find_path(POPPLERQT6_INCLUDE_DIR NAMES poppler-qt6.h PATH_SUFFIXES poppler/qt6)
find_library(POPPLERQT6_LIBRARY NAMES poppler-qt6)
if(POPPLERQT6_INCLUDE_DIR AND POPPLERQT6_LIBRARY)
yacreader_add_imported_library(Poppler::Qt6
TYPE UNKNOWN
LOCATION "${POPPLERQT6_LIBRARY}"
INCLUDE_DIR "${POPPLERQT6_INCLUDE_DIR}")
set(PopplerQt6_PROVIDER "CMake search")
set(PopplerQt6_INCLUDE_DIRS "${POPPLERQT6_INCLUDE_DIR}")
endif()
endif()
if(TARGET Poppler::Qt6)
set(PopplerQt6_TARGET Poppler::Qt6)
set(PopplerQt6_LIBRARIES Poppler::Qt6)
endif()
find_package_handle_standard_args(PopplerQt6 REQUIRED_VARS PopplerQt6_TARGET)
mark_as_advanced(POPPLERQT6_INCLUDE_DIR POPPLERQT6_LIBRARY)

72
cmake/Findpdfium.cmake Normal file
View File

@ -0,0 +1,72 @@
include(BackendHelpers)
include(FindPackageHandleStandardArgs)
set(pdfium_PROVIDER "")
set(pdfium_TARGET "")
set(pdfium_INCLUDE_DIRS "")
set(pdfium_LIBRARIES "")
if(NOT TARGET pdfium::pdfium AND WIN32)
yacreader_get_windows_arch_subdir(_pdfium_arch)
set(_pdfium_include_dir "${CMAKE_SOURCE_DIR}/dependencies/pdfium/win/public")
set(_pdfium_implib "${CMAKE_SOURCE_DIR}/dependencies/pdfium/win/${_pdfium_arch}/pdfium.lib")
set(_pdfium_dll "${CMAKE_SOURCE_DIR}/dependencies/pdfium/win/${_pdfium_arch}/pdfium.dll")
if(EXISTS "${_pdfium_include_dir}/fpdfview.h" AND EXISTS "${_pdfium_implib}" AND EXISTS "${_pdfium_dll}")
yacreader_add_imported_library(pdfium::pdfium
TYPE SHARED
LOCATION "${_pdfium_dll}"
IMPORTED_IMPLIB "${_pdfium_implib}"
INCLUDE_DIR "${_pdfium_include_dir}")
set(pdfium_PROVIDER "bundled dependencies (${_pdfium_arch}, Windows)")
set(pdfium_INCLUDE_DIRS "${_pdfium_include_dir}")
endif()
endif()
if(NOT TARGET pdfium::pdfium AND APPLE)
set(_pdfium_include_dir "${CMAKE_SOURCE_DIR}/dependencies/pdfium/macx/include")
set(_pdfium_library "${CMAKE_SOURCE_DIR}/dependencies/pdfium/macx/bin/libpdfium.a")
if(EXISTS "${_pdfium_include_dir}/fpdfview.h" AND EXISTS "${_pdfium_library}")
yacreader_add_imported_library(pdfium::pdfium
TYPE STATIC
LOCATION "${_pdfium_library}"
INCLUDE_DIR "${_pdfium_include_dir}")
set(pdfium_PROVIDER "bundled dependencies (macOS)")
set(pdfium_INCLUDE_DIRS "${_pdfium_include_dir}")
endif()
endif()
if(NOT TARGET pdfium::pdfium)
find_package(PkgConfig QUIET)
if(PkgConfig_FOUND)
pkg_check_modules(PDFIUM QUIET IMPORTED_TARGET libpdfium)
if(TARGET PkgConfig::PDFIUM)
yacreader_add_imported_library(pdfium::pdfium
TYPE INTERFACE
LINK_LIBRARIES "PkgConfig::PDFIUM")
set(pdfium_PROVIDER "pkg-config")
set(pdfium_INCLUDE_DIRS "${PDFIUM_INCLUDE_DIRS}")
endif()
endif()
endif()
if(NOT TARGET pdfium::pdfium)
find_path(PDFIUM_INCLUDE_DIR NAMES fpdfview.h PATH_SUFFIXES pdfium)
find_library(PDFIUM_LIBRARY NAMES pdfium libpdfium)
if(PDFIUM_INCLUDE_DIR AND PDFIUM_LIBRARY)
yacreader_add_imported_library(pdfium::pdfium
TYPE UNKNOWN
LOCATION "${PDFIUM_LIBRARY}"
INCLUDE_DIR "${PDFIUM_INCLUDE_DIR}")
set(pdfium_PROVIDER "CMake search")
set(pdfium_INCLUDE_DIRS "${PDFIUM_INCLUDE_DIR}")
endif()
endif()
if(TARGET pdfium::pdfium)
set(pdfium_TARGET pdfium::pdfium)
set(pdfium_LIBRARIES pdfium::pdfium)
endif()
find_package_handle_standard_args(pdfium REQUIRED_VARS pdfium_TARGET)
mark_as_advanced(PDFIUM_INCLUDE_DIR PDFIUM_LIBRARY)

74
cmake/Findunarr.cmake Normal file
View File

@ -0,0 +1,74 @@
include(BackendHelpers)
include(FindPackageHandleStandardArgs)
set(unarr_PROVIDER "")
set(unarr_TARGET "")
set(unarr_INCLUDE_DIRS "")
set(unarr_LIBRARIES "")
if(NOT TARGET unarr::unarr AND APPLE)
set(_unarr_include_dir "${CMAKE_SOURCE_DIR}/dependencies/unarr/macx")
set(_unarr_library "${CMAKE_SOURCE_DIR}/dependencies/unarr/macx/libunarr.a")
if(EXISTS "${_unarr_include_dir}/unarr.h" AND EXISTS "${_unarr_library}")
yacreader_add_imported_library(unarr::unarr
TYPE STATIC
LOCATION "${_unarr_library}"
INCLUDE_DIR "${_unarr_include_dir}"
LINK_LIBRARIES "z;bz2")
set(unarr_PROVIDER "bundled dependencies (macOS)")
set(unarr_INCLUDE_DIRS "${_unarr_include_dir}")
endif()
endif()
if(NOT TARGET unarr::unarr AND WIN32)
yacreader_get_windows_arch_subdir(_unarr_arch)
set(_unarr_include_dir "${CMAKE_SOURCE_DIR}/dependencies/unarr/win")
set(_unarr_implib "${CMAKE_SOURCE_DIR}/dependencies/unarr/win/${_unarr_arch}/unarr.lib")
set(_unarr_dll "${CMAKE_SOURCE_DIR}/dependencies/unarr/win/${_unarr_arch}/unarr.dll")
if(EXISTS "${_unarr_include_dir}/unarr.h" AND EXISTS "${_unarr_implib}" AND EXISTS "${_unarr_dll}")
yacreader_add_imported_library(unarr::unarr
TYPE SHARED
LOCATION "${_unarr_dll}"
IMPORTED_IMPLIB "${_unarr_implib}"
INCLUDE_DIR "${_unarr_include_dir}"
COMPILE_DEFINITIONS "UNARR_IS_SHARED_LIBRARY")
set(unarr_PROVIDER "bundled dependencies (${_unarr_arch}, Windows)")
set(unarr_INCLUDE_DIRS "${_unarr_include_dir}")
endif()
endif()
if(NOT TARGET unarr::unarr)
find_package(PkgConfig QUIET)
if(PkgConfig_FOUND)
pkg_check_modules(UNARR QUIET IMPORTED_TARGET libunarr)
if(TARGET PkgConfig::UNARR)
yacreader_add_imported_library(unarr::unarr
TYPE INTERFACE
LINK_LIBRARIES "PkgConfig::UNARR")
set(unarr_PROVIDER "pkg-config")
set(unarr_INCLUDE_DIRS "${UNARR_INCLUDE_DIRS}")
endif()
endif()
endif()
if(NOT TARGET unarr::unarr)
find_path(UNARR_INCLUDE_DIR NAMES unarr.h)
find_library(UNARR_LIBRARY NAMES unarr libunarr)
if(UNARR_INCLUDE_DIR AND UNARR_LIBRARY)
yacreader_add_imported_library(unarr::unarr
TYPE UNKNOWN
LOCATION "${UNARR_LIBRARY}"
INCLUDE_DIR "${UNARR_INCLUDE_DIR}")
set(unarr_PROVIDER "CMake search")
set(unarr_INCLUDE_DIRS "${UNARR_INCLUDE_DIR}")
endif()
endif()
if(TARGET unarr::unarr)
set(unarr_TARGET unarr::unarr)
set(unarr_LIBRARIES unarr::unarr)
endif()
find_package_handle_standard_args(unarr REQUIRED_VARS unarr_TARGET)
mark_as_advanced(UNARR_INCLUDE_DIR UNARR_LIBRARY)

View File

@ -2,8 +2,6 @@
# Creates an INTERFACE target 'pdf_backend_iface' that propagates # Creates an INTERFACE target 'pdf_backend_iface' that propagates
# compile definitions and link libraries based on PDF_BACKEND. # compile definitions and link libraries based on PDF_BACKEND.
include(BackendHelpers)
add_library(pdf_backend_iface INTERFACE) add_library(pdf_backend_iface INTERFACE)
if(PDF_BACKEND STREQUAL "no_pdf") if(PDF_BACKEND STREQUAL "no_pdf")
@ -14,65 +12,21 @@ elseif(PDF_BACKEND STREQUAL "pdfium")
message(STATUS "PDF backend: pdfium") message(STATUS "PDF backend: pdfium")
target_compile_definitions(pdf_backend_iface INTERFACE USE_PDFIUM) target_compile_definitions(pdf_backend_iface INTERFACE USE_PDFIUM)
if(WIN32) find_package(pdfium QUIET CONFIG)
yacreader_get_windows_arch_subdir(_pdfium_arch) if(TARGET pdfium::pdfium)
set(_pdfium_include_dir "${CMAKE_SOURCE_DIR}/dependencies/pdfium/win/public") message(STATUS " Found pdfium via CMake config")
set(_pdfium_implib "${CMAKE_SOURCE_DIR}/dependencies/pdfium/win/${_pdfium_arch}/pdfium.lib")
set(_pdfium_dll "${CMAKE_SOURCE_DIR}/dependencies/pdfium/win/${_pdfium_arch}/pdfium.dll")
if(NOT EXISTS "${_pdfium_include_dir}/fpdfview.h"
OR NOT EXISTS "${_pdfium_implib}"
OR NOT EXISTS "${_pdfium_dll}")
message(FATAL_ERROR
"Could not find bundled pdfium for ${_pdfium_arch}. "
"Expected files under dependencies/pdfium/win/${_pdfium_arch}.")
endif()
message(STATUS " Using bundled pdfium (${_pdfium_arch}, Windows)")
yacreader_add_imported_library(YACReader::pdfium
TYPE SHARED
LOCATION "${_pdfium_dll}"
IMPORTED_IMPLIB "${_pdfium_implib}"
INCLUDE_DIR "${_pdfium_include_dir}")
target_link_libraries(pdf_backend_iface INTERFACE YACReader::pdfium)
elseif(APPLE)
set(_pdfium_include_dir "${CMAKE_SOURCE_DIR}/dependencies/pdfium/macx/include")
set(_pdfium_library "${CMAKE_SOURCE_DIR}/dependencies/pdfium/macx/bin/libpdfium.a")
if(NOT EXISTS "${_pdfium_include_dir}/fpdfview.h" OR NOT EXISTS "${_pdfium_library}")
message(FATAL_ERROR "Could not find bundled pdfium under dependencies/pdfium/macx.")
endif()
message(STATUS " Using bundled pdfium (macOS)")
yacreader_add_imported_library(YACReader::pdfium
TYPE STATIC
LOCATION "${_pdfium_library}"
INCLUDE_DIR "${_pdfium_include_dir}")
target_link_libraries(pdf_backend_iface INTERFACE YACReader::pdfium)
else()
# Linux: try pkg-config first, then a normal CMake search.
find_package(PkgConfig QUIET)
if(PkgConfig_FOUND)
pkg_check_modules(PDFIUM QUIET IMPORTED_TARGET libpdfium)
endif()
if(TARGET PkgConfig::PDFIUM)
message(STATUS " Found pdfium via pkg-config")
target_link_libraries(pdf_backend_iface INTERFACE PkgConfig::PDFIUM)
else()
find_path(PDFIUM_INCLUDE_DIR NAMES fpdfview.h PATH_SUFFIXES pdfium)
find_library(PDFIUM_LIBRARY NAMES pdfium libpdfium)
if(PDFIUM_INCLUDE_DIR AND PDFIUM_LIBRARY)
message(STATUS " Found pdfium via CMake search")
yacreader_add_imported_library(YACReader::pdfium
TYPE UNKNOWN
LOCATION "${PDFIUM_LIBRARY}"
INCLUDE_DIR "${PDFIUM_INCLUDE_DIR}")
target_link_libraries(pdf_backend_iface INTERFACE YACReader::pdfium)
else() else()
find_package(pdfium QUIET MODULE)
if(NOT TARGET pdfium::pdfium)
message(FATAL_ERROR "Could not find libpdfium. Install it or use a different PDF_BACKEND.") message(FATAL_ERROR "Could not find libpdfium. Install it or use a different PDF_BACKEND.")
endif() endif()
if(pdfium_PROVIDER)
message(STATUS " Found pdfium via ${pdfium_PROVIDER}")
endif() endif()
endif() endif()
target_link_libraries(pdf_backend_iface INTERFACE pdfium::pdfium)
elseif(PDF_BACKEND STREQUAL "poppler") elseif(PDF_BACKEND STREQUAL "poppler")
message(STATUS "PDF backend: poppler") message(STATUS "PDF backend: poppler")
target_compile_definitions(pdf_backend_iface INTERFACE USE_POPPLER) target_compile_definitions(pdf_backend_iface INTERFACE USE_POPPLER)
@ -85,37 +39,23 @@ elseif(PDF_BACKEND STREQUAL "poppler")
# On Windows: vcpkg install poppler[qt6]:x64-windows, then pass the vcpkg toolchain file # On Windows: vcpkg install poppler[qt6]:x64-windows, then pass the vcpkg toolchain file
find_package(Poppler QUIET CONFIG) find_package(Poppler QUIET CONFIG)
if(TARGET Poppler::Qt6) if(TARGET Poppler::Qt6)
message(STATUS " Found poppler-qt6 via cmake config") message(STATUS " Found poppler-qt6 via CMake config")
target_link_libraries(pdf_backend_iface INTERFACE Poppler::Qt6)
else() else()
# Fall back to pkg-config (standard on Linux; on Windows requires vcpkg pkgconf) find_package(PopplerQt6 QUIET MODULE)
find_package(PkgConfig QUIET) if(TARGET Poppler::Qt6)
if(PkgConfig_FOUND) if(PopplerQt6_PROVIDER)
pkg_check_modules(POPPLER QUIET IMPORTED_TARGET poppler-qt6) message(STATUS " Found poppler-qt6 via ${PopplerQt6_PROVIDER}")
endif() endif()
if(TARGET PkgConfig::POPPLER)
message(STATUS " Found poppler-qt6 via pkg-config")
target_link_libraries(pdf_backend_iface INTERFACE PkgConfig::POPPLER)
elseif(MSVC) elseif(MSVC)
message(FATAL_ERROR "Could not find poppler-qt6. " message(FATAL_ERROR "Could not find poppler-qt6. "
"Install via vcpkg: vcpkg install poppler[qt6]:x64-windows " "Install via vcpkg: vcpkg install poppler[qt6]:x64-windows "
"then configure cmake with the vcpkg toolchain file.") "then configure cmake with the vcpkg toolchain file.")
else()
find_path(POPPLER_QT6_INCLUDE_DIR NAMES poppler-qt6.h PATH_SUFFIXES poppler/qt6)
find_library(POPPLER_QT6_LIBRARY NAMES poppler-qt6)
if(POPPLER_QT6_INCLUDE_DIR AND POPPLER_QT6_LIBRARY)
message(STATUS " Found poppler-qt6 via CMake search")
yacreader_add_imported_library(YACReader::poppler_qt6
TYPE UNKNOWN
LOCATION "${POPPLER_QT6_LIBRARY}"
INCLUDE_DIR "${POPPLER_QT6_INCLUDE_DIR}")
target_link_libraries(pdf_backend_iface INTERFACE YACReader::poppler_qt6)
else() else()
message(FATAL_ERROR "Could not find poppler-qt6. Install libpoppler-qt6-dev or use a different PDF_BACKEND.") message(FATAL_ERROR "Could not find poppler-qt6. Install libpoppler-qt6-dev or use a different PDF_BACKEND.")
endif() endif()
endif() endif()
endif()
target_link_libraries(pdf_backend_iface INTERFACE Poppler::Qt6)
elseif(PDF_BACKEND STREQUAL "pdfkit") elseif(PDF_BACKEND STREQUAL "pdfkit")
message(STATUS "PDF backend: pdfkit (macOS)") message(STATUS "PDF backend: pdfkit (macOS)")

View File

@ -1,8 +1,6 @@
# Comic archive decompression backend (cbx_backend) # Comic archive decompression backend (cbx_backend)
# Switched on DECOMPRESSION_BACKEND: unarr | 7zip | libarchive # Switched on DECOMPRESSION_BACKEND: unarr | 7zip | libarchive
include(BackendHelpers)
add_library(cbx_backend STATIC) add_library(cbx_backend STATIC)
if(DECOMPRESSION_BACKEND STREQUAL "unarr") if(DECOMPRESSION_BACKEND STREQUAL "unarr")
@ -16,77 +14,23 @@ if(DECOMPRESSION_BACKEND STREQUAL "unarr")
target_include_directories(cbx_backend PUBLIC unarr) target_include_directories(cbx_backend PUBLIC unarr)
target_compile_definitions(cbx_backend PUBLIC use_unarr) target_compile_definitions(cbx_backend PUBLIC use_unarr)
# Try CMake config first, then pkg-config, then bundled/system libraries.
set(_unarr_target "")
find_package(unarr QUIET CONFIG) find_package(unarr QUIET CONFIG)
if(TARGET unarr::unarr) if(TARGET unarr::unarr)
message(STATUS " Found unarr via CMake config") message(STATUS " Found unarr via CMake config")
set(_unarr_target unarr::unarr) else()
find_package(unarr QUIET MODULE)
endif() endif()
if(NOT _unarr_target AND APPLE) if(NOT TARGET unarr::unarr)
set(_unarr_include_dir "${CMAKE_SOURCE_DIR}/dependencies/unarr/macx")
set(_unarr_library "${CMAKE_SOURCE_DIR}/dependencies/unarr/macx/libunarr.a")
if(EXISTS "${_unarr_include_dir}/unarr.h" AND EXISTS "${_unarr_library}")
message(STATUS " Using bundled unarr (macOS)")
yacreader_add_imported_library(YACReader::unarr
TYPE STATIC
LOCATION "${_unarr_library}"
INCLUDE_DIR "${_unarr_include_dir}"
LINK_LIBRARIES "z;bz2")
set(_unarr_target YACReader::unarr)
endif()
endif()
if(NOT _unarr_target AND WIN32)
yacreader_get_windows_arch_subdir(_unarr_arch)
set(_unarr_include_dir "${CMAKE_SOURCE_DIR}/dependencies/unarr/win")
set(_unarr_implib "${CMAKE_SOURCE_DIR}/dependencies/unarr/win/${_unarr_arch}/unarr.lib")
set(_unarr_dll "${CMAKE_SOURCE_DIR}/dependencies/unarr/win/${_unarr_arch}/unarr.dll")
if(EXISTS "${_unarr_include_dir}/unarr.h" AND EXISTS "${_unarr_implib}" AND EXISTS "${_unarr_dll}")
message(STATUS " Using bundled unarr (${_unarr_arch}, Windows)")
yacreader_add_imported_library(YACReader::unarr
TYPE SHARED
LOCATION "${_unarr_dll}"
IMPORTED_IMPLIB "${_unarr_implib}"
INCLUDE_DIR "${_unarr_include_dir}")
set(_unarr_target YACReader::unarr)
target_compile_definitions(cbx_backend PRIVATE UNARR_IS_SHARED_LIBRARY)
endif()
endif()
if(NOT _unarr_target)
find_package(PkgConfig QUIET)
endif()
if(NOT _unarr_target AND PkgConfig_FOUND)
pkg_check_modules(UNARR QUIET IMPORTED_TARGET libunarr)
if(TARGET PkgConfig::UNARR)
message(STATUS " Found unarr via pkg-config")
set(_unarr_target PkgConfig::UNARR)
endif()
endif()
if(NOT _unarr_target)
find_path(UNARR_INCLUDE_DIR NAMES unarr.h)
find_library(UNARR_LIBRARY NAMES unarr libunarr)
if(UNARR_INCLUDE_DIR AND UNARR_LIBRARY)
message(STATUS " Found unarr via CMake search")
yacreader_add_imported_library(YACReader::unarr
TYPE UNKNOWN
LOCATION "${UNARR_LIBRARY}"
INCLUDE_DIR "${UNARR_INCLUDE_DIR}")
set(_unarr_target YACReader::unarr)
endif()
endif()
if(NOT _unarr_target)
message(FATAL_ERROR message(FATAL_ERROR
"Could not find unarr. Install libunarr or use a different DECOMPRESSION_BACKEND.") "Could not find unarr. Install libunarr or use a different DECOMPRESSION_BACKEND.")
endif() endif()
target_link_libraries(cbx_backend PRIVATE ${_unarr_target}) if(unarr_PROVIDER)
message(STATUS " Found unarr via ${unarr_PROVIDER}")
endif()
target_link_libraries(cbx_backend PRIVATE unarr::unarr)
elseif(DECOMPRESSION_BACKEND STREQUAL "7zip") elseif(DECOMPRESSION_BACKEND STREQUAL "7zip")
message(STATUS "Decompression backend: 7zip (in-tree)") message(STATUS "Decompression backend: 7zip (in-tree)")