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:
parent
47880ff9c6
commit
5cc1fd28b4
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue