aboutsummaryrefslogtreecommitdiff
path: root/scripts/buildsystems/vcpkg.cmake
blob: d8c7ee6b8e8d0b5811dd2b3a2eba785716b50c9b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
# Mark variables as used so cmake doesn't complain about them
set(CMAKE_TOOLCHAIN_FILE ${CMAKE_TOOLCHAIN_FILE})
if(NOT VCPKG_TOOLCHAIN)
    if(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)
    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)
        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 "bin/cl.exe$" OR _VCPKG_CL MATCHES "x86/cl.exe$")
                set(_VCPKG_TARGET_TRIPLET_ARCH x86)
            else()
                message(FATAL_ERROR "Unable to determine target architecture.")
            endif()
        endif()
    endif()

    if(CMAKE_SYSTEM_NAME STREQUAL "WindowsStore" OR CMAKE_SYSTEM_NAME STREQUAL "WindowsPhone")
        set(_VCPKG_TARGET_TRIPLET_PLAT uwp)
    else()
        set(_VCPKG_TARGET_TRIPLET_PLAT windows)
    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})

    #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})
    set(_VCPKG_INSTALLED_DIR ${_VCPKG_ROOT_DIR}/installed)

    if(CMAKE_BUILD_TYPE MATCHES "^Debug$" OR NOT DEFINED CMAKE_BUILD_TYPE)
        list(APPEND CMAKE_PREFIX_PATH
            ${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/debug
        )
        list(APPEND CMAKE_LIBRARY_PATH
            ${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/debug/lib/manual-link
        )
    endif()
    list(APPEND CMAKE_PREFIX_PATH
        ${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}
    )
    list(APPEND CMAKE_LIBRARY_PATH
        ${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/lib/manual-link
    )

    set(Boost_COMPILER "-vc140")

    if (NOT DEFINED CMAKE_SYSTEM_VERSION)
        include(${_VCPKG_ROOT_DIR}/scripts/cmake/vcpkg_get_windows_sdk.cmake)
        # This is used as an implicit parameter for vcpkg_get_windows_sdk
        set(VCPKG_ROOT_DIR ${_VCPKG_ROOT_DIR})
        vcpkg_get_windows_sdk(WINDOWS_SDK_VERSION)
        unset(VCPKG_ROOT_DIR)
        set(CMAKE_SYSTEM_VERSION ${WINDOWS_SDK_VERSION})
    endif()

    file(TO_CMAKE_PATH "$ENV{PROGRAMFILES}" _programfiles)
    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"
        "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"
    )

    set(CMAKE_PROGRAM_PATH ${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})
            set(CMAKE_PROGRAM_PATH ${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)
        if(IMPORTED_IDX EQUAL -1 AND ALIAS_IDX EQUAL -1)
            if(VCPKG_APPLOCAL_DEPS)
                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()

    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)
            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)
        if(name STREQUAL "Boost")
            unset(Boost_USE_STATIC_LIBS)
        endif()
        _find_package(${ARGV})
    endmacro()

    set(VCPKG_TOOLCHAIN ON)
endif()

set(_UNUSED ${CMAKE_TOOLCHAIN_FILE})
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})