# Minimal CMake build for speexdsp's resampler only.
# 仅编译 libspeexdsp/resample.c，使用 OUTSIDE_SPEEX + FLOATING_POINT 模式，
# 无需运行 autoconf/configure，也无需 os_support / kiss_fft 等其他源文件。
# 暴露 target: speexdsp_resampler，公开头文件路径 include/speex。

cmake_minimum_required(VERSION 3.16)

set(INCLUDE_STDINT "#include <stdint.h>")
set(SIZE16 "int16_t")
set(USIZE16 "uint16_t")
set(SIZE32 "int32_t")
set(USIZE32 "uint32_t")
configure_file(
    ${CMAKE_CURRENT_SOURCE_DIR}/include/speex/speexdsp_config_types.h.in
    ${CMAKE_CURRENT_SOURCE_DIR}/include/speex/speexdsp_config_types.h
    @ONLY
)

set(SPEEXDSP_RESAMPLER_SRC
    libspeexdsp/resample.c
)

add_library(speexdsp_resampler STATIC ${SPEEXDSP_RESAMPLER_SRC})

target_include_directories(speexdsp_resampler
    PUBLIC
        ${CMAKE_CURRENT_SOURCE_DIR}/include
    PRIVATE
        # OUTSIDE_SPEEX 模式下 resample.c 通过 "speex_resampler.h" 直接包含
        ${CMAKE_CURRENT_SOURCE_DIR}/include/speex
        ${CMAKE_CURRENT_SOURCE_DIR}/libspeexdsp
)

# OUTSIDE_SPEEX:
#   - 让 resample.c 走自包含路径，不依赖 speexdsp 内部生成的 config.h /
#     os_support.h / speexdsp_types.h。
#   - speex_resampler.h 中通过 RANDOM_PREFIX 给所有导出符号加前缀，
#     这里设为 "speex"，最终导出符号正是 speex_resampler_* / speex_resampler_strerror 等，
#     与公开头文件 <speex/speex_resampler.h> 中函数声明保持一致。
# FLOATING_POINT:
#   - 使用浮点核心，避免依赖 fixed_*.h（aarch64 上简化构建）。
# EXPORT:
#   - OUTSIDE_SPEEX 路径下 EXPORT 宏需要被定义为空。
target_compile_definitions(speexdsp_resampler
    PRIVATE
        OUTSIDE_SPEEX
        RANDOM_PREFIX=speex
        FLOATING_POINT
        EXPORT=
)

# 注：暂不启用 USE_NEON，speexdsp 的 NEON 头文件对 32-bit / 64-bit ARM 的封装
# 与编译器要求差异较大，保持通用 C 实现以确保跨平台稳定可构建。

# resample.c 中部分计算依赖 -lm
if(UNIX)
    target_link_libraries(speexdsp_resampler PUBLIC m)
endif()

set_target_properties(speexdsp_resampler PROPERTIES
    POSITION_INDEPENDENT_CODE ON
    C_STANDARD 99
)

# 静默上游 C 文件中的告警，避免污染主项目编译输出。
if(CMAKE_C_COMPILER_ID MATCHES "GNU|Clang")
    target_compile_options(speexdsp_resampler PRIVATE
        -w
    )
endif()