• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# ~~~
2# Copyright (c) 2023 LunarG, Inc.
3#
4# Licensed under the Apache License, Version 2.0 (the "License");
5# you may not use this file except in compliance with the License.
6# You may obtain a copy of the License at
7#
8#     http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS,
12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13# See the License for the specific language governing permissions and
14# limitations under the License.
15# ~~~
16
17option(UPDATE_DEPS "Run update_deps.py for user")
18if (UPDATE_DEPS)
19    find_package(Python3 REQUIRED QUIET)
20
21    set(update_dep_py "${CMAKE_CURRENT_LIST_DIR}/update_deps.py")
22    set(known_good_json "${CMAKE_CURRENT_LIST_DIR}/known_good.json")
23
24    set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${update_dep_py} ${known_good_json})
25
26    list(APPEND update_dep_command "${update_dep_py}")
27    list(APPEND update_dep_command "--generator")
28    list(APPEND update_dep_command "${CMAKE_GENERATOR}")
29
30    if (CMAKE_GENERATOR_PLATFORM)
31        list(APPEND update_dep_command "--arch")
32        list(APPEND update_dep_command "${CMAKE_GENERATOR_PLATFORM}")
33    endif()
34
35    if ("${CMAKE_OSX_ARCHITECTURES}" MATCHES ";")
36        list(APPEND update_dep_command "--osx-archs")
37        string(REPLACE ";" ":" osx_archs "${CMAKE_OSX_ARCHITECTURES}")
38        list(APPEND update_dep_command "${osx_archs}")
39
40        set(APPLE_UNIVERSAL_BINARY ON)
41    endif()
42
43    if (NOT CMAKE_BUILD_TYPE)
44        message(WARNING "CMAKE_BUILD_TYPE not set. Using Debug for dependency build type")
45        set(_build_type Debug)
46    else()
47        set(_build_type ${CMAKE_BUILD_TYPE})
48    endif()
49    list(APPEND update_dep_command "--config")
50    list(APPEND update_dep_command "${_build_type}")
51    list(APPEND update_dep_command "--api")
52    list(APPEND update_dep_command "${API_TYPE}")
53
54    set(UPDATE_DEPS_DIR_SUFFIX "${_build_type}")
55    if (CMAKE_CROSSCOMPILING)
56        if (APPLE_UNIVERSAL_BINARY)
57            set(UPDATE_DEPS_DIR_SUFFIX "${CMAKE_SYSTEM_NAME}/${UPDATE_DEPS_DIR_SUFFIX}/universal")
58        else()
59            set(UPDATE_DEPS_DIR_SUFFIX "${CMAKE_SYSTEM_NAME}/${UPDATE_DEPS_DIR_SUFFIX}/${CMAKE_SYSTEM_PROCESSOR}")
60        endif()
61    else()
62        if (APPLE_UNIVERSAL_BINARY)
63            set(UPDATE_DEPS_DIR_SUFFIX "${UPDATE_DEPS_DIR_SUFFIX}/universal")
64        else()
65            math(EXPR bitness "8 * ${CMAKE_SIZEOF_VOID_P}")
66            set(UPDATE_DEPS_DIR_SUFFIX "${UPDATE_DEPS_DIR_SUFFIX}/${bitness}")
67        endif()
68    endif()
69    set(UPDATE_DEPS_DIR "${PROJECT_SOURCE_DIR}/external/${UPDATE_DEPS_DIR_SUFFIX}" CACHE PATH "Location where update_deps.py installs packages")
70    list(APPEND update_dep_command "--dir" )
71    list(APPEND update_dep_command "${UPDATE_DEPS_DIR}")
72
73    if (NOT BUILD_TESTS)
74        list(APPEND update_dep_command "--optional=tests")
75    endif()
76
77    if (UPDATE_DEPS_SKIP_EXISTING_INSTALL)
78        list(APPEND update_dep_command "--skip-existing-install")
79    endif()
80
81    list(APPEND cmake_vars "CMAKE_TOOLCHAIN_FILE")
82
83    # Avoids manually setting CMAKE_SYSTEM_NAME unless it's needed:
84    # https://cmake.org/cmake/help/latest/variable/CMAKE_CROSSCOMPILING.html
85    if (NOT "${CMAKE_SYSTEM_NAME}" STREQUAL "${CMAKE_HOST_SYSTEM_NAME}")
86        list(APPEND cmake_vars "CMAKE_SYSTEM_NAME")
87    endif()
88    if (APPLE)
89        list(APPEND cmake_vars "CMAKE_OSX_DEPLOYMENT_TARGET")
90    endif()
91    if (NOT MSVC_IDE)
92        list(APPEND cmake_vars "CMAKE_CXX_COMPILER" "CMAKE_C_COMPILER" "CMAKE_ASM_COMPILER")
93    endif()
94    if (ANDROID)
95        list(APPEND cmake_vars "ANDROID_PLATFORM" "CMAKE_ANDROID_ARCH_ABI" "CMAKE_ANDROID_STL_TYPE" "CMAKE_ANDROID_RTTI" "CMAKE_ANDROID_EXCEPTIONS" "ANDROID_USE_LEGACY_TOOLCHAIN_FILE")
96    endif()
97
98    set(cmake_var)
99    foreach(var IN LISTS cmake_vars)
100        if (DEFINED ${var})
101            list(APPEND update_dep_command "--cmake_var")
102            list(APPEND update_dep_command "${var}=${${var}}")
103        endif()
104    endforeach()
105
106    if (cmake_var)
107        list(APPEND update_dep_command "${cmake_var}")
108    endif()
109
110    file(TIMESTAMP ${update_dep_py} timestamp_1)
111    file(TIMESTAMP ${known_good_json} timestamp_2)
112
113    string("MD5" md5_hash "${timestamp_1}-${timestamp_2}-${update_dep_command}")
114
115    set(UPDATE_DEPS_HASH "0" CACHE STRING "Default value until we run update_deps.py")
116    mark_as_advanced(UPDATE_DEPS_HASH)
117
118    if ("${UPDATE_DEPS_HASH}" STREQUAL "0")
119        list(APPEND update_dep_command "--clean-build")
120        list(APPEND update_dep_command "--clean-install")
121    endif()
122
123    if ("${md5_hash}" STREQUAL $CACHE{UPDATE_DEPS_HASH})
124        message(DEBUG "update_deps.py: no work to do.")
125    else()
126        execute_process(
127            COMMAND ${Python3_EXECUTABLE} ${update_dep_command}
128            RESULT_VARIABLE _update_deps_result
129        )
130        if (NOT (${_update_deps_result} EQUAL 0))
131            message(FATAL_ERROR "Could not run update_deps.py which is necessary to download dependencies.")
132        endif()
133        set(UPDATE_DEPS_HASH ${md5_hash} CACHE STRING "Ensure we only run update_deps.py when we need to." FORCE)
134        include("${UPDATE_DEPS_DIR}/helper.cmake")
135    endif()
136endif()
137if (VULKAN_HEADERS_INSTALL_DIR)
138    list(APPEND CMAKE_PREFIX_PATH ${VULKAN_HEADERS_INSTALL_DIR})
139    set(CMAKE_REQUIRE_FIND_PACKAGE_VulkanHeaders TRUE PARENT_SCOPE)
140endif()
141
142if (CMAKE_CROSSCOMPILING)
143    set(CMAKE_FIND_ROOT_PATH ${CMAKE_FIND_ROOT_PATH} ${CMAKE_PREFIX_PATH} PARENT_SCOPE)
144else()
145    set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} PARENT_SCOPE)
146endif()
147