aboutsummaryrefslogtreecommitdiff
path: root/vcpkg/scripts/test_ports/vcpkg-ci-cmake-toolchain-file
diff options
context:
space:
mode:
Diffstat (limited to 'vcpkg/scripts/test_ports/vcpkg-ci-cmake-toolchain-file')
-rw-r--r--vcpkg/scripts/test_ports/vcpkg-ci-cmake-toolchain-file/portfile.cmake164
-rw-r--r--vcpkg/scripts/test_ports/vcpkg-ci-cmake-toolchain-file/project/CMakeLists.txt42
-rw-r--r--vcpkg/scripts/test_ports/vcpkg-ci-cmake-toolchain-file/project/main.c7
-rw-r--r--vcpkg/scripts/test_ports/vcpkg-ci-cmake-toolchain-file/project/vcpkg_lock_find_package/CMakeLists.txt.in10
-rw-r--r--vcpkg/scripts/test_ports/vcpkg-ci-cmake-toolchain-file/project/vcpkg_lock_find_package/directPackageXConfig.cmake1
-rw-r--r--vcpkg/scripts/test_ports/vcpkg-ci-cmake-toolchain-file/project/vcpkg_lock_find_package/transitiveOptionalAbsentPackageXConfig.cmake2
-rw-r--r--vcpkg/scripts/test_ports/vcpkg-ci-cmake-toolchain-file/project/vcpkg_lock_find_package/transitivePackageXConfig.cmake2
-rw-r--r--vcpkg/scripts/test_ports/vcpkg-ci-cmake-toolchain-file/vcpkg.json17
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
+ }
+ ]
+}