rs_ctrl_os 0.6.1

A small runtime library for node discovery, ZeroMQ pub/sub messaging, dynamic TOML config reloading, and simple time synchronization in distributed Rust systems.
Documentation
cmake_minimum_required(VERSION 3.22)

# Prefer g++ when unset: default `c++` may be clang without usable C++ stdlib headers.
if(UNIX AND NOT APPLE AND NOT DEFINED CMAKE_CXX_COMPILER)
    find_program(_RCOS_GXX NAMES g++)
    if(_RCOS_GXX)
        set(CMAKE_CXX_COMPILER "${_RCOS_GXX}" CACHE FILEPATH "C++ compiler for rcos_minimal" FORCE)
    endif()
endif()
if(UNIX AND NOT APPLE AND NOT DEFINED CMAKE_C_COMPILER)
    find_program(_RCOS_GCC NAMES gcc)
    if(_RCOS_GCC)
        set(CMAKE_C_COMPILER "${_RCOS_GCC}" CACHE FILEPATH "C compiler for rcos_tutorial_c" FORCE)
    endif()
endif()

project(rcos_examples LANGUAGES C CXX)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

set(CMAKE_C_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_C_EXTENSIONS OFF)

# Parent repo root (contains include/rs_ctrl_os.h and target/.../librs_ctrl_os.a when built from source)
set(RCOS_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/.." CACHE PATH "rs_ctrl_os checkout or prefix with include/ and lib/")

set(RCOS_LIB "" CACHE FILEPATH "Path to librs_ctrl_os.a (empty = auto from RCOS_ROOT)")
if(NOT RCOS_LIB)
    set(_default_lib "${RCOS_ROOT}/target/release/librs_ctrl_os.a")
    if(EXISTS "${_default_lib}")
        set(RCOS_LIB "${_default_lib}")
    else()
        set(_debug_lib "${RCOS_ROOT}/target/debug/librs_ctrl_os.a")
        if(EXISTS "${_debug_lib}")
            set(RCOS_LIB "${_debug_lib}")
        endif()
    endif()
endif()
if(NOT RCOS_LIB OR NOT EXISTS "${RCOS_LIB}")
    message(FATAL_ERROR "Set RCOS_LIB to librs_ctrl_os.a (e.g. build with: cargo build --release in RCOS_ROOT). Current: '${RCOS_LIB}'")
endif()

find_package(PkgConfig QUIET)
if(PkgConfig_FOUND)
    pkg_check_modules(ZMQ IMPORTED_TARGET libzmq)
endif()

function(rcos_link_static target_name)
    target_include_directories(${target_name} PRIVATE "${RCOS_ROOT}/include")
    if(TARGET PkgConfig::ZMQ)
        target_link_libraries(${target_name} PRIVATE "${RCOS_LIB}" PkgConfig::ZMQ)
    else()
        find_library(ZMQ_LIBRARY NAMES zmq REQUIRED)
        target_link_libraries(${target_name} PRIVATE "${RCOS_LIB}" "${ZMQ_LIBRARY}")
    endif()
    if(UNIX AND NOT APPLE)
        # librs_ctrl_os.a embeds bundled libzmq C++ objects; C link needs libstdc++ explicitly.
        target_link_libraries(${target_name} PRIVATE stdc++ pthread dl m)
    endif()
endfunction()

add_executable(rcos_minimal minimal.cpp)
target_compile_features(rcos_minimal PRIVATE cxx_std_11)
rcos_link_static(rcos_minimal)

add_executable(rcos_tutorial_c tutorial_node.c)
target_compile_features(rcos_tutorial_c PRIVATE c_std_11)
rcos_link_static(rcos_tutorial_c)

add_executable(rcos_pubsub_chat pubsub_chat.c)
target_compile_features(rcos_pubsub_chat PRIVATE c_std_11)
rcos_link_static(rcos_pubsub_chat)