1# PICO_CMAKE_CONFIG: PICO_TOOLCHAIN_PATH, Path to search for compiler, type=string, default=none (i.e. search system paths), group=build, docref=cmake-toolchain-config
2set(PICO_TOOLCHAIN_PATH "${PICO_TOOLCHAIN_PATH}" CACHE INTERNAL "")
3
4# Set a default build type if none was specified
5set(default_build_type "Release")
6
7list(APPEND CMAKE_TRY_COMPILE_PLATFORM_VARIABLES CMAKE_PREFIX_PATH)
8
9if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
10    message(STATUS "Defaulting build type to '${default_build_type}' since not specified.")
11    set(CMAKE_BUILD_TYPE "${default_build_type}" CACHE STRING "Choose the type of build, options are: 'Debug', 'Release', 'MinSizeRel', 'RelWithDebInfo'." FORCE)
12    # Set the possible values of build type for cmake-gui
13    set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS
14            "Debug" "Release" "MinSizeRel" "RelWithDebInfo")
15endif()
16
17if (CMAKE_BUILD_TYPE STREQUAL "Default")
18    error("Default build type is NOT supported")
19endif()
20
21if (NOT (DEFINED PICO_COMPILER OR DEFINED CMAKE_TOOLCHAIN_FILE))
22    if (DEFINED PICO_DEFAULT_COMPILER)
23        pico_message("Defaulting compiler (PICO_COMPILER) to '${PICO_DEFAULT_COMPILER}' since not specified.")
24        set(PICO_COMPILER ${PICO_DEFAULT_COMPILER})
25    endif()
26endif ()
27
28# PICO_CMAKE_CONFIG: PICO_COMPILER, Specifies the compiler family to use, type=string, group=build, default=PICO_DEFAULT_COMPILER which is set based on PICO_PLATFORM, docref=cmake-toolchain-config
29# If PICO_COMPILER is specified, set toolchain file to ${PICO_COMPILER}.cmake.
30if (DEFINED PICO_COMPILER)
31    # maintain backwards compatibility with RP2040 SDK compilers
32    set(ORIG_PICO_COMPILER "${PICO_COMPILER}")
33    if (PICO_COMPILER STREQUAL "pico_arm_gcc")
34        if (PICO_PLATFORM STREQUAL "rp2040")
35            set(PICO_COMPILER "pico_arm_cortex_m0plus_gcc")
36        elseif(PICO_PLATFORM STREQUAL "rp2350")
37            set(PICO_COMPILER "pico_arm_cortex_m33_gcc")
38        endif()
39    elseif(PICO_COMPILER STREQUAL "pico_arm_clang")
40        if (PICO_PLATFORM STREQUAL "rp2040")
41            set(PICO_COMPILER "pico_arm_cortex_m0plus_clang")
42        elseif(PICO_PLATFORM STREQUAL "rp2350-arm-s")
43            set(PICO_COMPILER "pico_arm_cortex_m33_clang")
44        elseif(PICO_PLATFORM STREQUAL "rp2350-arm-ns")
45            set(PICO_COMPILER "pico_arm_cortex_m33_clang")
46        endif()
47    endif()
48    if (NOT PICO_COMPILER STREQUAL ORIG_PICO_COMPILER)
49        message("Accepting PICO_COMPILER value '${ORIG_PICO_COMPILER}' for compatibility, but using '${PICO_COMPILER}' instead")
50    endif()
51    if (NOT DEFINED PICO_TOOLCHAIN_DIR)
52        set(PICO_TOOLCHAIN_DIR "${CMAKE_CURRENT_LIST_DIR}/preload/toolchains")
53    endif()
54    set(toolchain_file "${PICO_TOOLCHAIN_DIR}/${PICO_COMPILER}.cmake")
55    if (EXISTS "${toolchain_file}")
56        set(CMAKE_TOOLCHAIN_FILE "${toolchain_file}")
57    else ()
58        # todo improve message
59        message(FATAL_ERROR "Toolchain file \"${PICO_COMPILER}.cmake\" does not exist, please\
60            select one from \"cmake/toolchains\" folder.")
61    endif ()
62    message("Configuring toolchain based on PICO_COMPILER '${PICO_COMPILER}'")
63endif ()
64
65if (PICO_PREVIOUS_CMAKE_TOOLCHAIN_FILE)
66    if (NOT "${PICO_PREVIOUS_CMAKE_TOOLCHAIN_FILE}" STREQUAL "${CMAKE_TOOLCHAIN_FILE}")
67        message(FATAL_ERROR "CMAKE_TOOLCHAIN_FILE was previously defined to ${PICO_PREVIOUS_CMAKE_TOOLCHAIN_FILE}, and now\
68                is being changed to ${CMAKE_TOOLCHAIN_FILE}. You\
69                need to delete the CMake cache and reconfigure if you want to switch compiler.\
70                The best practice is to use separate build directories for different platforms or compilers.")
71    endif ()
72endif ()
73
74set(PICO_PREVIOUS_CMAKE_TOOLCHAIN_FILE ${CMAKE_TOOLCHAIN_FILE} CACHE INTERNAL "Saved CMAKE_TOOLCHAIN_FILE" FORCE)
75unset(PICO_COMPILER CACHE)
76
77