aboutsummaryrefslogtreecommitdiff
path: root/vcpkg/scripts/test_ports/vcpkg-ci-cmake-toolchain-file/portfile.cmake
blob: 7f70d162ef356395b742e7f6e493ceace207a7d3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
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()