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