aboutsummaryrefslogtreecommitdiff
path: root/scripts/cmake
diff options
context:
space:
mode:
authoryurybura <yurybura@gmail.com>2018-05-11 13:34:43 +0300
committeryurybura <yurybura@gmail.com>2018-05-11 13:34:43 +0300
commit7d261fbbc39a1d36027299190920e0a7e222ebd7 (patch)
treed9b6745f2e6c670836cbbf61dbd2c4eb9ef857fe /scripts/cmake
parent50e5ee1e40380cf543ae804775462181984a86dc (diff)
parent9535a5631ac212b1c657a02be3ed9398df30c96c (diff)
downloadvcpkg-7d261fbbc39a1d36027299190920e0a7e222ebd7.tar.gz
vcpkg-7d261fbbc39a1d36027299190920e0a7e222ebd7.zip
Merge branch 'master' of https://github.com/yurybura/vcpkg
Diffstat (limited to 'scripts/cmake')
-rw-r--r--scripts/cmake/vcpkg_build_cmake.cmake56
-rw-r--r--scripts/cmake/vcpkg_build_msbuild.cmake23
-rw-r--r--scripts/cmake/vcpkg_configure_cmake.cmake4
-rw-r--r--scripts/cmake/vcpkg_download_distfile.cmake52
-rw-r--r--scripts/cmake/vcpkg_find_acquire_program.cmake46
-rw-r--r--scripts/cmake/vcpkg_fixup_cmake_targets.cmake31
-rw-r--r--scripts/cmake/vcpkg_from_github.cmake73
7 files changed, 229 insertions, 56 deletions
diff --git a/scripts/cmake/vcpkg_build_cmake.cmake b/scripts/cmake/vcpkg_build_cmake.cmake
index bdf192792..983ac9221 100644
--- a/scripts/cmake/vcpkg_build_cmake.cmake
+++ b/scripts/cmake/vcpkg_build_cmake.cmake
@@ -15,6 +15,9 @@
## The target passed to the cmake build command (`cmake --build . --target <target>`). If not specified, no target will
## be passed.
##
+## ### ADD_BIN_TO_PATH
+## Adds the appropriate Release and Debug `bin\` directories to the path during the build such that executables can run against the in-tree DLLs.
+##
## ## Notes:
## This command should be preceeded by a call to [`vcpkg_configure_cmake()`](vcpkg_configure_cmake.md).
## You can use the alias [`vcpkg_install_cmake()`](vcpkg_configure_cmake.md) function if your CMake script supports the
@@ -27,7 +30,7 @@
## * [poco](https://github.com/Microsoft/vcpkg/blob/master/ports/poco/portfile.cmake)
## * [opencv](https://github.com/Microsoft/vcpkg/blob/master/ports/opencv/portfile.cmake)
function(vcpkg_build_cmake)
- cmake_parse_arguments(_bc "DISABLE_PARALLEL" "TARGET;LOGFILE_ROOT" "" ${ARGN})
+ cmake_parse_arguments(_bc "DISABLE_PARALLEL;ADD_BIN_TO_PATH" "TARGET;LOGFILE_ROOT" "" ${ARGN})
if(NOT _bc_LOGFILE_ROOT)
set(_bc_LOGFILE_ROOT "build")
@@ -65,20 +68,24 @@ function(vcpkg_build_cmake)
if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL BUILDTYPE)
if(BUILDTYPE STREQUAL "debug")
set(SHORT_BUILDTYPE "dbg")
+ set(CONFIG "Debug")
else()
set(SHORT_BUILDTYPE "rel")
+ set(CONFIG "Release")
endif()
message(STATUS "Build ${TARGET_TRIPLET}-${SHORT_BUILDTYPE}")
set(LOGPREFIX "${CURRENT_BUILDTREES_DIR}/${_bc_LOGFILE_ROOT}-${TARGET_TRIPLET}-${SHORT_BUILDTYPE}")
set(LOGS)
- if(BUILDTYPE STREQUAL "release")
- set(CONFIG "Release")
- else()
- set(CONFIG "Debug")
+ if(_bc_ADD_BIN_TO_PATH)
+ set(_BACKUP_ENV_PATH "$ENV{PATH}")
+ if(BUILDTYPE STREQUAL "debug")
+ set(ENV{PATH} "${CURRENT_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/debug/bin;$ENV{PATH}")
+ else()
+ set(ENV{PATH} "${CURRENT_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/bin;$ENV{PATH}")
+ endif()
endif()
-
execute_process(
COMMAND ${CMAKE_COMMAND} --build . --config ${CONFIG} ${TARGET_PARAM} -- ${BUILD_ARGS} ${PARALLEL_ARG}
OUTPUT_FILE "${LOGPREFIX}-out.log"
@@ -98,6 +105,7 @@ function(vcpkg_build_cmake)
if(out_contents MATCHES "LINK : fatal error LNK1102:" OR out_contents MATCHES " fatal error C1060: ")
# The linker ran out of memory during execution. We will try continuing once more, with parallelism disabled.
+ message(STATUS "Restarting Build ${TARGET_TRIPLET}-${SHORT_BUILDTYPE} without parallelism because memory exceeded")
execute_process(
COMMAND ${CMAKE_COMMAND} --build . --config ${CONFIG} ${TARGET_PARAM} -- ${BUILD_ARGS} ${NO_PARALLEL_ARG}
OUTPUT_FILE "${LOGPREFIX}-out-1.log"
@@ -116,6 +124,39 @@ function(vcpkg_build_cmake)
list(APPEND LOGS "${LOGPREFIX}-err-1.log")
endif()
endif()
+ elseif(out_contents MATCHES ": No such file or directory")
+ # WSL workaround - WSL occassionally fails with no such file or directory. Detect if we are running in WSL and restart.
+ execute_process(COMMAND "uname" "-r"
+ OUTPUT_VARIABLE UNAME_R ERROR_VARIABLE UNAME_R
+ OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_STRIP_TRAILING_WHITESPACE)
+
+ if (UNAME_R MATCHES "Microsoft")
+ set(ITERATION 0)
+ while (ITERATION LESS 10 AND out_contents MATCHES ": No such file or directory")
+ MATH(EXPR ITERATION "${ITERATION}+1")
+ message(STATUS "Restarting Build ${TARGET_TRIPLET}-${SHORT_BUILDTYPE} because of wsl subsystem issue. Iteration: ${ITERATION}")
+ execute_process(
+ COMMAND ${CMAKE_COMMAND} --build . --config ${CONFIG} ${TARGET_PARAM} -- ${BUILD_ARGS}
+ OUTPUT_FILE "${LOGPREFIX}-out-${ITERATION}.log"
+ ERROR_FILE "${LOGPREFIX}-err-${ITERATION}.log"
+ RESULT_VARIABLE error_code
+ WORKING_DIRECTORY ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-${SHORT_BUILDTYPE})
+
+ if(error_code)
+ file(READ "${LOGPREFIX}-out-${ITERATION}.log" out_contents)
+ file(READ "${LOGPREFIX}-err-${ITERATION}.log" err_contents)
+
+ if(out_contents)
+ list(APPEND LOGS "${LOGPREFIX}-out-${ITERATION}.log")
+ endif()
+ if(err_contents)
+ list(APPEND LOGS "${LOGPREFIX}-err-${ITERATION}.log")
+ endif()
+ else()
+ break()
+ endif()
+ endwhile()
+ endif()
endif()
if(error_code)
@@ -134,6 +175,9 @@ function(vcpkg_build_cmake)
endif()
endif()
message(STATUS "Build ${TARGET_TRIPLET}-${SHORT_BUILDTYPE} done")
+ if(_bc_ADD_BIN_TO_PATH)
+ set(ENV{PATH} "${_BACKUP_ENV_PATH}")
+ endif()
endif()
endforeach()
endfunction()
diff --git a/scripts/cmake/vcpkg_build_msbuild.cmake b/scripts/cmake/vcpkg_build_msbuild.cmake
index b8403d277..db04530ef 100644
--- a/scripts/cmake/vcpkg_build_msbuild.cmake
+++ b/scripts/cmake/vcpkg_build_msbuild.cmake
@@ -19,6 +19,11 @@
## ```
##
## ## Parameters
+## ### USE_VCPKG_INTEGRATION
+## Apply the normal `integrate install` integration for building the project.
+##
+## By default, projects built with this command will not automatically link libraries or have header paths set.
+##
## ### PROJECT_PATH
## The path to the solution (`.sln`) or project (`.vcxproj`) file.
##
@@ -56,7 +61,13 @@
## * [cppunit](https://github.com/Microsoft/vcpkg/blob/master/ports/cppunit/portfile.cmake)
function(vcpkg_build_msbuild)
- cmake_parse_arguments(_csc "" "PROJECT_PATH;RELEASE_CONFIGURATION;DEBUG_CONFIGURATION;PLATFORM;PLATFORM_TOOLSET;TARGET_PLATFORM_VERSION;TARGET" "OPTIONS;OPTIONS_RELEASE;OPTIONS_DEBUG" ${ARGN})
+ cmake_parse_arguments(
+ _csc
+ "USE_VCPKG_INTEGRATION"
+ "PROJECT_PATH;RELEASE_CONFIGURATION;DEBUG_CONFIGURATION;PLATFORM;PLATFORM_TOOLSET;TARGET_PLATFORM_VERSION;TARGET"
+ "OPTIONS;OPTIONS_RELEASE;OPTIONS_DEBUG"
+ ${ARGN}
+ )
if(NOT DEFINED _csc_RELEASE_CONFIGURATION)
set(_csc_RELEASE_CONFIGURATION Release)
@@ -87,6 +98,16 @@ function(vcpkg_build_msbuild)
/m
)
+ if(VCPKG_LIBRARY_LINKAGE STREQUAL "static")
+ # Disable LTCG for static libraries because this setting introduces ABI incompatibility between minor compiler versions
+ # TODO: Add a way for the user to override this if they want to opt-in to incompatibility
+ list(APPEND _csc_OPTIONS /p:WholeProgramOptimization=false)
+ endif()
+
+ if(_csc_USE_VCPKG_INTEGRATION)
+ list(APPEND _csc_OPTIONS /p:ForceImportBeforeCppTargets=${VCPKG_ROOT_DIR}/scripts/buildsystems/msbuild/vcpkg.targets)
+ endif()
+
if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "release")
message(STATUS "Building ${_csc_PROJECT_PATH} for Release")
file(MAKE_DIRECTORY ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel)
diff --git a/scripts/cmake/vcpkg_configure_cmake.cmake b/scripts/cmake/vcpkg_configure_cmake.cmake
index 951b6443f..3e0922428 100644
--- a/scripts/cmake/vcpkg_configure_cmake.cmake
+++ b/scripts/cmake/vcpkg_configure_cmake.cmake
@@ -115,6 +115,7 @@ function(vcpkg_configure_cmake)
vcpkg_find_acquire_program(NINJA)
get_filename_component(NINJA_PATH ${NINJA} DIRECTORY)
set(ENV{PATH} "$ENV{PATH};${NINJA_PATH}")
+ list(APPEND _csc_OPTIONS "-DCMAKE_MAKE_PROGRAM=${NINJA}")
endif()
file(REMOVE_RECURSE ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-dbg)
@@ -164,6 +165,7 @@ function(vcpkg_configure_cmake)
list(APPEND _csc_OPTIONS
"-DVCPKG_TARGET_TRIPLET=${TARGET_TRIPLET}"
+ "-DVCPKG_PLATFORM_TOOLSET=${VCPKG_PLATFORM_TOOLSET}"
"-DCMAKE_EXPORT_NO_PACKAGE_REGISTRY=ON"
"-DCMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY=ON"
"-DCMAKE_FIND_PACKAGE_NO_SYSTEM_PACKAGE_REGISTRY=ON"
@@ -180,6 +182,8 @@ function(vcpkg_configure_cmake)
"-DVCPKG_C_FLAGS_DEBUG=${VCPKG_C_FLAGS_DEBUG}"
"-DVCPKG_CRT_LINKAGE=${VCPKG_CRT_LINKAGE}"
"-DVCPKG_LINKER_FLAGS=${VCPKG_LINKER_FLAGS}"
+ "-DCMAKE_INSTALL_LIBDIR:STRING=lib"
+ "-DCMAKE_INSTALL_BINDIR:STRING=bin"
)
if(DEFINED ARCH)
diff --git a/scripts/cmake/vcpkg_download_distfile.cmake b/scripts/cmake/vcpkg_download_distfile.cmake
index 4b111f3f0..9fc0a0c9a 100644
--- a/scripts/cmake/vcpkg_download_distfile.cmake
+++ b/scripts/cmake/vcpkg_download_distfile.cmake
@@ -103,19 +103,53 @@ function(vcpkg_download_distfile VAR)
endif()
# Tries to download the file.
- foreach(url IN LISTS vcpkg_download_distfile_URLS)
- message(STATUS "Downloading ${url}...")
- file(DOWNLOAD ${url} "${download_file_path_part}" STATUS download_status)
- list(GET download_status 0 status_code)
- if (NOT "${status_code}" STREQUAL "0")
- message(STATUS "Downloading ${url}... Failed. Status: ${download_status}")
+ list(GET vcpkg_download_distfile_URLS 0 SAMPLE_URL)
+ if(${_VCPKG_DOWNLOAD_TOOL} MATCHES "ARIA2" AND NOT ${SAMPLE_URL} MATCHES "aria2")
+ vcpkg_find_acquire_program("ARIA2")
+ message(STATUS "Downloading ${vcpkg_download_distfile_FILENAME}...")
+ execute_process(
+ COMMAND ${ARIA2} ${vcpkg_download_distfile_URLS}
+ -o temp/${vcpkg_download_distfile_FILENAME}
+ -l download-${vcpkg_download_distfile_FILENAME}-detailed.log
+ OUTPUT_FILE download-${vcpkg_download_distfile_FILENAME}-out.log
+ ERROR_FILE download-${vcpkg_download_distfile_FILENAME}-err.log
+ RESULT_VARIABLE error_code
+ WORKING_DIRECTORY ${DOWNLOADS}
+ )
+ if (NOT "${error_code}" STREQUAL "0")
+ message(STATUS
+ "Downloading ${vcpkg_download_distfile_FILENAME}... Failed.\n"
+ " Exit Code: ${error_code}\n"
+ " See logs for more information:\n"
+ " ${DOWNLOADS}/download-${vcpkg_download_distfile_FILENAME}-out.log\n"
+ " ${DOWNLOADS}/download-${vcpkg_download_distfile_FILENAME}-err.log\n"
+ " ${DOWNLOADS}/download-${vcpkg_download_distfile_FILENAME}-detailed.log\n"
+ )
set(download_success 0)
else()
- message(STATUS "Downloading ${url}... OK")
+ message(STATUS "Downloading ${vcpkg_download_distfile_FILENAME}... OK")
+ file(REMOVE
+ ${DOWNLOADS}/download-${vcpkg_download_distfile_FILENAME}-out.log
+ ${DOWNLOADS}/download-${vcpkg_download_distfile_FILENAME}-err.log
+ ${DOWNLOADS}/download-${vcpkg_download_distfile_FILENAME}-detailed.log
+ )
set(download_success 1)
- break()
endif()
- endforeach(url)
+ else()
+ foreach(url IN LISTS vcpkg_download_distfile_URLS)
+ message(STATUS "Downloading ${url}...")
+ file(DOWNLOAD ${url} "${download_file_path_part}" STATUS download_status)
+ list(GET download_status 0 status_code)
+ if (NOT "${status_code}" STREQUAL "0")
+ message(STATUS "Downloading ${url}... Failed. Status: ${download_status}")
+ set(download_success 0)
+ else()
+ message(STATUS "Downloading ${url}... OK")
+ set(download_success 1)
+ break()
+ endif()
+ endforeach(url)
+ endif()
if (NOT download_success)
message(FATAL_ERROR
diff --git a/scripts/cmake/vcpkg_find_acquire_program.cmake b/scripts/cmake/vcpkg_find_acquire_program.cmake
index 21d7ecd8f..39a722d93 100644
--- a/scripts/cmake/vcpkg_find_acquire_program.cmake
+++ b/scripts/cmake/vcpkg_find_acquire_program.cmake
@@ -25,6 +25,7 @@
## - NASM
## - NINJA
## - YASM
+## - ARIA2 (Downloader)
##
## Note that msys2 has a dedicated helper function: [`vcpkg_acquire_msys`](vcpkg_acquire_msys.md).
##
@@ -40,6 +41,7 @@ function(vcpkg_find_acquire_program VAR)
endif()
unset(NOEXTRACT)
+ unset(_vfa_RENAME)
unset(SUBDIR)
unset(REQUIRED_INTERPRETER)
@@ -49,12 +51,16 @@ function(vcpkg_find_acquire_program VAR)
if(VAR MATCHES "PERL")
set(PROGNAME perl)
set(PATHS ${DOWNLOADS}/tools/perl/perl/bin)
+ set(BREW_PACKAGE_NAME "perl")
+ set(APT_PACKAGE_NAME "perl")
set(URL "http://strawberryperl.com/download/5.24.1.1/strawberry-perl-5.24.1.1-32bit-portable.zip")
set(ARCHIVE "strawberry-perl-5.24.1.1-32bit-portable.zip")
set(HASH a6e685ea24376f50db5f06c5b46075f1d3be25168fa1f27fa9b02e2ac017826cee62a2b43562f9b6c989337a231ba914416c110075457764de2d11f99d5e0f26)
elseif(VAR MATCHES "NASM")
set(PROGNAME nasm)
set(PATHS ${DOWNLOADS}/tools/nasm/nasm-2.12.02)
+ set(BREW_PACKAGE_NAME "nasm")
+ set(APT_PACKAGE_NAME "nasm")
set(URL
"http://www.nasm.us/pub/nasm/releasebuilds/2.12.02/win32/nasm-2.12.02-win32.zip"
"http://mirrors.kodi.tv/build-deps/win32/nasm-2.12.02-win32.zip"
@@ -63,11 +69,13 @@ function(vcpkg_find_acquire_program VAR)
set(HASH df7aaba094e17832688c88993997612a2e2c96cc3dc14ca3e8347b44c7762115f5a7fc6d7f20be402553aaa4c9e43ddfcf6228f581cfe89289bae550de151b36)
elseif(VAR MATCHES "YASM")
set(PROGNAME yasm)
- set(PATHS ${DOWNLOADS}/tools/yasm)
- set(URL "http://www.tortall.net/projects/yasm/releases/yasm-1.3.0-win32.exe")
- set(ARCHIVE "yasm.exe")
+ set(SUBDIR 1.3.0.6)
+ set(PATHS ${DOWNLOADS}/tools/yasm/${SUBDIR})
+ set(URL "https://www.tortall.net/projects/yasm/snapshots/v1.3.0.6.g1962/yasm-1.3.0.6.g1962.exe")
+ set(ARCHIVE "yasm-1.3.0.6.g1962.exe")
+ set(_vfa_RENAME "yasm.exe")
set(NOEXTRACT ON)
- set(HASH 850b26be5bbbdaeaf45ac39dd27f69f1a85e600c35afbd16b9f621396b3c7a19863ea3ff316b025b578fce0a8280eef2203306a2b3e46ee1389abb65313fb720)
+ set(HASH c1945669d983b632a10c5ff31e86d6ecbff143c3d8b2c433c0d3d18f84356d2b351f71ac05fd44e5403651b00c31db0d14615d7f9a6ecce5750438d37105c55b)
elseif(VAR MATCHES "PYTHON3")
set(PROGNAME python)
set(SUBDIR "python3")
@@ -98,14 +106,20 @@ function(vcpkg_find_acquire_program VAR)
set(HASH 830cd94ed6518fbe4604a0f5a3322671b4674b87d25a71349c745500d38e85c0fac4f6995242fc5521eb048e3966bb5ec2a96a06b041343ed8da9bba78124f34)
elseif(VAR MATCHES "7Z")
set(PROGNAME 7z)
- set(PATHS "${PROGRAM_FILES_PLATFORM_BITNESS}/7-Zip" "${PROGRAM_FILES_32_BIT}/7-Zip" ${DOWNLOADS}/tools/7z/Files/7-Zip)
+ set(PATHS "${PROGRAM_FILES_PLATFORM_BITNESS}/7-Zip" "${PROGRAM_FILES_32_BIT}/7-Zip" "${DOWNLOADS}/tools/7z/Files/7-Zip")
set(URL "http://7-zip.org/a/7z1604.msi")
set(ARCHIVE "7z1604.msi")
set(HASH 556f95f7566fe23704d136239e4cf5e2a26f939ab43b44145c91b70d031a088d553e5c21301f1242a2295dcde3143b356211f0108c68e65eef8572407618326d)
elseif(VAR MATCHES "NINJA")
set(PROGNAME ninja)
set(SUBDIR "ninja-1.8.2")
- set(PATHS ${DOWNLOADS}/tools/ninja/${SUBDIR})
+ if(CMAKE_HOST_WIN32)
+ set(PATHS "${DOWNLOADS}/tools/ninja/${SUBDIR}")
+ elseif(CMAKE_HOST_SYSTEM_NAME STREQUAL "Darwin")
+ set(PATHS "${DOWNLOADS}/tools/${SUBDIR}-osx")
+ else()
+ set(PATHS "${DOWNLOADS}/tools/${SUBDIR}-linux")
+ endif()
set(BREW_PACKAGE_NAME "ninja")
set(APT_PACKAGE_NAME "ninja-build")
set(URL "https://github.com/ninja-build/ninja/releases/download/v1.8.2/ninja-win.zip")
@@ -167,6 +181,13 @@ function(vcpkg_find_acquire_program VAR)
set(URL "http://ftp.stack.nl/pub/users/dimitri/doxygen-1.8.14.windows.bin.zip")
set(ARCHIVE "doxygen-1.8.14.windows.bin.zip")
set(HASH d0d706501e7112045b1f401f22d12a2c8d9b7728edee9ad1975a17dff914c16494ae48a70beab6f6304643779935843f268c7afed3b9da7d403b5cb11cac0c50)
+ # Download Tools
+ elseif(VAR MATCHES "ARIA2")
+ set(PROGNAME aria2c)
+ set(PATHS ${DOWNLOADS}/tools/aria2c/aria2-1.33.1-win-32bit-build1)
+ set(URL "https://github.com/aria2/aria2/releases/download/release-1.33.1/aria2-1.33.1-win-32bit-build1.zip")
+ set(ARCHIVE "aria2-1.33.1-win-32bit-build1.zip")
+ set(HASH 2456176ba3d506a07cf0cc4f61f080e1ff8cb4106426d66f354c5bb67a9a8720b5ddb26904275e61b1f623c932355f7dcde4cd17556cc895f11293c23c3a9bf3)
else()
message(FATAL "unknown tool ${VAR} -- unable to acquire.")
endif()
@@ -199,15 +220,20 @@ function(vcpkg_find_acquire_program VAR)
FILENAME ${ARCHIVE}
)
- file(MAKE_DIRECTORY ${DOWNLOADS}/tools/${PROGNAME}/${SUBDIR})
+ set(PROG_PATH_SUBDIR "${DOWNLOADS}/tools/${PROGNAME}/${SUBDIR}")
+ file(MAKE_DIRECTORY ${PROG_PATH_SUBDIR})
if(DEFINED NOEXTRACT)
- file(COPY ${ARCHIVE_PATH} DESTINATION ${DOWNLOADS}/tools/${PROGNAME}/${SUBDIR})
+ if(DEFINED _vfa_RENAME)
+ file(INSTALL ${ARCHIVE_PATH} DESTINATION ${PROG_PATH_SUBDIR} RENAME ${_vfa_RENAME})
+ else()
+ file(COPY ${ARCHIVE_PATH} DESTINATION ${PROG_PATH_SUBDIR})
+ endif()
else()
get_filename_component(ARCHIVE_EXTENSION ${ARCHIVE} EXT)
string(TOLOWER "${ARCHIVE_EXTENSION}" ARCHIVE_EXTENSION)
if(ARCHIVE_EXTENSION STREQUAL ".msi")
file(TO_NATIVE_PATH "${ARCHIVE_PATH}" ARCHIVE_NATIVE_PATH)
- file(TO_NATIVE_PATH "${DOWNLOADS}/tools/${PROGNAME}/${SUBDIR}" DESTINATION_NATIVE_PATH)
+ file(TO_NATIVE_PATH "${PROG_PATH_SUBDIR}" DESTINATION_NATIVE_PATH)
execute_process(
COMMAND msiexec /a ${ARCHIVE_NATIVE_PATH} /qn TARGETDIR=${DESTINATION_NATIVE_PATH}
WORKING_DIRECTORY ${DOWNLOADS}
@@ -215,7 +241,7 @@ function(vcpkg_find_acquire_program VAR)
else()
execute_process(
COMMAND ${CMAKE_COMMAND} -E tar xzf ${ARCHIVE_PATH}
- WORKING_DIRECTORY ${DOWNLOADS}/tools/${PROGNAME}/${SUBDIR}
+ WORKING_DIRECTORY ${PROG_PATH_SUBDIR}
)
endif()
endif()
diff --git a/scripts/cmake/vcpkg_fixup_cmake_targets.cmake b/scripts/cmake/vcpkg_fixup_cmake_targets.cmake
index 7f1f827c2..47c91f83c 100644
--- a/scripts/cmake/vcpkg_fixup_cmake_targets.cmake
+++ b/scripts/cmake/vcpkg_fixup_cmake_targets.cmake
@@ -28,6 +28,12 @@ function(vcpkg_fixup_cmake_targets)
set(RELEASE_SHARE ${CURRENT_PACKAGES_DIR}/${_vfct_TARGET_PATH})
if(_vfct_CONFIG_PATH AND NOT RELEASE_SHARE STREQUAL "${CURRENT_PACKAGES_DIR}/${_vfct_CONFIG_PATH}")
+ if(_vfct_CONFIG_PATH STREQUAL "share")
+ file(RENAME ${CURRENT_PACKAGES_DIR}/debug/share ${CURRENT_PACKAGES_DIR}/debug/share2)
+ file(RENAME ${CURRENT_PACKAGES_DIR}/share ${CURRENT_PACKAGES_DIR}/share2)
+ set(_vfct_CONFIG_PATH share2)
+ endif()
+
set(DEBUG_CONFIG ${CURRENT_PACKAGES_DIR}/debug/${_vfct_CONFIG_PATH})
set(RELEASE_CONFIG ${CURRENT_PACKAGES_DIR}/${_vfct_CONFIG_PATH})
@@ -36,6 +42,7 @@ function(vcpkg_fixup_cmake_targets)
message(FATAL_ERROR "'${DEBUG_CONFIG}' does not exist.")
endif()
+ # This roundabout handling enables CONFIG_PATH share
file(MAKE_DIRECTORY ${DEBUG_SHARE})
file(GLOB FILES ${DEBUG_CONFIG}/*)
file(COPY ${FILES} DESTINATION ${DEBUG_SHARE})
@@ -76,12 +83,12 @@ function(vcpkg_fixup_cmake_targets)
endif()
if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "debug")
- if(NOT EXISTS ${DEBUG_SHARE})
+ if(NOT EXISTS "${DEBUG_SHARE}")
message(FATAL_ERROR "'${DEBUG_SHARE}' does not exist.")
endif()
endif()
- file(GLOB UNUSED_FILES
+ file(GLOB_RECURSE UNUSED_FILES
"${DEBUG_SHARE}/*[Tt]argets.cmake"
"${DEBUG_SHARE}/*[Cc]onfig.cmake"
"${DEBUG_SHARE}/*[Cc]onfigVersion.cmake"
@@ -91,10 +98,10 @@ function(vcpkg_fixup_cmake_targets)
file(REMOVE ${UNUSED_FILES})
endif()
- file(GLOB RELEASE_TARGETS
+ file(GLOB_RECURSE RELEASE_TARGETS
"${RELEASE_SHARE}/*-release.cmake"
)
- foreach(RELEASE_TARGET ${RELEASE_TARGETS})
+ foreach(RELEASE_TARGET IN LISTS RELEASE_TARGETS)
file(READ ${RELEASE_TARGET} _contents)
string(REPLACE "${CURRENT_INSTALLED_DIR}" "\${_IMPORT_PREFIX}" _contents "${_contents}")
string(REGEX REPLACE "\\\${_IMPORT_PREFIX}/bin/([^ \"]+\\.exe)" "\${_IMPORT_PREFIX}/tools/${PORT}/\\1" _contents "${_contents}")
@@ -102,25 +109,25 @@ function(vcpkg_fixup_cmake_targets)
endforeach()
if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "debug")
- file(GLOB DEBUG_TARGETS
+ file(GLOB_RECURSE DEBUG_TARGETS
"${DEBUG_SHARE}/*-debug.cmake"
)
- foreach(DEBUG_TARGET ${DEBUG_TARGETS})
- get_filename_component(DEBUG_TARGET_NAME ${DEBUG_TARGET} NAME)
+ foreach(DEBUG_TARGET IN LISTS DEBUG_TARGETS)
+ file(RELATIVE_PATH DEBUG_TARGET_REL "${DEBUG_SHARE}" "${DEBUG_TARGET}")
file(READ ${DEBUG_TARGET} _contents)
string(REPLACE "${CURRENT_INSTALLED_DIR}" "\${_IMPORT_PREFIX}" _contents "${_contents}")
string(REGEX REPLACE "\\\${_IMPORT_PREFIX}/bin/([^ \"]+\\.exe)" "\${_IMPORT_PREFIX}/tools/${PORT}/\\1" _contents "${_contents}")
string(REPLACE "\${_IMPORT_PREFIX}/lib" "\${_IMPORT_PREFIX}/debug/lib" _contents "${_contents}")
string(REPLACE "\${_IMPORT_PREFIX}/bin" "\${_IMPORT_PREFIX}/debug/bin" _contents "${_contents}")
- file(WRITE ${CURRENT_PACKAGES_DIR}/${_vfct_TARGET_PATH}/${DEBUG_TARGET_NAME} "${_contents}")
+ file(WRITE ${RELEASE_SHARE}/${DEBUG_TARGET_REL} "${_contents}")
file(REMOVE ${DEBUG_TARGET})
endforeach()
endif()
- file(GLOB MAIN_TARGETS "${RELEASE_SHARE}/*[Tt]argets.cmake")
- foreach(MAIN_TARGET ${MAIN_TARGETS})
+ file(GLOB_RECURSE MAIN_TARGETS "${RELEASE_SHARE}/*[Tt]argets.cmake")
+ foreach(MAIN_TARGET IN LISTS MAIN_TARGETS)
file(READ ${MAIN_TARGET} _contents)
string(REGEX REPLACE
"get_filename_component\\(_IMPORT_PREFIX \"\\\${CMAKE_CURRENT_LIST_FILE}\" PATH\\)(\nget_filename_component\\(_IMPORT_PREFIX \"\\\${_IMPORT_PREFIX}\" PATH\\))*"
@@ -133,8 +140,8 @@ function(vcpkg_fixup_cmake_targets)
file(WRITE ${MAIN_TARGET} "${_contents}")
endforeach()
- file(GLOB MAIN_CONFIGS "${RELEASE_SHARE}/*[Cc]onfig.cmake")
- foreach(MAIN_CONFIG ${MAIN_CONFIGS})
+ file(GLOB_RECURSE MAIN_CONFIGS "${RELEASE_SHARE}/*[Cc]onfig.cmake")
+ foreach(MAIN_CONFIG IN LISTS MAIN_CONFIGS)
file(READ ${MAIN_CONFIG} _contents)
string(REGEX REPLACE
"get_filename_component\\(_IMPORT_PREFIX \"\\\${CMAKE_CURRENT_LIST_FILE}\" PATH\\)(\nget_filename_component\\(_IMPORT_PREFIX \"\\\${_IMPORT_PREFIX}\" PATH\\))*"
diff --git a/scripts/cmake/vcpkg_from_github.cmake b/scripts/cmake/vcpkg_from_github.cmake
index c6a23cff6..28ada0631 100644
--- a/scripts/cmake/vcpkg_from_github.cmake
+++ b/scripts/cmake/vcpkg_from_github.cmake
@@ -51,7 +51,7 @@
## * [beast](https://github.com/Microsoft/vcpkg/blob/master/ports/beast/portfile.cmake)
function(vcpkg_from_github)
set(oneValueArgs OUT_SOURCE_PATH REPO REF SHA512 HEAD_REF)
- set(multipleValuesArgs)
+ set(multipleValuesArgs PATCHES)
cmake_parse_arguments(_vdud "" "${oneValueArgs}" "${multipleValuesArgs}" ${ARGN})
if(NOT DEFINED _vdud_OUT_SOURCE_PATH)
@@ -73,21 +73,17 @@ function(vcpkg_from_github)
string(REGEX REPLACE ".*/" "" REPO_NAME ${_vdud_REPO})
string(REGEX REPLACE "/.*" "" ORG_NAME ${_vdud_REPO})
- macro(set_SOURCE_PATH BASE BASEREF)
- set(SOURCE_PATH "${BASE}/${REPO_NAME}-${BASEREF}")
- if(EXISTS ${SOURCE_PATH})
- set(${_vdud_OUT_SOURCE_PATH} "${SOURCE_PATH}" PARENT_SCOPE)
- else()
- # Sometimes GitHub strips a leading 'v' off the REF.
- string(REGEX REPLACE "^v" "" REF ${BASEREF})
- string(REPLACE "/" "-" REF ${REF})
- set(SOURCE_PATH "${BASE}/${REPO_NAME}-${REF}")
- if(EXISTS ${SOURCE_PATH})
- set(${_vdud_OUT_SOURCE_PATH} "${SOURCE_PATH}" PARENT_SCOPE)
- else()
- message(FATAL_ERROR "Could not determine source path: '${BASE}/${REPO_NAME}-${BASEREF}' does not exist")
- endif()
+ 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}")
+ if(NOT EXISTS ${TEMP_SOURCE_PATH})
+ message(FATAL_ERROR "Could not determine source path: '${BASE}/${REPO_NAME}-${BASEREF}' does not exist")
endif()
+ endif()
endmacro()
if(VCPKG_USE_HEAD_VERSION AND NOT DEFINED _vdud_HEAD_REF)
@@ -108,8 +104,44 @@ function(vcpkg_from_github)
SHA512 "${_vdud_SHA512}"
FILENAME "${ORG_NAME}-${REPO_NAME}-${SANITIZED_REF}.tar.gz"
)
- vcpkg_extract_source_archive_ex(ARCHIVE "${ARCHIVE}")
- set_SOURCE_PATH(${CURRENT_BUILDTREES_DIR}/src ${SANITIZED_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
+ 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()
+
+ set(${_vdud_OUT_SOURCE_PATH} "${SOURCE_PATH}" PARENT_SCOPE)
+
return()
endif()
@@ -167,5 +199,10 @@ function(vcpkg_from_github)
set(VCPKG_HEAD_VERSION ${_version} PARENT_SCOPE)
endif()
- set_SOURCE_PATH(${CURRENT_BUILDTREES_DIR}/src/head ${SANITIZED_HEAD_REF})
+ set_TEMP_SOURCE_PATH(${CURRENT_BUILDTREES_DIR}/src/head ${SANITIZED_HEAD_REF})
+ vcpkg_apply_patches(
+ SOURCE_PATH ${TEMP_SOURCE_PATH}
+ PATCHES ${_vdud_PATCHES}
+ )
+ set(${_vdud_OUT_SOURCE_PATH} "${TEMP_SOURCE_PATH}" PARENT_SCOPE)
endfunction()