diff options
Diffstat (limited to 'vcpkg/scripts/test_ports/vcpkg-ci-cmake-toolchain-file')
8 files changed, 245 insertions, 0 deletions
diff --git a/vcpkg/scripts/test_ports/vcpkg-ci-cmake-toolchain-file/portfile.cmake b/vcpkg/scripts/test_ports/vcpkg-ci-cmake-toolchain-file/portfile.cmake new file mode 100644 index 0000000..7f70d16 --- /dev/null +++ b/vcpkg/scripts/test_ports/vcpkg-ci-cmake-toolchain-file/portfile.cmake @@ -0,0 +1,164 @@ +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() diff --git a/vcpkg/scripts/test_ports/vcpkg-ci-cmake-toolchain-file/project/CMakeLists.txt b/vcpkg/scripts/test_ports/vcpkg-ci-cmake-toolchain-file/project/CMakeLists.txt new file mode 100644 index 0000000..2171283 --- /dev/null +++ b/vcpkg/scripts/test_ports/vcpkg-ci-cmake-toolchain-file/project/CMakeLists.txt @@ -0,0 +1,42 @@ +cmake_minimum_required(VERSION 3.30) +project(cmake-toolchain-file-test C CXX) + +foreach(var IN ITEMS + CMAKE_SYSROOT + CMAKE_FIND_ROOT_PATH + CMAKE_PREFIX_PATH + CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES + CMAKE_SYSTEM_IGNORE_PATH + CMAKE_FIND_ROOT_PATH_MODE_LIBRARY +) + list(JOIN "${var}" "\n " dirs) + message("" "${var}:\n ${dirs}\n") +endforeach() + +set(CMAKE_FIND_DEBUG_MODE 1) +set(link_libs "") +set(implicit_link_libs "${CMAKE_CXX_IMPLICIT_LINK_LIBRARIES}") +list(REMOVE_ITEM implicit_link_libs ${CMAKE_C_IMPLICIT_LINK_LIBRARIES}) +foreach(lib IN LISTS implicit_link_libs) + if(EXISTS "${lib}") + message("" "Absolute path: ${lib}\n") + else() + string(MAKE_C_IDENTIFIER "${lib}" id) + find_library(${id}_LIBRARY NAMES "${lib}" NO_CACHE) + if(NOT ${id}_LIBRARY) + find_library(${id}_LIBRARY NAMES "${lib}" PATHS ${CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES} NO_DEFAULT_PATH NO_CACHE) + endif() + list(APPEND link_libs "${${id}_LIBRARY}") + endif() +endforeach() + +# Pull link errors into config step set of log files +try_compile(link_libs_accepted + SOURCES "${CMAKE_CURRENT_LIST_DIR}/main.c" + LINK_LIBRARIES ${link_libs} + LOG_DESCRIPTION "Checking linking with ${link_libs}" + OUTPUT_VARIABLE output +) +if(NOT link_libs_accepted) + message(FATAL_ERROR "${output}") +endif() diff --git a/vcpkg/scripts/test_ports/vcpkg-ci-cmake-toolchain-file/project/main.c b/vcpkg/scripts/test_ports/vcpkg-ci-cmake-toolchain-file/project/main.c new file mode 100644 index 0000000..d0510dd --- /dev/null +++ b/vcpkg/scripts/test_ports/vcpkg-ci-cmake-toolchain-file/project/main.c @@ -0,0 +1,7 @@ +#include <stdio.h> + +int main() +{ + printf("Hello %s\n", "world"); + return 0; +} diff --git a/vcpkg/scripts/test_ports/vcpkg-ci-cmake-toolchain-file/project/vcpkg_lock_find_package/CMakeLists.txt.in b/vcpkg/scripts/test_ports/vcpkg-ci-cmake-toolchain-file/project/vcpkg_lock_find_package/CMakeLists.txt.in new file mode 100644 index 0000000..c80e1da --- /dev/null +++ b/vcpkg/scripts/test_ports/vcpkg-ci-cmake-toolchain-file/project/vcpkg_lock_find_package/CMakeLists.txt.in @@ -0,0 +1,10 @@ +cmake_minimum_required(VERSION 3.30) +project(cmake-toolchain-file-test C) + +set(CMAKE_FIND_DEBUG_MODE 1) +set(VCPKG_TRACE_FIND_PACKAGE 1) + +set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE NEVER) +set(CMAKE_PREFIX_PATH "${CMAKE_CURRENT_LIST_DIR}/vcpkg_lock_find_package") + +@TEST_CODE@ diff --git a/vcpkg/scripts/test_ports/vcpkg-ci-cmake-toolchain-file/project/vcpkg_lock_find_package/directPackageXConfig.cmake b/vcpkg/scripts/test_ports/vcpkg-ci-cmake-toolchain-file/project/vcpkg_lock_find_package/directPackageXConfig.cmake new file mode 100644 index 0000000..636bc1a --- /dev/null +++ b/vcpkg/scripts/test_ports/vcpkg-ci-cmake-toolchain-file/project/vcpkg_lock_find_package/directPackageXConfig.cmake @@ -0,0 +1 @@ +# intentionally empty diff --git a/vcpkg/scripts/test_ports/vcpkg-ci-cmake-toolchain-file/project/vcpkg_lock_find_package/transitiveOptionalAbsentPackageXConfig.cmake b/vcpkg/scripts/test_ports/vcpkg-ci-cmake-toolchain-file/project/vcpkg_lock_find_package/transitiveOptionalAbsentPackageXConfig.cmake new file mode 100644 index 0000000..c55e262 --- /dev/null +++ b/vcpkg/scripts/test_ports/vcpkg-ci-cmake-toolchain-file/project/vcpkg_lock_find_package/transitiveOptionalAbsentPackageXConfig.cmake @@ -0,0 +1,2 @@ +# Optional dependency! +find_package(absentPackageX) diff --git a/vcpkg/scripts/test_ports/vcpkg-ci-cmake-toolchain-file/project/vcpkg_lock_find_package/transitivePackageXConfig.cmake b/vcpkg/scripts/test_ports/vcpkg-ci-cmake-toolchain-file/project/vcpkg_lock_find_package/transitivePackageXConfig.cmake new file mode 100644 index 0000000..2a47fac --- /dev/null +++ b/vcpkg/scripts/test_ports/vcpkg-ci-cmake-toolchain-file/project/vcpkg_lock_find_package/transitivePackageXConfig.cmake @@ -0,0 +1,2 @@ +include(CMakeFindDependencyMacro) +find_dependency(directPackageX) diff --git a/vcpkg/scripts/test_ports/vcpkg-ci-cmake-toolchain-file/vcpkg.json b/vcpkg/scripts/test_ports/vcpkg-ci-cmake-toolchain-file/vcpkg.json new file mode 100644 index 0000000..d754f71 --- /dev/null +++ b/vcpkg/scripts/test_ports/vcpkg-ci-cmake-toolchain-file/vcpkg.json @@ -0,0 +1,17 @@ +{ + "name": "vcpkg-ci-cmake-toolchain-file", + "version-string": "ci", + "description": "Validate vcpkg.cmake toolchain file", + "homepage": "https://github.com/microsoft/vcpkg", + "license": "MIT", + "dependencies": [ + { + "name": "unit-test-cmake", + "host": true + }, + { + "name": "vcpkg-cmake", + "host": true + } + ] +} |