cmake_minimum_required(VERSION 3.13)

set(BUILD_PLATFORM "Linux" CACHE STRING "Target platform: Pico or Linux")
set_property(CACHE BUILD_PLATFORM PROPERTY STRINGS Pico Linux)

if(NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/cmake/platform_${BUILD_PLATFORM}_pre.cmake")
    message(FATAL_ERROR "Unknown BUILD_PLATFORM '${BUILD_PLATFORM}' (no cmake/platform_${BUILD_PLATFORM}_pre.cmake found)")
endif()

string(TOLOWER ${BUILD_PLATFORM} BUILD_PLATFORM_LOWER)

set(GEOGRAPHICLIB_DIR ${CMAKE_CURRENT_SOURCE_DIR}/geographiclib)

# Configure GeographicLib before adding it, to skip docs/tools/tests
set(BUILD_SHARED_LIBS OFF CACHE BOOL "" FORCE)
set(BUILD_DOCUMENTATION OFF CACHE BOOL "" FORCE)
set(BUILD_BOTH_LIBRARIES OFF CACHE BOOL "" FORCE)
set(PACKAGE_DEBIAN OFF CACHE BOOL "" FORCE)

# Pre-project platform setup (e.g. Pico's pico_sdk_import.cmake must run
# before project(), and it must set PROJECT_LANGUAGES).
include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/platform_${BUILD_PLATFORM}_pre.cmake)

project(p-rad ${PROJECT_LANGUAGES})

set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# NOTE: don't use add_link_options/add_compile_options here - they apply to
# every target including pico-sdk's bs2_default, whose binary gets fully
# garbage-collected. Scope them to the p-rad target instead (see platform files).

# Automatically collect core sources and platform-specific HAL files.
# HAL files are matched by suffix convention: src/hal/*_<platform>.cpp
file(GLOB CORE_SOURCES CONFIGURE_DEPENDS "src/core/*.cpp" "src/core/*.c")
file(GLOB HAL_SOURCES CONFIGURE_DEPENDS "src/hal/*_${BUILD_PLATFORM_LOWER}.cpp")

add_subdirectory(${GEOGRAPHICLIB_DIR} EXCLUDE_FROM_ALL)

# Post-project platform setup: add_executable, link libraries, platform-specific calls.
include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/platform_${BUILD_PLATFORM}.cmake)
