cmake_minimum_required(VERSION 3.25) project(voicecat VERSION 0.0.1 DESCRIPTION "Self-hosted native voice & text chat (see docs/)" # C is needed for the vendored RNNoise noise-suppression lib (third_party/rnnoise). LANGUAGES CXX C) # On iOS, audio_engine.cpp includes miniaudio.h which pulls in AVFoundation Objective-C # headers. Those cannot be compiled as C++; we set audio_engine.cpp's LANGUAGE to OBJCXX # in core/CMakeLists.txt, but that requires the language to be enabled first. if(CMAKE_SYSTEM_NAME STREQUAL "iOS") enable_language(OBJCXX) endif() # ── Options ─────────────────────────────────────────────────────────────────── # The M0 skeleton compiles with NO third-party dependencies: every subsystem is a # stub that returns VC_ERR_NOT_IMPLEMENTED. As each subsystem is built out, flip # VOICECAT_USE_VCPKG_DEPS=ON so CMake pulls the real libraries (mbedTLS, libsodium, # opus, protobuf, ...) via the vcpkg toolchain (see vcpkg.json / docs/tech-stack.md). option(VOICECAT_USE_VCPKG_DEPS "Link real third-party deps via vcpkg" OFF) option(VOICECAT_BUILD_SERVER "Build voicecat-server" ON) option(VOICECAT_BUILD_TOOLS "Build the vccli headless test client" ON) option(VOICECAT_BUILD_TESTS "Build tests" ON) option(VOICECAT_BUILD_SHARED "Build libvoicecat as a shared library" OFF) # ── Global settings ─────────────────────────────────────────────────────────── set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) set(CMAKE_BUILD_TYPE Debug CACHE STRING "" FORCE) endif() set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) # ── Static MinGW runtime (Windows) ──────────────────────────────────────────── # x64-mingw-static only statically links vcpkg's OWN deps (protobuf, sodium, ...); # the GCC/MinGW runtime stays dynamic by default, so every produced .exe/.dll # otherwise depends on libgcc_s_seh-1.dll / libwinpthread-1.dll / libstdc++-6.dll # at runtime — DLLs that exist on a dev box (MSYS2/UCRT64) but not on a clean # Windows machine, where the server then fails to start with "… was not found". # Apply the fully-static-MinGW recipe to ALL targets so binaries are portable. # (The SHARED voicecat.dll already sets these in core/CMakeLists.txt; the duplicate # is harmless. Verify with: objdump -p build//bin/voicecat-server.exe | # grep "DLL Name" — only Windows system DLLs should remain.) if(WIN32 AND MINGW) add_link_options(-static-libgcc -static-libstdc++ -static -lwinpthread) endif() # ── Targets ─────────────────────────────────────────────────────────────────── add_subdirectory(core) if(VOICECAT_BUILD_SERVER) add_subdirectory(server) endif() if(VOICECAT_BUILD_TOOLS) add_subdirectory(tools/vccli) if(VOICECAT_USE_VCPKG_DEPS) add_subdirectory(tools/voicecat-admin) endif() endif() if(VOICECAT_BUILD_TESTS) enable_testing() add_subdirectory(tests) endif() message(STATUS "VoiceCat ${PROJECT_VERSION} configured " "(vcpkg deps: ${VOICECAT_USE_VCPKG_DEPS}, " "server: ${VOICECAT_BUILD_SERVER}, tools: ${VOICECAT_BUILD_TOOLS})")