diff --git a/CMakeLists.txt b/CMakeLists.txt index 16928b74..c535a3dd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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) diff --git a/cmake/Findlibheif.cmake b/cmake/Findlibheif.cmake index d4ff65ab..f1245220 100644 --- a/cmake/Findlibheif.cmake +++ b/cmake/Findlibheif.cmake @@ -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 diff --git a/tests/cmake/libheif-discovery/CMakeLists.txt b/tests/cmake/libheif-discovery/CMakeLists.txt new file mode 100644 index 00000000..7cc3e515 --- /dev/null +++ b/tests/cmake/libheif-discovery/CMakeLists.txt @@ -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()