Quellcode durchsuchen

build: project skeleton, cpp-httplib v0.46.0, db-client link, smoke test

Fszontagh vor 2 Monaten
Ursprung
Commit
645318aeab
9 geänderte Dateien mit 126 neuen und 0 gelöschten Zeilen
  1. 59 0
      CMakeLists.txt
  2. 7 0
      cmake/Dependencies.cmake
  3. 5 0
      cmake/version.hpp.in
  4. 5 0
      config/config.json
  5. 22 0
      src/CMakeLists.txt
  6. 1 0
      src/config.cpp
  7. 15 0
      src/main.cpp
  8. 6 0
      tests/CMakeLists.txt
  9. 6 0
      tests/test_smoke.cpp

+ 59 - 0
CMakeLists.txt

@@ -0,0 +1,59 @@
+cmake_minimum_required(VERSION 3.20)
+file(READ "${CMAKE_CURRENT_SOURCE_DIR}/VERSION" SVAPI_VERSION)
+string(STRIP "${SVAPI_VERSION}" SVAPI_VERSION)
+project(smartbotic-vectorapi VERSION ${SVAPI_VERSION} LANGUAGES CXX)
+
+set(CMAKE_CXX_STANDARD 20)
+set(CMAKE_CXX_STANDARD_REQUIRED ON)
+set(CMAKE_CXX_EXTENSIONS OFF)
+set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
+if(NOT CMAKE_BUILD_TYPE)
+    set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Build type" FORCE)
+endif()
+
+option(BUILD_TESTS "Build tests" ON)
+option(BUILD_WEBUI "Build the React web UI via npm" ON)
+
+include(GNUInstallDirs)
+list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
+include(Dependencies)
+
+find_package(smartbotic-db-client REQUIRED)
+find_package(nlohmann_json REQUIRED)
+find_package(spdlog REQUIRED)
+find_package(OpenSSL REQUIRED)
+
+# Optional systemd (sd_notify)
+find_package(PkgConfig)
+if(PkgConfig_FOUND)
+    pkg_check_modules(SYSTEMD IMPORTED_TARGET libsystemd)
+endif()
+
+# git commit for version banner
+execute_process(COMMAND git rev-parse --short HEAD
+    WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
+    OUTPUT_VARIABLE SVAPI_GIT_COMMIT OUTPUT_STRIP_TRAILING_WHITESPACE
+    ERROR_QUIET)
+if(NOT SVAPI_GIT_COMMIT)
+    set(SVAPI_GIT_COMMIT "unknown")
+endif()
+configure_file(${CMAKE_SOURCE_DIR}/cmake/version.hpp.in
+    ${CMAKE_BINARY_DIR}/generated/svapi/version.hpp @ONLY)
+
+add_subdirectory(src)
+
+if(BUILD_TESTS)
+    enable_testing()
+    add_subdirectory(tests)
+endif()
+
+if(BUILD_WEBUI)
+    include(WebUI OPTIONAL)   # provided by plan 2; absent is fine
+endif()
+
+# Install: config conffile, api docs
+install(FILES ${CMAKE_SOURCE_DIR}/config/config.json
+    DESTINATION ${CMAKE_INSTALL_SYSCONFDIR}/smartbotic-vectorapi)
+install(FILES ${CMAKE_SOURCE_DIR}/api/openapi.json
+              ${CMAKE_SOURCE_DIR}/api/llms.txt
+    DESTINATION ${CMAKE_INSTALL_DATADIR}/smartbotic-vectorapi)

+ 7 - 0
cmake/Dependencies.cmake

@@ -0,0 +1,7 @@
+include(FetchContent)
+set(HTTPLIB_REQUIRE_OPENSSL ON CACHE BOOL "" FORCE)
+set(HTTPLIB_USE_OPENSSL_IF_AVAILABLE ON CACHE BOOL "" FORCE)
+FetchContent_Declare(httplib
+    GIT_REPOSITORY https://github.com/yhirose/cpp-httplib.git
+    GIT_TAG        v0.46.0)
+FetchContent_MakeAvailable(httplib)

+ 5 - 0
cmake/version.hpp.in

@@ -0,0 +1,5 @@
+#pragma once
+namespace svapi {
+inline constexpr const char* VERSION = "@SVAPI_VERSION@";
+inline constexpr const char* GIT_COMMIT = "@SVAPI_GIT_COMMIT@";
+}

+ 5 - 0
config/config.json

@@ -0,0 +1,5 @@
+{
+  "log_level": "info",
+  "http": { "bind_address": "0.0.0.0", "port": 8080 },
+  "database": { "address": "localhost:9004" }
+}

+ 22 - 0
src/CMakeLists.txt

@@ -0,0 +1,22 @@
+add_library(vectorapi_core STATIC
+    config.cpp
+)
+target_include_directories(vectorapi_core PUBLIC
+    ${CMAKE_CURRENT_SOURCE_DIR}
+    ${CMAKE_BINARY_DIR}/generated)
+target_link_libraries(vectorapi_core PUBLIC
+    smartbotic::db-client
+    httplib::httplib
+    nlohmann_json::nlohmann_json
+    spdlog::spdlog
+    OpenSSL::SSL OpenSSL::Crypto)
+target_compile_definitions(vectorapi_core PUBLIC CPPHTTPLIB_OPENSSL_SUPPORT)
+
+add_executable(smartbotic-vectorapi main.cpp)
+target_link_libraries(smartbotic-vectorapi PRIVATE
+    vectorapi_core
+    $<$<BOOL:${SYSTEMD_FOUND}>:PkgConfig::SYSTEMD>)
+if(SYSTEMD_FOUND)
+    target_compile_definitions(smartbotic-vectorapi PRIVATE HAVE_SYSTEMD)
+endif()
+install(TARGETS smartbotic-vectorapi RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})

+ 1 - 0
src/config.cpp

@@ -0,0 +1 @@
+// placeholder until Task 2

+ 15 - 0
src/main.cpp

@@ -0,0 +1,15 @@
+#include <svapi/version.hpp>
+#include <cstring>
+#include <iostream>
+
+int main(int argc, char** argv) {
+    for (int i = 1; i < argc; ++i) {
+        if (std::strcmp(argv[i], "--version") == 0 || std::strcmp(argv[i], "-v") == 0) {
+            std::cout << "smartbotic-vectorapi " << svapi::VERSION
+                      << " (" << svapi::GIT_COMMIT << ")\n";
+            return 0;
+        }
+    }
+    std::cout << "smartbotic-vectorapi " << svapi::VERSION << " — not yet wired (see plan)\n";
+    return 0;
+}

+ 6 - 0
tests/CMakeLists.txt

@@ -0,0 +1,6 @@
+find_package(GTest REQUIRED)
+include(GoogleTest)
+
+add_executable(test_smoke test_smoke.cpp)
+target_link_libraries(test_smoke PRIVATE vectorapi_core GTest::gtest_main)
+gtest_discover_tests(test_smoke)

+ 6 - 0
tests/test_smoke.cpp

@@ -0,0 +1,6 @@
+#include <gtest/gtest.h>
+#include <svapi/version.hpp>
+
+TEST(Smoke, VersionIsNonEmpty) {
+    EXPECT_GT(std::string(svapi::VERSION).size(), 0u);
+}