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
108 lines
3.9 KiB
CMake
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()
|