diff options
| author | Ethan Morgan <ethan@gweithio.com> | 2026-02-14 16:44:06 +0000 |
|---|---|---|
| committer | Ethan Morgan <ethan@gweithio.com> | 2026-02-14 16:44:06 +0000 |
| commit | 54409423f767d8b1cf30cb7d0efca6b4ca138823 (patch) | |
| tree | d915ac7828703ce4b963efdd9728a1777ba18c1e /vcpkg/ports/vcpkg-gn | |
Diffstat (limited to 'vcpkg/ports/vcpkg-gn')
| -rw-r--r-- | vcpkg/ports/vcpkg-gn/portfile.cmake | 11 | ||||
| -rw-r--r-- | vcpkg/ports/vcpkg-gn/vcpkg-port-config.cmake | 2 | ||||
| -rw-r--r-- | vcpkg/ports/vcpkg-gn/vcpkg.json | 14 | ||||
| -rw-r--r-- | vcpkg/ports/vcpkg-gn/vcpkg_gn_configure.cmake | 48 | ||||
| -rw-r--r-- | vcpkg/ports/vcpkg-gn/vcpkg_gn_install.cmake | 115 |
5 files changed, 190 insertions, 0 deletions
diff --git a/vcpkg/ports/vcpkg-gn/portfile.cmake b/vcpkg/ports/vcpkg-gn/portfile.cmake new file mode 100644 index 0000000..2754054 --- /dev/null +++ b/vcpkg/ports/vcpkg-gn/portfile.cmake @@ -0,0 +1,11 @@ +set(VCPKG_POLICY_EMPTY_PACKAGE enabled)
+
+if(NOT TARGET_TRIPLET STREQUAL _HOST_TRIPLET)
+ message(FATAL_ERROR "vcpkg-gn is a host-only port; please mark it as a host port in your dependencies.")
+endif()
+
+file(INSTALL
+ "${CMAKE_CURRENT_LIST_DIR}/vcpkg-port-config.cmake"
+ "${CMAKE_CURRENT_LIST_DIR}/vcpkg_gn_configure.cmake"
+ "${CMAKE_CURRENT_LIST_DIR}/vcpkg_gn_install.cmake"
+ DESTINATION "${CURRENT_PACKAGES_DIR}/share/${PORT}")
diff --git a/vcpkg/ports/vcpkg-gn/vcpkg-port-config.cmake b/vcpkg/ports/vcpkg-gn/vcpkg-port-config.cmake new file mode 100644 index 0000000..b2eed1c --- /dev/null +++ b/vcpkg/ports/vcpkg-gn/vcpkg-port-config.cmake @@ -0,0 +1,2 @@ +include("${CMAKE_CURRENT_LIST_DIR}/vcpkg_gn_configure.cmake")
+include("${CMAKE_CURRENT_LIST_DIR}/vcpkg_gn_install.cmake")
diff --git a/vcpkg/ports/vcpkg-gn/vcpkg.json b/vcpkg/ports/vcpkg-gn/vcpkg.json new file mode 100644 index 0000000..cecf37c --- /dev/null +++ b/vcpkg/ports/vcpkg-gn/vcpkg.json @@ -0,0 +1,14 @@ +{ + "name": "vcpkg-gn", + "version-date": "2025-08-05", + "description": "GN is a meta-build system that generates build files for Ninja (GN is the build system for Chromium, Fuchsia, and related projects)", + "documentation": "https://gn.googlesource.com/gn/+/main/docs/reference.md", + "license": "MIT", + "supports": "native", + "dependencies": [ + { + "name": "vcpkg-tool-gn", + "host": true + } + ] +} diff --git a/vcpkg/ports/vcpkg-gn/vcpkg_gn_configure.cmake b/vcpkg/ports/vcpkg-gn/vcpkg_gn_configure.cmake new file mode 100644 index 0000000..fe497b8 --- /dev/null +++ b/vcpkg/ports/vcpkg-gn/vcpkg_gn_configure.cmake @@ -0,0 +1,48 @@ +include_guard(GLOBAL) + +function(z_vcpkg_gn_configure_generate) + cmake_parse_arguments(PARSE_ARGV 0 "arg" "" "SOURCE_PATH;CONFIG;ARGS" "") + if(DEFINED arg_UNPARSED_ARGUMENTS) + message(FATAL_ERROR "Internal error: generate was passed extra arguments: ${arg_UNPARSED_ARGUMENTS}") + endif() + + message(STATUS "Generating build (${arg_CONFIG})...") + vcpkg_execute_required_process( + COMMAND "${GN}" gen "${CURRENT_BUILDTREES_DIR}/${arg_CONFIG}" "${arg_ARGS}" + WORKING_DIRECTORY "${arg_SOURCE_PATH}" + LOGNAME "generate-${arg_CONFIG}" + ) +endfunction() + +function(vcpkg_gn_configure) + cmake_parse_arguments(PARSE_ARGV 0 "arg" "" "SOURCE_PATH;OPTIONS;OPTIONS_DEBUG;OPTIONS_RELEASE" "") + + if(DEFINED arg_UNPARSED_ARGUMENTS) + message(WARNING "vcpkg_gn_configure was passed extra arguments: ${arg_UNPARSED_ARGUMENTS}") + endif() + if(NOT DEFINED arg_SOURCE_PATH) + message(FATAL_ERROR "SOURCE_PATH must be specified.") + endif() + + vcpkg_find_acquire_program(PYTHON3) + get_filename_component(PYTHON3_DIR "${PYTHON3}" DIRECTORY) + vcpkg_add_to_path(PREPEND "${PYTHON3_DIR}") + + vcpkg_find_acquire_program(GN) + + if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "debug") + z_vcpkg_gn_configure_generate( + SOURCE_PATH "${arg_SOURCE_PATH}" + CONFIG "${TARGET_TRIPLET}-dbg" + ARGS "--args=${arg_OPTIONS} ${arg_OPTIONS_DEBUG}" + ) + endif() + + if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "release") + z_vcpkg_gn_configure_generate( + SOURCE_PATH "${arg_SOURCE_PATH}" + CONFIG "${TARGET_TRIPLET}-rel" + ARGS "--args=${arg_OPTIONS} ${arg_OPTIONS_RELEASE}" + ) + endif() +endfunction() diff --git a/vcpkg/ports/vcpkg-gn/vcpkg_gn_install.cmake b/vcpkg/ports/vcpkg-gn/vcpkg_gn_install.cmake new file mode 100644 index 0000000..e0447ee --- /dev/null +++ b/vcpkg/ports/vcpkg-gn/vcpkg_gn_install.cmake @@ -0,0 +1,115 @@ +include_guard(GLOBAL) + +function(z_vcpkg_gn_install_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_gn_install_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_gn_install_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_gn_install_get_desc(outputs + SOURCE_PATH "${arg_SOURCE_PATH}" + BUILD_DIR "${arg_BUILD_DIR}" + TARGET "//${target}" + WHAT_TO_DISPLAY outputs + ) + z_vcpkg_gn_install_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_gn_install) + cmake_parse_arguments(PARSE_ARGV 0 arg "" "SOURCE_PATH" "TARGETS") + + if(DEFINED arg_UNPARSED_ARGUMENTS) + message(WARNING "vcpkg_gn_install 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_gn_install_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_gn_install_install( + SOURCE_PATH "${arg_SOURCE_PATH}" + BUILD_DIR "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel" + INSTALL_DIR "${CURRENT_PACKAGES_DIR}" + TARGETS ${arg_TARGETS} + ) + endif() +endfunction() |