diff --git a/docs/maintainers/portfile-functions.md b/docs/maintainers/portfile-functions.md index dd97511c0a3..1c24f8e98c9 100644 --- a/docs/maintainers/portfile-functions.md +++ b/docs/maintainers/portfile-functions.md @@ -19,7 +19,7 @@ - [vcpkg\_clean\_msbuild](vcpkg_clean_msbuild.md) - [vcpkg\_common\_definitions](vcpkg_common_definitions.md) - [vcpkg\_configure\_cmake](vcpkg_configure_cmake.md) (deprecated, use [vcpkg\_cmake\_configure](ports/vcpkg-cmake/vcpkg_cmake_configure.md)) -- [vcpkg\_configure\_gn](vcpkg_configure_gn.md) +- [vcpkg\_configure\_gn](vcpkg_configure_gn.md) (deprecated, use [vcpkg\_gn\_configure](ports/vcpkg-gn/vcpkg_gn_configure.md)) - [vcpkg\_configure\_make](vcpkg_configure_make.md) - [vcpkg\_configure\_meson](vcpkg_configure_meson.md) - [vcpkg\_configure\_qmake](vcpkg_configure_qmake.md) @@ -47,7 +47,7 @@ - [vcpkg\_get\_windows\_sdk](vcpkg_get_windows_sdk.md) - [vcpkg\_host\_path\_list](vcpkg_host_path_list.md) - [vcpkg\_install\_cmake](vcpkg_install_cmake.md) (deprecated, use [vcpkg\_cmake\_install](ports/vcpkg-cmake/vcpkg_cmake_install.md)) -- [vcpkg\_install\_gn](vcpkg_install_gn.md) +- [vcpkg\_install\_gn](vcpkg_install_gn.md) (deprecated, use [vcpkg\_gn\_install](ports/vcpkg-gn/vcpkg_gn_install.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_configure_gn.md b/docs/maintainers/vcpkg_configure_gn.md index c196f733011..cb300327c27 100644 --- a/docs/maintainers/vcpkg_configure_gn.md +++ b/docs/maintainers/vcpkg_configure_gn.md @@ -1,5 +1,7 @@ # vcpkg_configure_gn +**This function has been deprecated in favor of [`vcpkg_gn_configure`](ports/vcpkg-gn/vcpkg_gn_configure.md) from the vcpkg-gn port.** + The latest version of this document lives in the [vcpkg repo](https://github.com/Microsoft/vcpkg/blob/master/docs/maintainers/vcpkg_configure_gn.md). Generate Ninja (GN) targets diff --git a/docs/maintainers/vcpkg_install_gn.md b/docs/maintainers/vcpkg_install_gn.md index a0134b4a153..ebc166ad252 100644 --- a/docs/maintainers/vcpkg_install_gn.md +++ b/docs/maintainers/vcpkg_install_gn.md @@ -1,5 +1,7 @@ # vcpkg_install_gn +**This function has been deprecated in favor of [`vcpkg_gn_install`](ports/vcpkg-gn/vcpkg_gn_install.md) from the vcpkg-gn port.** + The latest version of this document lives in the [vcpkg repo](https://github.com/Microsoft/vcpkg/blob/master/docs/maintainers/vcpkg_install_gn.md). Installs a GN project. diff --git a/ports/vcpkg-gn/portfile.cmake b/ports/vcpkg-gn/portfile.cmake new file mode 100644 index 00000000000..721f8ff075c --- /dev/null +++ b/ports/vcpkg-gn/portfile.cmake @@ -0,0 +1,73 @@ +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() + +set(BASE_URL "https://chrome-infra-packages.appspot.com/dl/gn/gn") +set(PLATFORM "") +set(ID "") +set(HASH "") + +if(VCPKG_TARGET_IS_WINDOWS) + if(VCPKG_TARGET_ARCHITECTURE STREQUAL "x64") + set(PLATFORM "windows-amd64") + set(ID "UXzb_By8w0nZJ4HNiOo0-ylLKn97JMEGeFgu7lh-5bYC") + set(HASH "4508eee7a8d594d31d34a9810371ba13f0b233642ed89b0185ef209165af1c1b2df49d4b5020e01f333a0724b66bcae80133db8f6256d37295b02927743eaddf") + else() + message(FATAL_ERROR "Only x64 is supported on Windows") + endif() +elseif(VCPKG_TARGET_IS_OSX) + if(VCPKG_TARGET_ARCHITECTURE STREQUAL "x64") + set(PLATFORM "mac-amd64") + set(ID "Al2dYNoD4IBgOnjJSohdXIZMhZJIqHeyaE2AiqWYfIYC") + set(HASH "98b0f6c99ab5e9f6aac448e19aa22d6f2a4924cff51493ce905be7329e1575575c5b9be96e86b07eb0be7215718bf6384bcee01233c8ef0d5554bfa3f51fc811") + elseif(VCPKG_TARGET_ARCHITECTURE STREQUAL "arm64") + set(PLATFORM "mac-arm64") + set(ID "WVStyq9u1pq0xScIl-o4nOlNBYTHCQQCV0KPhgRAAhEC") + set(HASH "ec7a46574d6dc4177e02ac0e558da59dfaa503bf2263c904b09145bc5cbee759c91f0b55b4bc9f372953af78eb3ac6ad98e0fc1b1cf419689a1f7615c786311d") + else() + message(FATAL_ERROR "Only x64 and arm64 are supported on osx") + endif() +elseif(VCPKG_TARGET_IS_LINUX) + if(VCPKG_TARGET_ARCHITECTURE STREQUAL "x64") + set(PLATFORM "linux-amd64") + set(ID "bMLaJoqEAsCsT5M_sG6KxlaiRQ5aS2RVhrC2qLPilE8C") + set(HASH "fd073139b4ca816dd9f742232d565017237589ec62d02dcb2e54a1d22350450e61b11cc8aa9acd645565f7aac62f9d0bf64ca30f8e6c07f547c746cea3998064") + elseif(VCPKG_TARGET_ARCHITECTURE STREQUAL "arm64") + set(PLATFORM "linux-arm64") + set(ID "A_VzbiVBrgO0cxX_Iyt8FomIH-WU8YAG2LW8FAhSaOgC") + set(HASH "71da448fd496f803d241ef3656a0c69889a7084624f7f6f92c5326b6e7c0a67b386c69f5cff1a07402b5aa57f5d754a23e09191bbecae8d443ad9896198e36a7") + else() + message(FATAL_ERROR "Only x64 and arm64 are supported on linux") + endif() +else() + message(FATAL_ERROR "Target not yet supported by '${PORT}'") +endif() + +set(URL "${BASE_URL}/${PLATFORM}/+/${ID}") +message(STATUS "URL: '${URL}'") + +vcpkg_download_distfile(ARCHIVE_PATH + URLS "${URL}" + SHA512 "${HASH}" + FILENAME "gn-${PLATFORM}-${ID}.zip" + #ALWAYS_REDOWNLOAD + #SKIP_SHA512 +) + +file(MAKE_DIRECTORY "${CURRENT_PACKAGES_DIR}/tools/${PORT}") +message(STATUS "ARCHIVE_PATH: '${ARCHIVE_PATH}'") + +vcpkg_execute_in_download_mode( + COMMAND ${CMAKE_COMMAND} -E tar xzf "${ARCHIVE_PATH}" + WORKING_DIRECTORY "${CURRENT_PACKAGES_DIR}/tools/${PORT}" +) +file(GLOB_RECURSE folders "${CURRENT_PACKAGES_DIR}/tools/${PORT}/*" LIST_DIRECTORIES true) +message(STATUS "Files and Folders: '${folders}'") + +file(INSTALL + "${CMAKE_CURRENT_LIST_DIR}/vcpkg_gn_configure.cmake" + "${CMAKE_CURRENT_LIST_DIR}/vcpkg_gn_install.cmake" + "${CMAKE_CURRENT_LIST_DIR}/vcpkg-port-config.cmake" + DESTINATION "${CURRENT_PACKAGES_DIR}/share/${PORT}") diff --git a/ports/vcpkg-gn/vcpkg-port-config.cmake b/ports/vcpkg-gn/vcpkg-port-config.cmake new file mode 100644 index 00000000000..3542ba9282e --- /dev/null +++ b/ports/vcpkg-gn/vcpkg-port-config.cmake @@ -0,0 +1,4 @@ +include("${CMAKE_CURRENT_LIST_DIR}/vcpkg_gn_configure.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/vcpkg_gn_install.cmake") + +file(REAL_PATH "${CMAKE_CURRENT_LIST_DIR}/../../tools/vcpkg-gn/gn${CMAKE_EXECUTABLE_SUFFIX}" VCPKG_GN) diff --git a/ports/vcpkg-gn/vcpkg.json b/ports/vcpkg-gn/vcpkg.json new file mode 100644 index 00000000000..64bdccd0e68 --- /dev/null +++ b/ports/vcpkg-gn/vcpkg.json @@ -0,0 +1,6 @@ +{ + "name": "vcpkg-gn", + "version-date": "2021-11-16", + "description": "https://gn.googlesource.com/gn/+/4aa9bdfa05b688c58d3d7d3e496f3f18cbb3d89e", + "supports": "native & !x86" +} diff --git a/ports/vcpkg-gn/vcpkg_gn_configure.cmake b/ports/vcpkg-gn/vcpkg_gn_configure.cmake new file mode 100644 index 00000000000..87aaba85dea --- /dev/null +++ b/ports/vcpkg-gn/vcpkg_gn_configure.cmake @@ -0,0 +1,80 @@ +#[===[.md: +# vcpkg_gn_configure + +Generate Ninja (GN) targets + +## Usage: +```cmake +vcpkg_gn_configure( + SOURCE_PATH + [OPTIONS ] + [OPTIONS_DEBUG ] + [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. +#]===] +if(Z_VCPKG_GN_CONFIGURE_GUARD) + return() +endif() +set(Z_VCPKG_GN_CONFIGURE_GUARD ON CACHE INTERNAL "guard variable") + +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 "${VCPKG_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(PYTHON2) + get_filename_component(PYTHON2_DIR "${PYTHON2}" DIRECTORY) + vcpkg_add_to_path(PREPEND "${PYTHON2_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/ports/vcpkg-gn/vcpkg_gn_install.cmake b/ports/vcpkg-gn/vcpkg_gn_install.cmake new file mode 100644 index 00000000000..517046b54ef --- /dev/null +++ b/ports/vcpkg-gn/vcpkg_gn_install.cmake @@ -0,0 +1,144 @@ +#[===[.md: +# vcpkg_gn_install + +Installs a GN project. + +In order to build a GN project without installing, use [`vcpkg_build_ninja()`]. + +## Usage: +```cmake +vcpkg_gn_install( + SOURCE_PATH + [TARGETS ...] +) +``` + +## Parameters: +### SOURCE_PATH +The path to the source directory + +### TARGETS +Only install the specified targets. + +Note: includes must be handled separately + +[`vcpkg_build_ninja()`]: vcpkg_build_ninja.md +#]===] +if(Z_VCPKG_GN_INSTALL_GUARD) + return() +endif() +set(Z_VCPKG_GN_INSTALL_GUARD ON CACHE INTERNAL "guard variable") + +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 "${VCPKG_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 "${VCPKG_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() diff --git a/scripts/cmake/vcpkg_configure_gn.cmake b/scripts/cmake/vcpkg_configure_gn.cmake index e844d8d70c6..cdd4c313aa2 100644 --- a/scripts/cmake/vcpkg_configure_gn.cmake +++ b/scripts/cmake/vcpkg_configure_gn.cmake @@ -1,3 +1,4 @@ +# DEPRECATED BY ports/vcpkg-gn/vcpkg_gn_configure #[===[.md: # vcpkg_configure_gn @@ -43,8 +44,11 @@ function(z_vcpkg_configure_gn_generate) endfunction() function(vcpkg_configure_gn) - cmake_parse_arguments(PARSE_ARGV 0 "arg" "" "SOURCE_PATH;OPTIONS;OPTIONS_DEBUG;OPTIONS_RELEASE" "") + if(Z_VCPKG_GN_CONFIGURE_GUARD) + message(FATAL_ERROR "The ${PORT} port already depends on vcpkg-gn; using both vcpkg-gn and vcpkg_configure_gn in the same port is unsupported.") + endif() + cmake_parse_arguments(PARSE_ARGV 0 "arg" "" "SOURCE_PATH;OPTIONS;OPTIONS_DEBUG;OPTIONS_RELEASE" "") if(DEFINED arg_UNPARSED_ARGUMENTS) message(WARNING "vcpkg_configure_gn was passed extra arguments: ${arg_UNPARSED_ARGUMENTS}") endif() diff --git a/scripts/cmake/vcpkg_install_gn.cmake b/scripts/cmake/vcpkg_install_gn.cmake index ac16fac1432..fc51f157ca9 100644 --- a/scripts/cmake/vcpkg_install_gn.cmake +++ b/scripts/cmake/vcpkg_install_gn.cmake @@ -1,3 +1,4 @@ +# DEPRECATED BY ports/vcpkg-gn/vcpkg_gn_install #[===[.md: # vcpkg_install_gn @@ -107,8 +108,11 @@ function(z_vcpkg_install_gn_install) endfunction() function(vcpkg_install_gn) - cmake_parse_arguments(PARSE_ARGV 0 arg "" "SOURCE_PATH" "TARGETS") + 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.") + 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() diff --git a/versions/baseline.json b/versions/baseline.json index 861fdf64294..06ac94378a3 100644 --- a/versions/baseline.json +++ b/versions/baseline.json @@ -7072,6 +7072,10 @@ "baseline": "3", "port-version": 1 }, + "vcpkg-gn": { + "baseline": "2021-11-16", + "port-version": 0 + }, "vcpkg-pkgconfig-get-modules": { "baseline": "2021-04-02", "port-version": 1 diff --git a/versions/v-/vcpkg-gn.json b/versions/v-/vcpkg-gn.json new file mode 100644 index 00000000000..542393a83b8 --- /dev/null +++ b/versions/v-/vcpkg-gn.json @@ -0,0 +1,9 @@ +{ + "versions": [ + { + "git-tree": "f0ec062fd9ed47e9a00f343e15f185e4201e661b", + "version-date": "2021-11-16", + "port-version": 0 + } + ] +}