aboutsummaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
authorBob Kast <bob.kast@emc.com>2018-10-23 09:06:58 -0400
committerBob Kast <bob.kast@emc.com>2018-10-23 09:06:58 -0400
commit230d795ae3c3f2e45821b887c6065a81a8c04326 (patch)
tree7b014a1547ff1cc9ef80add56eb03b17774a1ff6 /scripts
parent3d1fbeb7de48a3d7a782be7b8722efb5015c7010 (diff)
parent9b21ff9612916e24f89c6839599d3d50446597d8 (diff)
downloadvcpkg-230d795ae3c3f2e45821b887c6065a81a8c04326.tar.gz
vcpkg-230d795ae3c3f2e45821b887c6065a81a8c04326.zip
Merge branch 'master' of https://github.com/EMCECS/vcpkg
# Conflicts: # ports/ecsutil/CONTROL # ports/ecsutil/portfile.cmake
Diffstat (limited to 'scripts')
-rw-r--r--scripts/bootstrap.ps11
-rw-r--r--scripts/cleanEnvironmentHelper.ps12
-rw-r--r--scripts/cmake/vcpkg_append_to_path.cmake41
-rw-r--r--scripts/cmake/vcpkg_common_functions.cmake4
-rw-r--r--scripts/cmake/vcpkg_download_distfile.cmake7
-rw-r--r--scripts/cmake/vcpkg_extract_source_archive.cmake104
-rw-r--r--scripts/cmake/vcpkg_find_acquire_program.cmake46
-rw-r--r--scripts/cmake/vcpkg_from_bitbucket.cmake34
-rw-r--r--scripts/cmake/vcpkg_from_github.cmake74
-rw-r--r--scripts/cmake/vcpkg_from_gitlab.cmake81
-rw-r--r--scripts/cmake/vcpkg_test_cmake.cmake53
-rw-r--r--scripts/templates/portfile.in.cmake3
-rw-r--r--scripts/toolchains/osx.cmake6
-rw-r--r--scripts/vcpkgTools.xml7
14 files changed, 301 insertions, 162 deletions
diff --git a/scripts/bootstrap.ps1 b/scripts/bootstrap.ps1
index 5554ddc1e..7ebbb2930 100644
--- a/scripts/bootstrap.ps1
+++ b/scripts/bootstrap.ps1
@@ -349,6 +349,7 @@ $arguments = (
"/p:Platform=$platform",
"/p:PlatformToolset=$platformToolset",
"/p:TargetPlatformVersion=$windowsSDK",
+"/p:PreferredToolArchitecture=x64",
"/verbosity:minimal",
"/m",
"/nologo",
diff --git a/scripts/cleanEnvironmentHelper.ps1 b/scripts/cleanEnvironmentHelper.ps1
index 0a133f5f8..a3792ecd3 100644
--- a/scripts/cleanEnvironmentHelper.ps1
+++ b/scripts/cleanEnvironmentHelper.ps1
@@ -17,7 +17,7 @@ foreach ($name in $nameSet)
}
# PATH needs to be concatenated as it has values in both machine and user environment. Any other values should be set.
- if ($name -match 'path')
+ if ($name -eq 'path')
{
$pathValuePartial = @()
# Machine values before user values
diff --git a/scripts/cmake/vcpkg_append_to_path.cmake b/scripts/cmake/vcpkg_append_to_path.cmake
new file mode 100644
index 000000000..6890dfe31
--- /dev/null
+++ b/scripts/cmake/vcpkg_append_to_path.cmake
@@ -0,0 +1,41 @@
+## # vcpkg_add_to_path
+##
+## Add a directory to the PATH environment variable
+##
+## ## Usage
+## ```cmake
+## vcpkg_add_to_path([PREPEND] <${PYTHON3_DIR}>)
+## ```
+##
+## ## Parameters
+## ### <positional>
+## The directory to add
+##
+## ### PREPEND
+## Prepends the directory.
+##
+## The default is to append.
+function(vcpkg_add_to_path)
+ if(NOT "${ARGC}" STREQUAL "1" AND NOT "${ARGC}" STREQUAL "2")
+ message(FATAL_ERROR "vcpkg_add_to_path() only accepts 1 or 2 arguments.")
+ endif()
+ if("${ARGV0}" STREQUAL "PREPEND")
+ if(NOT "${ARGC}" STREQUAL "2")
+ message(FATAL_ERROR "Expected second argument.")
+ endif()
+ if(CMAKE_HOST_WIN32)
+ set(ENV{PATH} "${ARGV1};$ENV{PATH}")
+ else()
+ set(ENV{PATH} "${ARGV1}:$ENV{PATH}")
+ endif()
+ else()
+ if(NOT "${ARGC}" STREQUAL "1")
+ message(FATAL_ERROR "Unexpected second argument: ${ARGV1}")
+ endif()
+ if(CMAKE_HOST_WIN32)
+ set(ENV{PATH} "$ENV{PATH};${ARGV0}")
+ else()
+ set(ENV{PATH} "$ENV{PATH}:${ARGV0}")
+ endif()
+ 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 6677af00a..90a3e2814 100644
--- a/scripts/cmake/vcpkg_common_functions.cmake
+++ b/scripts/cmake/vcpkg_common_functions.cmake
@@ -1,4 +1,5 @@
include(vcpkg_acquire_msys)
+include(vcpkg_append_to_path)
include(vcpkg_check_linkage)
include(vcpkg_download_distfile)
include(vcpkg_extract_source_archive)
@@ -24,4 +25,5 @@ include(vcpkg_copy_tool_dependencies)
include(vcpkg_get_program_files_32_bit)
include(vcpkg_get_program_files_platform_bitness)
include(vcpkg_get_windows_sdk)
-include(vcpkg_replace_string) \ No newline at end of file
+include(vcpkg_replace_string)
+include(vcpkg_test_cmake)
diff --git a/scripts/cmake/vcpkg_download_distfile.cmake b/scripts/cmake/vcpkg_download_distfile.cmake
index db3e45594..949036c88 100644
--- a/scripts/cmake/vcpkg_download_distfile.cmake
+++ b/scripts/cmake/vcpkg_download_distfile.cmake
@@ -68,7 +68,12 @@ function(vcpkg_download_distfile VAR)
set(downloaded_file_path ${DOWNLOADS}/${vcpkg_download_distfile_FILENAME})
set(download_file_path_part "${DOWNLOADS}/temp/${vcpkg_download_distfile_FILENAME}")
- file(REMOVE_RECURSE "${DOWNLOADS}/temp")
+ # Works around issue #3399
+ if(IS_DIRECTORY "${DOWNLOADS}/temp")
+ file(REMOVE_RECURSE "${DOWNLOADS}/temp0")
+ file(RENAME "${DOWNLOADS}/temp" "${DOWNLOADS}/temp0")
+ file(REMOVE_RECURSE "${DOWNLOADS}/temp0")
+ endif()
file(MAKE_DIRECTORY "${DOWNLOADS}/temp")
function(test_hash FILE_PATH FILE_KIND CUSTOM_ERROR_ADVICE)
diff --git a/scripts/cmake/vcpkg_extract_source_archive.cmake b/scripts/cmake/vcpkg_extract_source_archive.cmake
index 3aafd4ca4..da0ac611a 100644
--- a/scripts/cmake/vcpkg_extract_source_archive.cmake
+++ b/scripts/cmake/vcpkg_extract_source_archive.cmake
@@ -29,25 +29,19 @@
## * [msgpack](https://github.com/Microsoft/vcpkg/blob/master/ports/msgpack/portfile.cmake)
include(vcpkg_execute_required_process)
-function(vcpkg_extract_source_archive_ex)
- cmake_parse_arguments(_vesae "" "ARCHIVE;WORKING_DIRECTORY" "" ${ARGN})
-
- if(NOT _vesae_ARCHIVE)
- message(FATAL_ERROR "Must specify ARCHIVE parameter to vcpkg_extract_source_archive_ex()")
- endif()
-
- if(DEFINED _vesae_WORKING_DIRECTORY)
- set(WORKING_DIRECTORY ${_vesae_WORKING_DIRECTORY})
+function(vcpkg_extract_source_archive ARCHIVE)
+ if(NOT ARGC EQUAL 2)
+ set(WORKING_DIRECTORY "${CURRENT_BUILDTREES_DIR}/src")
else()
- set(WORKING_DIRECTORY ${CURRENT_BUILDTREES_DIR}/src)
+ set(WORKING_DIRECTORY ${ARGV1})
endif()
- get_filename_component(ARCHIVE_FILENAME ${_vesae_ARCHIVE} NAME)
+ get_filename_component(ARCHIVE_FILENAME "${ARCHIVE}" NAME)
if(NOT EXISTS ${WORKING_DIRECTORY}/${ARCHIVE_FILENAME}.extracted)
- message(STATUS "Extracting source ${_vesae_ARCHIVE}")
+ message(STATUS "Extracting source ${ARCHIVE}")
file(MAKE_DIRECTORY ${WORKING_DIRECTORY})
vcpkg_execute_required_process(
- COMMAND ${CMAKE_COMMAND} -E tar xjf ${_vesae_ARCHIVE}
+ COMMAND ${CMAKE_COMMAND} -E tar xjf ${ARCHIVE}
WORKING_DIRECTORY ${WORKING_DIRECTORY}
LOGNAME extract
)
@@ -55,13 +49,81 @@ function(vcpkg_extract_source_archive_ex)
endif()
endfunction()
-function(vcpkg_extract_source_archive ARCHIVE)
- if(NOT ARGC EQUAL 2)
- vcpkg_extract_source_archive_ex(ARCHIVE ${ARCHIVE})
- else()
- vcpkg_extract_source_archive_ex(
- ARCHIVE ${ARCHIVE}
- WORKING_DIRECTORY ${ARGV1}
+function(vcpkg_extract_source_archive_ex)
+ cmake_parse_arguments(_vesae "NO_REMOVE_ONE_LEVEL" "OUT_SOURCE_PATH;ARCHIVE;REF;WORKING_DIRECTORY" "PATCHES" ${ARGN})
+
+ if(NOT _vesae_ARCHIVE)
+ message(FATAL_ERROR "Must specify ARCHIVE parameter to vcpkg_extract_source_archive_ex()")
+ endif()
+
+ if(NOT DEFINED _vesae_OUT_SOURCE_PATH)
+ message(FATAL_ERROR "Must specify OUT_SOURCE_PATH parameter to vcpkg_extract_source_archive_ex()")
+ endif()
+
+ if(NOT DEFINED _vesae_WORKING_DIRECTORY)
+ set(_vesae_WORKING_DIRECTORY ${CURRENT_BUILDTREES_DIR}/src)
+ endif()
+
+ if(NOT DEFINED _vesae_REF)
+ get_filename_component(_vesae_REF ${_vesae_ARCHIVE} NAME_WE)
+ endif()
+
+ string(REPLACE "/" "-" SANITIZED_REF "${_vesae_REF}")
+
+ # Take the last 10 chars of the REF
+ set(REF_MAX_LENGTH 10)
+ string(LENGTH ${SANITIZED_REF} REF_LENGTH)
+ math(EXPR FROM_REF ${REF_LENGTH}-${REF_MAX_LENGTH})
+ if(FROM_REF LESS 0)
+ set(FROM_REF 0)
+ endif()
+ string(SUBSTRING ${SANITIZED_REF} ${FROM_REF} ${REF_LENGTH} SHORTENED_SANITIZED_REF)
+
+ # Hash the archive hash along with the patches. Take the first 10 chars of the hash
+ file(SHA512 ${_vesae_ARCHIVE} PATCHSET_HASH)
+ foreach(PATCH IN LISTS _vesae_PATCHES)
+ get_filename_component(ABSOLUTE_PATCH "${PATCH}" ABSOLUTE BASE_DIR "${CURRENT_PORT_DIR}")
+ file(SHA512 ${ABSOLUTE_PATCH} CURRENT_HASH)
+ string(APPEND PATCHSET_HASH ${CURRENT_HASH})
+ endforeach()
+
+ string(SHA512 PATCHSET_HASH ${PATCHSET_HASH})
+ string(SUBSTRING ${PATCHSET_HASH} 0 10 PATCHSET_HASH)
+ set(SOURCE_PATH "${_vesae_WORKING_DIRECTORY}/${SHORTENED_SANITIZED_REF}-${PATCHSET_HASH}")
+
+ if(NOT EXISTS ${SOURCE_PATH})
+ set(TEMP_DIR "${_vesae_WORKING_DIRECTORY}/TEMP")
+ file(REMOVE_RECURSE ${TEMP_DIR})
+ vcpkg_extract_source_archive("${_vesae_ARCHIVE}" "${TEMP_DIR}")
+
+ if(_vesae_NO_REMOVE_ONE_LEVEL)
+ set(TEMP_SOURCE_PATH ${TEMP_DIR})
+ else()
+ file(GLOB _ARCHIVE_FILES "${TEMP_DIR}/*")
+ list(LENGTH _ARCHIVE_FILES _NUM_ARCHIVE_FILES)
+ set(TEMP_SOURCE_PATH)
+ foreach(dir IN LISTS _ARCHIVE_FILES)
+ if (IS_DIRECTORY ${dir})
+ set(TEMP_SOURCE_PATH "${dir}")
+ break()
+ endif()
+ endforeach()
+
+ if(NOT _NUM_ARCHIVE_FILES EQUAL 2 OR NOT TEMP_SOURCE_PATH)
+ message(FATAL_ERROR "Could not unwrap top level directory from archive. Pass NO_REMOVE_ONE_LEVEL to disable this.")
+ endif()
+ endif()
+
+ vcpkg_apply_patches(
+ SOURCE_PATH ${TEMP_SOURCE_PATH}
+ PATCHES ${_vesae_PATCHES}
)
+
+ file(RENAME ${TEMP_SOURCE_PATH} ${SOURCE_PATH})
+ file(REMOVE_RECURSE ${TEMP_DIR})
endif()
-endfunction() \ No newline at end of file
+
+ set(${_vesae_OUT_SOURCE_PATH} "${SOURCE_PATH}" PARENT_SCOPE)
+ message(STATUS "Using source at ${SOURCE_PATH}")
+ return()
+endfunction()
diff --git a/scripts/cmake/vcpkg_find_acquire_program.cmake b/scripts/cmake/vcpkg_find_acquire_program.cmake
index 39a722d93..4cb123fd6 100644
--- a/scripts/cmake/vcpkg_find_acquire_program.cmake
+++ b/scripts/cmake/vcpkg_find_acquire_program.cmake
@@ -128,23 +128,41 @@ function(vcpkg_find_acquire_program VAR)
elseif(VAR MATCHES "MESON")
set(PROGNAME meson)
set(REQUIRED_INTERPRETER PYTHON3)
- set(SCRIPTNAME meson.py)
- set(PATHS ${DOWNLOADS}/tools/meson/meson-0.43.0)
- set(URL "https://github.com/mesonbuild/meson/archive/0.43.0.zip")
- set(ARCHIVE "meson-0.43.0.zip")
- set(HASH dde4de72eff37046731224f32aa5f4618d45bdf148cec2d1af6e25e7522ebc2b04aedc9eceed483dfa93823a0ea7ea472d0c0c9380061bf3ee2f16b87dd1425e)
+ set(BREW_PACKAGE_NAME "meson")
+ set(APT_PACKAGE_NAME "meson")
+ if(CMAKE_HOST_WIN32)
+ set(SCRIPTNAME meson.py)
+ else()
+ set(SCRIPTNAME meson)
+ endif()
+ set(PATHS ${DOWNLOADS}/tools/meson/meson-0.47.1)
+ set(URL "https://github.com/mesonbuild/meson/archive/0.47.1.zip")
+ set(ARCHIVE "meson-0.47.1.zip")
+ set(HASH 0f6462835583a51707bee82d852018cfcb7444c0dad95b2ba08814e500a5cfe3f731dc6c1fb73c765d1120ee2a2d6600e15d8d393bab1993e84bd4354b2e6855)
elseif(VAR MATCHES "FLEX")
+ if(CMAKE_HOST_WIN32)
set(PROGNAME win_flex)
- set(PATHS ${DOWNLOADS}/tools/win_flex)
- set(URL "https://sourceforge.net/projects/winflexbison/files/win_flex_bison-2.5.9.zip/download")
- set(ARCHIVE "win_flex_bison-2.5.9.zip")
- set(HASH 9580f0e46893670a011645947c1becda69909a41a38bb4197fe33bd1ab7719da6b80e1be316f269e1a4759286870d49a9b07ef83afc4bac33232bd348e0bc814)
+ set(PATHS ${DOWNLOADS}/tools/win_flex)
+ set(URL "https://sourceforge.net/projects/winflexbison/files/win_flex_bison-2.5.9.zip/download")
+ set(ARCHIVE "win_flex_bison-2.5.9.zip")
+ set(HASH 9580f0e46893670a011645947c1becda69909a41a38bb4197fe33bd1ab7719da6b80e1be316f269e1a4759286870d49a9b07ef83afc4bac33232bd348e0bc814)
+ else()
+ set(PROGNAME flex)
+ set(APT_PACKAGE_NAME flex)
+ set(BREW_PACKAGE_NAME flex)
+ endif()
elseif(VAR MATCHES "BISON")
- set(PROGNAME win_bison)
- set(PATHS ${DOWNLOADS}/tools/win_bison)
- set(URL "https://sourceforge.net/projects/winflexbison/files/win_flex_bison-2.5.9.zip/download")
- set(ARCHIVE "win_flex_bison-2.5.9.zip")
- set(HASH 9580f0e46893670a011645947c1becda69909a41a38bb4197fe33bd1ab7719da6b80e1be316f269e1a4759286870d49a9b07ef83afc4bac33232bd348e0bc814)
+ if(CMAKE_HOST_WIN32)
+ set(PROGNAME win_bison)
+ set(PATHS ${DOWNLOADS}/tools/win_bison)
+ set(URL "https://sourceforge.net/projects/winflexbison/files/win_flex_bison-2.5.9.zip/download")
+ set(ARCHIVE "win_flex_bison-2.5.9.zip")
+ set(HASH 9580f0e46893670a011645947c1becda69909a41a38bb4197fe33bd1ab7719da6b80e1be316f269e1a4759286870d49a9b07ef83afc4bac33232bd348e0bc814)
+ else()
+ set(PROGNAME bison)
+ set(APT_PACKAGE_NAME bison)
+ set(BREW_PACKAGE_NAME bison)
+ endif()
elseif(VAR MATCHES "GPERF")
set(PROGNAME gperf)
set(PATHS ${DOWNLOADS}/tools/gperf/bin)
diff --git a/scripts/cmake/vcpkg_from_bitbucket.cmake b/scripts/cmake/vcpkg_from_bitbucket.cmake
index a12d86b43..5f23714ea 100644
--- a/scripts/cmake/vcpkg_from_bitbucket.cmake
+++ b/scripts/cmake/vcpkg_from_bitbucket.cmake
@@ -11,6 +11,7 @@
## [REF <v2.0.0>]
## [SHA512 <45d0d7f8cc350...>]
## [HEAD_REF <master>]
+## [PATCHES <patch1.patch> <patch2.patch>...]
## )
## ```
##
@@ -40,6 +41,11 @@
##
## For most projects, this should be `master`. The chosen branch should be one that is expected to be always buildable on all supported platforms.
##
+## ### PATCHES
+## A list of patches to be applied to the extracted sources.
+##
+## Relative paths are based on the port directory.
+##
## ## Notes:
## At least one of `REF` and `HEAD_REF` must be specified, however it is preferable for both to be present.
##
@@ -50,7 +56,7 @@
## * [blaze](https://github.com/Microsoft/vcpkg/blob/master/ports/blaze/portfile.cmake)
function(vcpkg_from_bitbucket)
set(oneValueArgs OUT_SOURCE_PATH REPO REF SHA512 HEAD_REF)
- set(multipleValuesArgs)
+ set(multipleValuesArgs PATCHES)
cmake_parse_arguments(_vdud "" "${oneValueArgs}" "${multipleValuesArgs}" ${ARGN})
if(NOT _vdud_OUT_SOURCE_PATH)
@@ -115,7 +121,7 @@ function(vcpkg_from_bitbucket)
string(REGEX REPLACE "\"hash\": \"([a-f0-9]+)\"" "\\1" _version ${x})
string(SUBSTRING ${_version} 0 12 _version) # Get the 12 first numbers from commit hash
else()
- set(_version ${_vdud_REF})
+ string(SUBSTRING ${_vdud_REF} 0 12 _version) # Get the 12 first numbers from commit hash
endif()
vcpkg_download_distfile(ARCHIVE
@@ -123,8 +129,14 @@ function(vcpkg_from_bitbucket)
SHA512 "${_vdud_SHA512}"
FILENAME "${ORG_NAME}-${REPO_NAME}-${_vdud_REF}.tar.gz"
)
- vcpkg_extract_source_archive_ex(ARCHIVE "${ARCHIVE}")
- set_SOURCE_PATH(${CURRENT_BUILDTREES_DIR}/src ${_version})
+
+ vcpkg_extract_source_archive_ex(
+ OUT_SOURCE_PATH SOURCE_PATH
+ ARCHIVE "${ARCHIVE}"
+ REF "${_vdud_REF}"
+ PATCHES ${_vdud_PATCHES}
+ )
+ set(${_vdud_OUT_SOURCE_PATH} "${SOURCE_PATH}" PARENT_SCOPE)
return()
endif()
@@ -164,11 +176,6 @@ function(vcpkg_from_bitbucket)
)
endif()
- vcpkg_extract_source_archive_ex(
- ARCHIVE "${ARCHIVE}"
- WORKING_DIRECTORY "${CURRENT_BUILDTREES_DIR}/src/head"
- )
-
# Parse the github refs response with regex.
# TODO: use some JSON swiss-army-knife utility instead.
file(READ "${ARCHIVE_VERSION}" _contents)
@@ -179,5 +186,12 @@ function(vcpkg_from_bitbucket)
# exports VCPKG_HEAD_VERSION to the caller. This will get picked up by ports.cmake after the build.
set(VCPKG_HEAD_VERSION ${_version} PARENT_SCOPE)
- set_SOURCE_PATH(${CURRENT_BUILDTREES_DIR}/src/head ${_vdud_HEAD_REF})
+ vcpkg_extract_source_archive_ex(
+ OUT_SOURCE_PATH SOURCE_PATH
+ ARCHIVE "${downloaded_file_path}"
+ REF "${_vdud_HEAD_REF}"
+ WORKING_DIRECTORY "${CURRENT_BUILDTREES_DIR}/src/head"
+ PATCHES ${_vdud_PATCHES}
+ )
+ set(${_vdud_OUT_SOURCE_PATH} "${SOURCE_PATH}" PARENT_SCOPE)
endfunction()
diff --git a/scripts/cmake/vcpkg_from_github.cmake b/scripts/cmake/vcpkg_from_github.cmake
index 33de8354d..48bfd828a 100644
--- a/scripts/cmake/vcpkg_from_github.cmake
+++ b/scripts/cmake/vcpkg_from_github.cmake
@@ -80,16 +80,16 @@ function(vcpkg_from_github)
string(REGEX REPLACE "/.*" "" ORG_NAME ${_vdud_REPO})
macro(set_TEMP_SOURCE_PATH BASE BASEREF)
- set(TEMP_SOURCE_PATH "${BASE}/${REPO_NAME}-${BASEREF}")
- if(NOT EXISTS ${TEMP_SOURCE_PATH})
- # Sometimes GitHub strips a leading 'v' off the REF.
- string(REGEX REPLACE "^v" "" REF ${BASEREF})
- string(REPLACE "/" "-" REF ${REF})
- set(TEMP_SOURCE_PATH "${BASE}/${REPO_NAME}-${REF}")
+ set(TEMP_SOURCE_PATH "${BASE}/${REPO_NAME}-${BASEREF}")
if(NOT EXISTS ${TEMP_SOURCE_PATH})
- message(FATAL_ERROR "Could not determine source path: '${BASE}/${REPO_NAME}-${BASEREF}' does not exist")
+ # Sometimes GitHub strips a leading 'v' off the REF.
+ string(REGEX REPLACE "^v" "" REF ${BASEREF})
+ string(REPLACE "/" "-" REF ${REF})
+ set(TEMP_SOURCE_PATH "${BASE}/${REPO_NAME}-${REF}")
+ if(NOT EXISTS ${TEMP_SOURCE_PATH})
+ message(FATAL_ERROR "Could not determine source path: '${BASE}/${REPO_NAME}-${BASEREF}' does not exist")
+ endif()
endif()
- endif()
endmacro()
if(VCPKG_USE_HEAD_VERSION AND NOT DEFINED _vdud_HEAD_REF)
@@ -111,44 +111,14 @@ function(vcpkg_from_github)
FILENAME "${ORG_NAME}-${REPO_NAME}-${SANITIZED_REF}.tar.gz"
)
- # Take the last 10 chars of the REF
- set(REF_MAX_LENGTH 10)
- string(LENGTH ${SANITIZED_REF} REF_LENGTH)
- math(EXPR FROM_REF ${REF_LENGTH}-${REF_MAX_LENGTH})
- if(FROM_REF LESS 0)
- set(FROM_REF 0)
- endif()
- string(SUBSTRING ${SANITIZED_REF} ${FROM_REF} ${REF_LENGTH} SHORTENED_SANITIZED_REF)
-
- # Hash the archive hash along with the patches. Take the first 10 chars of the hash
- set(PATCHSET_HASH "${_vdud_SHA512}")
- foreach(PATCH IN LISTS _vdud_PATCHES)
- get_filename_component(ABSOLUTE_PATCH "${PATCH}" ABSOLUTE BASE_DIR "${CURRENT_PORT_DIR}")
- file(SHA512 ${ABSOLUTE_PATCH} CURRENT_HASH)
- string(APPEND PATCHSET_HASH ${CURRENT_HASH})
- endforeach()
-
- string(SHA512 PATCHSET_HASH ${PATCHSET_HASH})
- string(SUBSTRING ${PATCHSET_HASH} 0 10 PATCHSET_HASH)
- set(SOURCE_PATH "${CURRENT_BUILDTREES_DIR}/src/${SHORTENED_SANITIZED_REF}-${PATCHSET_HASH}")
-
- if(NOT EXISTS ${SOURCE_PATH})
- set(TEMP_DIR "${CURRENT_BUILDTREES_DIR}/src/TEMP")
- file(REMOVE_RECURSE ${TEMP_DIR})
- vcpkg_extract_source_archive_ex(ARCHIVE "${ARCHIVE}" WORKING_DIRECTORY ${TEMP_DIR})
- set_TEMP_SOURCE_PATH(${CURRENT_BUILDTREES_DIR}/src/TEMP ${SANITIZED_REF})
-
- vcpkg_apply_patches(
- SOURCE_PATH ${TEMP_SOURCE_PATH}
- PATCHES ${_vdud_PATCHES}
- )
-
- file(RENAME ${TEMP_SOURCE_PATH} ${SOURCE_PATH})
- file(REMOVE_RECURSE ${TEMP_DIR})
- endif()
+ vcpkg_extract_source_archive_ex(
+ OUT_SOURCE_PATH SOURCE_PATH
+ ARCHIVE "${ARCHIVE}"
+ REF "${SANITIZED_REF}"
+ PATCHES ${_vdud_PATCHES}
+ )
set(${_vdud_OUT_SOURCE_PATH} "${SOURCE_PATH}" PARENT_SCOPE)
- message(STATUS "Using source at ${SOURCE_PATH}")
return()
endif()
@@ -189,11 +159,6 @@ function(vcpkg_from_github)
)
endif()
- vcpkg_extract_source_archive_ex(
- ARCHIVE "${ARCHIVE}"
- WORKING_DIRECTORY "${CURRENT_BUILDTREES_DIR}/src/head"
- )
-
# Parse the github refs response with regex.
# TODO: use some JSON swiss-army-knife utility instead.
file(READ "${ARCHIVE_VERSION}" _contents)
@@ -206,11 +171,12 @@ function(vcpkg_from_github)
set(VCPKG_HEAD_VERSION ${_version} PARENT_SCOPE)
endif()
- set_TEMP_SOURCE_PATH(${CURRENT_BUILDTREES_DIR}/src/head ${SANITIZED_HEAD_REF})
- vcpkg_apply_patches(
- SOURCE_PATH ${TEMP_SOURCE_PATH}
+ vcpkg_extract_source_archive_ex(
+ OUT_SOURCE_PATH SOURCE_PATH
+ ARCHIVE "${downloaded_file_path}"
+ REF "${SANITIZED_HEAD_REF}"
+ WORKING_DIRECTORY ${CURRENT_BUILDTREES_DIR}/src/head
PATCHES ${_vdud_PATCHES}
)
- set(${_vdud_OUT_SOURCE_PATH} "${TEMP_SOURCE_PATH}" PARENT_SCOPE)
- message(STATUS "Using source at ${TEMP_SOURCE_PATH}")
+ set(${_vdud_OUT_SOURCE_PATH} "${SOURCE_PATH}" PARENT_SCOPE)
endfunction()
diff --git a/scripts/cmake/vcpkg_from_gitlab.cmake b/scripts/cmake/vcpkg_from_gitlab.cmake
index 2f2198fd6..f13bc054c 100644
--- a/scripts/cmake/vcpkg_from_gitlab.cmake
+++ b/scripts/cmake/vcpkg_from_gitlab.cmake
@@ -11,6 +11,7 @@
## [REF <v10.7.3>]
## [SHA512 <45d0d7f8cc350...>]
## [HEAD_REF <master>]
+## [PATCHES <patch1.patch> <patch2.patch>...]
## )
## ```
##
@@ -45,6 +46,11 @@
##
## For most projects, this should be `master`. The chosen branch should be one that is expected to be always buildable on all supported platforms.
##
+## ### PATCHES
+## A list of patches to be applied to the extracted sources.
+##
+## Relative paths are based on the port directory.
+##
## ## Notes:
## At least one of `REF` and `HEAD_REF` must be specified, however it is preferable for both to be present.
##
@@ -76,28 +82,14 @@ function(vcpkg_from_gitlab)
message(FATAL_ERROR "At least one of REF and HEAD_REF must be specified.")
endif()
- string(REGEX REPLACE ".*/" "" REPO_NAME ${_vdud_REPO})
- string(REGEX REPLACE "/.*" "" ORG_NAME ${_vdud_REPO})
-
- macro(set_TEMP_SOURCE_PATH BASE)
- file(GLOB _ARCHIVE_FILES "${BASE}/${REPO_NAME}*")
- foreach(dir ${_ARCHIVE_FILES})
- if (IS_DIRECTORY ${dir})
- list(APPEND _ARCHIVE_DIRS "${dir}")
- endif()
- endforeach()
- list(LENGTH _ARCHIVE_DIRS _NUM_ARCHIVE_DIRS)
- if(NOT 1 EQUAL ${_NUM_ARCHIVE_DIRS})
- message(FATAL_ERROR "Could not determine source path: There were ${_NUM_ARCHIVE_DIRS} directories extracted from the archive that start with the repo name.")
- endif()
- list(GET _ARCHIVE_DIRS 0 TEMP_SOURCE_PATH)
- endmacro()
-
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()
+ string(REGEX REPLACE ".*/" "" REPO_NAME ${_vdud_REPO})
+ string(REGEX REPLACE "/.*" "" ORG_NAME ${_vdud_REPO})
+
# Handle --no-head scenarios
if(NOT VCPKG_USE_HEAD_VERSION)
if(NOT _vdud_REF)
@@ -112,43 +104,14 @@ function(vcpkg_from_gitlab)
FILENAME "${ORG_NAME}-${REPO_NAME}-${SANITIZED_REF}.tar.gz"
)
- # Take the last 10 chars of the REF
- set(REF_MAX_LENGTH 10)
- string(LENGTH ${SANITIZED_REF} REF_LENGTH)
- math(EXPR FROM_REF ${REF_LENGTH}-${REF_MAX_LENGTH})
- if(FROM_REF LESS 0)
- set(FROM_REF 0)
- endif()
- string(SUBSTRING ${SANITIZED_REF} ${FROM_REF} ${REF_LENGTH} SHORTENED_SANITIZED_REF)
-
- # Hash the archive hash along with the patches. Take the first 10 chars of the hash
- set(PATCHSET_HASH "${_vdud_SHA512}")
- foreach(PATCH IN LISTS _vdud_PATCHES)
- file(SHA512 ${PATCH} CURRENT_HASH)
- string(APPEND PATCHSET_HASH ${CURRENT_HASH})
- endforeach()
-
- string(SHA512 PATCHSET_HASH ${PATCHSET_HASH})
- string(SUBSTRING ${PATCHSET_HASH} 0 10 PATCHSET_HASH)
- set(SOURCE_PATH "${CURRENT_BUILDTREES_DIR}/src/${SHORTENED_SANITIZED_REF}-${PATCHSET_HASH}")
-
- if(NOT EXISTS ${SOURCE_PATH})
- set(TEMP_DIR "${CURRENT_BUILDTREES_DIR}/src/TEMP")
- file(REMOVE_RECURSE ${TEMP_DIR})
- vcpkg_extract_source_archive_ex(ARCHIVE "${ARCHIVE}" WORKING_DIRECTORY ${TEMP_DIR})
- set_TEMP_SOURCE_PATH(${CURRENT_BUILDTREES_DIR}/src/TEMP ${SANITIZED_REF})
-
- vcpkg_apply_patches(
- SOURCE_PATH ${TEMP_SOURCE_PATH}
- PATCHES ${_vdud_PATCHES}
- )
-
- file(RENAME ${TEMP_SOURCE_PATH} ${SOURCE_PATH})
- file(REMOVE_RECURSE ${TEMP_DIR})
- endif()
+ vcpkg_extract_source_archive_ex(
+ OUT_SOURCE_PATH SOURCE_PATH
+ ARCHIVE "${ARCHIVE}"
+ REF "${SANITIZED_REF}"
+ PATCHES ${_vdud_PATCHES}
+ )
set(${_vdud_OUT_SOURCE_PATH} "${SOURCE_PATH}" PARENT_SCOPE)
-
return()
endif()
@@ -182,10 +145,6 @@ function(vcpkg_from_gitlab)
)
endif()
- vcpkg_extract_source_archive_ex(
- ARCHIVE "${ARCHIVE}"
- WORKING_DIRECTORY "${CURRENT_BUILDTREES_DIR}/src/head"
- )
# There are issues with the Gitlab API project paths being URL-escaped, so we use git here to get the head revision
execute_process(COMMAND ${GIT} ls-remote
"${_vdud_GITLAB_URL}/${ORG_NAME}/${REPO_NAME}.git" "${_vdud_HEAD_REF}"
@@ -199,10 +158,12 @@ function(vcpkg_from_gitlab)
set(VCPKG_HEAD_VERSION ${_version} PARENT_SCOPE)
endif()
- set_TEMP_SOURCE_PATH(${CURRENT_BUILDTREES_DIR}/src/head ${SANITIZED_HEAD_REF})
- vcpkg_apply_patches(
- SOURCE_PATH ${TEMP_SOURCE_PATH}
+ vcpkg_extract_source_archive_ex(
+ OUT_SOURCE_PATH SOURCE_PATH
+ ARCHIVE "${downloaded_file_path}"
+ REF "${SANITIZED_HEAD_REF}"
+ WORKING_DIRECTORY ${CURRENT_BUILDTREES_DIR}/src/head
PATCHES ${_vdud_PATCHES}
)
- set(${_vdud_OUT_SOURCE_PATH} "${TEMP_SOURCE_PATH}" PARENT_SCOPE)
+ set(${_vdud_OUT_SOURCE_PATH} "${SOURCE_PATH}" PARENT_SCOPE)
endfunction()
diff --git a/scripts/cmake/vcpkg_test_cmake.cmake b/scripts/cmake/vcpkg_test_cmake.cmake
new file mode 100644
index 000000000..718b2f69c
--- /dev/null
+++ b/scripts/cmake/vcpkg_test_cmake.cmake
@@ -0,0 +1,53 @@
+## # vcpkg_test_cmake
+##
+## Tests a built package for CMake `find_package()` integration.
+##
+## ## Usage:
+## ```cmake
+## vcpkg_test_cmake(PACKAGE_NAME <name> [MODULE])
+## ```
+##
+## ## Parameters:
+##
+## ### PACKAGE_NAME
+## The expected name to find with `find_package()`.
+##
+## ### MODULE
+## Indicates that the library expects to be found via built-in CMake targets.
+##
+function(vcpkg_test_cmake)
+ cmake_parse_arguments(_tc "MODULE" "PACKAGE_NAME" "" ${ARGN})
+
+ if(NOT DEFINED _tc_PACKAGE_NAME)
+ message(FATAL_ERROR "PACKAGE_NAME must be specified")
+ endif()
+ if(_tc_MODULE)
+ set(PACKAGE_TYPE MODULE)
+ else()
+ set(PACKAGE_TYPE CONFIG)
+ endif()
+
+ message(STATUS "Performing CMake integration test")
+ file(REMOVE_RECURSE ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-test)
+ file(MAKE_DIRECTORY ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-test)
+
+ # Generate test source CMakeLists.txt
+ set(VCPKG_TEST_CMAKELIST ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-test/CMakeLists.txt)
+ file(WRITE ${VCPKG_TEST_CMAKELIST} "cmake_minimum_required(VERSION 3.10)\n")
+ file(APPEND ${VCPKG_TEST_CMAKELIST} "set(CMAKE_PREFIX_PATH \"${CURRENT_PACKAGES_DIR};${CURRENT_INSTALLED_DIR}\")\n")
+ file(APPEND ${VCPKG_TEST_CMAKELIST} "\n")
+ file(APPEND ${VCPKG_TEST_CMAKELIST} "find_package(${_tc_PACKAGE_NAME} ${PACKAGE_TYPE} REQUIRED)\n")
+
+ # Run cmake config with a generated CMakeLists.txt
+ set(LOGPREFIX "${CURRENT_BUILDTREES_DIR}/test-cmake-${TARGET_TRIPLET}")
+ execute_process(
+ COMMAND ${CMAKE_COMMAND} .
+ OUTPUT_FILE "${LOGPREFIX}-out.log"
+ ERROR_FILE "${LOGPREFIX}-err.log"
+ RESULT_VARIABLE error_code
+ WORKING_DIRECTORY ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-test
+ )
+ if(error_code)
+ message(FATAL_ERROR "CMake integration test failed; unable to find_package(${_tc_PACKAGE_NAME} ${PACKAGE_TYPE} REQUIRED)")
+ endif()
+endfunction()
diff --git a/scripts/templates/portfile.in.cmake b/scripts/templates/portfile.in.cmake
index e89ad4640..e44f53aa8 100644
--- a/scripts/templates/portfile.in.cmake
+++ b/scripts/templates/portfile.in.cmake
@@ -31,3 +31,6 @@ vcpkg_install_cmake()
# Handle copyright
# file(INSTALL ${SOURCE_PATH}/LICENSE DESTINATION ${CURRENT_PACKAGES_DIR}/share/@PORT@ RENAME copyright)
+
+# Post-build test for cmake libraries
+# vcpkg_test_cmake(PACKAGE_NAME @PORT@)
diff --git a/scripts/toolchains/osx.cmake b/scripts/toolchains/osx.cmake
index b8f261d09..9c4fdb12e 100644
--- a/scripts/toolchains/osx.cmake
+++ b/scripts/toolchains/osx.cmake
@@ -1,5 +1,11 @@
if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Darwin")
set(CMAKE_CROSSCOMPILING OFF CACHE BOOL "")
+
+ set(CMAKE_SYSTEM_VERSION "${CMAKE_HOST_SYSTEM_VERSION}" CACHE STRING "")
+ set(CMAKE_SYSTEM_PROCESSOR "${CMAKE_HOST_SYSTEM_PROCESSOR}" CACHE STRING "")
+else()
+ set(CMAKE_SYSTEM_VERSION "17.0.0" CACHE STRING "")
+ set(CMAKE_SYSTEM_PROCESSOR "x86_64" CACHE STRING "")
endif()
set(CMAKE_SYSTEM_NAME Darwin CACHE STRING "")
diff --git a/scripts/vcpkgTools.xml b/scripts/vcpkgTools.xml
index 320e86275..c2045433d 100644
--- a/scripts/vcpkgTools.xml
+++ b/scripts/vcpkgTools.xml
@@ -73,6 +73,13 @@
<sha512>2456176ba3d506a07cf0cc4f61f080e1ff8cb4106426d66f354c5bb67a9a8720b5ddb26904275e61b1f623c932355f7dcde4cd17556cc895f11293c23c3a9bf3</sha512>
<archiveName>aria2-1.33.1-win-32bit-build1.zip</archiveName>
</tool>
+ <tool name="ninja" os="windows">
+ <version>1.8.2</version>
+ <exeRelativePath>ninja.exe</exeRelativePath>
+ <url>https://github.com/ninja-build/ninja/releases/download/v1.8.2/ninja-win.zip</url>
+ <sha512>9b9ce248240665fcd6404b989f3b3c27ed9682838225e6dc9b67b551774f251e4ff8a207504f941e7c811e7a8be1945e7bcb94472a335ef15e23a0200a32e6d5</sha512>
+ <archiveName>ninja-win.zip</archiveName>
+ </tool>
<tool name="ninja" os="linux">
<version>1.8.2</version>
<exeRelativePath>ninja</exeRelativePath>