|
| 1 | +cmake_minimum_required(VERSION 3.20) |
| 2 | +project(livekit_cpp_example_collection LANGUAGES CXX) |
| 3 | + |
| 4 | +set(CMAKE_CXX_STANDARD 17) |
| 5 | +set(CMAKE_CXX_STANDARD_REQUIRED ON) |
| 6 | + |
| 7 | +# -------- User knobs -------- |
| 8 | +# Default to the version you mentioned. Users can override: |
| 9 | +# cmake -S . -B build -DLIVEKIT_SDK_VERSION=0.1.9 |
| 10 | +set(LIVEKIT_SDK_VERSION "0.1.9" CACHE STRING "LiveKit C++ SDK version to download") |
| 11 | + |
| 12 | +# Optional: enforce integrity if you have the sha256 for that specific asset. |
| 13 | +# Users can pass: |
| 14 | +# -DLIVEKIT_SDK_SHA256=<hash> |
| 15 | +set(LIVEKIT_SDK_SHA256 "" CACHE STRING "Optional sha256 for the downloaded SDK archive") |
| 16 | + |
| 17 | +# Where to unpack inside the build directory |
| 18 | +set(LIVEKIT_SDK_DIR "${CMAKE_BINARY_DIR}/_deps/livekit-sdk" CACHE PATH "Where to unpack the LiveKit SDK") |
| 19 | + |
| 20 | +# -------- Detect platform triple -------- |
| 21 | +# We’re detecting the *host* because these examples are built natively. |
| 22 | +# (If you later want cross-compile, this should key off CMAKE_SYSTEM_* instead.) |
| 23 | +set(_host_os "") |
| 24 | +if(WIN32) |
| 25 | + set(_host_os "windows") |
| 26 | +elseif(APPLE) |
| 27 | + set(_host_os "macos") |
| 28 | +elseif(UNIX) |
| 29 | + set(_host_os "linux") |
| 30 | +else() |
| 31 | + message(FATAL_ERROR "Unsupported host OS") |
| 32 | +endif() |
| 33 | + |
| 34 | +set(_host_arch "") |
| 35 | +if(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "^(x86_64|AMD64)$") |
| 36 | + set(_host_arch "x64") |
| 37 | +elseif(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "^(arm64|aarch64)$") |
| 38 | + set(_host_arch "arm64") |
| 39 | +else() |
| 40 | + message(FATAL_ERROR "Unsupported host arch: ${CMAKE_HOST_SYSTEM_PROCESSOR}") |
| 41 | +endif() |
| 42 | + |
| 43 | +# Map to your release artifact naming |
| 44 | +# Adjust if you use different naming (e.g., macos-x86_64 vs macos-x64) |
| 45 | +if(_host_os STREQUAL "macos" AND _host_arch STREQUAL "x64") |
| 46 | + # If your asset is named macos-x86_64 instead, change this to "macos-x86_64" |
| 47 | + set(SDK_TRIPLE "macos-x64") |
| 48 | +else() |
| 49 | + set(SDK_TRIPLE "${_host_os}-${_host_arch}") |
| 50 | +endif() |
| 51 | + |
| 52 | +# -------- Compute archive name + URL -------- |
| 53 | +if(_host_os STREQUAL "windows") |
| 54 | + set(SDK_EXT "zip") |
| 55 | +else() |
| 56 | + set(SDK_EXT "tar.gz") |
| 57 | +endif() |
| 58 | + |
| 59 | +set(SDK_ARCHIVE "livekit-sdk-${SDK_TRIPLE}-${LIVEKIT_SDK_VERSION}.${SDK_EXT}") |
| 60 | +set(SDK_URL "https://github.com/livekit/client-sdk-cpp/releases/download/v${LIVEKIT_SDK_VERSION}/${SDK_ARCHIVE}") |
| 61 | + |
| 62 | +# Where to download |
| 63 | +set(SDK_DL_DIR "${CMAKE_BINARY_DIR}/_downloads") |
| 64 | +set(SDK_ARCHIVE_PATH "${SDK_DL_DIR}/${SDK_ARCHIVE}") |
| 65 | + |
| 66 | +# The extracted SDK root will look like: |
| 67 | +# <LIVEKIT_SDK_DIR>/livekit-sdk-<triple>-<ver>/ |
| 68 | +set(SDK_EXTRACTED_ROOT "${LIVEKIT_SDK_DIR}/livekit-sdk-${SDK_TRIPLE}-${LIVEKIT_SDK_VERSION}") |
| 69 | + |
| 70 | +# -------- Download + extract (configure-time) -------- |
| 71 | +file(MAKE_DIRECTORY "${SDK_DL_DIR}") |
| 72 | +file(MAKE_DIRECTORY "${LIVEKIT_SDK_DIR}") |
| 73 | + |
| 74 | +if(NOT EXISTS "${SDK_EXTRACTED_ROOT}") |
| 75 | + message(STATUS "LiveKit SDK not found at: ${SDK_EXTRACTED_ROOT}") |
| 76 | + message(STATUS "Downloading: ${SDK_URL}") |
| 77 | + |
| 78 | + if(LIVEKIT_SDK_SHA256 STREQUAL "") |
| 79 | + file(DOWNLOAD |
| 80 | + "${SDK_URL}" |
| 81 | + "${SDK_ARCHIVE_PATH}" |
| 82 | + SHOW_PROGRESS |
| 83 | + STATUS _dl_status |
| 84 | + TLS_VERIFY ON |
| 85 | + ) |
| 86 | + else() |
| 87 | + file(DOWNLOAD |
| 88 | + "${SDK_URL}" |
| 89 | + "${SDK_ARCHIVE_PATH}" |
| 90 | + SHOW_PROGRESS |
| 91 | + STATUS _dl_status |
| 92 | + TLS_VERIFY ON |
| 93 | + EXPECTED_HASH "SHA256=${LIVEKIT_SDK_SHA256}" |
| 94 | + ) |
| 95 | + endif() |
| 96 | + |
| 97 | + list(GET _dl_status 0 _dl_code) |
| 98 | + list(GET _dl_status 1 _dl_msg) |
| 99 | + if(NOT _dl_code EQUAL 0) |
| 100 | + message(FATAL_ERROR "Failed to download ${SDK_URL}\nStatus: ${_dl_code}\nMessage: ${_dl_msg}") |
| 101 | + endif() |
| 102 | + |
| 103 | + message(STATUS "Extracting: ${SDK_ARCHIVE_PATH}") |
| 104 | + |
| 105 | + # Clean any previous partial extraction |
| 106 | + file(REMOVE_RECURSE "${SDK_EXTRACTED_ROOT}") |
| 107 | + |
| 108 | + if(_host_os STREQUAL "windows") |
| 109 | + # CMake can extract zip with -E tar |
| 110 | + execute_process( |
| 111 | + COMMAND "${CMAKE_COMMAND}" -E tar xvf "${SDK_ARCHIVE_PATH}" |
| 112 | + WORKING_DIRECTORY "${LIVEKIT_SDK_DIR}" |
| 113 | + RESULT_VARIABLE _xret |
| 114 | + ) |
| 115 | + else() |
| 116 | + execute_process( |
| 117 | + COMMAND "${CMAKE_COMMAND}" -E tar xvf "${SDK_ARCHIVE_PATH}" |
| 118 | + WORKING_DIRECTORY "${LIVEKIT_SDK_DIR}" |
| 119 | + RESULT_VARIABLE _xret |
| 120 | + ) |
| 121 | + endif() |
| 122 | + |
| 123 | + if(NOT _xret EQUAL 0) |
| 124 | + message(FATAL_ERROR "Failed to extract ${SDK_ARCHIVE_PATH} (code=${_xret})") |
| 125 | + endif() |
| 126 | +endif() |
| 127 | + |
| 128 | +if(NOT EXISTS "${SDK_EXTRACTED_ROOT}/lib/cmake") |
| 129 | + message(FATAL_ERROR |
| 130 | + "Extracted SDK does not look valid (missing lib/cmake).\n" |
| 131 | + "Expected root: ${SDK_EXTRACTED_ROOT}\n" |
| 132 | + "If the archive root folder name differs, adjust SDK_EXTRACTED_ROOT logic." |
| 133 | + ) |
| 134 | +endif() |
| 135 | + |
| 136 | +# -------- Make find_package(LiveKit) work -------- |
| 137 | +# Your SDK installs a config package under <prefix>/lib/cmake/... |
| 138 | +# The most robust approach is to push <prefix> onto CMAKE_PREFIX_PATH. |
| 139 | +list(PREPEND CMAKE_PREFIX_PATH "${SDK_EXTRACTED_ROOT}") |
| 140 | + |
| 141 | +# Some packages also require explicit *_DIR; keep as a fallback option: |
| 142 | +# set(LiveKit_DIR "${SDK_EXTRACTED_ROOT}/lib/cmake/LiveKit" CACHE PATH "" FORCE) |
| 143 | + |
| 144 | +find_package(LiveKit CONFIG REQUIRED) |
| 145 | + |
| 146 | +# -------- Build examples -------- |
| 147 | +add_subdirectory(basic_room) |
| 148 | + |
0 commit comments