1# PICO_BOARD is the root of config as it can define PICO_PLATFORM and other build vars 2 3# PICO_CMAKE_CONFIG: PICO_BOARD, Board name being built for. This may be specified in the user environment, type=string, default=pico or pico2, group=build, docref=cmake-platform-board-config 4if (DEFINED ENV{PICO_BOARD} AND NOT PICO_BOARD) 5 set(PICO_BOARD $ENV{PICO_BOARD}) 6 message("Initializing PICO_BOARD from environment ('${PICO_BOARD}')") 7endif() 8 9# PICO_CMAKE_CONFIG: PICO_PLATFORM, Platform to build for e.g. rp2040/rp2350/rp2350-arm-s/rp2350-riscv/host. This may be specified in the user environment, type=string, default=based on PICO_BOARD or environment value, group=build, docref=cmake-platform-board-config 10if (DEFINED ENV{PICO_PLATFORM} AND NOT PICO_PLATFORM) 11 set(PICO_PLATFORM $ENV{PICO_PLATFORM}) 12 message("Initializing PICO_PLATFORM from environment ('${PICO_PLATFORM}')") 13endif() 14set(PICO_SAVED_PLATFORM "${PICO_PLATFORM}") 15 16# If PICO_PLATFORM is specified byt not PICO_BOARD, we'll make a stab at defaulting 17if (NOT PICO_DEFAULT_BOARD_rp2040) 18 set(PICO_DEFAULT_BOARD_rp2040 "pico") 19endif() 20if (NOT PICO_DEFAULT_BOARD_rp2350) 21 set(PICO_DEFAULT_BOARD_rp2350 "pico2") 22endif() 23if (NOT PICO_DEFAULT_BOARD_rp2350-arm-s) 24 set(PICO_DEFAULT_BOARD_rp2350-arm-s "pico2") 25endif() 26if (NOT PICO_DEFAULT_BOARD_rp2350-riscv) 27 set(PICO_DEFAULT_BOARD_rp2350-riscv "pico2") 28endif() 29if (NOT PICO_DEFAULT_BOARD_host) 30 set(PICO_DEFAULT_BOARD_host "none") 31endif() 32 33if (NOT PICO_DEFAULT_PLATFORM) 34 set(PICO_DEFAULT_PLATFORM "rp2040") 35endif() 36 37if (NOT PICO_BOARD) 38 if (NOT PICO_PLATFORM) 39 # if we have neither BOARD nor PLATFORM default PLATFORM silently, so we don't end up with a board of "none" 40 # on platform that does have a default board (we want default PLATFORM and BOARD in that case) 41 set(PICO_PLATFORM ${PICO_DEFAULT_PLATFORM}) 42 # set PICO_SAVED_PLATFORM so we don't print "Defaulting" again below 43 set(PICO_SAVED_PLATFORM ${PICO_DEFAULT_PLATFORM}) 44 pico_message("Defaulting platform (PICO_PLATFORM) to '${PICO_PLATFORM}' since not specified.") 45 endif() 46 if (PICO_DEFAULT_BOARD_${PICO_PLATFORM}) 47 set(PICO_BOARD ${PICO_DEFAULT_BOARD_${PICO_PLATFORM}}) 48 else() 49 set(PICO_BOARD "none") 50 endif() 51 pico_message("Defaulting target board (PICO_BOARD) to '${PICO_BOARD}' since not specified.") 52else() 53 message("Target board (PICO_BOARD) is '${PICO_BOARD}'.") 54endif() 55set(PICO_BOARD ${PICO_BOARD} CACHE STRING "PICO target board (e.g. pico, pico2)" FORCE) 56 57# PICO_CMAKE_CONFIG: PICO_BOARD_CMAKE_DIRS, List of directories to look for <PICO_BOARD>.cmake in. This may be specified in the user environment, type=list, group=build 58if (DEFINED ENV{PICO_BOARD_CMAKE_DIRS}) 59 set(PICO_BOARD_CMAKE_DIRS $ENV{PICO_BOARD_CMAKE_DIRS}) 60 message("Using PICO_BOARD_CMAKE_DIRS from environment ('${PICO_BOARD_CMAKE_DIRS}')") 61endif() 62 63list(APPEND PICO_BOARD_CMAKE_DIRS ${CMAKE_CURRENT_LIST_DIR}/../src/boards) 64 65pico_find_in_paths(PICO_BOARD_CMAKE_FILE PICO_BOARD_CMAKE_DIRS ${PICO_BOARD}.cmake) 66if (EXISTS "${PICO_BOARD_CMAKE_FILE}") 67 message("Using CMake board configuration from ${PICO_BOARD_CMAKE_FILE}") 68 include(${PICO_BOARD_CMAKE_FILE} board_config) 69else() 70 include(generic_board) 71endif() 72 73list(APPEND PICO_INCLUDE_DIRS ${PICO_SDK_PATH}/src/boards/include) # so boards/foo.h can be explicitly included 74 75# PICO_CMAKE_CONFIG: PICO_DEFAULT_RP2350_PLATFORM, Default actual platform to build for if rp2350 is specified for PICO_PLATFORM e.g. rp2350-arm-s/rp2350-riscv, type=string, default=rp2350-arm-s, group=build 76if (DEFINED ENV{PICO_DEFAULT_RP2350_PLATFORM} AND NOT PICO_DEFAULT_RP2350_PLATFORM) 77 set(PICO_DEFAULT_RP2350_PLATFORM $ENV{PICO_DEFAULT_RP2350_PLATFORM}) 78endif() 79if (NOT PICO_DEFAULT_RP2350_PLATFORM) 80 set(PICO_DEFAULT_RP2350_PLATFORM "rp2350-arm-s") 81endif() 82 83if (NOT COMMAND pico_expand_pico_platform) 84 function(pico_expand_pico_platform FUNC DO_MESSAGE) 85 if (${FUNC} STREQUAL "rp2350") 86 if (DO_MESSAGE) 87 message("Auto-converting non-specific PICO_PLATFORM='rp2350' to 'rp2350-arm-s'") 88 endif() 89 set(${FUNC} "${PICO_DEFAULT_RP2350_PLATFORM}" PARENT_SCOPE) 90 endif() 91 endfunction() 92endif() 93 94if (NOT PICO_PLATFORM) 95 set(PICO_PLATFORM ${PICO_DEFAULT_PLATFORM}) 96 pico_message("Defaulting platform (PICO_PLATFORM) to '${PICO_PLATFORM}' since not specified.") 97else() 98 if (NOT PICO_SAVED_PLATFORM) 99 pico_expand_pico_platform(PICO_PLATFORM 1) 100 pico_message("Defaulting platform (PICO_PLATFORM) to '${PICO_PLATFORM}' based on PICO_BOARD setting.") 101 else() 102 string(REGEX REPLACE "-.*" "" PICO_PLATFORM_PREFIX ${PICO_PLATFORM}) 103 string(REGEX REPLACE "-.*" "" PICO_SAVED_PLATFORM_PREFIX ${PICO_SAVED_PLATFORM}) 104 if (PICO_PLATFORM_PREFIX STREQUAL PICO_SAVED_PLATFORM_PREFIX) 105 # the PICO_PLATFORM specified based on the board is compatible based on the one we were 106 # already using, so use that 107 pico_expand_pico_platform(PICO_SAVED_PLATFORM 0) 108 set(PICO_PLATFORM ${PICO_SAVED_PLATFORM}) 109 message("Pico Platform (PICO_PLATFORM) is '${PICO_PLATFORM}'.") 110 else() 111 message(FATAL_ERROR "PICO_PLATFORM is specified to be '${PICO_SAVED_PLATFORM}', but PICO_BOARD='${PICO_BOARD}' uses \ 112 '${PICO_PLATFORM}' which is incompatible. You need to delete the CMake cache or build directory and reconfigure to proceed. \ 113 The best practice is to use separate build directories for different platforms.") 114 endif() 115 endif() 116endif() 117unset(PICO_SAVED_PLATFORM) 118 119if (PICO_PREVIOUS_PLATFORM AND NOT PICO_PREVIOUS_PLATFORM STREQUAL PICO_PLATFORM) 120 message(FATAL_ERROR "PICO_PLATFORM has been modified from '${PICO_SAVED_PLATFORM}' to '${PICO_PLATFORM}.\ 121 You need to delete the CMake cache or build directory and reconfigure to proceed.\ 122 The best practice is to use separate build directories for different platforms.") 123endif() 124set(PICO_PLATFORM ${PICO_PLATFORM} CACHE STRING "PICO Build platform (e.g. rp2040, rp2350, rp2350-riscv, host)" FORCE) 125set(PICO_PREVIOUS_PLATFORM ${PICO_PLATFORM} CACHE STRING "Saved PICO Build platform (e.g. rp2040, rp2350, rp2350-riscv, host)" INTERNAL) 126 127# PICO_CMAKE_CONFIG: PICO_CMAKE_PRELOAD_PLATFORM_FILE, Custom CMake file to use to set up the platform environment, type=string, group=build 128set(PICO_CMAKE_PRELOAD_PLATFORM_FILE ${PICO_CMAKE_PRELOAD_PLATFORM_FILE} CACHE INTERNAL "") 129if (NOT PICO_CMAKE_PRELOAD_PLATFORM_DIR) 130 set(PICO_CMAKE_PRELOAD_PLATFORM_DIR "${CMAKE_CURRENT_LIST_DIR}/preload/platforms") 131endif() 132set(PICO_CMAKE_PRELOAD_PLATFORM_DIR "${PICO_CMAKE_PRELOAD_PLATFORM_DIR}" CACHE INTERNAL "") 133 134if (NOT PICO_CMAKE_PRELOAD_PLATFORM_FILE) 135 set(PICO_CMAKE_PRELOAD_PLATFORM_FILE ${PICO_CMAKE_PRELOAD_PLATFORM_DIR}/${PICO_PLATFORM}.cmake CACHE INTERNAL "") 136endif () 137 138if (NOT EXISTS "${PICO_CMAKE_PRELOAD_PLATFORM_FILE}") 139 message(FATAL_ERROR "${PICO_CMAKE_PRELOAD_PLATFORM_FILE} does not exist. \ 140 Either specify a valid PICO_PLATFORM (or PICO_CMAKE_PRELOAD_PLATFORM_FILE).") 141endif () 142 143include(${PICO_CMAKE_PRELOAD_PLATFORM_FILE}) 144