Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 31 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -761,6 +761,37 @@ if(UHDR_BUILD_TESTS)
-P "${TESTS_DIR}/windows_unicode_cli_test.cmake"
)
endif()

# The fixture configures with the host compiler; skip target toolchains such as Android.
if(NOT CMAKE_CROSSCOMPILING)
set(_libheif_discovery_cmake_args -G "${CMAKE_GENERATOR}")
if(CMAKE_GENERATOR_PLATFORM)
list(APPEND _libheif_discovery_cmake_args -A "${CMAKE_GENERATOR_PLATFORM}")
endif()
if(CMAKE_GENERATOR_TOOLSET)
list(APPEND _libheif_discovery_cmake_args -T "${CMAKE_GENERATOR_TOOLSET}")
endif()

foreach(_variable IN ITEMS CMAKE_CXX_COMPILER CMAKE_TOOLCHAIN_FILE
CMAKE_OSX_ARCHITECTURES CMAKE_OSX_DEPLOYMENT_TARGET CMAKE_OSX_SYSROOT)
if(DEFINED ${_variable} AND NOT "${${_variable}}" STREQUAL "")
string(REPLACE ";" "\\;" _value "${${_variable}}")
list(APPEND _libheif_discovery_cmake_args "-D${_variable}=${_value}")
endif()
endforeach()

foreach(_case IN ITEMS no-defs empty-defs one-def multiple-defs missing-api)
add_test(
NAME "LibheifDiscovery-${_case}"
COMMAND ${CMAKE_COMMAND}
${_libheif_discovery_cmake_args}
-S "${TESTS_DIR}/cmake/libheif-discovery"
-B "${CMAKE_CURRENT_BINARY_DIR}/libheif-discovery/${_case}"
"-DLIBHEIF_MODULE_DIR=${CMAKE_CURRENT_SOURCE_DIR}/cmake"
"-DLIBHEIF_TEST_CASE=${_case}"
)
endforeach()
endif()
endif()

if(UHDR_BUILD_BENCHMARK)
Expand Down
2 changes: 1 addition & 1 deletion cmake/Findlibheif.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ if(LIBHEIF_TARGET)
list(APPEND CMAKE_REQUIRED_INCLUDES ${LIBHEIF_INCLUDE_DIR})
endif()
if(LIBHEIF_DEFS)
set(CMAKE_REQUIRED_DEFINITIONS "-D${LIBHEIF_DEFS}")
list(TRANSFORM LIBHEIF_DEFS PREPEND "-D" OUTPUT_VARIABLE CMAKE_REQUIRED_DEFINITIONS)
endif()

# Perform a compile-only check to avoid linking transitive dependencies
Expand Down
57 changes: 57 additions & 0 deletions tests/cmake/libheif-discovery/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
cmake_minimum_required(VERSION 3.15)
project(libheif_discovery_regression LANGUAGES CXX)

if(NOT LIBHEIF_MODULE_DIR OR NOT LIBHEIF_TEST_CASE)
message(FATAL_ERROR "LIBHEIF_MODULE_DIR and LIBHEIF_TEST_CASE are required")
endif()

set(_fixture_root "${CMAKE_CURRENT_BINARY_DIR}/fixture")
set(_package_dir "${_fixture_root}/lib/cmake/libheif")
file(MAKE_DIRECTORY "${_package_dir}")

set(_include_dir "${_fixture_root}/include/${LIBHEIF_TEST_CASE}/libheif")
file(MAKE_DIRECTORY "${_include_dir}")
if(LIBHEIF_TEST_CASE STREQUAL "one-def")
file(WRITE "${_include_dir}/heif.h" [=[
#ifdef LIBHEIF_TEST_SINGLE
int heif_image_handle_get_gain_map_image_handle();
#endif
]=])
elseif(LIBHEIF_TEST_CASE STREQUAL "multiple-defs")
file(WRITE "${_include_dir}/heif.h" [=[
#if defined(LIBHEIF_TEST_FIRST) && defined(LIBHEIF_TEST_SECOND)
int heif_image_handle_get_gain_map_image_handle();
#endif
]=])
elseif(LIBHEIF_TEST_CASE STREQUAL "missing-api")
file(WRITE "${_include_dir}/heif.h" "/* Gain map API intentionally absent. */\n")
else()
file(WRITE "${_include_dir}/heif.h" "int heif_image_handle_get_gain_map_image_handle();\n")
endif()

file(WRITE "${_package_dir}/libheifConfig.cmake" [=[
add_library(libheif::heif INTERFACE IMPORTED)
set_property(TARGET libheif::heif PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${LIBHEIF_TEST_INCLUDE_DIR}")
if(LIBHEIF_TEST_CASE STREQUAL "empty-defs")
set_property(TARGET libheif::heif PROPERTY INTERFACE_COMPILE_DEFINITIONS "")
elseif(LIBHEIF_TEST_CASE STREQUAL "one-def")
set_property(TARGET libheif::heif PROPERTY INTERFACE_COMPILE_DEFINITIONS LIBHEIF_TEST_SINGLE)
elseif(LIBHEIF_TEST_CASE STREQUAL "multiple-defs" OR LIBHEIF_TEST_CASE STREQUAL "missing-api")
set_property(TARGET libheif::heif PROPERTY INTERFACE_COMPILE_DEFINITIONS
LIBHEIF_TEST_FIRST LIBHEIF_TEST_SECOND)
endif()
]=])

set(libheif_DIR "${_package_dir}")
set(LIBHEIF_TEST_INCLUDE_DIR "${_fixture_root}/include/${LIBHEIF_TEST_CASE}")
list(APPEND CMAKE_MODULE_PATH "${LIBHEIF_MODULE_DIR}")
unset(LIBHEIF_HAS_GAIN_MAP CACHE)
find_package(libheif REQUIRED MODULE)

if(LIBHEIF_TEST_CASE STREQUAL "missing-api")
if(LIBHEIF_HAS_GAIN_MAP)
message(FATAL_ERROR "The feature check accepted a missing gain map API")
endif()
elseif(NOT LIBHEIF_HAS_GAIN_MAP)
message(FATAL_ERROR "The feature check rejected the ${LIBHEIF_TEST_CASE} fixture")
endif()
Loading