# 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()