mirror of
https://github.com/microsoft/vcpkg.git
synced 2024-12-04 00:39:18 +08:00
c7542de3f3
CMAKE_TRY_COMPILE_PLATFORM_VARIABLES is used when CMake 3.6.0 or higher is encountered. For older versions the previous behavior emulating this functionality is used.
294 lines
14 KiB
CMake
294 lines
14 KiB
CMake
# Mark variables as used so cmake doesn't complain about them
|
|
mark_as_advanced(CMAKE_TOOLCHAIN_FILE)
|
|
|
|
# Determine whether the toolchain is loaded during a try-compile configuration
|
|
get_property(_CMAKE_IN_TRY_COMPILE GLOBAL PROPERTY IN_TRY_COMPILE)
|
|
|
|
if (${CMAKE_VERSION} VERSION_LESS "3.6.0")
|
|
set(_CMAKE_EMULATE_TRY_COMPILE_PLATFORM_VARIABLES ON)
|
|
else()
|
|
set(_CMAKE_EMULATE_TRY_COMPILE_PLATFORM_VARIABLES OFF)
|
|
endif()
|
|
|
|
if(_CMAKE_IN_TRY_COMPILE AND _CMAKE_EMULATE_TRY_COMPILE_PLATFORM_VARIABLES)
|
|
include("${CMAKE_CURRENT_SOURCE_DIR}/../vcpkg.config.cmake" OPTIONAL)
|
|
endif()
|
|
|
|
if(VCPKG_CHAINLOAD_TOOLCHAIN_FILE)
|
|
include("${VCPKG_CHAINLOAD_TOOLCHAIN_FILE}")
|
|
endif()
|
|
|
|
if(VCPKG_TOOLCHAIN)
|
|
return()
|
|
endif()
|
|
|
|
if(VCPKG_TARGET_TRIPLET)
|
|
elseif(CMAKE_GENERATOR_PLATFORM MATCHES "^[Ww][Ii][Nn]32$")
|
|
set(_VCPKG_TARGET_TRIPLET_ARCH x86)
|
|
elseif(CMAKE_GENERATOR_PLATFORM MATCHES "^[Xx]64$")
|
|
set(_VCPKG_TARGET_TRIPLET_ARCH x64)
|
|
elseif(CMAKE_GENERATOR_PLATFORM MATCHES "^[Aa][Rr][Mm]$")
|
|
set(_VCPKG_TARGET_TRIPLET_ARCH arm)
|
|
elseif(CMAKE_GENERATOR_PLATFORM MATCHES "^[Aa][Rr][Mm]64$")
|
|
set(_VCPKG_TARGET_TRIPLET_ARCH arm64)
|
|
else()
|
|
if(CMAKE_GENERATOR MATCHES "^Visual Studio 14 2015 Win64$")
|
|
set(_VCPKG_TARGET_TRIPLET_ARCH x64)
|
|
elseif(CMAKE_GENERATOR MATCHES "^Visual Studio 14 2015 ARM$")
|
|
set(_VCPKG_TARGET_TRIPLET_ARCH arm)
|
|
elseif(CMAKE_GENERATOR MATCHES "^Visual Studio 14 2015$")
|
|
set(_VCPKG_TARGET_TRIPLET_ARCH x86)
|
|
elseif(CMAKE_GENERATOR MATCHES "^Visual Studio 15 2017 Win64$")
|
|
set(_VCPKG_TARGET_TRIPLET_ARCH x64)
|
|
elseif(CMAKE_GENERATOR MATCHES "^Visual Studio 15 2017 ARM$")
|
|
set(_VCPKG_TARGET_TRIPLET_ARCH arm)
|
|
elseif(CMAKE_GENERATOR MATCHES "^Visual Studio 15 2017$")
|
|
set(_VCPKG_TARGET_TRIPLET_ARCH x86)
|
|
elseif(CMAKE_GENERATOR MATCHES "^Visual Studio 16 2019$")
|
|
set(_VCPKG_TARGET_TRIPLET_ARCH x86)
|
|
else()
|
|
find_program(_VCPKG_CL cl)
|
|
if(_VCPKG_CL MATCHES "amd64/cl.exe$" OR _VCPKG_CL MATCHES "x64/cl.exe$")
|
|
set(_VCPKG_TARGET_TRIPLET_ARCH x64)
|
|
elseif(_VCPKG_CL MATCHES "arm/cl.exe$")
|
|
set(_VCPKG_TARGET_TRIPLET_ARCH arm)
|
|
elseif(_VCPKG_CL MATCHES "arm64/cl.exe$")
|
|
set(_VCPKG_TARGET_TRIPLET_ARCH arm64)
|
|
elseif(_VCPKG_CL MATCHES "bin/cl.exe$" OR _VCPKG_CL MATCHES "x86/cl.exe$")
|
|
set(_VCPKG_TARGET_TRIPLET_ARCH x86)
|
|
elseif(CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL "x86_64")
|
|
set(_VCPKG_TARGET_TRIPLET_ARCH x64)
|
|
else()
|
|
if( _CMAKE_IN_TRY_COMPILE )
|
|
message(STATUS "Unable to determine target architecture, continuing without vcpkg.")
|
|
else()
|
|
message(WARNING "Unable to determine target architecture, continuing without vcpkg.")
|
|
endif()
|
|
set(VCPKG_TOOLCHAIN ON)
|
|
return()
|
|
endif()
|
|
endif()
|
|
endif()
|
|
|
|
if(CMAKE_SYSTEM_NAME STREQUAL "WindowsStore" OR CMAKE_SYSTEM_NAME STREQUAL "WindowsPhone")
|
|
set(_VCPKG_TARGET_TRIPLET_PLAT uwp)
|
|
elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux" OR (NOT CMAKE_SYSTEM_NAME AND CMAKE_HOST_SYSTEM_NAME STREQUAL "Linux"))
|
|
set(_VCPKG_TARGET_TRIPLET_PLAT linux)
|
|
elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin" OR (NOT CMAKE_SYSTEM_NAME AND CMAKE_HOST_SYSTEM_NAME STREQUAL "Darwin"))
|
|
set(_VCPKG_TARGET_TRIPLET_PLAT osx)
|
|
elseif(CMAKE_SYSTEM_NAME STREQUAL "Windows" OR (NOT CMAKE_SYSTEM_NAME AND CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows"))
|
|
set(_VCPKG_TARGET_TRIPLET_PLAT windows)
|
|
elseif(CMAKE_SYSTEM_NAME STREQUAL "FreeBSD" OR (NOT CMAKE_SYSTEM_NAME AND CMAKE_HOST_SYSTEM_NAME STREQUAL "FreeBSD"))
|
|
set(_VCPKG_TARGET_TRIPLET_PLAT freebsd)
|
|
endif()
|
|
|
|
set(VCPKG_TARGET_TRIPLET ${_VCPKG_TARGET_TRIPLET_ARCH}-${_VCPKG_TARGET_TRIPLET_PLAT} CACHE STRING "Vcpkg target triplet (ex. x86-windows)")
|
|
set(_VCPKG_TOOLCHAIN_DIR ${CMAKE_CURRENT_LIST_DIR})
|
|
|
|
if(NOT DEFINED _VCPKG_ROOT_DIR)
|
|
# Detect .vcpkg-root to figure VCPKG_ROOT_DIR
|
|
set(_VCPKG_ROOT_DIR_CANDIDATE ${CMAKE_CURRENT_LIST_DIR})
|
|
while(IS_DIRECTORY ${_VCPKG_ROOT_DIR_CANDIDATE} AND NOT EXISTS "${_VCPKG_ROOT_DIR_CANDIDATE}/.vcpkg-root")
|
|
get_filename_component(_VCPKG_ROOT_DIR_TEMP ${_VCPKG_ROOT_DIR_CANDIDATE} DIRECTORY)
|
|
if (_VCPKG_ROOT_DIR_TEMP STREQUAL _VCPKG_ROOT_DIR_CANDIDATE) # If unchanged, we have reached the root of the drive
|
|
message(FATAL_ERROR "Could not find .vcpkg-root")
|
|
else()
|
|
SET(_VCPKG_ROOT_DIR_CANDIDATE ${_VCPKG_ROOT_DIR_TEMP})
|
|
endif()
|
|
endwhile()
|
|
set(_VCPKG_ROOT_DIR ${_VCPKG_ROOT_DIR_CANDIDATE} CACHE INTERNAL "Vcpkg root directory")
|
|
endif()
|
|
set(_VCPKG_INSTALLED_DIR ${_VCPKG_ROOT_DIR}/installed)
|
|
|
|
if(NOT EXISTS "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}" AND NOT _CMAKE_IN_TRY_COMPILE)
|
|
message(WARNING "There are no libraries installed for the Vcpkg triplet ${VCPKG_TARGET_TRIPLET}.")
|
|
endif()
|
|
|
|
if(CMAKE_BUILD_TYPE MATCHES "^[Dd][Ee][Bb][Uu][Gg]$" OR NOT DEFINED CMAKE_BUILD_TYPE) #Debug build: Put Debug paths before Release paths.
|
|
list(APPEND CMAKE_PREFIX_PATH
|
|
${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/debug ${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}
|
|
)
|
|
list(APPEND CMAKE_LIBRARY_PATH
|
|
${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/debug/lib/manual-link ${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/lib/manual-link
|
|
)
|
|
list(APPEND CMAKE_FIND_ROOT_PATH
|
|
${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/debug ${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}
|
|
)
|
|
else() #Release build: Put Release paths before Debug paths. Debug Paths are required so that CMake generates correct info in autogenerated target files.
|
|
list(APPEND CMAKE_PREFIX_PATH
|
|
${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET} ${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/debug
|
|
)
|
|
list(APPEND CMAKE_LIBRARY_PATH
|
|
${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/lib/manual-link ${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/debug/lib/manual-link
|
|
)
|
|
list(APPEND CMAKE_FIND_ROOT_PATH
|
|
${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET} ${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/debug
|
|
)
|
|
endif()
|
|
|
|
file(TO_CMAKE_PATH "$ENV{PROGRAMFILES}" _programfiles)
|
|
set(_PROGRAMFILESX86 "PROGRAMFILES(x86)")
|
|
file(TO_CMAKE_PATH "$ENV{${_PROGRAMFILESX86}}" _programfiles_x86)
|
|
set(CMAKE_SYSTEM_IGNORE_PATH
|
|
"${_programfiles}/OpenSSL"
|
|
"${_programfiles}/OpenSSL-Win32"
|
|
"${_programfiles}/OpenSSL-Win64"
|
|
"${_programfiles}/OpenSSL-Win32/lib/VC"
|
|
"${_programfiles}/OpenSSL-Win64/lib/VC"
|
|
"${_programfiles}/OpenSSL-Win32/lib/VC/static"
|
|
"${_programfiles}/OpenSSL-Win64/lib/VC/static"
|
|
"${_programfiles_x86}/OpenSSL"
|
|
"${_programfiles_x86}/OpenSSL-Win32"
|
|
"${_programfiles_x86}/OpenSSL-Win64"
|
|
"${_programfiles_x86}/OpenSSL-Win32/lib/VC"
|
|
"${_programfiles_x86}/OpenSSL-Win64/lib/VC"
|
|
"${_programfiles_x86}/OpenSSL-Win32/lib/VC/static"
|
|
"${_programfiles_x86}/OpenSSL-Win64/lib/VC/static"
|
|
"C:/OpenSSL/"
|
|
"C:/OpenSSL-Win32/"
|
|
"C:/OpenSSL-Win64/"
|
|
"C:/OpenSSL-Win32/lib/VC"
|
|
"C:/OpenSSL-Win64/lib/VC"
|
|
"C:/OpenSSL-Win32/lib/VC/static"
|
|
"C:/OpenSSL-Win64/lib/VC/static"
|
|
)
|
|
|
|
list(APPEND CMAKE_PROGRAM_PATH ${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/tools)
|
|
file(GLOB _VCPKG_TOOLS_DIRS ${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/tools/*)
|
|
foreach(_VCPKG_TOOLS_DIR ${_VCPKG_TOOLS_DIRS})
|
|
if(IS_DIRECTORY ${_VCPKG_TOOLS_DIR})
|
|
list(APPEND CMAKE_PROGRAM_PATH ${_VCPKG_TOOLS_DIR})
|
|
endif()
|
|
endforeach()
|
|
|
|
option(VCPKG_APPLOCAL_DEPS "Automatically copy dependencies into the output directory for executables." ON)
|
|
function(add_executable name)
|
|
_add_executable(${ARGV})
|
|
list(FIND ARGV "IMPORTED" IMPORTED_IDX)
|
|
list(FIND ARGV "ALIAS" ALIAS_IDX)
|
|
list(FIND ARGV "MACOSX_BUNDLE" MACOSX_BUNDLE_IDX)
|
|
if(IMPORTED_IDX EQUAL -1 AND ALIAS_IDX EQUAL -1)
|
|
if(VCPKG_APPLOCAL_DEPS)
|
|
if(_VCPKG_TARGET_TRIPLET_PLAT MATCHES "windows|uwp")
|
|
add_custom_command(TARGET ${name} POST_BUILD
|
|
COMMAND powershell -noprofile -executionpolicy Bypass -file ${_VCPKG_TOOLCHAIN_DIR}/msbuild/applocal.ps1
|
|
-targetBinary $<TARGET_FILE:${name}>
|
|
-installedDir "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}$<$<CONFIG:Debug>:/debug>/bin"
|
|
-OutVariable out
|
|
)
|
|
elseif(_VCPKG_TARGET_TRIPLET_PLAT MATCHES "osx")
|
|
if (NOT MACOSX_BUNDLE_IDX EQUAL -1)
|
|
add_custom_command(TARGET ${name} POST_BUILD
|
|
COMMAND python ${_VCPKG_TOOLCHAIN_DIR}/osx/applocal.py
|
|
$<TARGET_FILE:${name}>
|
|
"${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}$<$<CONFIG:Debug>:/debug>"
|
|
)
|
|
endif()
|
|
endif()
|
|
endif()
|
|
set_target_properties(${name} PROPERTIES VS_USER_PROPS do_not_import_user.props)
|
|
set_target_properties(${name} PROPERTIES VS_GLOBAL_VcpkgEnabled false)
|
|
endif()
|
|
endfunction()
|
|
|
|
function(add_library name)
|
|
_add_library(${ARGV})
|
|
list(FIND ARGV "IMPORTED" IMPORTED_IDX)
|
|
list(FIND ARGV "INTERFACE" INTERFACE_IDX)
|
|
list(FIND ARGV "ALIAS" ALIAS_IDX)
|
|
if(IMPORTED_IDX EQUAL -1 AND INTERFACE_IDX EQUAL -1 AND ALIAS_IDX EQUAL -1)
|
|
get_target_property(IS_LIBRARY_SHARED ${name} TYPE)
|
|
if(VCPKG_APPLOCAL_DEPS AND _VCPKG_TARGET_TRIPLET_PLAT MATCHES "windows|uwp" AND (IS_LIBRARY_SHARED STREQUAL "SHARED_LIBRARY" OR IS_LIBRARY_SHARED STREQUAL "MODULE_LIBRARY"))
|
|
add_custom_command(TARGET ${name} POST_BUILD
|
|
COMMAND powershell -noprofile -executionpolicy Bypass -file ${_VCPKG_TOOLCHAIN_DIR}/msbuild/applocal.ps1
|
|
-targetBinary $<TARGET_FILE:${name}>
|
|
-installedDir "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}$<$<CONFIG:Debug>:/debug>/bin"
|
|
-OutVariable out
|
|
)
|
|
endif()
|
|
set_target_properties(${name} PROPERTIES VS_USER_PROPS do_not_import_user.props)
|
|
set_target_properties(${name} PROPERTIES VS_GLOBAL_VcpkgEnabled false)
|
|
endif()
|
|
endfunction()
|
|
|
|
macro(find_package name)
|
|
string(TOLOWER "${name}" _vcpkg_lowercase_name)
|
|
if(EXISTS "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/share/${_vcpkg_lowercase_name}/vcpkg-cmake-wrapper.cmake")
|
|
set(ARGS "${ARGV}")
|
|
include(${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/share/${_vcpkg_lowercase_name}/vcpkg-cmake-wrapper.cmake)
|
|
elseif("${name}" STREQUAL "Boost" AND EXISTS "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/include/boost")
|
|
# Checking for the boost headers disables this wrapper unless the user has installed at least one boost library
|
|
set(Boost_USE_STATIC_LIBS OFF)
|
|
set(Boost_USE_MULTITHREADED ON)
|
|
unset(Boost_USE_STATIC_RUNTIME)
|
|
set(Boost_NO_BOOST_CMAKE ON)
|
|
unset(Boost_USE_STATIC_RUNTIME CACHE)
|
|
set(Boost_COMPILER "-vc140")
|
|
_find_package(${ARGV})
|
|
elseif("${name}" STREQUAL "ICU" AND EXISTS "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/include/unicode/utf.h")
|
|
function(_vcpkg_find_in_list)
|
|
list(FIND ARGV "COMPONENTS" COMPONENTS_IDX)
|
|
set(COMPONENTS_IDX ${COMPONENTS_IDX} PARENT_SCOPE)
|
|
endfunction()
|
|
_vcpkg_find_in_list(${ARGV})
|
|
if(NOT COMPONENTS_IDX EQUAL -1)
|
|
_find_package(${ARGV} COMPONENTS data)
|
|
else()
|
|
_find_package(${ARGV})
|
|
endif()
|
|
elseif("${name}" STREQUAL "GSL" AND EXISTS "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/include/gsl")
|
|
_find_package(${ARGV})
|
|
if(GSL_FOUND AND TARGET GSL::gsl)
|
|
set_property( TARGET GSL::gslcblas APPEND PROPERTY IMPORTED_CONFIGURATIONS Release )
|
|
set_property( TARGET GSL::gsl APPEND PROPERTY IMPORTED_CONFIGURATIONS Release )
|
|
if( EXISTS "${GSL_LIBRARY_DEBUG}" AND EXISTS "${GSL_CBLAS_LIBRARY_DEBUG}")
|
|
set_property( TARGET GSL::gsl APPEND PROPERTY IMPORTED_CONFIGURATIONS Debug )
|
|
set_target_properties( GSL::gsl PROPERTIES IMPORTED_LOCATION_DEBUG "${GSL_LIBRARY_DEBUG}" )
|
|
set_property( TARGET GSL::gslcblas APPEND PROPERTY IMPORTED_CONFIGURATIONS Debug )
|
|
set_target_properties( GSL::gslcblas PROPERTIES IMPORTED_LOCATION_DEBUG "${GSL_CBLAS_LIBRARY_DEBUG}" )
|
|
endif()
|
|
endif()
|
|
elseif("${name}" STREQUAL "CURL" AND EXISTS "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/include/curl")
|
|
_find_package(${ARGV})
|
|
if(CURL_FOUND)
|
|
if(EXISTS "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/lib/nghttp2.lib")
|
|
list(APPEND CURL_LIBRARIES
|
|
"debug" "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/debug/lib/nghttp2.lib"
|
|
"optimized" "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/lib/nghttp2.lib")
|
|
endif()
|
|
endif()
|
|
elseif("${_vcpkg_lowercase_name}" STREQUAL "grpc" AND EXISTS "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/share/grpc")
|
|
_find_package(gRPC ${ARGN})
|
|
else()
|
|
_find_package(${ARGV})
|
|
endif()
|
|
endmacro()
|
|
|
|
set(VCPKG_TOOLCHAIN ON)
|
|
set(_UNUSED ${CMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION})
|
|
set(_UNUSED ${CMAKE_EXPORT_NO_PACKAGE_REGISTRY})
|
|
set(_UNUSED ${CMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY})
|
|
set(_UNUSED ${CMAKE_FIND_PACKAGE_NO_SYSTEM_PACKAGE_REGISTRY})
|
|
set(_UNUSED ${CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_SKIP})
|
|
|
|
# Propogate these values to try-compile configurations so the triplet and toolchain load
|
|
if(NOT _CMAKE_IN_TRY_COMPILE)
|
|
if(_CMAKE_EMULATE_TRY_COMPILE_PLATFORM_VARIABLES)
|
|
file(TO_CMAKE_PATH "${VCPKG_CHAINLOAD_TOOLCHAIN_FILE}" _chainload_file)
|
|
file(TO_CMAKE_PATH "${_VCPKG_ROOT_DIR}" _root_dir)
|
|
file(WRITE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/vcpkg.config.cmake"
|
|
"set(VCPKG_TARGET_TRIPLET \"${VCPKG_TARGET_TRIPLET}\" CACHE STRING \"\")\n"
|
|
"set(VCPKG_APPLOCAL_DEPS \"${VCPKG_APPLOCAL_DEPS}\" CACHE STRING \"\")\n"
|
|
"set(VCPKG_CHAINLOAD_TOOLCHAIN_FILE \"${_chainload_file}\" CACHE STRING \"\")\n"
|
|
"set(_VCPKG_ROOT_DIR \"${_root_dir}\" CACHE STRING \"\")\n"
|
|
)
|
|
else()
|
|
set(CMAKE_TRY_COMPILE_PLATFORM_VARIABLES
|
|
VCPKG_TARGET_TRIPLET
|
|
VCPKG_APPLOCAL_DEPS
|
|
VCPKG_CHAINLOAD_TOOLCHAIN_FILE
|
|
_VCPKG_ROOT_DIR
|
|
)
|
|
endif()
|
|
endif()
|