# 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}}) set(test_user_dir ${env_dir}/${env_suffix_${env_var}}) execute_process(COMMAND ${PYTHON_EXECUTABLE} ${ZEPHYR_BASE}/scripts/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}")