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.
121 lines
4.0 KiB
121 lines
4.0 KiB
# SPDX-License-Identifier: Apache-2.0 |
|
# |
|
# Copyright (c) 2021, Nordic Semiconductor ASA |
|
|
|
# Snippets support |
|
# |
|
# This module: |
|
# |
|
# - searches for snippets in zephyr and any modules |
|
# - validates the SNIPPET input variable, if any |
|
# |
|
# If SNIPPET contains a snippet name that is not found, an error |
|
# will be raised, and the list of valid snippets will be printed. |
|
# |
|
# Outcome: |
|
# The following variables will be defined when this module completes: |
|
# |
|
# - SNIPPET_AS_LIST: CMake list of snippet names, created from the |
|
# SNIPPET variable |
|
# - SNIPPET_ROOT: CMake list of snippet roots, deduplicated and with |
|
# ZEPHYR_BASE appended at the end |
|
# |
|
# The following variables may be updated when this module completes: |
|
# - DTC_OVERLAY_FILE |
|
# - OVERLAY_CONFIG |
|
# |
|
# The following targets will be defined when this CMake module completes: |
|
# - snippets: when invoked, a list of valid snippets will be printed |
|
# |
|
# Optional variables: |
|
# - SNIPPET_ROOT: input CMake list of snippet roots (directories containing |
|
# additional snippet implementations); this should not include ZEPHYR_BASE, |
|
# as that will be added by this module |
|
|
|
include_guard(GLOBAL) |
|
|
|
include(extensions) |
|
|
|
# Warn the user if SNIPPET changes later. Such changes are ignored. |
|
zephyr_check_cache(SNIPPET WATCH) |
|
|
|
# Putting the body into a function prevents us from polluting the |
|
# parent scope. We'll set our outcome variables in the parent scope of |
|
# the function to ensure the outcome of the module. |
|
function(zephyr_process_snippets) |
|
set(snippets_py ${ZEPHYR_BASE}/scripts/snippets.py) |
|
set(snippets_generated ${CMAKE_BINARY_DIR}/zephyr/snippets_generated.cmake) |
|
|
|
# Set SNIPPET_AS_LIST, removing snippets_generated.cmake if we are |
|
# running cmake again and snippets are no longer requested. |
|
if (NOT DEFINED SNIPPET) |
|
set(SNIPPET_AS_LIST "" PARENT_SCOPE) |
|
file(REMOVE ${snippets_generated}) |
|
else() |
|
string(REPLACE " " ";" SNIPPET_AS_LIST "${SNIPPET}") |
|
set(SNIPPET_AS_LIST "${SNIPPET_AS_LIST}" PARENT_SCOPE) |
|
endif() |
|
|
|
# Set SNIPPET_ROOT. |
|
list(APPEND SNIPPET_ROOT ${APPLICATION_SOURCE_DIR}) |
|
list(APPEND SNIPPET_ROOT ${ZEPHYR_BASE}) |
|
unset(real_snippet_root) |
|
foreach(snippet_dir ${SNIPPET_ROOT}) |
|
# The user might have put a symbolic link in here, for example. |
|
file(REAL_PATH ${snippet_dir} real_snippet_dir) |
|
list(APPEND real_snippet_root ${real_snippet_dir}) |
|
endforeach() |
|
set(SNIPPET_ROOT ${real_snippet_root}) |
|
list(REMOVE_DUPLICATES SNIPPET_ROOT) |
|
set(SNIPPET_ROOT "${SNIPPET_ROOT}" PARENT_SCOPE) |
|
|
|
# Generate and include snippets_generated.cmake. |
|
# The Python script is responsible for checking for unknown |
|
# snippets. |
|
set(snippet_root_args) |
|
foreach(root IN LISTS SNIPPET_ROOT) |
|
list(APPEND snippet_root_args --snippet-root "${root}") |
|
endforeach() |
|
set(requested_snippet_args) |
|
foreach(snippet_name ${SNIPPET_AS_LIST}) |
|
list(APPEND requested_snippet_args --snippet "${snippet_name}") |
|
endforeach() |
|
execute_process(COMMAND ${PYTHON_EXECUTABLE} |
|
${snippets_py} |
|
${snippet_root_args} |
|
${requested_snippet_args} |
|
--cmake-out ${snippets_generated} |
|
OUTPUT_VARIABLE output |
|
ERROR_VARIABLE output |
|
RESULT_VARIABLE ret) |
|
if(${ret}) |
|
message(FATAL_ERROR "${output}") |
|
endif() |
|
include(${snippets_generated}) |
|
|
|
# Create the 'snippets' target. Each snippet is printed in a |
|
# separate command because build system files are not fond of |
|
# newlines. |
|
list(TRANSFORM SNIPPET_NAMES PREPEND "COMMAND;${CMAKE_COMMAND};-E;echo;" |
|
OUTPUT_VARIABLE snippets_target_cmd) |
|
add_custom_target(snippets ${snippets_target_cmd} USES_TERMINAL) |
|
|
|
# If snippets were requested, print messages for each one. |
|
if(SNIPPET_AS_LIST) |
|
# Print the requested snippets. |
|
set(snippet_names "Snippet(s):") |
|
foreach(snippet IN LISTS SNIPPET_AS_LIST) |
|
string(APPEND snippet_names " ${snippet}") |
|
endforeach() |
|
message(STATUS "${snippet_names}") |
|
endif() |
|
|
|
# Re-run cmake if any files we depend on changed. |
|
set_property(DIRECTORY APPEND PROPERTY |
|
CMAKE_CONFIGURE_DEPENDS |
|
${snippets_py} |
|
${SNIPPET_PATHS} # generated variable |
|
) |
|
endfunction() |
|
|
|
zephyr_process_snippets()
|
|
|