aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Vejdarski <extrulm@gmail.com>2020-05-12 04:58:12 +0700
committerGitHub <noreply@github.com>2020-05-11 14:58:12 -0700
commit6d5a1a897eca21b956d7b1de71af9a1f25c08e33 (patch)
tree1e0a84af5b291e56e0d50c85567833581ecba609
parent06c647e11a21dd4c193e63968e1d3f9024e05996 (diff)
downloadvcpkg-6d5a1a897eca21b956d7b1de71af9a1f25c08e33.tar.gz
vcpkg-6d5a1a897eca21b956d7b1de71af9a1f25c08e33.zip
[gn, crashpad] Add GN build support and crashpad port (#10505)
* [vcpkg_find_acquire_program] Add gn * [GN] Add build system support * [crashpad] Add new port
-rw-r--r--docs/maintainers/portfile-functions.md10
-rw-r--r--docs/maintainers/vcpkg_build_gn.md17
-rw-r--r--docs/maintainers/vcpkg_build_ninja.md17
-rw-r--r--docs/maintainers/vcpkg_configure_gn.md30
-rw-r--r--docs/maintainers/vcpkg_find_acquire_program.md1
-rw-r--r--docs/maintainers/vcpkg_install_gn.md23
-rw-r--r--ports/crashpad/CONTROL7
-rw-r--r--ports/crashpad/crashpadConfig.cmake.in31
-rw-r--r--ports/crashpad/portfile.cmake129
-rw-r--r--ports/crashpad/zlib.gn15
-rw-r--r--scripts/ci.baseline.txt5
-rw-r--r--scripts/cmake/vcpkg_build_gn.cmake18
-rw-r--r--scripts/cmake/vcpkg_build_ninja.cmake37
-rw-r--r--scripts/cmake/vcpkg_common_functions.cmake4
-rw-r--r--scripts/cmake/vcpkg_configure_gn.cmake58
-rw-r--r--scripts/cmake/vcpkg_find_acquire_program.cmake24
-rw-r--r--scripts/cmake/vcpkg_install_gn.cmake91
17 files changed, 514 insertions, 3 deletions
diff --git a/docs/maintainers/portfile-functions.md b/docs/maintainers/portfile-functions.md
index 4cd42a685..591516466 100644
--- a/docs/maintainers/portfile-functions.md
+++ b/docs/maintainers/portfile-functions.md
@@ -1,13 +1,15 @@
-<!-- Run regenerate.ps1 to extract documentation from scripts\cmake\*.cmake -->
-
+<!-- Run regenerate.ps1 to extract documentation from scripts\cmake\*.cmake -->
+
# Portfile helper functions
- [execute\_process](execute_process.md)
- [vcpkg\_acquire\_msys](vcpkg_acquire_msys.md)
- [vcpkg\_add\_to\_path](vcpkg_add_to_path.md)
- [vcpkg\_apply\_patches](vcpkg_apply_patches.md)
- [vcpkg\_build\_cmake](vcpkg_build_cmake.md)
+- [vcpkg\_build\_gn](vcpkg_build_gn.md)
- [vcpkg\_build\_make](vcpkg_build_make.md)
- [vcpkg\_build\_msbuild](vcpkg_build_msbuild.md)
+- [vcpkg\_build\_ninja](vcpkg_build_ninja.md)
- [vcpkg\_build\_nmake](vcpkg_build_nmake.md)
- [vcpkg\_check\_features](vcpkg_check_features.md)
- [vcpkg\_check\_linkage](vcpkg_check_linkage.md)
@@ -15,11 +17,12 @@
- [vcpkg\_clean\_msbuild](vcpkg_clean_msbuild.md)
- [vcpkg\_common\_definitions](vcpkg_common_definitions.md)
- [vcpkg\_configure\_cmake](vcpkg_configure_cmake.md)
+- [vcpkg\_configure\_gn](vcpkg_configure_gn.md)
- [vcpkg\_configure\_make](vcpkg_configure_make.md)
- [vcpkg\_configure\_meson](vcpkg_configure_meson.md)
- [vcpkg\_copy\_pdbs](vcpkg_copy_pdbs.md)
-- [vcpkg\_copy\_tools](vcpkg_copy_tools.md)
- [vcpkg\_copy\_tool\_dependencies](vcpkg_copy_tool_dependencies.md)
+- [vcpkg\_copy\_tools](vcpkg_copy_tools.md)
- [vcpkg\_download\_distfile](vcpkg_download_distfile.md)
- [vcpkg\_execute\_build\_process](vcpkg_execute_build_process.md)
- [vcpkg\_execute\_required\_process](vcpkg_execute_required_process.md)
@@ -33,6 +36,7 @@
- [vcpkg\_from\_github](vcpkg_from_github.md)
- [vcpkg\_from\_gitlab](vcpkg_from_gitlab.md)
- [vcpkg\_install\_cmake](vcpkg_install_cmake.md)
+- [vcpkg\_install\_gn](vcpkg_install_gn.md)
- [vcpkg\_install\_make](vcpkg_install_make.md)
- [vcpkg\_install\_meson](vcpkg_install_meson.md)
- [vcpkg\_install\_msbuild](vcpkg_install_msbuild.md)
diff --git a/docs/maintainers/vcpkg_build_gn.md b/docs/maintainers/vcpkg_build_gn.md
new file mode 100644
index 000000000..3c3407d92
--- /dev/null
+++ b/docs/maintainers/vcpkg_build_gn.md
@@ -0,0 +1,17 @@
+# vcpkg_build_gn
+
+Build a GN project
+
+## Usage:
+```cmake
+vcpkg_build_gn(
+ [TARGETS <target>...]
+)
+```
+
+## Parameters:
+### TARGETS
+Only build the specified targets.
+
+## Source
+[scripts/cmake/vcpkg_build_gn.cmake](https://github.com/Microsoft/vcpkg/blob/master/scripts/cmake/vcpkg_build_gn.cmake)
diff --git a/docs/maintainers/vcpkg_build_ninja.md b/docs/maintainers/vcpkg_build_ninja.md
new file mode 100644
index 000000000..56a1b6050
--- /dev/null
+++ b/docs/maintainers/vcpkg_build_ninja.md
@@ -0,0 +1,17 @@
+# vcpkg_build_ninja
+
+Build a ninja project
+
+## Usage:
+```cmake
+vcpkg_build_ninja(
+ [TARGETS <target>...]
+)
+```
+
+## Parameters:
+### TARGETS
+Only build the specified targets.
+
+## Source
+[scripts/cmake/vcpkg_build_ninja.cmake](https://github.com/Microsoft/vcpkg/blob/master/scripts/cmake/vcpkg_build_ninja.cmake)
diff --git a/docs/maintainers/vcpkg_configure_gn.md b/docs/maintainers/vcpkg_configure_gn.md
new file mode 100644
index 000000000..7d98ac9a9
--- /dev/null
+++ b/docs/maintainers/vcpkg_configure_gn.md
@@ -0,0 +1,30 @@
+# vcpkg_configure_gn
+
+Generate Ninja (GN) targets
+
+## Usage:
+```cmake
+vcpkg_configure_gn(
+ SOURCE_PATH <SOURCE_PATH>
+ [OPTIONS <OPTIONS>]
+ [OPTIONS_DEBUG <OPTIONS_DEBUG>]
+ [OPTIONS_RELEASE <OPTIONS_RELEASE>]
+)
+```
+
+## Parameters:
+### SOURCE_PATH (required)
+The path to the GN project.
+
+### OPTIONS
+Options to be passed to both the debug and release targets.
+Note: Must be provided as a space-separated string.
+
+### OPTIONS_DEBUG (space-separated string)
+Options to be passed to the debug target.
+
+### OPTIONS_RELEASE (space-separated string)
+Options to be passed to the release target.
+
+## Source
+[scripts/cmake/vcpkg_configure_gn.cmake](https://github.com/Microsoft/vcpkg/blob/master/scripts/cmake/vcpkg_configure_gn.cmake)
diff --git a/docs/maintainers/vcpkg_find_acquire_program.md b/docs/maintainers/vcpkg_find_acquire_program.md
index 83e01ce00..461d13822 100644
--- a/docs/maintainers/vcpkg_find_acquire_program.md
+++ b/docs/maintainers/vcpkg_find_acquire_program.md
@@ -25,6 +25,7 @@ The current list of programs includes:
- PYTHON2
- PYTHON3
- GIT
+- GN
- GO
- JOM
- MESON
diff --git a/docs/maintainers/vcpkg_install_gn.md b/docs/maintainers/vcpkg_install_gn.md
new file mode 100644
index 000000000..a1d4156c7
--- /dev/null
+++ b/docs/maintainers/vcpkg_install_gn.md
@@ -0,0 +1,23 @@
+# vcpkg_install_gn
+
+Installs a GN project
+
+## Usage:
+```cmake
+vcpkg_install_gn(
+ SOURCE_PATH <SOURCE_PATH>
+ [TARGETS <target>...]
+)
+```
+
+## Parameters:
+### SOURCE_PATH
+The path to the source directory
+
+### TARGETS
+Only install the specified targets.
+
+Note: includes must be handled separately
+
+## Source
+[scripts/cmake/vcpkg_install_gn.cmake](https://github.com/Microsoft/vcpkg/blob/master/scripts/cmake/vcpkg_install_gn.cmake)
diff --git a/ports/crashpad/CONTROL b/ports/crashpad/CONTROL
new file mode 100644
index 000000000..dab2671f6
--- /dev/null
+++ b/ports/crashpad/CONTROL
@@ -0,0 +1,7 @@
+Source: crashpad
+Version: 2020-03-18
+Homepage: https://chromium.googlesource.com/crashpad/crashpad/+/master/README.md
+Description: Crashpad is a crash-reporting system.
+ Crashpad is a library for capturing, storing and transmitting postmortem crash reports from a client to an upstream collection server. Crashpad aims to make it possible for clients to capture process state at the time of crash with the best possible fidelity and coverage, with the minimum of fuss.
+Build-Depends: zlib
+Supports: x64 & (osx|windows)
diff --git a/ports/crashpad/crashpadConfig.cmake.in b/ports/crashpad/crashpadConfig.cmake.in
new file mode 100644
index 000000000..1c95bf1b7
--- /dev/null
+++ b/ports/crashpad/crashpadConfig.cmake.in
@@ -0,0 +1,31 @@
+# Compute the installation prefix relative to this file.
+get_filename_component(_IMPORT_PREFIX "${CMAKE_CURRENT_LIST_FILE}" PATH)
+get_filename_component(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH)
+get_filename_component(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH)
+if(_IMPORT_PREFIX STREQUAL "/")
+ set(_IMPORT_PREFIX "")
+endif()
+
+add_library(crashpad INTERFACE)
+add_library(crashpad::crashpad ALIAS crashpad)
+
+set(CRASHPAD_LIBRARIES client util base)
+
+if(WIN32)
+ target_compile_definitions(crashpad INTERFACE NOMINMAX)
+elseif(APPLE)
+ list(APPEND CRASHPAD_LIBRARIES ApplicationServices
+ CoreFoundation Foundation IOKit Security bsm)
+endif()
+
+foreach(LIB_NAME ${CRASHPAD_LIBRARIES})
+ find_library(_LIB ${LIB_NAME})
+ target_link_libraries(crashpad INTERFACE ${_LIB})
+ unset(_LIB CACHE)
+endforeach()
+
+find_package(ZLIB REQUIRED)
+target_link_libraries(crashpad INTERFACE ZLIB::ZLIB)
+
+target_include_directories(crashpad
+ INTERFACE ${_IMPORT_PREFIX}/include/crashpad)
diff --git a/ports/crashpad/portfile.cmake b/ports/crashpad/portfile.cmake
new file mode 100644
index 000000000..30026d5c1
--- /dev/null
+++ b/ports/crashpad/portfile.cmake
@@ -0,0 +1,129 @@
+vcpkg_fail_port_install(
+ ON_ARCH "x86" "arm" "arm64"
+ ON_TARGET "UWP" "LINUX")
+
+vcpkg_check_linkage(ONLY_STATIC_LIBRARY)
+
+vcpkg_from_git(
+ OUT_SOURCE_PATH SOURCE_PATH
+ URL https://chromium.googlesource.com/crashpad/crashpad
+ REF 9a31d3f8e9815774026a753a1ff6155347cd549f
+)
+
+function(checkout_in_path PATH URL REF)
+ if(EXISTS "${PATH}")
+ return()
+ endif()
+
+ vcpkg_from_git(
+ OUT_SOURCE_PATH DEP_SOURCE_PATH
+ URL "${URL}"
+ REF "${REF}"
+ )
+ file(RENAME "${DEP_SOURCE_PATH}" "${PATH}")
+ file(REMOVE_RECURSE "${DEP_SOURCE_PATH}")
+endfunction()
+
+# mini_chromium contains the toolchains and build configuration
+checkout_in_path(
+ "${SOURCE_PATH}/third_party/mini_chromium/mini_chromium"
+ "https://chromium.googlesource.com/chromium/mini_chromium"
+ "c426ff98e1d9e9d59777fe8b883a5c0ceeca9ca3"
+)
+
+function(replace_gn_dependency INPUT_FILE OUTPUT_FILE LIBRARY_NAMES)
+ unset(_LIBRARY_DEB CACHE)
+ find_library(_LIBRARY_DEB NAMES ${LIBRARY_NAMES}
+ PATHS "${CURRENT_INSTALLED_DIR}/debug/lib"
+ NO_DEFAULT_PATH)
+
+ if(_LIBRARY_DEB MATCHES "-NOTFOUND")
+ message(FATAL_ERROR "Could not find debug library with names: ${LIBRARY_NAMES}")
+ endif()
+
+ unset(_LIBRARY_REL CACHE)
+ find_library(_LIBRARY_REL NAMES ${LIBRARY_NAMES}
+ PATHS "${CURRENT_INSTALLED_DIR}/lib"
+ NO_DEFAULT_PATH)
+
+ if(_LIBRARY_REL MATCHES "-NOTFOUND")
+ message(FATAL_ERROR "Could not find library with names: ${LIBRARY_NAMES}")
+ endif()
+
+ set(_INCLUDE_DIR "${CURRENT_INSTALLED_DIR}/include")
+
+ file(REMOVE "${OUTPUT_FILE}")
+ configure_file("${INPUT_FILE}" "${OUTPUT_FILE}" @ONLY)
+endfunction()
+
+replace_gn_dependency(
+ "${CMAKE_CURRENT_LIST_DIR}/zlib.gn"
+ "${SOURCE_PATH}/third_party/zlib/BUILD.gn"
+ "z;zlib;zlibd"
+)
+
+set(OPTIONS_DBG "is_debug=true")
+set(OPTIONS_REL "")
+
+if(CMAKE_HOST_WIN32)
+ # Load toolchains
+ if(NOT VCPKG_CHAINLOAD_TOOLCHAIN_FILE)
+ set(VCPKG_CHAINLOAD_TOOLCHAIN_FILE "${SCRIPTS}/toolchains/windows.cmake")
+ endif()
+ include("${VCPKG_CHAINLOAD_TOOLCHAIN_FILE}")
+
+ foreach(_VAR CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS
+ CMAKE_C_FLAGS_RELEASE CMAKE_CXX_FLAGS_RELEASE)
+ string(STRIP "${${_VAR}}" ${_VAR})
+ endforeach()
+
+ set(OPTIONS_DBG "${OPTIONS_DBG} \
+ extra_cflags_c=\"${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_DEBUG}\" \
+ extra_cflags_cc=\"${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_DEBUG}\"")
+
+ set(OPTIONS_REL "${OPTIONS_REL} \
+ extra_cflags_c=\"${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_RELEASE}\" \
+ extra_cflags_cc=\"${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_RELEASE}\"")
+
+ set(DISABLE_WHOLE_PROGRAM_OPTIMIZATION "\
+ extra_cflags=\"/GL-\" \
+ extra_ldflags=\"/LTCG:OFF\" \
+ extra_arflags=\"/LTCG:OFF\"")
+
+ set(OPTIONS_DBG "${OPTIONS_DBG} ${DISABLE_WHOLE_PROGRAM_OPTIMIZATION}")
+ set(OPTIONS_REL "${OPTIONS_REL} ${DISABLE_WHOLE_PROGRAM_OPTIMIZATION}")
+endif()
+
+vcpkg_configure_gn(
+ SOURCE_PATH "${SOURCE_PATH}"
+ OPTIONS_DEBUG "${OPTIONS_DBG}"
+ OPTIONS_RELEASE "${OPTIONS_REL}"
+)
+
+vcpkg_install_gn(
+ SOURCE_PATH "${SOURCE_PATH}"
+ TARGETS client util third_party/mini_chromium/mini_chromium/base handler:crashpad_handler
+)
+
+message(STATUS "Installing headers...")
+set(PACKAGES_INCLUDE_DIR "${CURRENT_PACKAGES_DIR}/include/${PORT}")
+function(install_headers DIR)
+ file(COPY "${DIR}" DESTINATION "${PACKAGES_INCLUDE_DIR}" FILES_MATCHING PATTERN "*.h")
+endfunction()
+install_headers("${SOURCE_PATH}/client")
+install_headers("${SOURCE_PATH}/util")
+install_headers("${SOURCE_PATH}/third_party/mini_chromium/mini_chromium/base")
+install_headers("${SOURCE_PATH}/third_party/mini_chromium/mini_chromium/build")
+
+# remove empty directories
+file(REMOVE_RECURSE
+ "${PACKAGES_INCLUDE_DIR}/util/net/testdata"
+ "${PACKAGES_INCLUDE_DIR}/build/ios")
+
+configure_file("${CMAKE_CURRENT_LIST_DIR}/crashpadConfig.cmake.in"
+ "${CURRENT_PACKAGES_DIR}/share/${PORT}/crashpadConfig.cmake" @ONLY)
+
+vcpkg_copy_pdbs()
+file(INSTALL "${SOURCE_PATH}/LICENSE"
+ DESTINATION "${CURRENT_PACKAGES_DIR}/share/${PORT}"
+ RENAME copyright)
diff --git a/ports/crashpad/zlib.gn b/ports/crashpad/zlib.gn
new file mode 100644
index 000000000..5b551a30a
--- /dev/null
+++ b/ports/crashpad/zlib.gn
@@ -0,0 +1,15 @@
+import("../../build/crashpad_buildconfig.gni")
+
+config("zlib_config") {
+ defines = [ "CRASHPAD_ZLIB_SOURCE_EXTERNAL" ]
+ include_dirs = [ "@_INCLUDE_DIR@" ]
+}
+
+source_set("zlib") {
+ public_configs = [ ":zlib_config" ]
+ if(is_debug) {
+ libs = [ "@_LIBRARY_DEB@" ]
+ } else {
+ libs = [ "@_LIBRARY_REL@" ]
+ }
+} \ No newline at end of file
diff --git a/scripts/ci.baseline.txt b/scripts/ci.baseline.txt
index c2f1680ca..77f023e26 100644
--- a/scripts/ci.baseline.txt
+++ b/scripts/ci.baseline.txt
@@ -294,6 +294,11 @@ cppunit:x64-osx=fail
cppunit:x64-uwp=fail
cpr:x64-linux=ignore
cpuinfo:arm64-windows=ignore
+crashpad:arm64-windows=fail
+crashpad:arm-uwp=fail
+crashpad:x64-linux=fail
+crashpad:x64-uwp=fail
+crashpad:x86-windows=fail
crfsuite:arm-uwp=fail
crfsuite:x64-uwp=fail
crossguid:x64-osx=fail
diff --git a/scripts/cmake/vcpkg_build_gn.cmake b/scripts/cmake/vcpkg_build_gn.cmake
new file mode 100644
index 000000000..cf0ea89cf
--- /dev/null
+++ b/scripts/cmake/vcpkg_build_gn.cmake
@@ -0,0 +1,18 @@
+## # vcpkg_build_gn
+##
+## Build a GN project
+##
+## ## Usage:
+## ```cmake
+## vcpkg_build_gn(
+## [TARGETS <target>...]
+## )
+## ```
+##
+## ## Parameters:
+## ### TARGETS
+## Only build the specified targets.
+
+function(vcpkg_build_gn)
+ vcpkg_build_ninja(${ARGN})
+endfunction() \ No newline at end of file
diff --git a/scripts/cmake/vcpkg_build_ninja.cmake b/scripts/cmake/vcpkg_build_ninja.cmake
new file mode 100644
index 000000000..3eb05c98b
--- /dev/null
+++ b/scripts/cmake/vcpkg_build_ninja.cmake
@@ -0,0 +1,37 @@
+## # vcpkg_build_ninja
+##
+## Build a ninja project
+##
+## ## Usage:
+## ```cmake
+## vcpkg_build_ninja(
+## [TARGETS <target>...]
+## )
+## ```
+##
+## ## Parameters:
+## ### TARGETS
+## Only build the specified targets.
+
+function(vcpkg_build_ninja)
+ cmake_parse_arguments(_vbn "" "" "TARGETS" ${ARGN})
+
+ vcpkg_find_acquire_program(NINJA)
+
+ function(build CONFIG)
+ message(STATUS "Building (${CONFIG})...")
+ vcpkg_execute_build_process(
+ COMMAND "${NINJA}" -C "${CURRENT_BUILDTREES_DIR}/${CONFIG}" ${_vbn_TARGETS}
+ WORKING_DIRECTORY "${SOURCE_PATH}"
+ LOGNAME build-${CONFIG}
+ )
+ endfunction()
+
+ if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "debug")
+ build(${TARGET_TRIPLET}-dbg)
+ endif()
+
+ if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "release")
+ build(${TARGET_TRIPLET}-rel)
+ endif()
+endfunction() \ No newline at end of file
diff --git a/scripts/cmake/vcpkg_common_functions.cmake b/scripts/cmake/vcpkg_common_functions.cmake
index 0475a5e31..7724a3f7f 100644
--- a/scripts/cmake/vcpkg_common_functions.cmake
+++ b/scripts/cmake/vcpkg_common_functions.cmake
@@ -19,17 +19,21 @@ include(vcpkg_from_github)
include(vcpkg_from_gitlab)
include(vcpkg_from_bitbucket)
include(vcpkg_build_cmake)
+include(vcpkg_build_gn)
include(vcpkg_build_msbuild)
include(vcpkg_build_qmake)
include(vcpkg_build_make)
+include(vcpkg_build_ninja)
include(vcpkg_build_nmake)
include(vcpkg_install_cmake)
+include(vcpkg_install_gn)
include(vcpkg_install_meson)
include(vcpkg_install_msbuild)
include(vcpkg_install_make)
include(vcpkg_install_nmake)
include(vcpkg_install_qmake)
include(vcpkg_configure_cmake)
+include(vcpkg_configure_gn)
include(vcpkg_configure_meson)
include(vcpkg_configure_qmake)
include(vcpkg_configure_make)
diff --git a/scripts/cmake/vcpkg_configure_gn.cmake b/scripts/cmake/vcpkg_configure_gn.cmake
new file mode 100644
index 000000000..3ae14b8be
--- /dev/null
+++ b/scripts/cmake/vcpkg_configure_gn.cmake
@@ -0,0 +1,58 @@
+## # vcpkg_configure_gn
+##
+## Generate Ninja (GN) targets
+##
+## ## Usage:
+## ```cmake
+## vcpkg_configure_gn(
+## SOURCE_PATH <SOURCE_PATH>
+## [OPTIONS <OPTIONS>]
+## [OPTIONS_DEBUG <OPTIONS_DEBUG>]
+## [OPTIONS_RELEASE <OPTIONS_RELEASE>]
+## )
+## ```
+##
+## ## Parameters:
+## ### SOURCE_PATH (required)
+## The path to the GN project.
+##
+## ### OPTIONS
+## Options to be passed to both the debug and release targets.
+## Note: Must be provided as a space-separated string.
+##
+## ### OPTIONS_DEBUG (space-separated string)
+## Options to be passed to the debug target.
+##
+## ### OPTIONS_RELEASE (space-separated string)
+## Options to be passed to the release target.
+
+function(vcpkg_configure_gn)
+ cmake_parse_arguments(_vcg "" "SOURCE_PATH;OPTIONS;OPTIONS_DEBUG;OPTIONS_RELEASE" "" ${ARGN})
+
+ if(NOT DEFINED _vcg_SOURCE_PATH)
+ message(FATAL_ERROR "SOURCE_PATH must be specified.")
+ endif()
+
+ vcpkg_find_acquire_program(PYTHON2)
+ get_filename_component(PYTHON2_DIR "${PYTHON2}" DIRECTORY)
+ vcpkg_add_to_path(PREPEND "${PYTHON2_DIR}")
+
+ vcpkg_find_acquire_program(GN)
+
+ function(generate CONFIG ARGS)
+ message(STATUS "Generating build (${CONFIG})...")
+ vcpkg_execute_required_process(
+ COMMAND "${GN}" gen "${CURRENT_BUILDTREES_DIR}/${CONFIG}" "${ARGS}"
+ WORKING_DIRECTORY "${SOURCE_PATH}"
+ LOGNAME generate-${CONFIG}
+ )
+ endfunction()
+
+ if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "debug")
+ generate(${TARGET_TRIPLET}-dbg "--args=${_vcg_OPTIONS} ${_vcg_OPTIONS_DEBUG}")
+ endif()
+
+ if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "release")
+ generate(${TARGET_TRIPLET}-rel "--args=${_vcg_OPTIONS} ${_vcg_OPTIONS_RELEASE}")
+ endif()
+endfunction() \ No newline at end of file
diff --git a/scripts/cmake/vcpkg_find_acquire_program.cmake b/scripts/cmake/vcpkg_find_acquire_program.cmake
index 5aa1cf440..cd5277be9 100644
--- a/scripts/cmake/vcpkg_find_acquire_program.cmake
+++ b/scripts/cmake/vcpkg_find_acquire_program.cmake
@@ -25,6 +25,7 @@
## - PYTHON2
## - PYTHON3
## - GIT
+## - GN
## - GO
## - JOM
## - MESON
@@ -101,6 +102,29 @@ function(vcpkg_find_acquire_program VAR)
set(BREW_PACKAGE_NAME "git")
set(APT_PACKAGE_NAME "git")
endif()
+ elseif(VAR MATCHES "GN")
+ set(PROGNAME gn)
+ set(_vfa_RENAME "gn")
+ set(CIPD_DOWNLOAD_GN "https://chrome-infra-packages.appspot.com/dl/gn/gn")
+ if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Linux")
+ set(_vfa_SUPPORTED ON)
+ set(GN_VERSION "xus7xtaPhpv5vCmKFOnsBVoB-PKmhZvRsSTjbQAuF0MC")
+ set(GN_PLATFORM "linux-amd64")
+ set(HASH "871e75d7f3597b74fb99e36bb41fe5a9f8ce8a4d9f167f4729fc6e444807a59f35ec8aca70c2274a99c79d70a1108272be1ad991678a8ceb39e30f77abb13135")
+ elseif(CMAKE_HOST_SYSTEM_NAME STREQUAL "Darwin")
+ set(_vfa_SUPPORTED ON)
+ set(GN_VERSION "qhxILDNcJ2H44HfHmfiU-XIY3E_SIXvFqLd2wvbIgOoC")
+ set(GN_PLATFORM "mac-amd64")
+ set(HASH "03ee64cb15bae7fceb412900d470601090bce147cfd45eb9b46683ac1a5dca848465a5d74c55a47df7f0e334d708151249a6d37bb021de74dd48b97ed4a07937")
+ else()
+ set(GN_VERSION "qUkAhy9J0P7c5racy-9wB6AHNK_btS18im8S06_ehhwC")
+ set(GN_PLATFORM "windows-amd64")
+ set(HASH "263e02bd79eee0cb7b664831b7898565c5656a046328d8f187ef7ae2a4d766991d477b190c9b425fcc960ab76f381cd3e396afb85cba7408ca9e74eb32c175db")
+ endif()
+ set(SUBDIR "${GN_VERSION}")
+ set(PATHS "${DOWNLOADS}/tools/gn/${SUBDIR}")
+ set(URL "${CIPD_DOWNLOAD_GN}/${GN_PLATFORM}/+/${GN_VERSION}")
+ set(ARCHIVE "gn-${GN_PLATFORM}.zip")
elseif(VAR MATCHES "GO")
set(PROGNAME go)
set(PATHS ${DOWNLOADS}/tools/go/go/bin)
diff --git a/scripts/cmake/vcpkg_install_gn.cmake b/scripts/cmake/vcpkg_install_gn.cmake
new file mode 100644
index 000000000..33c2b7301
--- /dev/null
+++ b/scripts/cmake/vcpkg_install_gn.cmake
@@ -0,0 +1,91 @@
+## # vcpkg_install_gn
+##
+## Installs a GN project
+##
+## ## Usage:
+## ```cmake
+## vcpkg_install_gn(
+## SOURCE_PATH <SOURCE_PATH>
+## [TARGETS <target>...]
+## )
+## ```
+##
+## ## Parameters:
+## ### SOURCE_PATH
+## The path to the source directory
+##
+## ### TARGETS
+## Only install the specified targets.
+##
+## Note: includes must be handled separately
+
+function(vcpkg_install_gn)
+ cmake_parse_arguments(_vig "" "SOURCE_PATH" "TARGETS" ${ARGN})
+
+ if(NOT DEFINED _vig_SOURCE_PATH)
+ message(FATAL_ERROR "SOURCE_PATH must be specified.")
+ endif()
+
+ vcpkg_build_ninja(TARGETS ${_vig_TARGETS})
+
+ vcpkg_find_acquire_program(GN)
+
+ function(gn_get_target_type OUT_VAR BUILD_DIR TARGET)
+ execute_process(
+ COMMAND ${GN} desc "${BUILD_DIR}" "${TARGET}"
+ WORKING_DIRECTORY "${_vig_SOURCE_PATH}"
+ OUTPUT_VARIABLE OUTPUT_
+ OUTPUT_STRIP_TRAILING_WHITESPACE
+ )
+ string(REGEX MATCH "type: ([A-Za-z0-9_]+)" OUTPUT_ "${OUTPUT_}")
+ set(${OUT_VAR} ${CMAKE_MATCH_1} PARENT_SCOPE)
+ endfunction()
+
+ function(gn_desc OUT_VAR BUILD_DIR TARGET WHAT_TO_DISPLAY)
+ execute_process(
+ COMMAND ${GN} desc "${BUILD_DIR}" "${TARGET}" "${WHAT_TO_DISPLAY}"
+ WORKING_DIRECTORY "${_vig_SOURCE_PATH}"
+ OUTPUT_VARIABLE OUTPUT_
+ OUTPUT_STRIP_TRAILING_WHITESPACE
+ )
+ string(REGEX REPLACE "\n|(\r\n)" ";" OUTPUT_ "${OUTPUT_}")
+ set(${OUT_VAR} ${OUTPUT_} PARENT_SCOPE)
+ endfunction()
+
+ function(install_ BUILD_DIR INSTALL_DIR)
+ if(_vig_TARGETS)
+ foreach(TARGET ${_vig_TARGETS})
+ # GN targets must start with a //
+ gn_desc(OUTPUTS "${BUILD_DIR}" "//${TARGET}" outputs)
+ gn_get_target_type(TARGET_TYPE "${BUILD_DIR}" "//${TARGET}")
+ foreach(OUTPUT ${OUTPUTS})
+ if(NOT EXISTS "${OUTPUT}")
+ if(OUTPUT MATCHES "^//")
+ # relative path (e.g. //out/Release/target.lib)
+ string(REGEX REPLACE "^//" "${_vig_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()
+ endif()
+ if(TARGET_TYPE STREQUAL "executable")
+ file(INSTALL "${OUTPUT}" DESTINATION "${INSTALL_DIR}/tools")
+ elseif("${OUTPUT}" MATCHES "(\\.dll|\\.pdb)$")
+ file(INSTALL "${OUTPUT}" DESTINATION "${INSTALL_DIR}/bin")
+ else()
+ file(INSTALL "${OUTPUT}" DESTINATION "${INSTALL_DIR}/lib")
+ endif()
+ endforeach()
+ endforeach()
+ endif()
+ endfunction()
+
+ if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "debug")
+ install_("${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-dbg" "${CURRENT_PACKAGES_DIR}/debug")
+ endif()
+
+ if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "release")
+ install_("${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel" "${CURRENT_PACKAGES_DIR}")
+ endif()
+
+endfunction() \ No newline at end of file