zephyr/cmake/boards.cmake
Marc Herbert 3a04536487 doc,cmake: make find_package(Zephyr...) REQUIRED
This provides a better error message when building with CMake and
forgetting ZEPHYR_BASE or not registering Zephyr in the CMake package
registry. See parent commit for more details (split from parent for
better readability).

Signed-off-by: Marc Herbert <marc.herbert@intel.com>
2020-05-29 10:47:25 +02:00

118 lines
3.5 KiB
CMake

# SPDX-License-Identifier: Apache-2.0
# List all architectures, export the list in list_var
function(list_archs list_var)
FILE(GLOB arch_contents RELATIVE ${ZEPHYR_BASE}/arch ${ZEPHYR_BASE}/arch/*)
set(_arch_list)
foreach(f ${arch_contents})
if ("${f}" STREQUAL "common")
continue()
endif()
if (IS_DIRECTORY "${ZEPHYR_BASE}/arch/${f}")
list(APPEND _arch_list "${f}")
endif()
endforeach()
# Export the arch list to the parent scope
set(${list_var} ${_arch_list} PARENT_SCOPE)
endfunction()
# List all boards for a particular arch, export the list in list_var
function(list_boards arch list_var)
# Make sure we start with an empty list for each arch
set(_boards_for_${arch} "")
foreach(root ${BOARD_ROOT})
set(board_arch_dir ${root}/boards/${arch})
# Match the _defconfig files in the board directories to make sure we are
# finding boards, e.g. qemu_xtensa/qemu_xtensa_defconfig
file(GLOB_RECURSE defconfigs_for_${arch}
RELATIVE ${board_arch_dir}
${board_arch_dir}/*_defconfig
)
# The above gives a list like
# nrf51_blenano/nrf51_blenano_defconfig;nrf51dk_nrf51422/nrf51dk_nrf51422_defconfig
# we construct a list of board names by removing both the _defconfig
# suffix and the path.
foreach(defconfig_path ${defconfigs_for_${arch}})
get_filename_component(board ${defconfig_path} NAME)
string(REPLACE "_defconfig" "" board "${board}")
list(APPEND _boards_for_${arch} ${board})
endforeach()
endforeach()
# Export the board list for this arch to the parent scope
set(${list_var} ${_boards_for_${arch}} PARENT_SCOPE)
endfunction()
# Function to dump and optionally save to a file all architectures and boards
# Takes the board root as a semicolon-separated list in:
# BOARD_ROOT
# Additional arguments:
# file_out Filename to save the boards list. If not defined, stdout will be used
# indent Prepend an additional indendation string to each line
function(dump_all_boards file_out indent)
set(arch_list)
list_archs(arch_list)
foreach(arch ${arch_list})
list_boards(${arch} boards_for_${arch})
endforeach()
if(file_out)
file(WRITE ${file_out} "")
endif()
foreach(arch ${arch_list})
set(_arch_str "${indent}${arch}:")
if(file_out)
file(APPEND ${file_out} "${_arch_str}\n")
else()
message(${_arch_str})
endif()
foreach(board ${boards_for_${arch}})
set(_board_str "${indent} ${board}")
if(file_out)
file(APPEND ${file_out} "${_board_str}\n")
else()
message(${_board_str})
endif()
endforeach()
endforeach()
endfunction()
if(CMAKE_SCRIPT_MODE_FILE AND NOT CMAKE_PARENT_LIST_FILE)
# If this file is invoked as a script directly with -P:
# cmake [options] -P board.cmake
# Note that CMAKE_PARENT_LIST_FILE not being set ensures that this present
# file is being invoked directly with -P, and not via an include directive from
# some other script
# The options available are:
# BOARD_ROOT: Semi-colon separated board roots
# FILE_OUT: Set to a file path to save the boards to a file. If not defined the
# the contents will be printed to stdout
cmake_minimum_required(VERSION 3.13.1)
set(NO_BOILERPLATE TRUE)
find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
# Appending Zephyr base to list of board roots, as this is also done in boilerplate.cmake.
# But as this file was executed in script mode, it must also be done here, to give same output.
list(APPEND BOARD_ROOT ${ZEPHYR_BASE})
if (NOT FILE_OUT)
set(FILE_OUT FALSE)
endif()
dump_all_boards(${FILE_OUT} "")
endif()