2018-05-15 00:49:07 +08:00
## # vcpkg_from_gitlab
##
## Download and extract a project from Gitlab instances. Enables support for `install --head`.
##
## ## Usage:
## ```cmake
## vcpkg_from_gitlab(
2018-08-08 20:25:20 +08:00
## GITLAB_URL <https://gitlab.com>
2018-05-15 00:49:07 +08:00
## OUT_SOURCE_PATH <SOURCE_PATH>
## REPO <gitlab-org/gitlab-ce>
## [REF <v10.7.3>]
## [SHA512 <45d0d7f8cc350...>]
## [HEAD_REF <master>]
2018-09-05 07:20:46 +08:00
## [PATCHES <patch1.patch> <patch2.patch>...]
2018-05-15 00:49:07 +08:00
## )
## ```
##
## ## Parameters:
##
## ### GITLAB_URL
## The URL of the Gitlab instance to use.
##
## ### OUT_SOURCE_PATH
## Specifies the out-variable that will contain the extracted location.
##
## This should be set to `SOURCE_PATH` by convention.
##
## ### REPO
## The organization or user plus the repository name on the Gitlab instance.
##
## ### REF
## A stable git commit-ish (ideally a tag) that will not change contents. **This should not be a branch.**
##
## For repositories without official releases, this can be set to the full commit id of the current latest master.
##
## If `REF` is specified, `SHA512` must also be specified.
##
## ### SHA512
## The SHA512 hash that should match the archive (${GITLAB_URL}/${REPO}/-/archive/${REF}/${REPO_NAME}-${REF}.tar.gz).
## The REPO_NAME variable is parsed from the value of REPO.
##
## This is most easily determined by first setting it to `1`, then trying to build the port. The error message will contain the full hash, which can be copied back into the portfile.
##
## ### HEAD_REF
## The unstable git commit-ish (ideally a branch) to pull for `--head` builds.
##
## For most projects, this should be `master`. The chosen branch should be one that is expected to be always buildable on all supported platforms.
##
2018-09-05 07:20:46 +08:00
## ### PATCHES
## A list of patches to be applied to the extracted sources.
##
## Relative paths are based on the port directory.
##
2018-05-15 00:49:07 +08:00
## ## Notes:
## At least one of `REF` and `HEAD_REF` must be specified, however it is preferable for both to be present.
##
## This exports the `VCPKG_HEAD_VERSION` variable during head builds.
##
2019-03-15 04:43:49 +08:00
## ## Examples:
## * [curl][https://github.com/Microsoft/vcpkg/blob/master/ports/curl/portfile.cmake#L75]
## * [folly](https://github.com/Microsoft/vcpkg/blob/master/ports/folly/portfile.cmake#L15)
## * [z3](https://github.com/Microsoft/vcpkg/blob/master/ports/z3/portfile.cmake#L13)
##
2020-09-10 01:36:58 +08:00
include ( vcpkg_execute_in_download_mode )
2018-05-15 00:49:07 +08:00
function ( vcpkg_from_gitlab )
set ( oneValueArgs OUT_SOURCE_PATH GITLAB_URL USER REPO REF SHA512 HEAD_REF )
set ( multipleValuesArgs PATCHES )
2020-10-27 10:30:27 +08:00
# parse parameters such that semicolons in options arguments to COMMAND don't get erased
cmake_parse_arguments ( PARSE_ARGV 0 _vdud "" "${oneValueArgs}" "${multipleValuesArgs}" )
2018-05-15 00:49:07 +08:00
if ( NOT DEFINED _vdud_GITLAB_URL )
message ( FATAL_ERROR "GITLAB_URL must be specified." )
endif ( )
if ( NOT DEFINED _vdud_OUT_SOURCE_PATH )
message ( FATAL_ERROR "OUT_SOURCE_PATH must be specified." )
endif ( )
if ( ( DEFINED _vdud_REF AND NOT DEFINED _vdud_SHA512 ) OR ( NOT DEFINED _vdud_REF AND DEFINED _vdud_SHA512 ) )
message ( FATAL_ERROR "SHA512 must be specified if REF is specified." )
endif ( )
if ( NOT DEFINED _vdud_REPO )
message ( FATAL_ERROR "REPO must be specified." )
endif ( )
if ( NOT DEFINED _vdud_REF AND NOT DEFINED _vdud_HEAD_REF )
message ( FATAL_ERROR "At least one of REF and HEAD_REF must be specified." )
endif ( )
if ( VCPKG_USE_HEAD_VERSION AND NOT DEFINED _vdud_HEAD_REF )
message ( STATUS "Package does not specify HEAD_REF. Falling back to non-HEAD version." )
set ( VCPKG_USE_HEAD_VERSION OFF )
endif ( )
2020-07-31 06:10:26 +08:00
string ( REPLACE "/" ";" GITLAB_REPO_LINK ${ _vdud_REPO } )
list ( LENGTH GITLAB_REPO_LINK len )
if ( ${ len } EQUAL "2" )
list ( GET GITLAB_REPO_LINK 0 ORG_NAME )
list ( GET GITLAB_REPO_LINK 1 REPO_NAME )
set ( GITLAB_LINK ${ _vdud_GITLAB_URL } / ${ ORG_NAME } / ${ REPO_NAME } )
endif ( )
if ( ${ len } EQUAL "3" )
list ( GET GITLAB_REPO_LINK 0 ORG_NAME )
list ( GET GITLAB_REPO_LINK 1 GROUP_NAME )
list ( GET GITLAB_REPO_LINK 2 REPO_NAME )
set ( GITLAB_LINK ${ _vdud_GITLAB_URL } / ${ ORG_NAME } / ${ GROUP_NAME } / ${ REPO_NAME } )
endif ( )
2018-05-15 00:49:07 +08:00
# Handle --no-head scenarios
if ( NOT VCPKG_USE_HEAD_VERSION )
if ( NOT _vdud_REF )
message ( FATAL_ERROR "Package does not specify REF. It must built using --head." )
endif ( )
string ( REPLACE "/" "-" SANITIZED_REF "${_vdud_REF}" )
vcpkg_download_distfile ( ARCHIVE
2020-07-31 06:10:26 +08:00
U R L S " $ { G I T L A B _ L I N K } / - / a r c h i v e / $ { _ v d u d _ R E F } / $ { R E P O _ N A M E } - $ { _ v d u d _ R E F } . t a r . g z "
2018-05-15 00:49:07 +08:00
S H A 5 1 2 " $ { _ v d u d _ S H A 5 1 2 } "
F I L E N A M E " $ { O R G _ N A M E } - $ { R E P O _ N A M E } - $ { S A N I T I Z E D _ R E F } . t a r . g z "
)
2018-09-05 07:20:46 +08:00
vcpkg_extract_source_archive_ex (
O U T _ S O U R C E _ P A T H S O U R C E _ P A T H
A R C H I V E " $ { A R C H I V E } "
R E F " $ { S A N I T I Z E D _ R E F } "
P A T C H E S $ { _ v d u d _ P A T C H E S }
)
2018-05-15 00:49:07 +08:00
set ( ${ _vdud_OUT_SOURCE_PATH } "${SOURCE_PATH}" PARENT_SCOPE )
return ( )
endif ( )
# The following is for --head scenarios
2020-07-31 06:10:26 +08:00
set ( URL "${GITLAB_LINK}/-/archive/${_vdud_HEAD_REF}/${_vdud_HEAD_REF}.tar.gz" )
2018-05-15 00:49:07 +08:00
string ( REPLACE "/" "-" SANITIZED_HEAD_REF "${_vdud_HEAD_REF}" )
set ( downloaded_file_name "${ORG_NAME}-${REPO_NAME}-${SANITIZED_HEAD_REF}.tar.gz" )
set ( downloaded_file_path "${DOWNLOADS}/${downloaded_file_name}" )
if ( _VCPKG_NO_DOWNLOADS )
if ( NOT EXISTS ${ downloaded_file_path } OR NOT EXISTS ${ downloaded_file_path } .version )
message ( FATAL_ERROR "Downloads are disabled, but '${downloaded_file_path}' does not exist." )
endif ( )
message ( STATUS "Using cached ${downloaded_file_path}" )
else ( )
if ( EXISTS ${ downloaded_file_path } )
message ( STATUS "Purging cached ${downloaded_file_path} to fetch latest (use --no-downloads to suppress)" )
file ( REMOVE ${ downloaded_file_path } )
endif ( )
if ( EXISTS ${ downloaded_file_path } .version )
file ( REMOVE ${ downloaded_file_path } .version )
endif ( )
if ( EXISTS ${ CURRENT_BUILDTREES_DIR } /src/head )
file ( REMOVE_RECURSE ${ CURRENT_BUILDTREES_DIR } /src/head )
endif ( )
vcpkg_download_distfile ( ARCHIVE
U R L S $ { U R L }
F I L E N A M E $ { d o w n l o a d e d _ f i l e _ n a m e }
S K I P _ S H A 5 1 2
)
endif ( )
# There are issues with the Gitlab API project paths being URL-escaped, so we use git here to get the head revision
2020-09-10 01:36:58 +08:00
vcpkg_execute_in_download_mode ( COMMAND ${ GIT } ls-remote
2020-07-31 06:10:26 +08:00
" $ { G I T L A B _ L I N K } . g i t " " $ { _ v d u d _ H E A D _ R E F } "
2018-05-15 00:49:07 +08:00
R E S U L T _ V A R I A B L E _ g i t _ r e s u l t
O U T P U T _ V A R I A B L E _ g i t _ o u t p u t
)
string ( REGEX MATCH "[a-f0-9]+" _version "${_git_output}" )
# exports VCPKG_HEAD_VERSION to the caller. This will get picked up by ports.cmake after the build.
# When multiple vcpkg_from_gitlab's are used after each other, only use the version from the first (hopefully the primary one).
if ( NOT DEFINED VCPKG_HEAD_VERSION )
set ( VCPKG_HEAD_VERSION ${ _version } PARENT_SCOPE )
endif ( )
2018-09-05 07:20:46 +08:00
vcpkg_extract_source_archive_ex (
O U T _ S O U R C E _ P A T H S O U R C E _ P A T H
A R C H I V E " $ { d o w n l o a d e d _ f i l e _ p a t h } "
R E F " $ { S A N I T I Z E D _ H E A D _ R E F } "
W O R K I N G _ D I R E C T O R Y $ { C U R R E N T _ B U I L D T R E E S _ D I R } / s r c / h e a d
2018-05-15 00:49:07 +08:00
P A T C H E S $ { _ v d u d _ P A T C H E S }
)
2018-09-05 07:20:46 +08:00
set ( ${ _vdud_OUT_SOURCE_PATH } "${SOURCE_PATH}" PARENT_SCOPE )
2018-05-15 00:49:07 +08:00
endfunction ( )