aboutsummaryrefslogtreecommitdiff
path: root/vcpkg/scripts/cmake/vcpkg_install_gn.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_install_gn.cmake
move to own git serverHEADmaster
Diffstat (limited to 'vcpkg/scripts/cmake/vcpkg_install_gn.cmake')
-rw-r--r--vcpkg/scripts/cmake/vcpkg_install_gn.cmake118
1 files changed, 118 insertions, 0 deletions
diff --git a/vcpkg/scripts/cmake/vcpkg_install_gn.cmake b/vcpkg/scripts/cmake/vcpkg_install_gn.cmake
new file mode 100644
index 0000000..5d96cbd
--- /dev/null
+++ b/vcpkg/scripts/cmake/vcpkg_install_gn.cmake
@@ -0,0 +1,118 @@
+function(z_vcpkg_install_gn_get_target_type out_var)
+ cmake_parse_arguments(PARSE_ARGV 1 "arg" "" "SOURCE_PATH;BUILD_DIR;TARGET" "")
+ if(DEFINED arg_UNPARSED_ARGUMENTS)
+ message(FATAL_ERROR "Internal error: get_target_type was passed extra arguments: ${arg_UNPARSED_ARGUMENTS}")
+ endif()
+
+ execute_process(
+ COMMAND "${GN}" desc "${arg_BUILD_DIR}" "${arg_TARGET}"
+ WORKING_DIRECTORY "${arg_SOURCE_PATH}"
+ OUTPUT_VARIABLE output
+ OUTPUT_STRIP_TRAILING_WHITESPACE
+ )
+ if(output MATCHES [[type: ([A-Za-z0-9_]+)]])
+ set("${out_var}" "${CMAKE_MATCH_1}" PARENT_SCOPE)
+ else()
+ message(FATAL_ERROR "invalid result from `gn desc`: ${output}")
+ endif()
+endfunction()
+
+function(z_vcpkg_install_gn_get_desc out_var)
+ cmake_parse_arguments(PARSE_ARGV 1 "arg" "" "SOURCE_PATH;BUILD_DIR;TARGET;WHAT_TO_DISPLAY" "")
+ if(DEFINED arg_UNPARSED_ARGUMENTS)
+ message(FATAL_ERROR "Internal error: get_desc was passed extra arguments: ${arg_UNPARSED_ARGUMENTS}")
+ endif()
+
+ execute_process(
+ COMMAND "${GN}" desc "${arg_BUILD_DIR}" "${arg_TARGET}" "${arg_WHAT_TO_DISPLAY}"
+ WORKING_DIRECTORY "${arg_SOURCE_PATH}"
+ OUTPUT_VARIABLE output
+ OUTPUT_STRIP_TRAILING_WHITESPACE
+ )
+ string(REPLACE ";" "\\;" output "${output}")
+ string(REGEX REPLACE "\n|(\r\n)" ";" output "${output}")
+ set("${out_var}" "${output}" PARENT_SCOPE)
+endfunction()
+
+function(z_vcpkg_install_gn_install)
+ cmake_parse_arguments(PARSE_ARGV 0 "arg" "" "SOURCE_PATH;BUILD_DIR;INSTALL_DIR" "TARGETS")
+ if(DEFINED arg_UNPARSED_ARGUMENTS)
+ message(FATAL_ERROR "Internal error: install was passed extra arguments: ${arg_UNPARSED_ARGUMENTS}")
+ endif()
+
+ foreach(target IN LISTS arg_TARGETS)
+ # GN targets must start with a //
+ z_vcpkg_install_gn_get_desc(outputs
+ SOURCE_PATH "${arg_SOURCE_PATH}"
+ BUILD_DIR "${arg_BUILD_DIR}"
+ TARGET "//${target}"
+ WHAT_TO_DISPLAY outputs
+ )
+ z_vcpkg_install_gn_get_target_type(target_type
+ SOURCE_PATH "${arg_SOURCE_PATH}"
+ BUILD_DIR "${arg_BUILD_DIR}"
+ TARGET "//${target}"
+ )
+
+ foreach(output IN LISTS outputs)
+ if(output MATCHES "^//")
+ # relative path (e.g. //out/Release/target.lib)
+ string(REGEX REPLACE "^//" "${arg_SOURCE_PATH}/" output "${output}")
+ elseif(output MATCHES "^/" AND CMAKE_HOST_WIN32)
+ # absolute path (e.g. /C:/path/to/target.lib)
+ string(REGEX REPLACE "^/" "" output "${output}")
+ endif()
+
+ if(NOT EXISTS "${output}")
+ message(WARNING "Output for target `${target}` doesn't exist: ${output}.")
+ continue()
+ endif()
+
+ if(target_type STREQUAL "executable")
+ file(INSTALL "${output}" DESTINATION "${arg_INSTALL_DIR}/tools")
+ elseif(output MATCHES "(\\.dll|\\.pdb)$")
+ file(INSTALL "${output}" DESTINATION "${arg_INSTALL_DIR}/bin")
+ else()
+ file(INSTALL "${output}" DESTINATION "${arg_INSTALL_DIR}/lib")
+ endif()
+ endforeach()
+ endforeach()
+endfunction()
+
+function(vcpkg_install_gn)
+ if(Z_VCPKG_GN_INSTALL_GUARD)
+ message(FATAL_ERROR "The ${PORT} port already depends on vcpkg-gn; using both vcpkg-gn and vcpkg_install_gn in the same port is unsupported.")
+ else()
+ message("${Z_VCPKG_BACKCOMPAT_MESSAGE_LEVEL}" "This function 'vcpkg_install_gn' is obsolete. Use 'vcpkg_gn_install' in port 'vcpkg-gn'.")
+ endif()
+
+ cmake_parse_arguments(PARSE_ARGV 0 arg "" "SOURCE_PATH" "TARGETS")
+ if(DEFINED arg_UNPARSED_ARGUMENTS)
+ message(WARNING "vcpkg_install_gn was passed extra arguments: ${arg_UNPARSED_ARGUMENTS}")
+ endif()
+ if(NOT DEFINED arg_SOURCE_PATH)
+ message(FATAL_ERROR "SOURCE_PATH must be specified.")
+ endif()
+
+ vcpkg_build_ninja(TARGETS ${arg_TARGETS})
+
+ vcpkg_find_acquire_program(GN)
+
+ if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "debug")
+ z_vcpkg_install_gn_install(
+ SOURCE_PATH "${arg_SOURCE_PATH}"
+ BUILD_DIR "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-dbg"
+ INSTALL_DIR "${CURRENT_PACKAGES_DIR}/debug"
+ TARGETS ${arg_TARGETS}
+ )
+ endif()
+
+ if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "release")
+ z_vcpkg_install_gn_install(
+ SOURCE_PATH "${arg_SOURCE_PATH}"
+ BUILD_DIR "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel"
+ INSTALL_DIR "${CURRENT_PACKAGES_DIR}"
+ TARGETS ${arg_TARGETS}
+ )
+ endif()
+endfunction()