aboutsummaryrefslogtreecommitdiff
path: root/vcpkg/ports/vcpkg-gn
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/ports/vcpkg-gn
move to own git serverHEADmaster
Diffstat (limited to 'vcpkg/ports/vcpkg-gn')
-rw-r--r--vcpkg/ports/vcpkg-gn/portfile.cmake11
-rw-r--r--vcpkg/ports/vcpkg-gn/vcpkg-port-config.cmake2
-rw-r--r--vcpkg/ports/vcpkg-gn/vcpkg.json14
-rw-r--r--vcpkg/ports/vcpkg-gn/vcpkg_gn_configure.cmake48
-rw-r--r--vcpkg/ports/vcpkg-gn/vcpkg_gn_install.cmake115
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()