Files
vdm/CMakeLists.txt
T
samiandClaude Sonnet 5 81dba88362 pkg: wire top-level CMake, clang-format/tidy, editorconfig
CMakeLists.txt: every lane's add_subdirectory() is now guarded by EXISTS
on that lane's CMakeLists.txt, so main configures no matter which lanes
have merged and a lane lights up its targets on merge with no edit here.
Dependencies are found at top level (gated on the consuming lane) so a
missing -dev package fails fast with a clear name. Warnings via
add_compile_options (survives the presets' CMAKE_CXX_FLAGS override);
VELOX_WERROR escape hatch. Verified end to end: `cmake --preset dev`
against a merged lane/core builds libveloxcore + tests, `ctest --preset
dev` green.

.clang-format: Google base, 4-space indent, 100 cols, right-aligned
pointers. .clang-tidy: small high-signal set (bugprone/performance/
concurrency/portability + selected modernize/readability). .editorconfig
mirrors both. .gitignore: build-*/ , CMakeUserPresets.json, profiling
and editor droppings.

Co-Authored-By: Claude Sonnet 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01HPPSGhiArbvQgwC2DNiURS
2026-09-09 19:22:36 +04:00

108 lines
3.9 KiB
CMake

# Velox Download Manager — top-level build. Owned by lane PKG/QA.
#
# Lanes land in parallel and merge to main independently, so every add_subdirectory()
# here is guarded by EXISTS on the lane's own CMakeLists.txt: main always configures,
# and a lane's targets light up the moment that lane merges — no coordinated edit here.
#
# cmake --preset dev && cmake --build --preset dev
# ctest --preset dev
cmake_minimum_required(VERSION 3.28)
project(velox
VERSION 0.1.0
DESCRIPTION "IDM-class download manager for Linux"
LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
if(NOT CMAKE_RUNTIME_OUTPUT_DIRECTORY)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
endif()
option(VELOX_BUILD_GUI "Build the Qt 6 GUI client" ON)
option(VELOX_BUILD_TESTS "Build unit and integration tests" ON)
option(VELOX_BUILD_FUZZ "Build libFuzzer targets (clang only)" OFF)
option(VELOX_ENABLE_MEDIA "Build the HLS/DASH media grabber (M4)" OFF)
option(VELOX_WERROR "Treat warnings as errors" ON)
# Project-wide warning flags. Set via add_compile_options (a directory property), not the
# CMAKE_CXX_FLAGS cache variable, because the dev/tsan presets overwrite that cache var
# wholesale for sanitizer flags — a target's warnings must not ride on it.
add_compile_options(-Wall -Wextra -Wpedantic)
if(VELOX_WERROR)
add_compile_options(-Werror)
endif()
if(VELOX_BUILD_FUZZ AND NOT CMAKE_CXX_COMPILER_ID MATCHES "Clang")
message(WARNING "VELOX_BUILD_FUZZ is ON but the compiler is ${CMAKE_CXX_COMPILER_ID}; "
"libFuzzer needs Clang. Fuzz targets will be skipped.")
endif()
# --- Dependencies -------------------------------------------------------------------
# Found once here so a missing -dev package fails at configure with a clear name, rather
# than deep in a lane. Each find is gated on the lane that needs it being present.
find_package(Threads REQUIRED)
if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/core/CMakeLists.txt)
find_package(CURL 8.0 REQUIRED)
find_package(OpenSSL REQUIRED)
endif()
if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/daemon/CMakeLists.txt)
find_package(SQLite3 REQUIRED)
find_package(nlohmann_json 3.11 REQUIRED)
find_package(PkgConfig REQUIRED)
pkg_check_modules(LIBSECRET REQUIRED IMPORTED_TARGET libsecret-1)
endif()
if(VELOX_BUILD_GUI AND EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/gui/CMakeLists.txt)
find_package(Qt6 6.6 REQUIRED COMPONENTS Widgets Svg Network LinguistTools)
qt_standard_project_setup()
endif()
if(VELOX_ENABLE_MEDIA)
find_package(PkgConfig REQUIRED)
pkg_check_modules(FFMPEG REQUIRED IMPORTED_TARGET
libavformat libavcodec libavutil)
endif()
# --- Tests --------------------------------------------------------------------------
if(VELOX_BUILD_TESTS)
enable_testing()
endif()
# --- Lane targets (guarded; see header) -------------------------------------------
foreach(lane IN ITEMS core daemon cli nmhost)
if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${lane}/CMakeLists.txt)
add_subdirectory(${lane})
else()
message(STATUS "velox: lane '${lane}' has not landed a CMakeLists yet — skipping.")
endif()
endforeach()
if(VELOX_BUILD_GUI)
if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/gui/CMakeLists.txt)
add_subdirectory(gui)
else()
message(STATUS "velox: lane 'gui' has not landed a CMakeLists yet — skipping.")
endif()
endif()
foreach(toolset tools/testserver tools/bench tools/fuzz tools/mockd)
if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${toolset}/CMakeLists.txt)
add_subdirectory(${toolset})
endif()
endforeach()
if(VELOX_BUILD_TESTS)
foreach(suite tests/conformance tests/integration tests/e2e)
if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${suite}/CMakeLists.txt)
add_subdirectory(${suite})
endif()
endforeach()
endif()