cmake/automate-vcpkg.cmake (181 lines of code) (raw):
#------------------------------------------------------------------------------------------------------------
#
# Automate-VCPKG by Andre Taulien
# ===============================
#
# Project Repository: https://github.com/REGoth-project/Automate-VCPKG
# License ..........: MIT, see end of file.
#
# Based on: https://github.com/sutambe/cpptruths/blob/vcpkg_cmake_blog/cpp0x/vcpkg_test/CMakeLists.txt
#
#
# While [Vcpkg](https://github.com/microsoft/vcpkg) on it's own is awesome, it does add
# a little bit of complexity to getting a project to build. Even more if the one trying
# to compile your application is not too fond of the commandline. Additionally, CMake
# commands tend to get rather long with the toolchain path.
#
# To keep things simple for new users who just want to get the project to build, this
# script offers a solution.
#
# Lets assume your main `CMakelists.txt` looks something like this:
#
# cmake_minimum_required (VERSION 3.12.0)
# project (MyProject)
#
# add_executable(MyExecutable main.c)
#
# To integrate Vcpkg into that `CMakelists.txt`, simple put the following lines before the
# call to `project(MyProject)`:
#
# include(cmake/automate-vcpkg.cmake)
#
# vcpkg_bootstrap()
# vcpkg_install_packages(libsquish physfs)
#
# The call to `vcpkg_bootstrap()` will clone the official Vcpkg repository and bootstrap it.
# If it detected an existing environment variable defining a valid `VCPKG_ROOT`, it will
# update the existing installation of Vcpkg.
#
# Arguments to `vcpkg_install_packages()` are the packages you want to install using Vcpkg.
#
# If you want to keep the possibility for users to chose their own copy of Vcpkg, you can
# simply not run the code snippet mentioned above, something like this will work:
#
# option(SKIP_AUTOMATE_VCPKG "When ON, you will need to built the packages
# required by MyProject on your own or supply your own vcpkg toolchain.")
#
# if (NOT SKIP_AUTOMATE_VCPKG)
# include(cmake/automate-vcpkg.cmake)
#
# vcpkg_bootstrap()
# vcpkg_install_packages(libsquish physfs)
# endif()
#
# Then, the user has to supply the packages on their own, be it through Vcpkg or manually
# specifying their locations.
#------------------------------------------------------------------------------------------------------------
cmake_minimum_required (VERSION 3.12)
if (WIN32)
set (
VCPKG_FALLBACK_ROOT
${CMAKE_CURRENT_BINARY_DIR}/vcpkg
CACHE STRING
"vcpkg configuration directory to use if vcpkg was not installed on the system before"
)
else ()
set (
VCPKG_FALLBACK_ROOT
${CMAKE_CURRENT_BINARY_DIR}/.vcpkg
CACHE STRING
"vcpkg configuration directory to use if vcpkg was not installed on the system before"
)
endif ()
# On Windows, Vcpkg defaults to x86, even on x64 systems. If we're
# doing a 64-bit build, we need to fix that.
if (WIN32)
# Since the compiler checks haven't run yet, we need to figure
# out the value of CMAKE_SIZEOF_VOID_P ourselfs
include (CheckTypeSize)
enable_language (C)
check_type_size ("void*" SIZEOF_VOID_P BUILTIN_TYPES_ONLY)
if (SIZEOF_VOID_P EQUAL 8)
if ("$ENV{PROCESSOR_ARCHITECTURE}" STREQUAL "ARM64")
set (VCPKG_TRIPLET arm64-windows)
else ()
set (VCPKG_TRIPLET x64-windows)
endif ()
message (STATUS "[VCPKG] Using Vcpkg triplet ${VCPKG_TRIPLET}")
endif ()
endif ()
if (NOT DEFINED VCPKG_ROOT)
if (NOT DEFINED ENV{VCPKG_ROOT})
set (VCPKG_ROOT ${VCPKG_FALLBACK_ROOT})
else ()
set (VCPKG_ROOT $ENV{VCPKG_ROOT})
endif ()
endif ()
# Installs a new copy of Vcpkg or updates an existing one
macro (vcpkg_bootstrap)
_install_or_update_vcpkg ()
# Find out whether the user supplied their own VCPKG toolchain file
if (NOT DEFINED ${CMAKE_TOOLCHAIN_FILE})
# We know this wasn't set before so we need point the toolchain file to the newly found VCPKG_ROOT
set (
CMAKE_TOOLCHAIN_FILE
${VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake
CACHE STRING "")
# Just setting vcpkg.cmake as toolchain file does not seem to actually pull in the code
include (${VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake)
set (AUTOMATE_VCPKG_USE_SYSTEM_VCPKG OFF)
else ()
# VCPKG_ROOT has been defined by the toolchain file already
set (AUTOMATE_VCPKG_USE_SYSTEM_VCPKG ON)
endif ()
message (STATUS "Automate VCPKG status:")
message (STATUS " VCPKG_ROOT.....: ${VCPKG_ROOT}")
message (STATUS " VCPKG_EXEC.....: ${VCPKG_EXEC}")
message (STATUS " VCPKG_BOOTSTRAP: ${VCPKG_BOOTSTRAP}")
endmacro ()
macro (_install_or_update_vcpkg)
if (NOT EXISTS ${VCPKG_ROOT})
message (STATUS "[VCPKG] Cloning vcpkg in ${VCPKG_ROOT}")
execute_process (COMMAND git clone --quiet https://github.com/Microsoft/vcpkg.git ${VCPKG_ROOT})
# If a reproducible build is desired (and potentially old libraries are ok), uncomment the
# following line and pin the vcpkg repository to a specific githash.
# 2023.02.24 Release: a7b6122
# execute_process(COMMAND git checkout a7b6122 WORKING_DIRECTORY ${VCPKG_ROOT})
else ()
# The following command has no effect if the vcpkg repository is in a detached head state.
message (STATUS "[VCPKG] Auto-updating vcpkg in ${VCPKG_ROOT}")
execute_process (COMMAND git pull WORKING_DIRECTORY ${VCPKG_ROOT})
endif ()
if (NOT EXISTS ${VCPKG_ROOT}/README.md)
message (FATAL_ERROR "[VCPKG] Could not clone vcpkg")
endif ()
if (WIN32)
set (VCPKG_EXEC ${VCPKG_ROOT}/vcpkg.exe)
set (VCPKG_BOOTSTRAP ${VCPKG_ROOT}/bootstrap-vcpkg.bat)
else ()
set (VCPKG_EXEC ${VCPKG_ROOT}/vcpkg)
set (VCPKG_BOOTSTRAP ${VCPKG_ROOT}/bootstrap-vcpkg.sh)
endif ()
if (NOT EXISTS ${VCPKG_EXEC})
message (STATUS "[VCPKG] Bootstrapping vcpkg in ${VCPKG_ROOT}")
execute_process (COMMAND ${VCPKG_BOOTSTRAP} -disableMetrics WORKING_DIRECTORY ${VCPKG_ROOT})
endif ()
if (NOT EXISTS ${VCPKG_EXEC})
message (FATAL_ERROR "[VCPKG] Could not bootstrap vcpkg")
endif ()
endmacro ()
# Installs the list of packages given as parameters using Vcpkg
macro (vcpkg_install_packages)
# Need the given list to be space-separated
#string (REPLACE ";" " " PACKAGES_LIST_STR "${ARGN}")
message (
STATUS "[VCPKG] Installing/Updating the following vcpkg-packages: ${PACKAGES_LIST_STR}")
if (VCPKG_TRIPLET)
set (ENV{VCPKG_DEFAULT_TRIPLET} "${VCPKG_TRIPLET}")
endif ()
execute_process (COMMAND ${VCPKG_EXEC} install ${ARGN} WORKING_DIRECTORY ${VCPKG_ROOT})
endmacro ()
# MIT License
#
# Copyright (c) 2019 REGoth-project
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.