From cf5cfe39891f1dbd4c9d5d1d8e29ed3d2cdd6f44 Mon Sep 17 00:00:00 2001 From: Dichen Zhang Date: Fri, 18 Sep 2026 22:21:01 +0000 Subject: [PATCH] cmake: prefer selected libheif headers and avoid system include demotion - Prepend libheif include directories (from target interface or LIBHEIF_INCLUDE_DIRS) to PRIVATE_INCLUDE_DIR so they are searched before other dependency or system include paths. - For CMake 3.25+, set SYSTEM FALSE on target libheif::heif to prevent it from being classified as a system target, ensuring its headers take precedence over conflicting host headers without stripping system include classification from other dependencies (e.g. GTest, Threads). - Resolve ALIASED_TARGET before calling set_target_properties to prevent CMake configuration fatal errors when libheif::heif is an ALIAS target (e.g. from Findlibheif.cmake aliasing 'heif' or 'PkgConfig::PC_LIBHEIF'). - Fall back to LIBHEIF_INCLUDE_DIRS if the target does not define INTERFACE_INCLUDE_DIRECTORIES. - Guard get_target_property with if(TARGET libheif::heif) to prevent CMake configuration errors when using custom or legacy Find modules. Ref: PR #468, PR #478 --- CMakeLists.txt | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 16928b74..ad2b2736 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -646,6 +646,25 @@ if(UHDR_ENABLE_HEIF) endif() if(LIBHEIF_FOUND) message(STATUS "Found libheif: ${LIBHEIF_LIBRARIES}") + if(TARGET libheif::heif) + get_target_property(_heif_interface_dirs libheif::heif INTERFACE_INCLUDE_DIRECTORIES) + if(_heif_interface_dirs) + list(PREPEND PRIVATE_INCLUDE_DIR ${_heif_interface_dirs}) + elseif(LIBHEIF_INCLUDE_DIRS) + list(PREPEND PRIVATE_INCLUDE_DIR ${LIBHEIF_INCLUDE_DIRS}) + endif() + # CMake 3.25+: prevent libheif from being classified as a system target so + # its headers are prioritized over any conflicting host/system headers, + # without stripping system include classification from other dependencies. + # Resolve ALIASED_TARGET if libheif::heif is an ALIAS (e.g. from Findlibheif.cmake). + get_target_property(_heif_real_target libheif::heif ALIASED_TARGET) + if(NOT _heif_real_target) + set(_heif_real_target libheif::heif) + endif() + set_target_properties(${_heif_real_target} PROPERTIES SYSTEM FALSE) + elseif(LIBHEIF_INCLUDE_DIRS) + list(PREPEND PRIVATE_INCLUDE_DIR ${LIBHEIF_INCLUDE_DIRS}) + endif() add_compile_options(-DUHDR_ENABLE_HEIF) list(APPEND PRIVATE_LINK_LIBS libheif::heif) else()