1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
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)