aboutsummaryrefslogtreecommitdiff
path: root/vcpkg/scripts/cmake/vcpkg_check_linkage.cmake
diff options
context:
space:
mode:
authorEthan Morgan <ethan@gweithio.com>2026-02-14 16:44:06 +0000
committerEthan Morgan <ethan@gweithio.com>2026-02-14 16:44:06 +0000
commit54409423f767d8b1cf30cb7d0efca6b4ca138823 (patch)
treed915ac7828703ce4b963efdd9728a1777ba18c1e /vcpkg/scripts/cmake/vcpkg_check_linkage.cmake
move to own git serverHEADmaster
Diffstat (limited to 'vcpkg/scripts/cmake/vcpkg_check_linkage.cmake')
-rw-r--r--vcpkg/scripts/cmake/vcpkg_check_linkage.cmake47
1 files changed, 47 insertions, 0 deletions
diff --git a/vcpkg/scripts/cmake/vcpkg_check_linkage.cmake b/vcpkg/scripts/cmake/vcpkg_check_linkage.cmake
new file mode 100644
index 0000000..80070ca
--- /dev/null
+++ b/vcpkg/scripts/cmake/vcpkg_check_linkage.cmake
@@ -0,0 +1,47 @@
+function(vcpkg_check_linkage)
+ cmake_parse_arguments(PARSE_ARGV 0 arg
+ "ONLY_STATIC_LIBRARY;ONLY_DYNAMIC_LIBRARY;ONLY_DYNAMIC_CRT;ONLY_STATIC_CRT"
+ ""
+ ""
+ )
+
+ if(DEFINED arg_UNPARSED_ARGUMENTS)
+ message(WARNING "${CMAKE_CURRENT_FUNCTION} was passed extra arguments: ${arg_UNPARSED_ARGUMENTS}")
+ endif()
+
+ if(arg_ONLY_STATIC_LIBRARY AND arg_ONLY_DYNAMIC_LIBRARY)
+ message(FATAL_ERROR "Requesting both ONLY_STATIC_LIBRARY and ONLY_DYNAMIC_LIBRARY; this is an error.")
+ endif()
+ if(arg_ONLY_STATIC_CRT AND arg_ONLY_DYNAMIC_CRT)
+ message(FATAL_ERROR "Requesting both ONLY_STATIC_CRT and ONLY_DYNAMIC_CRT; this is an error.")
+ endif()
+
+ if(arg_ONLY_STATIC_LIBRARY AND "${VCPKG_LIBRARY_LINKAGE}" STREQUAL "dynamic")
+ message(STATUS "Note: ${PORT} only supports static library linkage. Building static library.")
+ set(VCPKG_LIBRARY_LINKAGE static PARENT_SCOPE)
+ elseif(arg_ONLY_DYNAMIC_LIBRARY AND "${VCPKG_LIBRARY_LINKAGE}" STREQUAL "static")
+ if("${VCPKG_CRT_LINKAGE}" STREQUAL "static")
+ message(FATAL_ERROR "This port can only build as a dynamic library, but the triplet \
+selects a static library and a static CRT. Building a dynamic library with a static CRT creates \
+conditions many developers find surprising, and for which most ports are unprepared. Therefore, \
+vcpkg fails rather than changing VCPKG_LIBRARY_LINKAGE to dynamic.\
+
+Consider choosing a triplet that sets VCPKG_CRT_LINKAGE to dynamic. For more information, \
+explicitly requesting this configuration in a custom triplet, please see \
+https://learn.microsoft.com/vcpkg/maintainers/functions/vcpkg_check_linkage?WT.mc_id=vcpkg_inproduct_cli#notes \
+
+If you can edit the port calling vcpkg_check_linkage that emits this message, consider adding \
+!(static & staticcrt) to the \"supports\" expression so that this combination can fail early.")
+ else()
+ message(STATUS "Note: ${PORT} only supports dynamic library linkage. Building dynamic library.")
+ endif()
+
+ set(VCPKG_LIBRARY_LINKAGE dynamic PARENT_SCOPE)
+ endif()
+
+ if(arg_ONLY_DYNAMIC_CRT AND "${VCPKG_CRT_LINKAGE}" STREQUAL "static")
+ message(FATAL_ERROR "${PORT} only supports dynamic crt linkage")
+ elseif(arg_ONLY_STATIC_CRT AND "${VCPKG_CRT_LINKAGE}" STREQUAL "dynamic")
+ message(FATAL_ERROR "${PORT} only supports static crt linkage")
+ endif()
+endfunction()