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.