add_library(celcrsf STATIC crsf.c crsf_telemetry.c crsf_stream.c
                        crsf_param.c)
target_include_directories(celcrsf PUBLIC "${CMAKE_SOURCE_DIR}")
target_compile_features(celcrsf PRIVATE c_std_23)
target_link_libraries(celcrsf PUBLIC celserial)
add_library(cel::crsf ALIAS celcrsf)

# Platform-agnostic serial logic — calls cel_serial_platform_*();
# symbol resolved by celserial_platform (or a mock in tests)
add_library(celserial STATIC serial.c)
target_include_directories(celserial PUBLIC "${CMAKE_SOURCE_DIR}")
target_compile_features(celserial PRIVATE c_std_23)
add_library(cel::serial ALIAS celserial)

# Real platform backend — linked into production binaries only
add_library(celserial_platform STATIC)
target_include_directories(celserial_platform PUBLIC "${CMAKE_SOURCE_DIR}")
target_compile_features(celserial_platform PRIVATE c_std_23)
if (IS_WINDOWS)
    target_sources(celserial_platform PRIVATE platform/serial_win.c)
    target_link_libraries(celserial_platform PRIVATE advapi32 setupapi)
elseif(IS_LINUX OR IS_MACOS)
    target_sources(celserial_platform PRIVATE platform/serial_posix.c)
endif()

# Level-filtering logger — calls log_write(); symbol resolved by the final binary
add_library(cellogger STATIC logger.c)
target_include_directories(cellogger PUBLIC "${CMAKE_SOURCE_DIR}")
target_compile_features(cellogger PRIVATE c_std_23)
add_library(cel::logger ALIAS cellogger)

# Real log_write implementation — linked into production binaries only
add_library(cellog STATIC log_write.c)
target_include_directories(cellog PUBLIC "${CMAKE_SOURCE_DIR}")
target_compile_features(cellog PRIVATE c_std_23)
add_library(cel::log ALIAS cellog)

# Umbrella target — links all celrs libraries
add_library(cel INTERFACE)
target_link_libraries(cel INTERFACE celcrsf celserial cellogger cellog)
add_library(cel::cel ALIAS cel)
