python/cmake_modules/Usevcpkg.cmake (146 lines of code) (raw):
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
message(STATUS "Using vcpkg to find dependencies")
# ----------------------------------------------------------------------
# Define macros
# macro to list subdirectories (non-recursive)
macro(list_subdirs SUBDIRS DIR)
file(GLOB children_
RELATIVE ${DIR}
${DIR}/*)
set(subdirs_ "")
foreach(child_ ${children_})
if(IS_DIRECTORY "${DIR}/${child_}")
list(APPEND subdirs_ ${child_})
endif()
endforeach()
set("${SUBDIRS}" ${subdirs_})
unset(children_)
unset(subdirs_)
endmacro()
# ----------------------------------------------------------------------
# Get VCPKG_ROOT
if(DEFINED CMAKE_TOOLCHAIN_FILE)
# Get it from the CMake variable CMAKE_TOOLCHAIN_FILE
get_filename_component(_VCPKG_DOT_CMAKE "${CMAKE_TOOLCHAIN_FILE}" NAME)
if(EXISTS "${CMAKE_TOOLCHAIN_FILE}" AND _VCPKG_DOT_CMAKE STREQUAL "vcpkg.cmake")
get_filename_component(_VCPKG_BUILDSYSTEMS_DIR "${CMAKE_TOOLCHAIN_FILE}" DIRECTORY)
get_filename_component(VCPKG_ROOT "${_VCPKG_BUILDSYSTEMS_DIR}/../.." ABSOLUTE)
else()
message(FATAL_ERROR "vcpkg toolchain file not found at path specified in -DCMAKE_TOOLCHAIN_FILE"
)
endif()
else()
if(DEFINED VCPKG_ROOT)
# Get it from the CMake variable VCPKG_ROOT
find_program(_VCPKG_BIN vcpkg
PATHS "${VCPKG_ROOT}"
NO_DEFAULT_PATH)
if(NOT _VCPKG_BIN)
message(FATAL_ERROR "vcpkg not found in directory specified in -DVCPKG_ROOT")
endif()
elseif(DEFINED ENV{VCPKG_ROOT})
# Get it from the environment variable VCPKG_ROOT
set(VCPKG_ROOT $ENV{VCPKG_ROOT})
find_program(_VCPKG_BIN vcpkg
PATHS "${VCPKG_ROOT}"
NO_DEFAULT_PATH)
if(NOT _VCPKG_BIN)
message(FATAL_ERROR "vcpkg not found in directory in environment variable VCPKG_ROOT"
)
endif()
else()
# Get it from the file vcpkg.path.txt
find_program(_VCPKG_BIN vcpkg)
if(_VCPKG_BIN)
get_filename_component(_VCPKG_REAL_BIN "${_VCPKG_BIN}" REALPATH)
get_filename_component(VCPKG_ROOT "${_VCPKG_REAL_BIN}" DIRECTORY)
else()
if(CMAKE_HOST_WIN32)
set(_VCPKG_PATH_TXT "$ENV{LOCALAPPDATA}/vcpkg/vcpkg.path.txt")
else()
set(_VCPKG_PATH_TXT "$ENV{HOME}/.vcpkg/vcpkg.path.txt")
endif()
if(EXISTS "${_VCPKG_PATH_TXT}")
file(READ "${_VCPKG_PATH_TXT}" VCPKG_ROOT)
else()
message(FATAL_ERROR "vcpkg not found. Install vcpkg if not installed, "
"then run vcpkg integrate install or set environment variable VCPKG_ROOT."
)
endif()
find_program(_VCPKG_BIN vcpkg
PATHS "${VCPKG_ROOT}"
NO_DEFAULT_PATH)
if(NOT _VCPKG_BIN)
message(FATAL_ERROR "vcpkg not found. Re-run vcpkg integrate install "
"or set environment variable VCPKG_ROOT.")
endif()
endif()
endif()
set(CMAKE_TOOLCHAIN_FILE
"${VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake"
CACHE FILEPATH "Path to vcpkg CMake toolchain file")
endif()
message(STATUS "Using CMAKE_TOOLCHAIN_FILE: ${CMAKE_TOOLCHAIN_FILE}")
message(STATUS "Using VCPKG_ROOT: ${VCPKG_ROOT}")
# ----------------------------------------------------------------------
# Get VCPKG_TARGET_TRIPLET
if(DEFINED ENV{VCPKG_DEFAULT_TRIPLET} AND NOT DEFINED VCPKG_TARGET_TRIPLET)
set(VCPKG_TARGET_TRIPLET "$ENV{VCPKG_DEFAULT_TRIPLET}")
endif()
# Explicitly set manifest mode on if it is not set and vcpkg.json exists
if(NOT DEFINED VCPKG_MANIFEST_MODE AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/vcpkg.json")
set(VCPKG_MANIFEST_MODE
ON
CACHE BOOL "Use vcpkg.json manifest")
message(STATUS "vcpkg.json manifest found. Using VCPKG_MANIFEST_MODE: ON")
endif()
if(NOT DEFINED VCPKG_TARGET_TRIPLET)
message(FATAL_ERROR "Could not infer VCPKG_TARGET_TRIPLET. "
"Specify triplet with -DVCPKG_TARGET_TRIPLET.")
endif()
set(VCPKG_TARGET_TRIPLET
"${VCPKG_TARGET_TRIPLET}"
CACHE STRING "vcpkg triplet for the target environment")
if(NOT DEFINED VCPKG_BUILD_TYPE)
set(VCPKG_BUILD_TYPE
"${LOWERCASE_BUILD_TYPE}"
CACHE STRING "vcpkg build type (release|debug)")
endif()
if(NOT DEFINED VCPKG_LIBRARY_LINKAGE)
if(ARROW_DEPENDENCY_USE_SHARED)
set(VCPKG_LIBRARY_LINKAGE "dynamic")
else()
set(VCPKG_LIBRARY_LINKAGE "static")
endif()
set(VCPKG_LIBRARY_LINKAGE
"${VCPKG_LIBRARY_LINKAGE}"
CACHE STRING "vcpkg preferred library linkage (static|dynamic)")
endif()
message(STATUS "Using vcpkg installed libraries directory: ${_VCPKG_INSTALLED_DIR}")
message(STATUS "Using VCPKG_TARGET_TRIPLET: ${VCPKG_TARGET_TRIPLET}")
message(STATUS "Using VCPKG_BUILD_TYPE: ${VCPKG_BUILD_TYPE}")
message(STATUS "Using VCPKG_LIBRARY_LINKAGE: ${VCPKG_LIBRARY_LINKAGE}")
set(ARROW_VCPKG_PREFIX
"${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}"
CACHE PATH "Path to target triplet subdirectory in vcpkg installed directory")
set(ARROW_VCPKG
ON
CACHE BOOL "Use vcpkg for dependencies")
set(ARROW_DEPENDENCY_SOURCE
"SYSTEM"
CACHE STRING "The specified value VCPKG is implemented internally as SYSTEM" FORCE)