cmake: Wrap vcpkg code in a function.

Wrap the main body of code in Set-Toolchain-vcpkg.cmake in the
vcpkg_set_toolchain() function to not pollute the global variable
namespace with helper variables.

VCPKG_ROOT and toolchain variables are set in the cache.

Signed-off-by: Rafael Kitover <rkitover@gmail.com>
This commit is contained in:
Rafael Kitover 2020-01-17 21:55:26 +00:00
parent 47880ff9c6
commit 5cc1fd28b4
No known key found for this signature in database
GPG Key ID: 08AB596679D86240
1 changed files with 130 additions and 124 deletions

View File

@ -1,10 +1,14 @@
macro(vcpkg_check_git_status) if(NOT DEFINED VCPKG_TARGET_TRIPLET)
if(NOT vcpkg_git_status EQUAL 0) return()
endif()
function(vcpkg_check_git_status git_status)
if(NOT git_status EQUAL 0)
message(FATAL_ERROR "Error updating vcpkg from git, please make sure git for windows is installed correctly, it can be installed from Visual Studio components") message(FATAL_ERROR "Error updating vcpkg from git, please make sure git for windows is installed correctly, it can be installed from Visual Studio components")
endif() endif()
endmacro() endfunction()
function(vcpkg_get_first_upgrade) function(vcpkg_get_first_upgrade vcpkg_exe)
# First get the list of upgraded ports. # First get the list of upgraded ports.
execute_process( execute_process(
COMMAND ${vcpkg_exe} upgrade COMMAND ${vcpkg_exe} upgrade
@ -18,18 +22,15 @@ function(vcpkg_get_first_upgrade)
foreach(line ${upgrade_lines}) foreach(line ${upgrade_lines})
if(${line} MATCHES "^ [* ] ") if(${line} MATCHES "^ [* ] ")
string(REGEX REPLACE "^ [* ] " "" vcpkg_first_upgrade ${line}) string(REGEX REPLACE "^ [* ] " "" first_upgrade ${line})
set(vcpkg_first_upgrade ${vcpkg_first_upgrade} PARENT_SCOPE) set(first_upgrade ${first_upgrade} PARENT_SCOPE)
return() return()
endif() endif()
endforeach() endforeach()
endfunction() endfunction()
if(NOT DEFINED VCPKG_TARGET_TRIPLET) function(vcpkg_set_toolchain)
return() if(NOT DEFINED ENV{VCPKG_ROOT})
endif()
if(NOT DEFINED ENV{VCPKG_ROOT})
if(WIN32) if(WIN32)
if(DEFINED ENV{CI} OR EXISTS /vcpkg) if(DEFINED ENV{CI} OR EXISTS /vcpkg)
set(VCPKG_ROOT /vcpkg) set(VCPKG_ROOT /vcpkg)
@ -43,21 +44,23 @@ if(NOT DEFINED ENV{VCPKG_ROOT})
endif() endif()
set(ENV{VCPKG_ROOT} ${VCPKG_ROOT}) set(ENV{VCPKG_ROOT} ${VCPKG_ROOT})
else() else()
set(VCPKG_ROOT $ENV{VCPKG_ROOT}) set(VCPKG_ROOT $ENV{VCPKG_ROOT})
endif() endif()
if(NOT EXISTS ${VCPKG_ROOT}) set(VCPKG_ROOT ${VCPKG_ROOT} CACHE FILEPATH "vcpkg installation root path" FORCE)
get_filename_component(vcpkg_root_parent ${VCPKG_ROOT}/.. ABSOLUTE)
if(NOT EXISTS ${VCPKG_ROOT})
get_filename_component(root_parent ${VCPKG_ROOT}/.. ABSOLUTE)
execute_process( execute_process(
COMMAND git clone https://github.com/microsoft/vcpkg.git COMMAND git clone https://github.com/microsoft/vcpkg.git
RESULT_VARIABLE vcpkg_git_status RESULT_VARIABLE git_status
WORKING_DIRECTORY ${vcpkg_root_parent} WORKING_DIRECTORY ${root_parent}
) )
vcpkg_check_git_status() vcpkg_check_git_status(${git_status})
else() else()
# this is the case when we cache vcpkg/installed with the appveyor build cache # this is the case when we cache vcpkg/installed with the appveyor build cache
if(NOT EXISTS ${VCPKG_ROOT}/.git) if(NOT EXISTS ${VCPKG_ROOT}/.git)
set(git_commands set(git_commands
@ -72,50 +75,50 @@ else()
execute_process( execute_process(
COMMAND ${git_command} COMMAND ${git_command}
RESULT_VARIABLE vcpkg_git_status RESULT_VARIABLE git_status
WORKING_DIRECTORY ${VCPKG_ROOT} WORKING_DIRECTORY ${VCPKG_ROOT}
) )
vcpkg_check_git_status() vcpkg_check_git_status(${git_status})
endforeach() endforeach()
else() else()
execute_process( execute_process(
COMMAND git fetch origin COMMAND git fetch origin
RESULT_VARIABLE vcpkg_git_status RESULT_VARIABLE git_status
WORKING_DIRECTORY ${VCPKG_ROOT} WORKING_DIRECTORY ${VCPKG_ROOT}
) )
vcpkg_check_git_status() vcpkg_check_git_status(${git_status})
execute_process( execute_process(
COMMAND git status COMMAND git status
RESULT_VARIABLE vcpkg_git_status RESULT_VARIABLE git_status
OUTPUT_VARIABLE git_status_text OUTPUT_VARIABLE git_status_text
WORKING_DIRECTORY ${VCPKG_ROOT} WORKING_DIRECTORY ${VCPKG_ROOT}
) )
vcpkg_check_git_status() vcpkg_check_git_status(${git_status})
set(vcpkg_git_up_to_date FALSE) set(git_up_to_date FALSE)
if(git_status_text MATCHES "Your branch is up to date with") if(git_status_text MATCHES "Your branch is up to date with")
set(vcpkg_git_up_to_date TRUE) set(git_up_to_date TRUE)
endif() endif()
if(NOT vcpkg_git_up_to_date) if(NOT git_up_to_date)
execute_process( execute_process(
COMMAND git pull --rebase COMMAND git pull --rebase
RESULT_VARIABLE vcpkg_git_status RESULT_VARIABLE git_status
WORKING_DIRECTORY ${VCPKG_ROOT} WORKING_DIRECTORY ${VCPKG_ROOT}
) )
vcpkg_check_git_status() vcpkg_check_git_status(${git_status})
endif() endif()
endif() endif()
vcpkg_check_git_status() vcpkg_check_git_status(${git_status})
endif() endif()
# build latest vcpkg, if needed # build latest vcpkg, if needed
if(NOT vcpkg_git_up_to_date) if(NOT git_up_to_date)
if(WIN32) if(WIN32)
execute_process( execute_process(
COMMAND bootstrap-vcpkg.bat COMMAND bootstrap-vcpkg.bat
@ -127,50 +130,53 @@ if(NOT vcpkg_git_up_to_date)
WORKING_DIRECTORY ${VCPKG_ROOT} WORKING_DIRECTORY ${VCPKG_ROOT}
) )
endif() endif()
endif() endif()
foreach(pkg ${VCPKG_DEPS}) foreach(pkg ${VCPKG_DEPS})
list(APPEND VCPKG_DEPS_QUALIFIED ${pkg}:${VCPKG_TARGET_TRIPLET}) list(APPEND VCPKG_DEPS_QUALIFIED ${pkg}:${VCPKG_TARGET_TRIPLET})
endforeach() endforeach()
if(WIN32) if(WIN32)
set(vcpkg_exe vcpkg) set(vcpkg_exe vcpkg)
else() else()
set(vcpkg_exe ./vcpkg) set(vcpkg_exe ./vcpkg)
endif() endif()
# update portfiles # update portfiles
execute_process( execute_process(
COMMAND ${vcpkg_exe} update COMMAND ${vcpkg_exe} update
WORKING_DIRECTORY ${VCPKG_ROOT} WORKING_DIRECTORY ${VCPKG_ROOT}
) )
# build our deps # build our deps
execute_process( execute_process(
COMMAND ${vcpkg_exe} install ${VCPKG_DEPS_QUALIFIED} COMMAND ${vcpkg_exe} install ${VCPKG_DEPS_QUALIFIED}
WORKING_DIRECTORY ${VCPKG_ROOT} WORKING_DIRECTORY ${VCPKG_ROOT}
) )
# If ports have been updated, rebuild cache one at a time to not overrun the CI time limit. # If ports have been updated, rebuild cache one at a time to not overrun the CI time limit.
vcpkg_get_first_upgrade() vcpkg_get_first_upgrade(${vcpkg_exe})
if(DEFINED vcpkg_first_upgrade) if(DEFINED first_upgrade)
execute_process( execute_process(
COMMAND ${vcpkg_exe} upgrade --no-dry-run ${vcpkg_first_upgrade} COMMAND ${vcpkg_exe} upgrade --no-dry-run ${first_upgrade}
WORKING_DIRECTORY ${VCPKG_ROOT} WORKING_DIRECTORY ${VCPKG_ROOT}
) )
endif() endif()
if(WIN32 AND VCPKG_TARGET_TRIPLET MATCHES x64 AND CMAKE_GENERATOR MATCHES "Visual Studio") if(WIN32 AND VCPKG_TARGET_TRIPLET MATCHES x64 AND CMAKE_GENERATOR MATCHES "Visual Studio")
set(CMAKE_GENERATOR_PLATFORM x64 CACHE STRING "visual studio build architecture" FORCE) set(CMAKE_GENERATOR_PLATFORM x64 CACHE STRING "visual studio build architecture" FORCE)
endif() endif()
if(WIN32 AND (NOT CMAKE_GENERATOR MATCHES "Visual Studio")) if(WIN32 AND (NOT CMAKE_GENERATOR MATCHES "Visual Studio"))
# set toolchain to VS for e.g. Ninja or jom # set toolchain to VS for e.g. Ninja or jom
set(CMAKE_C_COMPILER cl CACHE STRING "Microsoft C/C++ Compiler" FORCE) set(CMAKE_C_COMPILER cl CACHE STRING "Microsoft C/C++ Compiler" FORCE)
set(CMAKE_CXX_COMPILER cl CACHE STRING "Microsoft C/C++ Compiler" FORCE) set(CMAKE_CXX_COMPILER cl CACHE STRING "Microsoft C/C++ Compiler" FORCE)
endif() endif()
set(CMAKE_TOOLCHAIN_FILE ${VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake CACHE FILEPATH "vcpkg toolchain" FORCE) set(CMAKE_TOOLCHAIN_FILE ${VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake CACHE FILEPATH "vcpkg toolchain" FORCE)
endfunction()
vcpkg_set_toolchain()
include(${VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake) include(${VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake)