Turn the design into a buildable, dependency-free M0 skeleton plus the
onboarding layer so a new agent can pick up instantly.
Build system:
- CMake + CMakePresets (dev = no deps; server-release = vcpkg) + vcpkg.json
- Skeleton builds with just a C++20 compiler; deps stay off until needed
- .gitattributes (LF), .gitignore, .clang-format
Core (libvoicecat):
- core/include/voicecat.h: full C ABI (the client/server contract), stubbed
- core/proto/voicecat.proto: control-plane wire format, matches docs/protocol.md
- src/{net,crypto,codec,protocol,session,audio,core}: subsystem stubs that
return VC_ERR_NOT_IMPLEMENTED, each pointing to its design doc
- server/ (voicecat-server) and tools/vccli/ link the core
- tests/: CTest smoke test asserting the C ABI contract (behavior, not just build)
- clients/{apple,windows}: M4 placeholders
Onboarding for agents:
- CLAUDE.md: hub — build/test commands, architecture at a glance, doc map, rules
- AGENTS.md: working method (behavior-driven; clean compile is the floor not the goal)
- PROGRESS.md: living tracker — M0 done, M1 task checklist, "where we left off"
Verified: cmake --preset dev && cmake --build --preset dev && ctest --preset dev → green.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
44 lines
2.0 KiB
CMake
44 lines
2.0 KiB
CMake
# libvoicecat — the shared C++ core (docs/architecture.md).
|
|
# Sources are globbed so adding a stub under src/<subsystem>/ needs no CMake edit.
|
|
file(GLOB_RECURSE VOICECAT_SOURCES CONFIGURE_DEPENDS
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp")
|
|
|
|
if(VOICECAT_BUILD_SHARED)
|
|
add_library(voicecat SHARED ${VOICECAT_SOURCES})
|
|
else()
|
|
add_library(voicecat STATIC ${VOICECAT_SOURCES})
|
|
# Static consumers must see VC_API as empty (no dllimport).
|
|
target_compile_definitions(voicecat PUBLIC VOICECAT_STATIC)
|
|
endif()
|
|
add_library(voicecat::voicecat ALIAS voicecat)
|
|
|
|
target_include_directories(voicecat
|
|
PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include
|
|
PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src)
|
|
|
|
target_compile_definitions(voicecat PRIVATE VOICECAT_BUILDING)
|
|
target_compile_features(voicecat PUBLIC cxx_std_20)
|
|
|
|
set_target_properties(voicecat PROPERTIES
|
|
C_VISIBILITY_PRESET hidden
|
|
CXX_VISIBILITY_PRESET hidden
|
|
VISIBILITY_INLINES_HIDDEN ON)
|
|
|
|
if(VOICECAT_USE_VCPKG_DEPS)
|
|
# Wire real dependencies here as each subsystem is implemented. Example (uncomment
|
|
# the ones a subsystem needs; see docs/tech-stack.md and core/proto for protobuf):
|
|
# find_package(unofficial-sodium CONFIG REQUIRED) # crypto/ (libsodium)
|
|
# find_package(MbedTLS CONFIG REQUIRED) # crypto/ (TLS 1.3)
|
|
# find_package(Opus CONFIG REQUIRED) # codec/
|
|
# find_package(protobuf CONFIG REQUIRED) # protocol/
|
|
# find_package(asio CONFIG REQUIRED) # net/
|
|
# find_package(unofficial-sqlite3 CONFIG REQUIRED) # server persistence
|
|
# find_package(spdlog CONFIG REQUIRED)
|
|
# target_link_libraries(voicecat PRIVATE Opus::opus protobuf::libprotobuf ...)
|
|
#
|
|
# protobuf codegen (when protocol/ is implemented):
|
|
# find_package(Protobuf CONFIG REQUIRED)
|
|
# protobuf_generate(TARGET voicecat PROTOS proto/voicecat.proto LANGUAGE cpp)
|
|
message(STATUS "voicecat: deps ON — add find_package()/link calls here as subsystems land")
|
|
endif()
|