Files
klubhaus-doorbell/libraries/FastLED/src/CMakeLists.txt
2026-02-12 00:45:31 -08:00

258 lines
9.5 KiB
CMake

# -----------------------------------------------------------------------------
# Efficiently compiles the libfastled.a archive to link against.
# Optionally, you can copy the header tree to a specified include path.
# -----------------------------------------------------------------------------
cmake_minimum_required(VERSION 3.5)
# Set FastLED source directory (this is where the FastLED sources live)
set(FASTLED_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
message(STATUS "FASTLED_SOURCE_DIR: ${FASTLED_SOURCE_DIR}")
if(NOT DEFINED CMAKE_CXX_STANDARD)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
message(STATUS "CMAKE_CXX_STANDARD not defined. Setting C++ standard to 17.")
else()
message(STATUS "CMAKE_CXX_STANDARD already defined as: ${CMAKE_CXX_STANDARD}")
endif()
# Retrieve and print the flags passed from the parent build system
message(STATUS "Using compile flags from parent CMakeLists.txt")
message(STATUS "COMMON_COMPILE_FLAGS: ${COMMON_COMPILE_FLAGS}")
message(STATUS "COMMON_COMPILE_DEFINITIONS: ${COMMON_COMPILE_DEFINITIONS}")
# Verify the directory exists
if(NOT EXISTS ${FASTLED_SOURCE_DIR})
message(FATAL_ERROR "Error: FASTLED_SOURCE_DIR does not exist! Check directory path.")
endif()
# Include FastLED headers (assumed to be in this directory)
include_directories(${FASTLED_SOURCE_DIR})
# Check if we should use unified compilation mode (FASTLED_ALL_SRC=1)
# Responds to directives from test system or environment variables
# Does NOT make compiler-specific decisions - that's handled by the test system
if(NOT DEFINED FASTLED_ALL_SRC)
# Only set default if not already specified by parent or environment
option(FASTLED_ALL_SRC "Enable unified compilation mode" OFF)
message(STATUS "FASTLED_ALL_SRC not specified: using default OFF (individual file compilation)")
else()
# Respect the value passed from parent CMake or environment
message(STATUS "FASTLED_ALL_SRC specified by parent/environment: ${FASTLED_ALL_SRC}")
endif()
if(FASTLED_ALL_SRC)
message(STATUS "FASTLED_ALL_SRC=ON: Using unified compilation mode")
# === Get all the source files ===
file(GLOB_RECURSE ALL_CPP_FILES "${FASTLED_SOURCE_DIR}/*.cpp")
# Exclude platform-specific files (e.g. esp, arm, avr)
list(FILTER ALL_CPP_FILES EXCLUDE REGEX ".*esp.*")
list(FILTER ALL_CPP_FILES EXCLUDE REGEX ".*arm.*")
list(FILTER ALL_CPP_FILES EXCLUDE REGEX ".*avr.*")
list(LENGTH ALL_CPP_FILES CPP_FILE_COUNT)
message(STATUS "Found ${CPP_FILE_COUNT} .cpp files for unified compilation")
# Organize files by subdirectory for detailed reporting
set(ROOT_FILES "")
set(FL_FILES "")
set(FX_FILES "")
set(SENSORS_FILES "")
set(PLATFORMS_FILES "")
set(THIRD_PARTY_FILES "")
set(OTHER_FILES "")
foreach(cpp_file ${ALL_CPP_FILES})
file(RELATIVE_PATH relative_path ${FASTLED_SOURCE_DIR} ${cpp_file})
if(relative_path MATCHES "^fl/")
list(APPEND FL_FILES ${relative_path})
elseif(relative_path MATCHES "^fx/")
list(APPEND FX_FILES ${relative_path})
elseif(relative_path MATCHES "^sensors/")
list(APPEND SENSORS_FILES ${relative_path})
elseif(relative_path MATCHES "^platforms/")
list(APPEND PLATFORMS_FILES ${relative_path})
elseif(relative_path MATCHES "^third_party/")
list(APPEND THIRD_PARTY_FILES ${relative_path})
elseif(NOT relative_path MATCHES "/")
list(APPEND ROOT_FILES ${relative_path})
else()
list(APPEND OTHER_FILES ${relative_path})
endif()
endforeach()
# Report files by category
message(STATUS "=== UNIFIED COMPILATION FILE BREAKDOWN ===")
list(LENGTH ROOT_FILES ROOT_COUNT)
if(ROOT_COUNT GREATER 0)
message(STATUS "Root src/ files (${ROOT_COUNT}):")
foreach(file ${ROOT_FILES})
message(STATUS " ${file}")
endforeach()
endif()
list(LENGTH FL_FILES FL_COUNT)
if(FL_COUNT GREATER 0)
message(STATUS "FL library files (${FL_COUNT}):")
foreach(file ${FL_FILES})
message(STATUS " ${file}")
endforeach()
endif()
list(LENGTH FX_FILES FX_COUNT)
if(FX_COUNT GREATER 0)
message(STATUS "FX library files (${FX_COUNT}):")
foreach(file ${FX_FILES})
message(STATUS " ${file}")
endforeach()
endif()
list(LENGTH SENSORS_FILES SENSORS_COUNT)
if(SENSORS_COUNT GREATER 0)
message(STATUS "Sensors library files (${SENSORS_COUNT}):")
foreach(file ${SENSORS_FILES})
message(STATUS " ${file}")
endforeach()
endif()
list(LENGTH PLATFORMS_FILES PLATFORMS_COUNT)
if(PLATFORMS_COUNT GREATER 0)
message(STATUS "Platforms library files (${PLATFORMS_COUNT}):")
foreach(file ${PLATFORMS_FILES})
message(STATUS " ${file}")
endforeach()
endif()
list(LENGTH THIRD_PARTY_FILES THIRD_PARTY_COUNT)
if(THIRD_PARTY_COUNT GREATER 0)
message(STATUS "Third party library files (${THIRD_PARTY_COUNT}):")
foreach(file ${THIRD_PARTY_FILES})
message(STATUS " ${file}")
endforeach()
endif()
list(LENGTH OTHER_FILES OTHER_COUNT)
if(OTHER_COUNT GREATER 0)
message(STATUS "Other files (${OTHER_COUNT}):")
foreach(file ${OTHER_FILES})
message(STATUS " ${file}")
endforeach()
endif()
message(STATUS "=== TOTAL: ${CPP_FILE_COUNT} files combined into unified compilation ===")
# Generate unified source file that includes all .cpp files
set(UNIFIED_SOURCE_FILE "${CMAKE_CURRENT_BINARY_DIR}/fastled_unified.cpp")
# Create content for unified source file
set(UNIFIED_CONTENT "// Auto-generated unified compilation file\n")
set(UNIFIED_CONTENT "${UNIFIED_CONTENT}// This file includes all FastLED source files for unified compilation\n")
set(UNIFIED_CONTENT "${UNIFIED_CONTENT}// Generated from ${CPP_FILE_COUNT} .cpp files\n\n")
foreach(cpp_file ${ALL_CPP_FILES})
# Convert absolute path to relative path from FASTLED_SOURCE_DIR
file(RELATIVE_PATH relative_path ${FASTLED_SOURCE_DIR} ${cpp_file})
set(UNIFIED_CONTENT "${UNIFIED_CONTENT}#include \"${relative_path}\"\n")
endforeach()
# Write the unified source file
file(WRITE ${UNIFIED_SOURCE_FILE} ${UNIFIED_CONTENT})
# Use only the unified source file for compilation
set(FASTLED_SOURCES ${UNIFIED_SOURCE_FILE})
message(STATUS "Generated unified source file: ${UNIFIED_SOURCE_FILE}")
else()
message(STATUS "FASTLED_ALL_SRC=OFF: Using individual file compilation mode")
# === Get all the source files ===
file(GLOB_RECURSE FASTLED_SOURCES "${FASTLED_SOURCE_DIR}/*.c*")
message(STATUS "Found source files: ${FASTLED_SOURCES}")
if(FASTLED_SOURCES STREQUAL "")
message(FATAL_ERROR "Error: No source files found in ${FASTLED_SOURCE_DIR}!")
endif()
# Exclude platform-specific files (e.g. esp, arm, avr)
list(FILTER FASTLED_SOURCES EXCLUDE REGEX ".*esp.*")
list(FILTER FASTLED_SOURCES EXCLUDE REGEX ".*arm.*")
list(FILTER FASTLED_SOURCES EXCLUDE REGEX ".*avr.*")
endif()
# -----------------------------------------------------------------------------
# Create the main FastLED library from sources (unified or individual)
# -----------------------------------------------------------------------------
add_library(fastled STATIC ${FASTLED_SOURCES})
# Apply FastLED library-specific compile flags and definitions
# Note: We apply library-specific flags that disable exceptions/RTTI for embedded compatibility
target_compile_options(fastled PRIVATE
# Core warning flags
-Wall
-funwind-tables
$<$<CONFIG:Debug>:-g>
$<$<CONFIG:Release>:-O2>
# FastLED embedded requirements: disable exceptions and RTTI
-fno-exceptions # Disable C++ exceptions (embedded requirement)
-fno-rtti # Disable runtime type info (embedded requirement)
# Dead code elimination
-ffunction-sections
-fdata-sections
# Essential warnings
-Werror=return-type
-Werror=missing-declarations
-Werror=uninitialized
-Werror=array-bounds
-Werror=null-dereference
-Werror=deprecated-declarations
-Wno-comment
)
# Add GCC-specific flags for FastLED library
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
target_compile_options(fastled PRIVATE
-Werror=maybe-uninitialized
)
endif()
# Add C++ specific flags for FastLED library
target_compile_options(fastled PRIVATE $<$<COMPILE_LANGUAGE:CXX>:
-Werror=suggest-override
-Werror=non-virtual-dtor
-Werror=switch-enum
-Werror=delete-non-virtual-dtor
>)
# Apply FastLED library-specific definitions
target_compile_definitions(fastled PRIVATE
FASTLED_FORCE_NAMESPACE=1
FASTLED_NO_AUTO_NAMESPACE
FASTLED_STUB_IMPL
FASTLED_NO_PINMAP
HAS_HARDWARE_PIN_SUPPORT
PROGMEM=
FASTLED_FIVE_BIT_HD_GAMMA_FUNCTION_2_8
)
# Ensure full archive linking: force inclusion of all object files
target_link_options(fastled PRIVATE "-Wl,--whole-archive" "-Wl,--no-whole-archive")
# Add Windows debugging libraries for crash handler
if(WIN32)
target_link_libraries(fastled dbghelp psapi)
endif()
list(LENGTH FASTLED_SOURCES FASTLED_SOURCE_COUNT)
if(FASTLED_ALL_SRC)
message(STATUS "Created fastled library with unified compilation (${CPP_FILE_COUNT} .cpp files combined into ${FASTLED_SOURCE_COUNT} compilation unit)")
else()
message(STATUS "Created fastled library with ${FASTLED_SOURCE_COUNT} individual source files")
endif()