| # 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}") |