12681e4b1b
Stacked on #222 (base `feat/c-abi-hub`), so the diff is just the additions on top of the hub foundation — no merge of #222 required. ## What this adds **Examples — full parity with rust/python/node (`examples/c/`)** - `streaming.c` upgraded to the multi-indicator (SMA/EMA/RSI/MACD + signals) demo - `backtest.c`, `multi_timeframe.c` (manual time-bucket resampling), `parallel_assets.c` (serial vs OpenMP fan-out, one handle per asset) - three educational strategies: `strategy_rsi_mean_reversion.c`, `strategy_macd_adx.c`, `strategy_bollinger_squeeze.c` - two network examples shelling out to `curl`: `fetch_btcusdt.c`, `live_binance.c` (REST poll) - two header-only helpers (`wickra_csv.h`, `wickra_strategy.h`) since the C ABI ships no IO layer - CMake builds all 11; the 9 offline ones run under `ctest` on 3 OS; the network two are built-only **Docs & metadata — surface the C ABI everywhere it was missing** - ARCHITECTURE diagram + crate table, SECURITY + THREAT_MODEL (the C ABI as the sole `unsafe` FFI surface), the three binding package READMEs, issue/PR templates, CHANGELOG, and the GitHub About template (live About + org description updated too) **Cleanup** - removed all references to the private generator tooling from public files (`bindings/c/src/lib.rs` header, `CONTRIBUTING.md`, `sync-about.yml`) Verified locally: `cargo build -p wickra-c --release`, `cmake + ctest` (9/9 pass), and `-Wall -Wextra -Wpedantic` clean on gcc 13.
83 lines
3.7 KiB
CMake
83 lines
3.7 KiB
CMake
cmake_minimum_required(VERSION 3.15)
|
|
project(wickra_c_examples C CXX)
|
|
|
|
# Directory holding the compiled Wickra C library (cargo output), e.g.
|
|
# <workspace>/target/release. Override with -DWICKRA_LIB_DIR=/path/to/target/release.
|
|
if(NOT DEFINED WICKRA_LIB_DIR)
|
|
set(WICKRA_LIB_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../target/release")
|
|
endif()
|
|
set(WICKRA_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../bindings/c/include")
|
|
|
|
# Absolute path to the bundled OHLCV datasets, baked into the data-driven
|
|
# examples as a compile definition so they run from any working directory (the
|
|
# C counterpart of the Rust examples' CARGO_MANIFEST_DIR).
|
|
get_filename_component(WICKRA_DATA_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../data" ABSOLUTE)
|
|
|
|
# OpenMP is optional: parallel_assets links it when present and falls back to a
|
|
# single-threaded run otherwise.
|
|
find_package(OpenMP QUIET)
|
|
|
|
# Pick the right link target per platform/toolchain.
|
|
# - MSVC links the generated import library (wickra.dll.lib).
|
|
# - MinGW/gcc on Windows links the DLL directly.
|
|
# - Unix links the shared object / dylib.
|
|
if(WIN32)
|
|
set(WICKRA_RUNTIME "${WICKRA_LIB_DIR}/wickra.dll")
|
|
if(MSVC)
|
|
set(WICKRA_LINK_LIB "${WICKRA_LIB_DIR}/wickra.dll.lib")
|
|
else()
|
|
set(WICKRA_LINK_LIB "${WICKRA_LIB_DIR}/wickra.dll")
|
|
endif()
|
|
elseif(APPLE)
|
|
set(WICKRA_LINK_LIB "${WICKRA_LIB_DIR}/libwickra.dylib")
|
|
else()
|
|
set(WICKRA_LINK_LIB "${WICKRA_LIB_DIR}/libwickra.so")
|
|
endif()
|
|
|
|
enable_testing()
|
|
|
|
# Build one example and link it to the Wickra library. On Windows the DLL is
|
|
# copied next to the executable so the loader finds it at run time. With
|
|
# register_test=TRUE the example is also run as a ctest; network examples pass
|
|
# FALSE (they are built only, never run in CI).
|
|
function(add_wickra_example name source register_test)
|
|
add_executable(${name} ${source})
|
|
target_include_directories(${name} PRIVATE "${WICKRA_INCLUDE_DIR}")
|
|
target_link_libraries(${name} PRIVATE "${WICKRA_LINK_LIB}")
|
|
target_compile_definitions(${name} PRIVATE "WICKRA_DATA_DIR=\"${WICKRA_DATA_DIR}\"")
|
|
if(UNIX AND NOT APPLE)
|
|
target_link_libraries(${name} PRIVATE m)
|
|
endif()
|
|
if(WIN32)
|
|
add_custom_command(TARGET ${name} POST_BUILD
|
|
COMMAND ${CMAKE_COMMAND} -E copy_if_different
|
|
"${WICKRA_RUNTIME}" "$<TARGET_FILE_DIR:${name}>")
|
|
endif()
|
|
if(register_test)
|
|
add_test(NAME ${name} COMMAND ${name})
|
|
if(NOT WIN32)
|
|
set_tests_properties(${name} PROPERTIES
|
|
ENVIRONMENT "LD_LIBRARY_PATH=${WICKRA_LIB_DIR};DYLD_LIBRARY_PATH=${WICKRA_LIB_DIR}")
|
|
endif()
|
|
endif()
|
|
endfunction()
|
|
|
|
# Offline examples — built and run as ctests.
|
|
add_wickra_example(smoke smoke.c TRUE) # links the boundary, asserts values
|
|
add_wickra_example(streaming streaming.c TRUE) # multi-indicator tick stream
|
|
add_wickra_example(cpp_smoke smoke.cpp TRUE) # C++ RAII wrapper (wickra.hpp)
|
|
add_wickra_example(backtest backtest.c TRUE) # indicator basket over a CSV
|
|
add_wickra_example(multi_timeframe multi_timeframe.c TRUE) # resample + per-TF indicators
|
|
add_wickra_example(parallel_assets parallel_assets.c TRUE) # serial vs OpenMP fan-out
|
|
add_wickra_example(strategy_rsi_mean_reversion strategy_rsi_mean_reversion.c TRUE)
|
|
add_wickra_example(strategy_macd_adx strategy_macd_adx.c TRUE)
|
|
add_wickra_example(strategy_bollinger_squeeze strategy_bollinger_squeeze.c TRUE)
|
|
|
|
if(OpenMP_C_FOUND)
|
|
target_link_libraries(parallel_assets PRIVATE OpenMP::OpenMP_C)
|
|
endif()
|
|
|
|
# Network examples — built (so they stay compilable) but not run in CI.
|
|
add_wickra_example(fetch_btcusdt fetch_btcusdt.c FALSE) # downloads CSVs via curl
|
|
add_wickra_example(live_binance live_binance.c FALSE) # polls Binance REST via curl
|