mirror of
https://github.com/microsoft/vcpkg.git
synced 2024-11-24 08:58:59 +08:00
d369df7ecf
* [rollup:2021-07-06 1/8] PR #18272 (@strega-nil) [scripts-audit] vcpkg_from_* * [rollup:2021-07-06 2/8] PR #18319 (@strega-nil) [scripts-audit] add guidelines for cmake * [rollup 2021-07-06 3/8] PR #18410 (@mheyman) [vcpkg-cmake-config] documentation fix * [rollup:2021-07-06 4/8] PR #18488 (@strega-nil) [scripts-audit] vcpkg_execute_* * [rollup:2021-07-06 5/8] PR #18517 (@strega-nil) [scripts-audit] vcpkg_extract_source_archive * [rollup:2021-07-06 6/8] PR #18674 (@NancyLi1013) [vcpkg doc] Update examples * [rollup:2021-07-06 7/8] PR #18695 (@JackBoosY) [vcpkg] Update the minimum version of vcpkg * [rollup:2021-07-06 8/8] PR #18758 (@ras0219-msft) [vcpkg_from_git] Fix error if downloads folder does not exist * build docs! * fix bond:*-windows * fix nmap Co-authored-by: nicole mazzuca <mazzucan@outlook.com> Co-authored-by: Michael Heyman <Michael.Heyman@jhuapl.edu> Co-authored-by: NancyLi1013 <lirui09@beyondsoft.com> Co-authored-by: JackBoosY <yuzaiyang@beyondsoft.com> Co-authored-by: Robert Schumacher <ras0219@outlook.com>
154 lines
4.9 KiB
CMake
154 lines
4.9 KiB
CMake
#[===[.md:
|
|
# vcpkg_from_git
|
|
|
|
Download and extract a project from git
|
|
|
|
## Usage:
|
|
```cmake
|
|
vcpkg_from_git(
|
|
OUT_SOURCE_PATH <SOURCE_PATH>
|
|
URL <https://android.googlesource.com/platform/external/fdlibm>
|
|
REF <59f7335e4d...>
|
|
[HEAD_REF <ref>]
|
|
[PATCHES <patch1.patch> <patch2.patch>...]
|
|
)
|
|
```
|
|
|
|
## Parameters:
|
|
### OUT_SOURCE_PATH
|
|
Specifies the out-variable that will contain the extracted location.
|
|
|
|
This should be set to `SOURCE_PATH` by convention.
|
|
|
|
### URL
|
|
The url of the git repository.
|
|
|
|
### REF
|
|
The git sha of the commit to download.
|
|
|
|
### HEAD_REF
|
|
The git branch to use when the package is requested to be built from the latest sources.
|
|
|
|
Example: `main`, `develop`, `HEAD`
|
|
|
|
### PATCHES
|
|
A list of patches to be applied to the extracted sources.
|
|
|
|
Relative paths are based on the port directory.
|
|
|
|
## Notes:
|
|
`OUT_SOURCE_PATH`, `REF`, and `URL` must be specified.
|
|
|
|
## Examples:
|
|
|
|
* [fdlibm](https://github.com/Microsoft/vcpkg/blob/master/ports/fdlibm/portfile.cmake)
|
|
#]===]
|
|
|
|
include(vcpkg_execute_in_download_mode)
|
|
|
|
function(vcpkg_from_git)
|
|
cmake_parse_arguments(PARSE_ARGV 0 "arg"
|
|
""
|
|
"OUT_SOURCE_PATH;URL;REF;HEAD_REF;TAG"
|
|
"PATCHES"
|
|
)
|
|
|
|
if(DEFINED arg_UNPARSED_ARGUMENTS)
|
|
message(WARNING "vcpkg_from_git was passed extra arguments: ${arg_UNPARSED_ARGUMENTS}")
|
|
endif()
|
|
if(DEFINED arg_TAG)
|
|
message(WARNING "The TAG argument to vcpkg_from_git has been deprecated and has no effect.")
|
|
endif()
|
|
|
|
|
|
if(NOT DEFINED arg_OUT_SOURCE_PATH)
|
|
message(FATAL_ERROR "OUT_SOURCE_PATH must be specified.")
|
|
endif()
|
|
if(NOT DEFINED arg_URL)
|
|
message(FATAL_ERROR "The git url must be specified")
|
|
endif()
|
|
if(NOT DEFINED arg_REF AND NOT DEFINED arg_HEAD_REF)
|
|
message(FATAL_ERROR "At least one of REF or HEAD_REF must be specified.")
|
|
endif()
|
|
|
|
set(working_directory_param "")
|
|
set(ref_to_use "${arg_REF}")
|
|
if(VCPKG_USE_HEAD_VERSION)
|
|
if(DEFINED arg_HEAD_REF)
|
|
set(working_directory_param "WORKING_DIRECTORY" "${CURRENT_BUILDTREES_DIR}/src/head")
|
|
set(ref_to_use "${arg_HEAD_REF}")
|
|
else()
|
|
message(STATUS "Package does not specify HEAD_REF. Falling back to non-HEAD version.")
|
|
endif()
|
|
elseif(NOT DEFINED arg_REF)
|
|
message(FATAL_ERROR "Package does not specify REF. It must be built using --head.")
|
|
endif()
|
|
|
|
string(REPLACE "/" "_-" sanitized_ref "${ref_to_use}")
|
|
set(temp_archive "${DOWNLOADS}/temp/${PORT}-${sanitized_ref}.tar.gz")
|
|
set(archive "${DOWNLOADS}/${PORT}-${sanitized_ref}.tar.gz")
|
|
|
|
if(NOT EXISTS "${archive}")
|
|
if(_VCPKG_NO_DOWNLOADS)
|
|
message(FATAL_ERROR "Downloads are disabled, but '${archive}' does not exist.")
|
|
endif()
|
|
message(STATUS "Fetching ${arg_URL} ${ref_to_use}...")
|
|
find_program(GIT NAMES git git.cmd)
|
|
file(MAKE_DIRECTORY "${DOWNLOADS}")
|
|
# Note: git init is safe to run multiple times
|
|
vcpkg_execute_required_process(
|
|
ALLOW_IN_DOWNLOAD_MODE
|
|
COMMAND "${GIT}" init git-tmp
|
|
WORKING_DIRECTORY "${DOWNLOADS}"
|
|
LOGNAME "git-init-${TARGET_TRIPLET}"
|
|
)
|
|
vcpkg_execute_required_process(
|
|
ALLOW_IN_DOWNLOAD_MODE
|
|
COMMAND "${GIT}" fetch "${arg_URL}" "${ref_to_use}" --depth 1 -n
|
|
WORKING_DIRECTORY "${DOWNLOADS}/git-tmp"
|
|
LOGNAME "git-fetch-${TARGET_TRIPLET}"
|
|
)
|
|
vcpkg_execute_in_download_mode(
|
|
COMMAND "${GIT}" rev-parse FETCH_HEAD
|
|
OUTPUT_VARIABLE rev_parse_head
|
|
ERROR_VARIABLE rev_parse_head
|
|
RESULT_VARIABLE error_code
|
|
WORKING_DIRECTORY "${DOWNLOADS}/git-tmp"
|
|
)
|
|
if(error_code)
|
|
message(FATAL_ERROR "unable to determine FETCH_HEAD after fetching git repository")
|
|
endif()
|
|
string(STRIP "${rev_parse_head}" rev_parse_head)
|
|
if(VCPKG_USE_HEAD_VERSION)
|
|
set(VCPKG_HEAD_VERSION "${rev_parse_head}" PARENT_SCOPE)
|
|
elseif(NOT rev_parse_head STREQUAL arg_REF)
|
|
message(FATAL_ERROR "REF (${arg_REF}) does not match FETCH_HEAD (${rev_parse_head})
|
|
[Expected : ( ${arg_REF} )])
|
|
[ Actual : ( ${rev_parse_head} )]"
|
|
)
|
|
endif()
|
|
|
|
file(MAKE_DIRECTORY "${DOWNLOADS}/temp")
|
|
vcpkg_execute_required_process(
|
|
ALLOW_IN_DOWNLOAD_MODE
|
|
COMMAND "${GIT}" archive "${rev_parse_head}" -o "${temp_archive}"
|
|
WORKING_DIRECTORY "${DOWNLOADS}/git-tmp"
|
|
LOGNAME git-archive
|
|
)
|
|
file(RENAME "${temp_archive}" "${archive}")
|
|
else()
|
|
message(STATUS "Using cached ${archive}")
|
|
endif()
|
|
|
|
vcpkg_extract_source_archive_ex(
|
|
OUT_SOURCE_PATH SOURCE_PATH
|
|
ARCHIVE "${archive}"
|
|
REF "${sanitized_ref}"
|
|
PATCHES ${arg_PATCHES}
|
|
NO_REMOVE_ONE_LEVEL
|
|
${working_directory_param}
|
|
)
|
|
|
|
set("${arg_OUT_SOURCE_PATH}" "${SOURCE_PATH}" PARENT_SCOPE)
|
|
endfunction()
|