Patrick Kelley 8fd444092b initial
2025-05-07 15:35:15 -04:00

165 lines
5.5 KiB
CMake

set(VCPKG_POLICY_EMPTY_PACKAGE enabled)
# For simplicity and speed, reusing source and build dirs
# - and the CMake cache - in multiple steps.
set(SOURCE_PATH "${CURRENT_BUILDTREES_DIR}/src/project")
file(REMOVE_RECURSE "${SOURCE_PATH}")
message(STATUS "Testing toolchain find_library search path setup")
file(COPY "${CURRENT_PORT_DIR}/project/" DESTINATION "${SOURCE_PATH}")
vcpkg_cmake_configure(
SOURCE_PATH "${SOURCE_PATH}"
DISABLE_PARALLEL_CONFIGURE # keep separate logs
)
vcpkg_cmake_build()
message(STATUS "Testing toolchain capability VCPKG_LOCK_FIND_PACKAGE")
set(VCPKG_BUILD_TYPE release)
function(write_test_project TEST_CODE)
configure_file("${CURRENT_PORT_DIR}/project/vcpkg_lock_find_package/CMakeLists.txt.in" "${SOURCE_PATH}/CMakeLists.txt" @ONLY)
endfunction()
include("${CURRENT_HOST_INSTALLED_DIR}/share/unit-test-cmake/test-macros.cmake")
function(send_error summary)
set_has_error()
string(SHA1 id "${summary}")
string(SUBSTRING "${id}" 0 6 id)
set(log_base "${CURRENT_BUILDTREES_DIR}/test-${TARGET_TRIPLET}-${id}")
set(log_files "")
file(COPY_FILE "${CURRENT_BUILDTREES_DIR}/build-${TARGET_TRIPLET}-rel-out.log" "${log_base}-out.log")
file(COPY_FILE "${CURRENT_BUILDTREES_DIR}/build-${TARGET_TRIPLET}-rel-err.log" "${log_base}-err.log")
message(SEND_ERROR " Test failed:\n${summary}\n See logs for more information:\n ${log_base}-out.log\n ${log_base}-err.log\n")
endfunction()
macro(unit_test_ensure_cmake_success utecs_test)
write_test_project("${utecs_test}")
cmake_language(EVAL CODE "vcpkg_cmake_build()")
if(Z_VCPKG_UNIT_TEST_HAS_FATAL_ERROR)
send_error("${utecs_test} was expected to be successful.")
endif()
unset_fatal_error()
endmacro()
macro(unit_test_ensure_cmake_error utece_test)
write_test_project("${utece_test}")
cmake_language(EVAL CODE "vcpkg_cmake_build()")
if(NOT Z_VCPKG_UNIT_TEST_HAS_FATAL_ERROR)
send_error("${utece_test} was expected to be successful.")
endif()
unset_fatal_error()
endmacro()
unit_test_ensure_cmake_error([[
# No VCPKG_LOCK_FIND_PACKAGE
find_package(absentPackageX REQUIRED)
]])
unit_test_ensure_cmake_success([[
# No VCPKG_LOCK_FIND_PACKAGE
find_package(directPackageX REQUIRED)
find_package(transitivePackageX REQUIRED)
find_package(transitiveOptionalAbsentPackageX REQUIRED)
find_package(absentPackageX)
if(absentPackageX_FOUND)
message(FATAL_ERROR "absentPackageX_FOUND unexpectedly set to '${absentPackageX_FOUND}'.")
endif()
]])
unit_test_ensure_cmake_success([[
# Disabling an absent optional package
set(VCPKG_LOCK_FIND_PACKAGE_absentPackageX 0)
find_package(absentPackageX)
]])
unit_test_ensure_cmake_error([[
# Disabling an absent required package
set(VCPKG_LOCK_FIND_PACKAGE_absentPackageX 0)
find_package(absentPackageX REQUIRED)
]])
unit_test_ensure_cmake_success([[
# Disabling an available optional package
set(VCPKG_LOCK_FIND_PACKAGE_directPackageX 0)
find_package(directPackageX)
if(directPackageX_FOUND)
message(FATAL_ERROR "directPackageX_FOUND unexpectedly set to '${directPackageX_FOUND}'.")
endif()
]])
unit_test_ensure_cmake_error([[
# Disabling an available required package
set(VCPKG_LOCK_FIND_PACKAGE_directPackageX 0)
find_package(directPackageX REQUIRED)
]])
unit_test_ensure_cmake_success([[
# Core capability: a smart CMAKE_DISABLE_FIND_PACKAGE_<Pkg>
# Disabling only the direct package
set(VCPKG_LOCK_FIND_PACKAGE_directPackageX 0)
find_package(directPackageX) # optional
find_package(transitivePackageX REQUIRED)
]])
unit_test_ensure_cmake_error([[
# For reference: CMake default behavior which we want to avoid
set(CMAKE_DISABLE_FIND_PACKAGE_directPackageX 1)
find_package(transitivePackageX REQUIRED)
]])
unit_test_ensure_cmake_error([[
# Requiring an absent optional package
set(VCPKG_LOCK_FIND_PACKAGE_absentPackageX 1)
find_package(absentPackageX)
]])
unit_test_ensure_cmake_error([[
# Requiring an absent required package
set(VCPKG_LOCK_FIND_PACKAGE_absentPackageX 1)
find_package(absentPackageX REQUIRED)
]])
unit_test_ensure_cmake_success([[
# Requiring an available optional package
set(VCPKG_LOCK_FIND_PACKAGE_directPackageX 1)
find_package(directPackageX)
if(NOT DEFINED directPackageX_FOUND)
message(FATAL_ERROR "directPackageX_FOUND unexpectedly undefined.")
elseif(NOT directPackageX_FOUND)
message(FATAL_ERROR "directPackageX_FOUND unexpectedly set to '${directPackageX_FOUND}'.")
endif()
]])
unit_test_ensure_cmake_success([[
# Requiring an available required package
set(VCPKG_LOCK_FIND_PACKAGE_directPackageX 1)
find_package(directPackageX REQUIRED)
if(NOT DEFINED directPackageX_FOUND)
message(FATAL_ERROR "directPackageX_FOUND unexpectedly undefined.")
elseif(NOT directPackageX_FOUND)
message(FATAL_ERROR "directPackageX_FOUND unexpectedly set to '${directPackageX_FOUND}'.")
endif()
]])
unit_test_ensure_cmake_success([[
# Core capability: a smart CMAKE_REQUIRE_FIND_PACKAGE_<Pkg>
# Requiring only the direct package
set(VCPKG_LOCK_FIND_PACKAGE_absentPackageX 1)
find_package(transitiveOptionalAbsentPackageX REQUIRED)
]])
unit_test_ensure_cmake_error([[
# For reference: CMake default behavior which we want to avoid
set(CMAKE_REQUIRE_FIND_PACKAGE_absentPackageX 1)
find_package(transitiveOptionalAbsentPackageX REQUIRED)
]])
unit_test_report_result()