cmake_minimum_required(VERSION 3.16) project(Tasmota) # Find PlatformIO executable find_program(PLATFORMIO_CMD NAMES pio platformio) if(NOT PLATFORMIO_CMD) message(FATAL_ERROR "PlatformIO not found. Please install PlatformIO CLI.") endif() message(STATUS "Found PlatformIO: ${PLATFORMIO_CMD}") # Set default environment set(PIO_ENV "tasmota" CACHE STRING "PlatformIO environment to build") # Create a dummy target for CLion to parse add_custom_target(tasmota_dummy ALL COMMAND ${CMAKE_COMMAND} -E echo "Use PlatformIO targets to build" WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} ) # PlatformIO build target add_custom_target(pio_build COMMAND ${PLATFORMIO_CMD} run -e ${PIO_ENV} WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} COMMENT "Building PlatformIO environment: ${PIO_ENV}" ) # PlatformIO clean target add_custom_target(pio_clean COMMAND ${PLATFORMIO_CMD} run -e ${PIO_ENV} -t clean WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} COMMENT "Cleaning PlatformIO environment: ${PIO_ENV}" ) # PlatformIO upload target add_custom_target(pio_upload COMMAND ${PLATFORMIO_CMD} run -e ${PIO_ENV} -t upload WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} COMMENT "Uploading PlatformIO environment: ${PIO_ENV}" ) # PlatformIO monitor target add_custom_target(pio_monitor COMMAND ${PLATFORMIO_CMD} device monitor WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} COMMENT "Starting PlatformIO serial monitor" ) # Common Tasmota environments as separate targets set(TASMOTA_ENVS tasmota tasmota32 tasmota-minimal tasmota-sensors tasmota-display tasmota-ir ) foreach(env ${TASMOTA_ENVS}) add_custom_target(build_${env} COMMAND ${PLATFORMIO_CMD} run -e ${env} WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} COMMENT "Building ${env}" ) endforeach() # Generate compile_commands.json for code intelligence add_custom_target(generate_compile_commands COMMAND ${PLATFORMIO_CMD} run -t compiledb -e ${PIO_ENV} WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} COMMENT "Generating compile_commands.json" ) # Parse source files for CLion indexing (using tasmota directory) file(GLOB_RECURSE TASMOTA_SOURCES "${CMAKE_SOURCE_DIR}/tasmota/*.ino" "${CMAKE_SOURCE_DIR}/tasmota/*.cpp" "${CMAKE_SOURCE_DIR}/tasmota/*.c" "${CMAKE_SOURCE_DIR}/tasmota/*.h" ) # Create a library target for indexing (won't actually build) if(TASMOTA_SOURCES) add_library(tasmota_indexing EXCLUDE_FROM_ALL ${TASMOTA_SOURCES}) set_target_properties(tasmota_indexing PROPERTIES LINKER_LANGUAGE CXX) target_include_directories(tasmota_indexing PRIVATE ${CMAKE_SOURCE_DIR}/tasmota ${CMAKE_SOURCE_DIR}/tasmota/include ) # Set some basic defines for indexing target_compile_definitions(tasmota_indexing PRIVATE ARDUINO=10816 ARDUINO_ARCH_ESP8266 ESP8266 TASMOTA ) endif() message(STATUS "CMake wrapper for PlatformIO configured") message(STATUS "Available targets:") message(STATUS " - pio_build: Build default environment (${PIO_ENV})") message(STATUS " - pio_clean: Clean build files") message(STATUS " - pio_upload: Upload firmware to device") message(STATUS " - pio_monitor: Serial monitor") message(STATUS " - build_: Build specific environment") message(STATUS " - generate_compile_commands: Update code intelligence")