You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
98 lines
3.0 KiB
98 lines
3.0 KiB
# SPDX-License-Identifier: Apache-2.0 |
|
# |
|
# Copyright (c) 2021, Nordic Semiconductor ASA |
|
|
|
# Configure user cache directory. |
|
# |
|
# The user cache can be used for caching of data that should be persistent |
|
# across builds to speed up CMake configure / build system generation and/or |
|
# compilation. |
|
# |
|
# Only data that can be safely re-generated should be placed in this cache. |
|
# |
|
# Zephyr build system uses this user cache to store Zephyr compiler check |
|
# results which significantly improve toolchain testing performance. |
|
# See https://github.com/zephyrproject-rtos/zephyr/pull/7102 for details. |
|
# |
|
# Outcome: |
|
# The following variables will be defined when this CMake module completes: |
|
# |
|
# - USER_CACHE_DIR: User cache directory in use. |
|
# |
|
# If the above variable is already set when this CMake module is loaded, |
|
# then no changes to the variable will happen. |
|
# |
|
# Variables set by this module and not mentioned above are considered internal |
|
# use only and may be removed, renamed, or re-purposed without prior notice. |
|
|
|
include_guard(GLOBAL) |
|
|
|
include(python) |
|
|
|
function(find_appropriate_cache_directory dir) |
|
set(env_suffix_LOCALAPPDATA .cache) |
|
|
|
if(CMAKE_HOST_APPLE) |
|
# On macOS, ~/Library/Caches is the preferred cache directory. |
|
set(env_suffix_HOME Library/Caches) |
|
else() |
|
set(env_suffix_HOME .cache) |
|
endif() |
|
|
|
# Determine which env vars should be checked |
|
if(CMAKE_HOST_APPLE) |
|
set(dirs HOME) |
|
elseif(CMAKE_HOST_WIN32) |
|
set(dirs LOCALAPPDATA) |
|
else() |
|
# Assume Linux when we did not detect 'mac' or 'win' |
|
# |
|
# On Linux, freedesktop.org recommends using $XDG_CACHE_HOME if |
|
# that is defined and defaulting to $HOME/.cache otherwise. |
|
set(dirs |
|
XDG_CACHE_HOME |
|
HOME |
|
) |
|
endif() |
|
|
|
foreach(env_var ${dirs}) |
|
if(DEFINED ENV{${env_var}}) |
|
set(env_dir $ENV{${env_var}}) |
|
|
|
string(JOIN "/" test_user_dir ${env_dir} ${env_suffix_${env_var}}) |
|
|
|
execute_process(COMMAND ${PYTHON_EXECUTABLE} |
|
${ZEPHYR_BASE}/scripts/build/dir_is_writeable.py ${test_user_dir} |
|
RESULT_VARIABLE writable_result |
|
) |
|
if("${writable_result}" STREQUAL "0") |
|
# The directory is write-able |
|
set(user_dir ${test_user_dir}) |
|
break() |
|
else() |
|
# The directory was not writeable, keep looking for a suitable |
|
# directory |
|
endif() |
|
endif() |
|
endforeach() |
|
|
|
# Populate local_dir with a suitable directory for caching |
|
# files. Prefer a directory outside of the git repository because it |
|
# is good practice to have clean git repositories. |
|
if(DEFINED user_dir) |
|
# Zephyr's cache files go in the "zephyr" subdirectory of the |
|
# user's cache directory. |
|
set(local_dir ${user_dir}/zephyr) |
|
else() |
|
set(local_dir ${ZEPHYR_BASE}/.cache) |
|
endif() |
|
|
|
set(${dir} ${local_dir} PARENT_SCOPE) |
|
endfunction() |
|
|
|
# Populate USER_CACHE_DIR with a directory that user applications may |
|
# write cache files to. |
|
if(NOT DEFINED USER_CACHE_DIR) |
|
find_appropriate_cache_directory(USER_CACHE_DIR) |
|
endif() |
|
message(STATUS "Cache files will be written to: ${USER_CACHE_DIR}")
|
|
|