From 31fa9cd4987118eed4a7a5a1295aa14ceefd0516 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Monta=C3=B1ana=20G=C3=B3mez?= Date: Sun, 29 Jun 2025 18:46:11 +0200 Subject: [PATCH 1/9] First approach --- CLAUDE.md | 80 +++++++++++++++++++++++++++++-- CMakeLists.txt | 54 +++++++++++++++++++-- CONAN_README.md | 84 ++++++++++++++++++++++++++++++++ Makefile | 47 +++++++++++++++++- conandata.yml | 10 ++++ conanfile.py | 87 ++++++++++++++++++++++++++++++++++ test_package/CMakeLists.txt | 9 ++++ test_package/conanfile.py | 26 ++++++++++ test_package/test_bayesnet.cpp | 26 ++++++++++ tests/TestModulesVersions.cc | 4 +- 10 files changed, 417 insertions(+), 10 deletions(-) create mode 100644 CONAN_README.md create mode 100644 conandata.yml create mode 100644 conanfile.py create mode 100644 test_package/CMakeLists.txt create mode 100644 test_package/conanfile.py create mode 100644 test_package/test_bayesnet.cpp diff --git a/CLAUDE.md b/CLAUDE.md index a481e43..9d294cd 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -9,11 +9,22 @@ BayesNet is a C++ library implementing Bayesian Network Classifiers. It provides ## Build System & Dependencies ### Dependency Management -- Uses **vcpkg** for package management with private registry at https://github.com/rmontanana/vcpkg-stash +The project supports **two package managers**: + +#### vcpkg (Default) +- Uses vcpkg with private registry at https://github.com/rmontanana/vcpkg-stash - Core dependencies: libtorch, nlohmann-json, folding, fimdlp, arff-files, catch2 - All dependencies defined in `vcpkg.json` with version overrides +#### Conan (Alternative) +- Modern C++ package manager with better dependency resolution +- Configured via `conanfile.py` for packaging and distribution +- Supports subset of dependencies (libtorch, nlohmann-json, catch2) +- Custom dependencies (folding, fimdlp, arff-files) need custom Conan recipes + ### Build Commands + +#### Using vcpkg (Default) ```bash # Initialize dependencies make init @@ -37,11 +48,38 @@ make viewcoverage make clean ``` +#### Using Conan +```bash +# Install Conan first: pip install conan + +# Initialize dependencies +make conan-init + +# Build debug version (with tests and coverage) +make conan-debug +make buildd + +# Build release version +make conan-release +make buildr + +# Create and test Conan package +make conan-create + +# Upload to Conan remote +make conan-upload remote=myremote + +# Clean Conan cache and builds +make conan-clean +``` + ### CMake Configuration - Uses CMake 3.27+ with C++17 standard - Debug builds automatically enable testing and coverage - Release builds optimize with `-Ofast` -- Supports both static library and vcpkg package installation +- **Automatic package manager detection**: CMake detects whether Conan or vcpkg is being used +- Supports both static library and package manager installation +- Conditional dependency linking based on availability ## Testing Framework @@ -94,9 +132,45 @@ Sample code in `sample/` directory demonstrates library usage: make sample fname=tests/data/iris.arff model=TANLd ``` +## Package Distribution + +### Creating Conan Packages +```bash +# Create package locally +make conan-create + +# Test package installation +cd test_package +conan create .. + +# Upload to remote repository +make conan-upload remote=myremote profile=myprofile +``` + +### Using the Library +With Conan: +```python +# conanfile.txt or conanfile.py +[requires] +bayesnet/1.1.2@user/channel + +[generators] +cmake +``` + +With vcpkg: +```json +{ + "dependencies": ["bayesnet"] +} +``` + ## Common Development Tasks - **Add new classifier**: Extend BaseClassifier, implement in appropriate subdirectory - **Add new test**: Update `tests/CMakeLists.txt` and create test in `tests/` - **Modify build**: Edit main `CMakeLists.txt` or use Makefile targets -- **Update dependencies**: Modify `vcpkg.json` and run `make init` \ No newline at end of file +- **Update dependencies**: + - vcpkg: Modify `vcpkg.json` and run `make init` + - Conan: Modify `conanfile.py` and run `make conan-init` +- **Package for distribution**: Use `make conan-create` for Conan packaging \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index cf850ca..d21474c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,10 +10,36 @@ project(bayesnet set(CMAKE_CXX_STANDARD 17) cmake_policy(SET CMP0135 NEW) +# Package manager detection +if(EXISTS ${CMAKE_BINARY_DIR}/conan_toolchain.cmake) + include(${CMAKE_BINARY_DIR}/conan_toolchain.cmake) + set(USING_CONAN TRUE) + message(STATUS "Using Conan package manager") +else() + set(USING_CONAN FALSE) + message(STATUS "Using vcpkg package manager") +endif() + +# Find packages - works with both Conan and vcpkg find_package(Torch CONFIG REQUIRED) -find_package(fimdlp CONFIG REQUIRED) find_package(nlohmann_json CONFIG REQUIRED) -find_package(folding CONFIG REQUIRED) + +# These packages might not be available in Conan yet, so we handle them conditionally +if(NOT USING_CONAN) + find_package(fimdlp CONFIG REQUIRED) + find_package(folding CONFIG REQUIRED) +else() + # For Conan, we'll need to either find alternatives or create custom packages + # For now, we'll look for them and warn if not found + find_package(fimdlp CONFIG QUIET) + find_package(folding CONFIG QUIET) + if(NOT fimdlp_FOUND) + message(WARNING "fimdlp not found - you may need to create a custom Conan recipe") + endif() + if(NOT folding_FOUND) + message(WARNING "folding not found - you may need to create a custom Conan recipe") + endif() +endif() # Global CMake variables # ---------------------- @@ -52,7 +78,17 @@ include_directories( file(GLOB_RECURSE Sources "bayesnet/*.cc") add_library(bayesnet ${Sources}) -target_link_libraries(bayesnet fimdlp::fimdlp folding::folding "${TORCH_LIBRARIES}") + +# Link libraries conditionally based on package manager +set(BAYESNET_LINK_LIBRARIES "${TORCH_LIBRARIES}") +if(fimdlp_FOUND) + list(APPEND BAYESNET_LINK_LIBRARIES fimdlp::fimdlp) +endif() +if(folding_FOUND) + list(APPEND BAYESNET_LINK_LIBRARIES folding::folding) +endif() + +target_link_libraries(bayesnet ${BAYESNET_LINK_LIBRARIES}) # Testing # ------- @@ -64,7 +100,17 @@ endif (CMAKE_BUILD_TYPE STREQUAL "Debug") if (ENABLE_TESTING) MESSAGE(STATUS "Testing enabled") find_package(Catch2 CONFIG REQUIRED) - find_package(arff-files CONFIG REQUIRED) + + # Handle arff-files conditionally for different package managers + if(NOT USING_CONAN) + find_package(arff-files CONFIG REQUIRED) + else() + find_package(arff-files CONFIG QUIET) + if(NOT arff-files_FOUND) + message(WARNING "arff-files not found - you may need to create a custom Conan recipe") + endif() + endif() + enable_testing() include(CTest) add_subdirectory(tests) diff --git a/CONAN_README.md b/CONAN_README.md new file mode 100644 index 0000000..3c272c1 --- /dev/null +++ b/CONAN_README.md @@ -0,0 +1,84 @@ +# Using BayesNet with Conan + +This document explains how to use Conan as an alternative package manager for BayesNet. + +## Prerequisites + +```bash +pip install conan +``` + +## Quick Start + +### As a Consumer + +1. Create a `conanfile.txt` in your project: +```ini +[requires] +bayesnet/1.1.2@user/channel + +[generators] +CMakeDeps +CMakeToolchain + +[options] + +[imports] +``` + +2. Install dependencies: +```bash +conan install . --build=missing +``` + +3. In your CMakeLists.txt: +```cmake +find_package(bayesnet REQUIRED) +target_link_libraries(your_target bayesnet::bayesnet) +``` + +### Building BayesNet with Conan + +```bash +# Install dependencies +make conan-init + +# Build debug version +make conan-debug +make buildd + +# Build release version +make conan-release +make buildr + +# Create package +make conan-create +``` + +## Current Limitations + +- Custom dependencies (folding, fimdlp, arff-files) are not available in ConanCenter +- These need to be built as custom Conan packages or replaced with alternatives +- The conanfile.py currently comments out these dependencies + +## Creating Custom Dependency Packages + +For the custom dependencies, you'll need to create Conan recipes: + +1. **folding**: Cross-validation library +2. **fimdlp**: Discretization library +3. **arff-files**: ARFF file format parser + +Contact the maintainer or create custom recipes for these packages. + +## Package Distribution + +Once custom dependencies are resolved: + +```bash +# Create and test package +make conan-create + +# Upload to your remote +conan upload bayesnet/1.1.2@user/channel -r myremote +``` \ No newline at end of file diff --git a/Makefile b/Makefile index 2f21973..58082a8 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ SHELL := /bin/bash .DEFAULT_GOAL := help -.PHONY: viewcoverage coverage setup help install uninstall diagrams buildr buildd test clean debug release sample updatebadge doc doc-install init clean-test +.PHONY: viewcoverage coverage setup help install uninstall diagrams buildr buildd test clean debug release sample updatebadge doc doc-install init clean-test conan-init conan-debug conan-release conan-create conan-upload conan-clean f_release = build_Release f_debug = build_Debug @@ -226,3 +226,48 @@ help: ## Show help message printf '\033[0m'; \ printf "%s\n" $$help_info; \ done + +# Conan package manager targets +# ============================ + +conan-init: ## Install dependencies using Conan + @echo ">>> Installing dependencies with Conan" + @which conan || (echo ">>> Please install Conan first: pip install conan"; exit 1) + @conan profile detect --force + @conan install . --build=missing + @echo ">>> Done" + +conan-debug: ## Build debug version using Conan + @echo ">>> Building Debug BayesNet with Conan..." + @if [ -d ./$(f_debug) ]; then rm -rf ./$(f_debug); fi + @mkdir $(f_debug) + @conan install . -s build_type=Debug -o enable_testing=True -o enable_coverage=True --build=missing -of $(f_debug) + @cmake -S . -B $(f_debug) -D CMAKE_BUILD_TYPE=Debug -D ENABLE_TESTING=ON -D CODE_COVERAGE=ON + @echo ">>> Done" + +conan-release: ## Build release version using Conan + @echo ">>> Building Release BayesNet with Conan..." + @if [ -d ./$(f_release) ]; then rm -rf ./$(f_release); fi + @mkdir $(f_release) + @conan install . -s build_type=Release --build=missing -of $(f_release) + @cmake -S . -B $(f_release) -D CMAKE_BUILD_TYPE=Release + @echo ">>> Done" + +conan-create: ## Create Conan package + @echo ">>> Creating Conan package..." + @conan create . --build=missing + @echo ">>> Done" + +profile ?= default +remote ?= conancenter +conan-upload: ## Upload package to Conan remote (profile=default remote=conancenter) + @echo ">>> Uploading to Conan remote $(remote) with profile $(profile)..." + @conan upload bayesnet/$(shell grep version conanfile.py | cut -d'"' -f2) -r $(remote) --confirm + @echo ">>> Done" + +conan-clean: ## Clean Conan cache and build folders + @echo ">>> Cleaning Conan cache and build folders..." + @conan remove "*" --confirm + @if test -d "$(f_release)" ; then rm -rf "$(f_release)"; fi + @if test -d "$(f_debug)" ; then rm -rf "$(f_debug)"; fi + @echo ">>> Done" diff --git a/conandata.yml b/conandata.yml new file mode 100644 index 0000000..2aa53fd --- /dev/null +++ b/conandata.yml @@ -0,0 +1,10 @@ +sources: + "1.1.2": + url: "https://github.com/rmontanana/BayesNet/archive/v1.1.2.tar.gz" + sha256: "placeholder_sha256" # Replace with actual SHA256 when releasing + "1.0.7": + url: "https://github.com/rmontanana/BayesNet/archive/v1.0.7.tar.gz" + sha256: "placeholder_sha256" # Replace with actual SHA256 when releasing + +patches: + # Add patches here if needed for specific versions \ No newline at end of file diff --git a/conanfile.py b/conanfile.py new file mode 100644 index 0000000..c6ba203 --- /dev/null +++ b/conanfile.py @@ -0,0 +1,87 @@ +from conan import ConanFile +from conan.tools.cmake import CMakeToolchain, CMake, cmake_layout, CMakeDeps +from conan.tools.files import copy, save +import os + +class BayesNetConan(ConanFile): + name = "bayesnet" + version = "1.1.2" + + # Binary configuration + settings = "os", "compiler", "build_type", "arch" + options = { + "shared": [True, False], + "fPIC": [True, False], + "enable_testing": [True, False], + "enable_coverage": [True, False] + } + default_options = { + "shared": False, + "fPIC": True, + "enable_testing": False, + "enable_coverage": False + } + + # Sources are located in the same place as this recipe, copy them to the recipe + exports_sources = "CMakeLists.txt", "bayesnet/*", "config/*", "cmake/*", "tests/*", "bayesnetConfig.cmake.in" + + def config_options(self): + if self.settings.os == "Windows": + del self.options.fPIC + + def configure(self): + if self.options.shared: + self.options.rm_safe("fPIC") + + def requirements(self): + # Core dependencies + self.requires("libtorch/2.1.2") + self.requires("nlohmann_json/3.11.3") + + # Custom dependencies - these will need to be available in your Conan center or custom remotes + # For now, we'll comment them out and provide instructions in the README + self.requires("folding/1.1.1@user/channel") # Custom package + self.requires("fimdlp/2.1.0@user/channel") # Custom package + self.requires("arff-files/1.2.0@user/channel") # Custom package + + # Test dependencies + if self.options.enable_testing: + self.requires("catch2/3.8.1") + + def build_requirements(self): + self.build_requires("cmake/[>=3.27]") + + def layout(self): + cmake_layout(self) + + def generate(self): + deps = CMakeDeps(self) + deps.generate() + tc = CMakeToolchain(self) + tc.variables["ENABLE_TESTING"] = self.options.enable_testing + tc.variables["CODE_COVERAGE"] = self.options.enable_coverage + tc.generate() + + def build(self): + cmake = CMake(self) + cmake.configure() + cmake.build() + + if self.options.enable_testing: + # Run tests only if we're building with testing enabled + self.run("ctest --output-on-failure", cwd=self.build_folder) + + def package(self): + copy(self, "LICENSE", src=self.source_folder, dst=os.path.join(self.package_folder, "licenses")) + cmake = CMake(self) + cmake.install() + + def package_info(self): + self.cpp_info.libs = ["bayesnet"] + self.cpp_info.includedirs = ["include"] + self.cpp_info.set_property("cmake_find_mode", "both") + self.cpp_info.set_property("cmake_target_name", "bayesnet::bayesnet") + + # Add compiler flags that might be needed + if self.settings.os == "Linux": + self.cpp_info.system_libs = ["pthread"] \ No newline at end of file diff --git a/test_package/CMakeLists.txt b/test_package/CMakeLists.txt new file mode 100644 index 0000000..242e7df --- /dev/null +++ b/test_package/CMakeLists.txt @@ -0,0 +1,9 @@ +cmake_minimum_required(VERSION 3.27) +project(test_bayesnet) + +set(CMAKE_CXX_STANDARD 17) + +find_package(bayesnet REQUIRED) + +add_executable(test_bayesnet test_bayesnet.cpp) +target_link_libraries(test_bayesnet bayesnet::bayesnet) \ No newline at end of file diff --git a/test_package/conanfile.py b/test_package/conanfile.py new file mode 100644 index 0000000..916ccd4 --- /dev/null +++ b/test_package/conanfile.py @@ -0,0 +1,26 @@ +from conan import ConanFile +from conan.tools.cmake import CMake, cmake_layout +from conan.tools.build import can_run +import os + +class BayesNetTestConan(ConanFile): + settings = "os", "compiler", "build_type", "arch" + + def requirements(self): + self.requires(self.tested_reference_str) + + def build_requirements(self): + self.build_requires("cmake/[>=3.27]") + + def layout(self): + cmake_layout(self) + + def build(self): + cmake = CMake(self) + cmake.configure() + cmake.build() + + def test(self): + if can_run(self): + cmd = os.path.join(self.cpp.build.bindirs[0], "test_bayesnet") + self.run(cmd, env="conanrun") \ No newline at end of file diff --git a/test_package/test_bayesnet.cpp b/test_package/test_bayesnet.cpp new file mode 100644 index 0000000..b7e9585 --- /dev/null +++ b/test_package/test_bayesnet.cpp @@ -0,0 +1,26 @@ +#include +#include +#include +#include + +int main() { + std::cout << "Testing BayesNet library integration..." << std::endl; + + try { + // Test basic instantiation + bayesnet::Network network; + std::cout << "✓ Network class instantiated successfully" << std::endl; + + // Test TAN classifier instantiation + bayesnet::TAN tan; + std::cout << "✓ TAN classifier instantiated successfully" << std::endl; + + std::cout << "✓ All basic tests passed!" << std::endl; + std::cout << "BayesNet library is working correctly." << std::endl; + + return 0; + } catch (const std::exception& e) { + std::cerr << "✗ Test failed: " << e.what() << std::endl; + return 1; + } +} \ No newline at end of file diff --git a/tests/TestModulesVersions.cc b/tests/TestModulesVersions.cc index cf760d6..3cd99be 100644 --- a/tests/TestModulesVersions.cc +++ b/tests/TestModulesVersions.cc @@ -16,10 +16,10 @@ #include "TestUtils.h" std::map modules = { - { "mdlp", "2.0.1" }, + { "mdlp", "2.1.0" }, { "Folding", "1.1.1" }, { "json", "3.11" }, - { "ArffFiles", "1.1.0" } + { "ArffFiles", "1.2.0" } }; TEST_CASE("MDLP", "[Modules]") From 3e94d400e2086b7b6209f7885b8f9026906e961a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Monta=C3=B1ana?= Date: Mon, 30 Jun 2025 09:50:27 +0200 Subject: [PATCH 2/9] Fix conan-init --- CMakeUserPresets.json | 10 ++++++++++ conanfile.py | 8 ++++---- 2 files changed, 14 insertions(+), 4 deletions(-) create mode 100644 CMakeUserPresets.json diff --git a/CMakeUserPresets.json b/CMakeUserPresets.json new file mode 100644 index 0000000..b83e2a7 --- /dev/null +++ b/CMakeUserPresets.json @@ -0,0 +1,10 @@ +{ + "version": 4, + "vendor": { + "conan": {} + }, + "include": [ + "build/Release/generators/CMakePresets.json", + "build_Release/build/Release/generators/CMakePresets.json" + ] +} \ No newline at end of file diff --git a/conanfile.py b/conanfile.py index c6ba203..aa81a09 100644 --- a/conanfile.py +++ b/conanfile.py @@ -35,14 +35,14 @@ class BayesNetConan(ConanFile): def requirements(self): # Core dependencies - self.requires("libtorch/2.1.2") + self.requires("libtorch/2.7.0") self.requires("nlohmann_json/3.11.3") # Custom dependencies - these will need to be available in your Conan center or custom remotes # For now, we'll comment them out and provide instructions in the README - self.requires("folding/1.1.1@user/channel") # Custom package - self.requires("fimdlp/2.1.0@user/channel") # Custom package - self.requires("arff-files/1.2.0@user/channel") # Custom package + self.requires("folding/1.1.1") # Custom package + self.requires("fimdlp/2.1.0") # Custom package + self.requires("arff-files/1.2.0") # Custom package # Test dependencies if self.options.enable_testing: From 7a9d4178d9f8309d0d1a7a7575ecedd25f907134 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Monta=C3=B1ana=20G=C3=B3mez?= Date: Mon, 30 Jun 2025 22:40:35 +0200 Subject: [PATCH 3/9] First profiles MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Ricardo Montañana Gómez --- CMakeLists.txt | 75 ++--- CMakeUserPresets.json | 3 +- Makefile | 266 ++++++++++-------- bayesnet/CMakeLists.txt | 13 - conanfile.py | 14 +- config/config.h.in | 4 - sample/CMakeLists.txt | 43 +-- sample/CMakeUserPresets.json | 9 + sample/conanfile.txt | 14 + sample/sample.cc | 2 +- .../generators/conanbuild.sh | 1 + .../conanbuildenv-release-x86_64.sh | 16 ++ .../generators/conanrun.sh | 1 + .../generators/conanrunenv-release-x86_64.sh | 17 ++ .../generators/deactivate_conanbuild.sh | 1 + .../generators/deactivate_conanrun.sh | 1 + tests/CMakeLists.txt | 3 +- tests/TestUtils.h | 2 +- 18 files changed, 271 insertions(+), 214 deletions(-) delete mode 100644 bayesnet/CMakeLists.txt create mode 100644 sample/CMakeUserPresets.json create mode 100644 sample/conanfile.txt create mode 100644 test_package/build/gcc-14-x86_64-gnu17-release/generators/conanbuild.sh create mode 100644 test_package/build/gcc-14-x86_64-gnu17-release/generators/conanbuildenv-release-x86_64.sh create mode 100644 test_package/build/gcc-14-x86_64-gnu17-release/generators/conanrun.sh create mode 100644 test_package/build/gcc-14-x86_64-gnu17-release/generators/conanrunenv-release-x86_64.sh create mode 100644 test_package/build/gcc-14-x86_64-gnu17-release/generators/deactivate_conanbuild.sh create mode 100644 test_package/build/gcc-14-x86_64-gnu17-release/generators/deactivate_conanrun.sh diff --git a/CMakeLists.txt b/CMakeLists.txt index d21474c..be82a49 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,37 +10,6 @@ project(bayesnet set(CMAKE_CXX_STANDARD 17) cmake_policy(SET CMP0135 NEW) -# Package manager detection -if(EXISTS ${CMAKE_BINARY_DIR}/conan_toolchain.cmake) - include(${CMAKE_BINARY_DIR}/conan_toolchain.cmake) - set(USING_CONAN TRUE) - message(STATUS "Using Conan package manager") -else() - set(USING_CONAN FALSE) - message(STATUS "Using vcpkg package manager") -endif() - -# Find packages - works with both Conan and vcpkg -find_package(Torch CONFIG REQUIRED) -find_package(nlohmann_json CONFIG REQUIRED) - -# These packages might not be available in Conan yet, so we handle them conditionally -if(NOT USING_CONAN) - find_package(fimdlp CONFIG REQUIRED) - find_package(folding CONFIG REQUIRED) -else() - # For Conan, we'll need to either find alternatives or create custom packages - # For now, we'll look for them and warn if not found - find_package(fimdlp CONFIG QUIET) - find_package(folding CONFIG QUIET) - if(NOT fimdlp_FOUND) - message(WARNING "fimdlp not found - you may need to create a custom Conan recipe") - endif() - if(NOT folding_FOUND) - message(WARNING "folding not found - you may need to create a custom Conan recipe") - endif() -endif() - # Global CMake variables # ---------------------- set(CMAKE_CXX_STANDARD 17) @@ -57,17 +26,32 @@ endif() # Options # ------- -option(ENABLE_CLANG_TIDY "Enable to add clang tidy" OFF) option(ENABLE_TESTING "Unit testing build" OFF) option(CODE_COVERAGE "Collect coverage from test library" OFF) -option(INSTALL_GTEST "Enable installation of googletest" OFF) +option(USING_CONAN "Use Conan package manager" OFF) + +if(USING_CONAN) + message(STATUS "Using Conan package manager") +else(USING_CONAN) + message(STATUS "Using vcpkg package manager") +endif(USING_CONAN) + +find_package(Torch CONFIG REQUIRED) +if(NOT TARGET torch::torch) + add_library(torch::torch INTERFACE IMPORTED GLOBAL) + + # expose include paths and libraries that the find-module discovered + set_target_properties(torch::torch PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${TORCH_INCLUDE_DIRS}" + INTERFACE_LINK_LIBRARIES "${TORCH_LIBRARIES}") +endif() + +find_package(fimdlp CONFIG REQUIRED) +find_package(folding CONFIG REQUIRED) +find_package(nlohmann_json REQUIRED) add_subdirectory(config) -if (ENABLE_CLANG_TIDY) - include(StaticAnalyzers) # clang-tidy -endif (ENABLE_CLANG_TIDY) - # Add the library # --------------- include_directories( @@ -79,16 +63,13 @@ file(GLOB_RECURSE Sources "bayesnet/*.cc") add_library(bayesnet ${Sources}) -# Link libraries conditionally based on package manager -set(BAYESNET_LINK_LIBRARIES "${TORCH_LIBRARIES}") -if(fimdlp_FOUND) - list(APPEND BAYESNET_LINK_LIBRARIES fimdlp::fimdlp) -endif() -if(folding_FOUND) - list(APPEND BAYESNET_LINK_LIBRARIES folding::folding) -endif() - -target_link_libraries(bayesnet ${BAYESNET_LINK_LIBRARIES}) +target_link_libraries(bayesnet + nlohmann_json::nlohmann_json + folding::folding + fimdlp::fimdlp + torch::torch + arff-files::arff-files +) # Testing # ------- diff --git a/CMakeUserPresets.json b/CMakeUserPresets.json index b83e2a7..94f9b4d 100644 --- a/CMakeUserPresets.json +++ b/CMakeUserPresets.json @@ -5,6 +5,7 @@ }, "include": [ "build/Release/generators/CMakePresets.json", - "build_Release/build/Release/generators/CMakePresets.json" + "build_Release/build/Release/generators/CMakePresets.json", + "build_Debug/build/Debug/generators/CMakePresets.json" ] } \ No newline at end of file diff --git a/Makefile b/Makefile index 58082a8..6d16eeb 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ SHELL := /bin/bash .DEFAULT_GOAL := help -.PHONY: viewcoverage coverage setup help install uninstall diagrams buildr buildd test clean debug release sample updatebadge doc doc-install init clean-test conan-init conan-debug conan-release conan-create conan-upload conan-clean +.PHONY: viewcoverage coverage setup help install uninstall diagrams buildr buildd test clean vcpkg-debug vcpkg-release vcpkg-sample updatebadge doc doc-install init clean-test conan-debug conan-release conan-create conan-upload conan-clean conan-sample f_release = build_Release f_debug = build_Debug @@ -31,7 +31,6 @@ define ClearTests fi ; endef - setup: ## Install dependencies for tests and coverage @if [ "$(shell uname)" = "Darwin" ]; then \ brew install gcovr; \ @@ -43,47 +42,6 @@ setup: ## Install dependencies for tests and coverage fi @echo "* You should install plantuml & graphviz for the diagrams" -diagrams: ## Create an UML class diagram & dependency of the project (diagrams/BayesNet.png) - @which $(plantuml) || (echo ">>> Please install plantuml"; exit 1) - @which $(dot) || (echo ">>> Please install graphviz"; exit 1) - @which $(clang-uml) || (echo ">>> Please install clang-uml"; exit 1) - @export PLANTUML_LIMIT_SIZE=16384 - @echo ">>> Creating UML class diagram of the project..."; - @$(clang-uml) -p - @cd $(f_diagrams); \ - $(plantuml) -tsvg BayesNet.puml - @echo ">>> Creating dependency graph diagram of the project..."; - $(MAKE) debug - cd $(f_debug) && cmake .. --graphviz=dependency.dot - @$(dot) -Tsvg $(f_debug)/dependency.dot.BayesNet -o $(f_diagrams)/dependency.svg - -buildd: ## Build the debug targets - cmake --build $(f_debug) -t $(app_targets) --parallel $(CMAKE_BUILD_PARALLEL_LEVEL) - -buildr: ## Build the release targets - cmake --build $(f_release) -t $(app_targets) --parallel $(CMAKE_BUILD_PARALLEL_LEVEL) - -clean-test: ## Clean the tests info - @echo ">>> Cleaning Debug BayesNet tests..."; - $(call ClearTests) - @echo ">>> Done"; - -uninstall: ## Uninstall library - @echo ">>> Uninstalling BayesNet..."; - xargs rm < $(f_release)/install_manifest.txt - @echo ">>> Done"; - -prefix = "/usr/local" -install: ## Install library - @echo ">>> Installing BayesNet..."; - @cmake --install $(f_release) --prefix $(prefix) - @echo ">>> Done"; - -init: ## Initialize the project installing dependencies - @echo ">>> Installing dependencies" - @vcpkg install - @echo ">>> Done"; - clean: ## Clean the project @echo ">>> Cleaning the project..." @if test -f CMakeCache.txt ; then echo "- Deleting CMakeCache.txt"; rm -f CMakeCache.txt; fi @@ -96,37 +54,38 @@ clean: ## Clean the project @$(MAKE) clean-test @echo ">>> Done"; -debug: ## Build a debug version of the project - @echo ">>> Building Debug BayesNet..."; - @if [ -d ./$(f_debug) ]; then rm -rf ./$(f_debug); fi - @mkdir $(f_debug); - @cmake -S . -B $(f_debug) -D CMAKE_BUILD_TYPE=Debug -D ENABLE_TESTING=ON -D CODE_COVERAGE=ON -DCMAKE_TOOLCHAIN_FILE=${VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake +# Build targets +# ============= + +buildd: ## Build the debug targets + cmake --build $(f_debug) -t $(app_targets) --parallel $(CMAKE_BUILD_PARALLEL_LEVEL) + +buildr: ## Build the release targets + cmake --build $(f_release) -t $(app_targets) --parallel $(CMAKE_BUILD_PARALLEL_LEVEL) + + +# Install targets +# =============== + +uninstall: ## Uninstall library + @echo ">>> Uninstalling BayesNet..."; + xargs rm < $(f_release)/install_manifest.txt @echo ">>> Done"; -release: ## Build a Release version of the project - @echo ">>> Building Release BayesNet..."; - @if [ -d ./$(f_release) ]; then rm -rf ./$(f_release); fi - @mkdir $(f_release); - @cmake -S . -B $(f_release) -D CMAKE_BUILD_TYPE=Release -DCMAKE_TOOLCHAIN_FILE=${VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake +prefix = "/usr/local" +install: ## Install library + @echo ">>> Installing BayesNet..."; + @cmake --install $(f_release) --prefix $(prefix) @echo ">>> Done"; -fname = "tests/data/iris.arff" -model = "TANLd" -sample: ## Build sample - @echo ">>> Building Sample..."; - @if [ -d ./sample/build ]; then rm -rf ./sample/build; fi - @cd sample && cmake -B build -S . -D CMAKE_BUILD_TYPE=Release -DCMAKE_TOOLCHAIN_FILE=${VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake && \ - cmake --build build -t bayesnet_sample - sample/build/bayesnet_sample $(fname) $(model) - @echo ">>> Done"; -fname = "tests/data/iris.arff" -sample2: ## Build sample2 - @echo ">>> Building Sample..."; - @if [ -d ./sample/build ]; then rm -rf ./sample/build; fi - @cd sample && cmake -B build -S . -D CMAKE_BUILD_TYPE=Debug && cmake --build build -t bayesnet_sample_xspode - sample/build/bayesnet_sample_xspode $(fname) - @echo ">>> Done"; +# Test targets +# ============ + +clean-test: ## Clean the tests info + @echo ">>> Cleaning Debug BayesNet tests..."; + $(call ClearTests) + @echo ">>> Done"; opt = "" test: ## Run tests (opt="-s") to verbose output the tests, (opt="-c='Test Maximum Spanning Tree'") to run only that section @@ -182,6 +141,9 @@ updatebadge: ## Update the coverage badge in README.md @env python update_coverage.py $(f_debug)/tests @echo ">>> Done"; +# Documentation targets +# ===================== + doc: ## Generate documentation @echo ">>> Generating documentation..." @cmake --build $(f_release) -t doxygen @@ -196,6 +158,20 @@ doc: ## Generate documentation fi @echo ">>> Done"; +diagrams: ## Create an UML class diagram & dependency of the project (diagrams/BayesNet.png) + @which $(plantuml) || (echo ">>> Please install plantuml"; exit 1) + @which $(dot) || (echo ">>> Please install graphviz"; exit 1) + @which $(clang-uml) || (echo ">>> Please install clang-uml"; exit 1) + @export PLANTUML_LIMIT_SIZE=16384 + @echo ">>> Creating UML class diagram of the project..."; + @$(clang-uml) -p + @cd $(f_diagrams); \ + $(plantuml) -tsvg BayesNet.puml + @echo ">>> Creating dependency graph diagram of the project..."; + $(MAKE) debug + cd $(f_debug) && cmake .. --graphviz=dependency.dot + @$(dot) -Tsvg $(f_debug)/dependency.dot.BayesNet -o $(f_diagrams)/dependency.svg + docdir = "" doc-install: ## Install documentation @echo ">>> Installing documentation..." @@ -210,6 +186,111 @@ doc-install: ## Install documentation @sudo cp -rp $(mansrcdir) $(mandestdir) @echo ">>> Done"; +# Conan package manager targets +# ============================= + +# conan-debug: ## Build debug version using Conan +# @echo ">>> Building Debug BayesNet with Conan..." +# @if [ -d ./$(f_debug) ]; then rm -rf ./$(f_debug); fi +# @mkdir $(f_debug) +# @conan install . -s build_type=Debug --build=missing -of $(f_debug) +# @cmake -S . -B $(f_debug) -D CMAKE_BUILD_TYPE=Debug -D ENABLE_TESTING=ON -D CODE_COVERAGE=ON -D USING_CONAN=ON -DCMAKE_TOOLCHAIN_FILE=$(f_debug)/build/Debug/generators/conan_toolchain.cmake +# @echo ">>> Done" +conan-debug: ## Build debug version using Conan + @echo ">>> Building *Debug* BayesNet with Conan..." + @rm -rf $(f_debug) # wipe previous tree + @conan install . \ + -s build_type=Debug \ + --build=missing \ + -of $(f_debug) \ + --profile=debug + @cmake -S . -B $(f_debug) \ + -DCMAKE_BUILD_TYPE=Debug \ + -DENABLE_TESTING=ON \ + -DCODE_COVERAGE=ON \ + -DUSING_CONAN=ON \ + -DCMAKE_TOOLCHAIN_FILE=$(f_debug)/build/Debug/generators/conan_toolchain.cmake + @echo ">>> Done" + +conan-release: ## Build release version using Conan + @echo ">>> Building Release BayesNet with Conan..." + @conan install . \ + -s build_type=Release \ + --build=missing \ + -of $(f_debug) \ + --profile=release + @if [ -d ./$(f_release) ]; then rm -rf ./$(f_release); fi + @mkdir $(f_release) + @conan install . -s build_type=Release --build=missing -of $(f_release) + @cmake -S . -B $(f_release) -D CMAKE_BUILD_TYPE=Release -D USING_CONAN=ON -DCMAKE_TOOLCHAIN_FILE=$(f_release)/build/Release/generators/conan_toolchain.cmake + @echo ">>> Done" + +conan-create: ## Create Conan package + @echo ">>> Creating Conan package..." + @conan create . --build=missing -tf "" --profile=release + @conan create . --build=missing -tf "" --profile=debug + @echo ">>> Done" + +profile ?= default +remote ?= Cimmeria +conan-upload: ## Upload package to Conan remote (profile=default remote=conancenter) + @echo ">>> Uploading to Conan remote $(remote) with profile $(profile)..." + @conan upload bayesnet/$(grep version conanfile.py | cut -d'"' -f2) -r $(remote) --confirm + @echo ">>> Done" + +conan-clean: ## Clean Conan cache and build folders + @echo ">>> Cleaning Conan cache and build folders..." + @conan remove "*" --confirm + @if test -d "$(f_release)" ; then rm -rf "$(f_release)"; fi + @if test -d "$(f_debug)" ; then rm -rf "$(f_debug)"; fi + @echo ">>> Done" + +fname = "tests/data/iris.arff" +model = "TANLd" +conan-sample: ## Build sample with Conan + @echo ">>> Building Sample with Conan..."; + @if [ -d ./sample/build ]; then rm -rf ./sample/build; fi + @cd sample && conan install . --output-folder=build --build=missing + @cd sample && cmake -B build -S . -DCMAKE_BUILD_TYPE=Release -DCMAKE_TOOLCHAIN_FILE=build/conan_toolchain.cmake && \ + cmake --build build -t bayesnet_sample + sample/build/bayesnet_sample $(fname) $(model) + @echo ">>> Done"; + +# vcpkg package manager targets +# ============================= + +vcpkg-init: ## Initialize the project installing dependencies using vcpkg + @echo ">>> Installing dependencies with vcpkg" + @vcpkg install + @echo ">>> Done"; + +vcpkg-debug: ## Build a debug version of the project using vcpkg + @echo ">>> Building Debug BayesNet with vcpkg..."; + @if [ -d ./$(f_debug) ]; then rm -rf ./$(f_debug); fi + @mkdir $(f_debug); + @cmake -S . -B $(f_debug) -D CMAKE_BUILD_TYPE=Debug -D ENABLE_TESTING=ON -D CODE_COVERAGE=ON -DCMAKE_TOOLCHAIN_FILE=${VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake + @echo ">>> Done"; + +vcpkg-release: ## Build a Release version of the project using vcpkg + @echo ">>> Building Release BayesNet with vcpkg..."; + @if [ -d ./$(f_release) ]; then rm -rf ./$(f_release); fi + @mkdir $(f_release); + @cmake -S . -B $(f_release) -D CMAKE_BUILD_TYPE=Release -DCMAKE_TOOLCHAIN_FILE=${VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake + @echo ">>> Done"; + +fname = "tests/data/iris.arff" +model = "TANLd" +vcpkg-sample: ## Build sample with vcpkg + @echo ">>> Building Sample with vcpkg..."; + @if [ -d ./sample/build ]; then rm -rf ./sample/build; fi + @cd sample && cmake -B build -S . -D CMAKE_BUILD_TYPE=Release -DUSING_VCPKG=ON -DCMAKE_TOOLCHAIN_FILE=${VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake && \ + cmake --build build -t bayesnet_sample + sample/build/bayesnet_sample $(fname) $(model) + @echo ">>> Done"; + +# Help target +# =========== + help: ## Show help message @IFS=$$'\n' ; \ help_lines=(`fgrep -h "##" $(MAKEFILE_LIST) | fgrep -v fgrep | sed -e 's/\\$$//' | sed -e 's/##/:/'`); \ @@ -225,49 +306,4 @@ help: ## Show help message printf "%-20s %s" $$help_command ; \ printf '\033[0m'; \ printf "%s\n" $$help_info; \ - done - -# Conan package manager targets -# ============================ - -conan-init: ## Install dependencies using Conan - @echo ">>> Installing dependencies with Conan" - @which conan || (echo ">>> Please install Conan first: pip install conan"; exit 1) - @conan profile detect --force - @conan install . --build=missing - @echo ">>> Done" - -conan-debug: ## Build debug version using Conan - @echo ">>> Building Debug BayesNet with Conan..." - @if [ -d ./$(f_debug) ]; then rm -rf ./$(f_debug); fi - @mkdir $(f_debug) - @conan install . -s build_type=Debug -o enable_testing=True -o enable_coverage=True --build=missing -of $(f_debug) - @cmake -S . -B $(f_debug) -D CMAKE_BUILD_TYPE=Debug -D ENABLE_TESTING=ON -D CODE_COVERAGE=ON - @echo ">>> Done" - -conan-release: ## Build release version using Conan - @echo ">>> Building Release BayesNet with Conan..." - @if [ -d ./$(f_release) ]; then rm -rf ./$(f_release); fi - @mkdir $(f_release) - @conan install . -s build_type=Release --build=missing -of $(f_release) - @cmake -S . -B $(f_release) -D CMAKE_BUILD_TYPE=Release - @echo ">>> Done" - -conan-create: ## Create Conan package - @echo ">>> Creating Conan package..." - @conan create . --build=missing - @echo ">>> Done" - -profile ?= default -remote ?= conancenter -conan-upload: ## Upload package to Conan remote (profile=default remote=conancenter) - @echo ">>> Uploading to Conan remote $(remote) with profile $(profile)..." - @conan upload bayesnet/$(shell grep version conanfile.py | cut -d'"' -f2) -r $(remote) --confirm - @echo ">>> Done" - -conan-clean: ## Clean Conan cache and build folders - @echo ">>> Cleaning Conan cache and build folders..." - @conan remove "*" --confirm - @if test -d "$(f_release)" ; then rm -rf "$(f_release)"; fi - @if test -d "$(f_debug)" ; then rm -rf "$(f_debug)"; fi - @echo ">>> Done" + done \ No newline at end of file diff --git a/bayesnet/CMakeLists.txt b/bayesnet/CMakeLists.txt deleted file mode 100644 index 6815b70..0000000 --- a/bayesnet/CMakeLists.txt +++ /dev/null @@ -1,13 +0,0 @@ -include_directories( - ${BayesNet_SOURCE_DIR}/lib/log - ${BayesNet_SOURCE_DIR}/lib/mdlp/src - ${BayesNet_SOURCE_DIR}/lib/folding - ${BayesNet_SOURCE_DIR}/lib/json/include - ${BayesNet_SOURCE_DIR} - ${CMAKE_BINARY_DIR}/configured_files/include -) - -file(GLOB_RECURSE Sources "*.cc") - -add_library(BayesNet ${Sources}) -target_link_libraries(BayesNet fimdlp "${TORCH_LIBRARIES}") diff --git a/conanfile.py b/conanfile.py index aa81a09..dbb2236 100644 --- a/conanfile.py +++ b/conanfile.py @@ -5,7 +5,7 @@ import os class BayesNetConan(ConanFile): name = "bayesnet" - version = "1.1.2" + version = "1.2.0" # Binary configuration settings = "os", "compiler", "build_type", "arch" @@ -23,7 +23,7 @@ class BayesNetConan(ConanFile): } # Sources are located in the same place as this recipe, copy them to the recipe - exports_sources = "CMakeLists.txt", "bayesnet/*", "config/*", "cmake/*", "tests/*", "bayesnetConfig.cmake.in" + exports_sources = "CMakeLists.txt", "bayesnet/*", "config/*", "cmake/*", "docs/*", "tests/*", "bayesnetConfig.cmake.in" def config_options(self): if self.settings.os == "Windows": @@ -37,19 +37,13 @@ class BayesNetConan(ConanFile): # Core dependencies self.requires("libtorch/2.7.0") self.requires("nlohmann_json/3.11.3") - - # Custom dependencies - these will need to be available in your Conan center or custom remotes - # For now, we'll comment them out and provide instructions in the README self.requires("folding/1.1.1") # Custom package self.requires("fimdlp/2.1.0") # Custom package - self.requires("arff-files/1.2.0") # Custom package - - # Test dependencies - if self.options.enable_testing: - self.requires("catch2/3.8.1") def build_requirements(self): self.build_requires("cmake/[>=3.27]") + self.test_requires("arff-files/1.2.0") # Custom package + self.test_requires("catch2/3.8.1") def layout(self): cmake_layout(self) diff --git a/config/config.h.in b/config/config.h.in index 447fbcc..467507f 100644 --- a/config/config.h.in +++ b/config/config.h.in @@ -3,10 +3,6 @@ #include #include -#define PROJECT_VERSION_MAJOR @PROJECT_VERSION_MAJOR@ -#define PROJECT_VERSION_MINOR @PROJECT_VERSION_MINOR@ -#define PROJECT_VERSION_PATCH @PROJECT_VERSION_PATCH@ - static constexpr std::string_view project_name = "@PROJECT_NAME@"; static constexpr std::string_view project_version = "@PROJECT_VERSION@"; static constexpr std::string_view project_description = "@PROJECT_DESCRIPTION@"; diff --git a/sample/CMakeLists.txt b/sample/CMakeLists.txt index 1d93da3..d19b6e7 100644 --- a/sample/CMakeLists.txt +++ b/sample/CMakeLists.txt @@ -4,37 +4,38 @@ project(bayesnet_sample VERSION 0.1.0 LANGUAGES CXX) set(CMAKE_CXX_STANDARD 17) -set(CMAKE_BUILD_TYPE Release) - find_package(Torch CONFIG REQUIRED) find_package(fimdlp CONFIG REQUIRED) find_package(folding CONFIG REQUIRED) find_package(arff-files CONFIG REQUIRED) -find_package(nlohmann_json CONFIG REQUIRED) +find_package(nlohmann_json REQUIRED) +find_package(bayesnet CONFIG REQUIRED) -option(BAYESNET_VCPKG_CONFIG "Use vcpkg config for BayesNet" ON) +# option(USING_VCPKG "Use vcpkg config for BayesNet" OFF) +# option(USING_CONAN "Use Conan config for BayesNet" OFF) -if (BAYESNET_VCPKG_CONFIG) - message(STATUS "Using BayesNet vcpkg config") - find_package(bayesnet CONFIG REQUIRED) - set(BayesNet_LIBRARIES bayesnet::bayesnet) -else(BAYESNET_VCPKG_CONFIG) - message(STATUS "Using BayesNet local library config") - find_library(bayesnet NAMES libbayesnet bayesnet libbayesnet.a PATHS ${Platform_SOURCE_DIR}/../lib/lib REQUIRED) - find_path(Bayesnet_INCLUDE_DIRS REQUIRED NAMES bayesnet PATHS ${Platform_SOURCE_DIR}/../lib/include) - add_library(bayesnet::bayesnet UNKNOWN IMPORTED) - set_target_properties(bayesnet::bayesnet PROPERTIES - IMPORTED_LOCATION ${bayesnet} - INTERFACE_INCLUDE_DIRECTORIES ${Bayesnet_INCLUDE_DIRS} - ) -endif(BAYESNET_VCPKG_CONFIG) -message(STATUS "BayesNet: ${bayesnet}") +# if (USING_VCPKG OR USING_CONAN) +# message(STATUS "Using BayesNet vcpkg config") +# find_package(bayesnet CONFIG REQUIRED) +# set(BayesNet_LIBRARIES bayesnet::bayesnet) +# else(USING_VCPKG) +# message(STATUS "Using BayesNet local library config") +# find_library(bayesnet NAMES libbayesnet bayesnet libbayesnet.a PATHS ${Platform_SOURCE_DIR}/../lib/lib REQUIRED) +# find_path(Bayesnet_INCLUDE_DIRS REQUIRED NAMES bayesnet PATHS ${Platform_SOURCE_DIR}/../lib/include) +# add_library(bayesnet::bayesnet UNKNOWN IMPORTED) +# set_target_properties(bayesnet::bayesnet PROPERTIES +# IMPORTED_LOCATION ${bayesnet} +# INTERFACE_INCLUDE_DIRECTORIES ${Bayesnet_INCLUDE_DIRS} +# ) +# endif(USING_VCPKG) +# message(STATUS "BayesNet: ${bayesnet}") add_executable(bayesnet_sample sample.cc) target_link_libraries(bayesnet_sample PRIVATE fimdlp::fimdlp - arff-files::arff-files - "${TORCH_LIBRARIES}" + arff-files::arff-files + torch::torch bayesnet::bayesnet folding::folding + nlohmann_json::nlohmann_json ) diff --git a/sample/CMakeUserPresets.json b/sample/CMakeUserPresets.json new file mode 100644 index 0000000..945b382 --- /dev/null +++ b/sample/CMakeUserPresets.json @@ -0,0 +1,9 @@ +{ + "version": 4, + "vendor": { + "conan": {} + }, + "include": [ + "build/CMakePresets.json" + ] +} \ No newline at end of file diff --git a/sample/conanfile.txt b/sample/conanfile.txt new file mode 100644 index 0000000..5b86bb8 --- /dev/null +++ b/sample/conanfile.txt @@ -0,0 +1,14 @@ +[requires] +libtorch/2.7.0 +arff-files/1.2.0 +fimdlp/2.1.0 +folding/1.1.1 +bayesnet/1.2.0 +nlohmann_json/3.11.3 + +[generators] +CMakeToolchain +CMakeDeps + +[options] +libtorch/2.7.0:shared=True diff --git a/sample/sample.cc b/sample/sample.cc index 96f60dc..0c970ee 100644 --- a/sample/sample.cc +++ b/sample/sample.cc @@ -6,7 +6,7 @@ #include #include -#include +#include #include #include #include diff --git a/test_package/build/gcc-14-x86_64-gnu17-release/generators/conanbuild.sh b/test_package/build/gcc-14-x86_64-gnu17-release/generators/conanbuild.sh new file mode 100644 index 0000000..11b22e2 --- /dev/null +++ b/test_package/build/gcc-14-x86_64-gnu17-release/generators/conanbuild.sh @@ -0,0 +1 @@ +. "/home/rmontanana/Code/BayesNet/test_package/build/gcc-14-x86_64-gnu17-release/generators/conanbuildenv-release-x86_64.sh" \ No newline at end of file diff --git a/test_package/build/gcc-14-x86_64-gnu17-release/generators/conanbuildenv-release-x86_64.sh b/test_package/build/gcc-14-x86_64-gnu17-release/generators/conanbuildenv-release-x86_64.sh new file mode 100644 index 0000000..7a52af9 --- /dev/null +++ b/test_package/build/gcc-14-x86_64-gnu17-release/generators/conanbuildenv-release-x86_64.sh @@ -0,0 +1,16 @@ +script_folder="/home/rmontanana/Code/BayesNet/test_package/build/gcc-14-x86_64-gnu17-release/generators" +echo "echo Restoring environment" > "$script_folder/deactivate_conanbuildenv-release-x86_64.sh" +for v in PATH +do + is_defined="true" + value=$(printenv $v) || is_defined="" || true + if [ -n "$value" ] || [ -n "$is_defined" ] + then + echo export "$v='$value'" >> "$script_folder/deactivate_conanbuildenv-release-x86_64.sh" + else + echo unset $v >> "$script_folder/deactivate_conanbuildenv-release-x86_64.sh" + fi +done + + +export PATH="/home/rmontanana/.conan2/p/cmakeab16c849c207b/p/bin:$PATH" \ No newline at end of file diff --git a/test_package/build/gcc-14-x86_64-gnu17-release/generators/conanrun.sh b/test_package/build/gcc-14-x86_64-gnu17-release/generators/conanrun.sh new file mode 100644 index 0000000..ef2fa60 --- /dev/null +++ b/test_package/build/gcc-14-x86_64-gnu17-release/generators/conanrun.sh @@ -0,0 +1 @@ +. "/home/rmontanana/Code/BayesNet/test_package/build/gcc-14-x86_64-gnu17-release/generators/conanrunenv-release-x86_64.sh" \ No newline at end of file diff --git a/test_package/build/gcc-14-x86_64-gnu17-release/generators/conanrunenv-release-x86_64.sh b/test_package/build/gcc-14-x86_64-gnu17-release/generators/conanrunenv-release-x86_64.sh new file mode 100644 index 0000000..746a4be --- /dev/null +++ b/test_package/build/gcc-14-x86_64-gnu17-release/generators/conanrunenv-release-x86_64.sh @@ -0,0 +1,17 @@ +script_folder="/home/rmontanana/Code/BayesNet/test_package/build/gcc-14-x86_64-gnu17-release/generators" +echo "echo Restoring environment" > "$script_folder/deactivate_conanrunenv-release-x86_64.sh" +for v in LD_LIBRARY_PATH DYLD_LIBRARY_PATH +do + is_defined="true" + value=$(printenv $v) || is_defined="" || true + if [ -n "$value" ] || [ -n "$is_defined" ] + then + echo export "$v='$value'" >> "$script_folder/deactivate_conanrunenv-release-x86_64.sh" + else + echo unset $v >> "$script_folder/deactivate_conanrunenv-release-x86_64.sh" + fi +done + + +export LD_LIBRARY_PATH="/home/rmontanana/.conan2/p/libto33fc3f5110c64/p/lib:$LD_LIBRARY_PATH" +export DYLD_LIBRARY_PATH="/home/rmontanana/.conan2/p/libto33fc3f5110c64/p/lib:$DYLD_LIBRARY_PATH" \ No newline at end of file diff --git a/test_package/build/gcc-14-x86_64-gnu17-release/generators/deactivate_conanbuild.sh b/test_package/build/gcc-14-x86_64-gnu17-release/generators/deactivate_conanbuild.sh new file mode 100644 index 0000000..56f8845 --- /dev/null +++ b/test_package/build/gcc-14-x86_64-gnu17-release/generators/deactivate_conanbuild.sh @@ -0,0 +1 @@ +. "/home/rmontanana/Code/BayesNet/test_package/build/gcc-14-x86_64-gnu17-release/generators/deactivate_conanbuildenv-release-x86_64.sh" \ No newline at end of file diff --git a/test_package/build/gcc-14-x86_64-gnu17-release/generators/deactivate_conanrun.sh b/test_package/build/gcc-14-x86_64-gnu17-release/generators/deactivate_conanrun.sh new file mode 100644 index 0000000..c2dc2d7 --- /dev/null +++ b/test_package/build/gcc-14-x86_64-gnu17-release/generators/deactivate_conanrun.sh @@ -0,0 +1 @@ +. "/home/rmontanana/Code/BayesNet/test_package/build/gcc-14-x86_64-gnu17-release/generators/deactivate_conanrunenv-release-x86_64.sh" \ No newline at end of file diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 383687f..788a6eb 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -2,12 +2,13 @@ if(ENABLE_TESTING) include_directories( ${BayesNet_SOURCE_DIR} ${CMAKE_BINARY_DIR}/configured_files/include + ${nlohmann_json_INCLUDE_DIRS} ) file(GLOB_RECURSE BayesNet_SOURCES "${bayesnet_SOURCE_DIR}/bayesnet/*.cc") add_executable(TestBayesNet TestBayesNetwork.cc TestBayesNode.cc TestBayesClassifier.cc TestXSPnDE.cc TestXBA2DE.cc TestBayesModels.cc TestBayesMetrics.cc TestFeatureSelection.cc TestBoostAODE.cc TestXBAODE.cc TestA2DE.cc TestUtils.cc TestBayesEnsemble.cc TestModulesVersions.cc TestBoostA2DE.cc TestMST.cc TestXSPODE.cc ${BayesNet_SOURCES}) - target_link_libraries(TestBayesNet PUBLIC "${TORCH_LIBRARIES}" fimdlp::fimdlp PRIVATE Catch2::Catch2WithMain) + target_link_libraries(TestBayesNet PUBLIC "${TORCH_LIBRARIES}" fimdlp::fimdlp PRIVATE Catch2::Catch2WithMain folding::folding) add_test(NAME BayesNetworkTest COMMAND TestBayesNet) add_test(NAME A2DE COMMAND TestBayesNet "[A2DE]") add_test(NAME BoostA2DE COMMAND TestBayesNet "[BoostA2DE]") diff --git a/tests/TestUtils.h b/tests/TestUtils.h index d9c741e..e93b689 100644 --- a/tests/TestUtils.h +++ b/tests/TestUtils.h @@ -11,7 +11,7 @@ #include #include #include -#include +#include #include #include #include From 526d036d75c1956a4aca0e9cbfb9b486bd19f23b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Monta=C3=B1ana=20G=C3=B3mez?= Date: Mon, 30 Jun 2025 22:41:04 +0200 Subject: [PATCH 4/9] Remove cmake modules unneeded --- cmake/modules/AddGitSubmodule.cmake | 12 - cmake/modules/CodeCoverage.cmake | 746 ---------------------------- cmake/modules/StaticAnalyzers.cmake | 22 - 3 files changed, 780 deletions(-) delete mode 100644 cmake/modules/AddGitSubmodule.cmake delete mode 100644 cmake/modules/CodeCoverage.cmake delete mode 100644 cmake/modules/StaticAnalyzers.cmake diff --git a/cmake/modules/AddGitSubmodule.cmake b/cmake/modules/AddGitSubmodule.cmake deleted file mode 100644 index 7855fce..0000000 --- a/cmake/modules/AddGitSubmodule.cmake +++ /dev/null @@ -1,12 +0,0 @@ - -function(add_git_submodule dir) - find_package(Git REQUIRED) - - if(NOT EXISTS ${dir}/CMakeLists.txt) - message(STATUS "🚨 Adding git submodule => ${dir}") - execute_process(COMMAND ${GIT_EXECUTABLE} - submodule update --init --recursive -- ${dir} - WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}) - endif() - add_subdirectory(${dir}) -endfunction(add_git_submodule) diff --git a/cmake/modules/CodeCoverage.cmake b/cmake/modules/CodeCoverage.cmake deleted file mode 100644 index 670dea8..0000000 --- a/cmake/modules/CodeCoverage.cmake +++ /dev/null @@ -1,746 +0,0 @@ -# Copyright (c) 2012 - 2017, Lars Bilke -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without modification, -# are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, this -# list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Neither the name of the copyright holder nor the names of its contributors -# may be used to endorse or promote products derived from this software without -# specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# -# CHANGES: -# -# 2012-01-31, Lars Bilke -# - Enable Code Coverage -# -# 2013-09-17, Joakim Söderberg -# - Added support for Clang. -# - Some additional usage instructions. -# -# 2016-02-03, Lars Bilke -# - Refactored functions to use named parameters -# -# 2017-06-02, Lars Bilke -# - Merged with modified version from github.com/ufz/ogs -# -# 2019-05-06, Anatolii Kurotych -# - Remove unnecessary --coverage flag -# -# 2019-12-13, FeRD (Frank Dana) -# - Deprecate COVERAGE_LCOVR_EXCLUDES and COVERAGE_GCOVR_EXCLUDES lists in favor -# of tool-agnostic COVERAGE_EXCLUDES variable, or EXCLUDE setup arguments. -# - CMake 3.4+: All excludes can be specified relative to BASE_DIRECTORY -# - All setup functions: accept BASE_DIRECTORY, EXCLUDE list -# - Set lcov basedir with -b argument -# - Add automatic --demangle-cpp in lcovr, if 'c++filt' is available (can be -# overridden with NO_DEMANGLE option in setup_target_for_coverage_lcovr().) -# - Delete output dir, .info file on 'make clean' -# - Remove Python detection, since version mismatches will break gcovr -# - Minor cleanup (lowercase function names, update examples...) -# -# 2019-12-19, FeRD (Frank Dana) -# - Rename Lcov outputs, make filtered file canonical, fix cleanup for targets -# -# 2020-01-19, Bob Apthorpe -# - Added gfortran support -# -# 2020-02-17, FeRD (Frank Dana) -# - Make all add_custom_target()s VERBATIM to auto-escape wildcard characters -# in EXCLUDEs, and remove manual escaping from gcovr targets -# -# 2021-01-19, Robin Mueller -# - Add CODE_COVERAGE_VERBOSE option which will allow to print out commands which are run -# - Added the option for users to set the GCOVR_ADDITIONAL_ARGS variable to supply additional -# flags to the gcovr command -# -# 2020-05-04, Mihchael Davis -# - Add -fprofile-abs-path to make gcno files contain absolute paths -# - Fix BASE_DIRECTORY not working when defined -# - Change BYPRODUCT from folder to index.html to stop ninja from complaining about double defines -# -# 2021-05-10, Martin Stump -# - Check if the generator is multi-config before warning about non-Debug builds -# -# 2022-02-22, Marko Wehle -# - Change gcovr output from -o for --xml and --html output respectively. -# This will allow for Multiple Output Formats at the same time by making use of GCOVR_ADDITIONAL_ARGS, e.g. GCOVR_ADDITIONAL_ARGS "--txt". -# -# 2022-09-28, Sebastian Mueller -# - fix append_coverage_compiler_flags_to_target to correctly add flags -# - replace "-fprofile-arcs -ftest-coverage" with "--coverage" (equivalent) -# -# USAGE: -# -# 1. Copy this file into your cmake modules path. -# -# 2. Add the following line to your CMakeLists.txt (best inside an if-condition -# using a CMake option() to enable it just optionally): -# include(CodeCoverage) -# -# 3. Append necessary compiler flags for all supported source files: -# append_coverage_compiler_flags() -# Or for specific target: -# append_coverage_compiler_flags_to_target(YOUR_TARGET_NAME) -# -# 3.a (OPTIONAL) Set appropriate optimization flags, e.g. -O0, -O1 or -Og -# -# 4. If you need to exclude additional directories from the report, specify them -# using full paths in the COVERAGE_EXCLUDES variable before calling -# setup_target_for_coverage_*(). -# Example: -# set(COVERAGE_EXCLUDES -# '${PROJECT_SOURCE_DIR}/src/dir1/*' -# '/path/to/my/src/dir2/*') -# Or, use the EXCLUDE argument to setup_target_for_coverage_*(). -# Example: -# setup_target_for_coverage_lcov( -# NAME coverage -# EXECUTABLE testrunner -# EXCLUDE "${PROJECT_SOURCE_DIR}/src/dir1/*" "/path/to/my/src/dir2/*") -# -# 4.a NOTE: With CMake 3.4+, COVERAGE_EXCLUDES or EXCLUDE can also be set -# relative to the BASE_DIRECTORY (default: PROJECT_SOURCE_DIR) -# Example: -# set(COVERAGE_EXCLUDES "dir1/*") -# setup_target_for_coverage_gcovr_html( -# NAME coverage -# EXECUTABLE testrunner -# BASE_DIRECTORY "${PROJECT_SOURCE_DIR}/src" -# EXCLUDE "dir2/*") -# -# 5. Use the functions described below to create a custom make target which -# runs your test executable and produces a code coverage report. -# -# 6. Build a Debug build: -# cmake -DCMAKE_BUILD_TYPE=Debug .. -# make -# make my_coverage_target -# - -include(CMakeParseArguments) - -option(CODE_COVERAGE_VERBOSE "Verbose information" TRUE) - -# Check prereqs -find_program( GCOV_PATH gcov ) -find_program( LCOV_PATH NAMES lcov lcov.bat lcov.exe lcov.perl) -find_program( FASTCOV_PATH NAMES fastcov fastcov.py ) -find_program( GENHTML_PATH NAMES genhtml genhtml.perl genhtml.bat ) -find_program( GCOVR_PATH gcovr PATHS ${CMAKE_SOURCE_DIR}/scripts/test) -find_program( CPPFILT_PATH NAMES c++filt ) - -if(NOT GCOV_PATH) - message(FATAL_ERROR "gcov not found! Aborting...") -endif() # NOT GCOV_PATH - -# Check supported compiler (Clang, GNU and Flang) -get_property(LANGUAGES GLOBAL PROPERTY ENABLED_LANGUAGES) -foreach(LANG ${LANGUAGES}) - if("${CMAKE_${LANG}_COMPILER_ID}" MATCHES "(Apple)?[Cc]lang") - if("${CMAKE_${LANG}_COMPILER_VERSION}" VERSION_LESS 3) - message(FATAL_ERROR "Clang version must be 3.0.0 or greater! Aborting...") - endif() - elseif(NOT "${CMAKE_${LANG}_COMPILER_ID}" MATCHES "GNU" - AND NOT "${CMAKE_${LANG}_COMPILER_ID}" MATCHES "(LLVM)?[Ff]lang") - if ("${LANG}" MATCHES "CUDA") - message(STATUS "Ignoring CUDA") - else() - message(FATAL_ERROR "Compiler is not GNU or Flang! Aborting...") - endif() - endif() -endforeach() - -set(COVERAGE_COMPILER_FLAGS "-g --coverage" - CACHE INTERNAL "") -if(CMAKE_CXX_COMPILER_ID MATCHES "(GNU|Clang)") - include(CheckCXXCompilerFlag) - check_cxx_compiler_flag(-fprofile-abs-path HAVE_fprofile_abs_path) - if(HAVE_fprofile_abs_path) - set(COVERAGE_COMPILER_FLAGS "${COVERAGE_COMPILER_FLAGS} -fprofile-abs-path") - endif() -endif() - -set(CMAKE_Fortran_FLAGS_COVERAGE - ${COVERAGE_COMPILER_FLAGS} - CACHE STRING "Flags used by the Fortran compiler during coverage builds." - FORCE ) -set(CMAKE_CXX_FLAGS_COVERAGE - ${COVERAGE_COMPILER_FLAGS} - CACHE STRING "Flags used by the C++ compiler during coverage builds." - FORCE ) -set(CMAKE_C_FLAGS_COVERAGE - ${COVERAGE_COMPILER_FLAGS} - CACHE STRING "Flags used by the C compiler during coverage builds." - FORCE ) -set(CMAKE_EXE_LINKER_FLAGS_COVERAGE - "" - CACHE STRING "Flags used for linking binaries during coverage builds." - FORCE ) -set(CMAKE_SHARED_LINKER_FLAGS_COVERAGE - "" - CACHE STRING "Flags used by the shared libraries linker during coverage builds." - FORCE ) -mark_as_advanced( - CMAKE_Fortran_FLAGS_COVERAGE - CMAKE_CXX_FLAGS_COVERAGE - CMAKE_C_FLAGS_COVERAGE - CMAKE_EXE_LINKER_FLAGS_COVERAGE - CMAKE_SHARED_LINKER_FLAGS_COVERAGE ) - -get_property(GENERATOR_IS_MULTI_CONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) -if(NOT (CMAKE_BUILD_TYPE STREQUAL "Debug" OR GENERATOR_IS_MULTI_CONFIG)) - message(WARNING "Code coverage results with an optimised (non-Debug) build may be misleading") -endif() # NOT (CMAKE_BUILD_TYPE STREQUAL "Debug" OR GENERATOR_IS_MULTI_CONFIG) - -if(CMAKE_C_COMPILER_ID STREQUAL "GNU" OR CMAKE_Fortran_COMPILER_ID STREQUAL "GNU") - link_libraries(gcov) -endif() - -# Defines a target for running and collection code coverage information -# Builds dependencies, runs the given executable and outputs reports. -# NOTE! The executable should always have a ZERO as exit code otherwise -# the coverage generation will not complete. -# -# setup_target_for_coverage_lcov( -# NAME testrunner_coverage # New target name -# EXECUTABLE testrunner -j ${PROCESSOR_COUNT} # Executable in PROJECT_BINARY_DIR -# DEPENDENCIES testrunner # Dependencies to build first -# BASE_DIRECTORY "../" # Base directory for report -# # (defaults to PROJECT_SOURCE_DIR) -# EXCLUDE "src/dir1/*" "src/dir2/*" # Patterns to exclude (can be relative -# # to BASE_DIRECTORY, with CMake 3.4+) -# NO_DEMANGLE # Don't demangle C++ symbols -# # even if c++filt is found -# ) -function(setup_target_for_coverage_lcov) - - set(options NO_DEMANGLE SONARQUBE) - set(oneValueArgs BASE_DIRECTORY NAME) - set(multiValueArgs EXCLUDE EXECUTABLE EXECUTABLE_ARGS DEPENDENCIES LCOV_ARGS GENHTML_ARGS) - cmake_parse_arguments(Coverage "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) - - if(NOT LCOV_PATH) - message(FATAL_ERROR "lcov not found! Aborting...") - endif() # NOT LCOV_PATH - - if(NOT GENHTML_PATH) - message(FATAL_ERROR "genhtml not found! Aborting...") - endif() # NOT GENHTML_PATH - - # Set base directory (as absolute path), or default to PROJECT_SOURCE_DIR - if(DEFINED Coverage_BASE_DIRECTORY) - get_filename_component(BASEDIR ${Coverage_BASE_DIRECTORY} ABSOLUTE) - else() - set(BASEDIR ${PROJECT_SOURCE_DIR}) - endif() - - # Collect excludes (CMake 3.4+: Also compute absolute paths) - set(LCOV_EXCLUDES "") - foreach(EXCLUDE ${Coverage_EXCLUDE} ${COVERAGE_EXCLUDES} ${COVERAGE_LCOV_EXCLUDES}) - if(CMAKE_VERSION VERSION_GREATER 3.4) - get_filename_component(EXCLUDE ${EXCLUDE} ABSOLUTE BASE_DIR ${BASEDIR}) - endif() - list(APPEND LCOV_EXCLUDES "${EXCLUDE}") - endforeach() - list(REMOVE_DUPLICATES LCOV_EXCLUDES) - - # Conditional arguments - if(CPPFILT_PATH AND NOT ${Coverage_NO_DEMANGLE}) - set(GENHTML_EXTRA_ARGS "--demangle-cpp") - endif() - - # Setting up commands which will be run to generate coverage data. - # Cleanup lcov - set(LCOV_CLEAN_CMD - ${LCOV_PATH} ${Coverage_LCOV_ARGS} --gcov-tool ${GCOV_PATH} -directory . - -b ${BASEDIR} --zerocounters - ) - # Create baseline to make sure untouched files show up in the report - set(LCOV_BASELINE_CMD - ${LCOV_PATH} ${Coverage_LCOV_ARGS} --gcov-tool ${GCOV_PATH} -c -i -d . -b - ${BASEDIR} -o ${Coverage_NAME}.base - ) - # Run tests - set(LCOV_EXEC_TESTS_CMD - ${Coverage_EXECUTABLE} ${Coverage_EXECUTABLE_ARGS} - ) - # Capturing lcov counters and generating report - set(LCOV_CAPTURE_CMD - ${LCOV_PATH} ${Coverage_LCOV_ARGS} --gcov-tool ${GCOV_PATH} --directory . -b - ${BASEDIR} --capture --output-file ${Coverage_NAME}.capture - ) - # add baseline counters - set(LCOV_BASELINE_COUNT_CMD - ${LCOV_PATH} ${Coverage_LCOV_ARGS} --gcov-tool ${GCOV_PATH} -a ${Coverage_NAME}.base - -a ${Coverage_NAME}.capture --output-file ${Coverage_NAME}.total - ) - # filter collected data to final coverage report - set(LCOV_FILTER_CMD - ${LCOV_PATH} ${Coverage_LCOV_ARGS} --gcov-tool ${GCOV_PATH} --remove - ${Coverage_NAME}.total ${LCOV_EXCLUDES} --output-file ${Coverage_NAME}.info - ) - # Generate HTML output - set(LCOV_GEN_HTML_CMD - ${GENHTML_PATH} ${GENHTML_EXTRA_ARGS} ${Coverage_GENHTML_ARGS} -o - ${Coverage_NAME} ${Coverage_NAME}.info - ) - if(${Coverage_SONARQUBE}) - # Generate SonarQube output - set(GCOVR_XML_CMD - ${GCOVR_PATH} --sonarqube ${Coverage_NAME}_sonarqube.xml -r ${BASEDIR} ${GCOVR_ADDITIONAL_ARGS} - ${GCOVR_EXCLUDE_ARGS} --object-directory=${PROJECT_BINARY_DIR} - ) - set(GCOVR_XML_CMD_COMMAND - COMMAND ${GCOVR_XML_CMD} - ) - set(GCOVR_XML_CMD_BYPRODUCTS ${Coverage_NAME}_sonarqube.xml) - set(GCOVR_XML_CMD_COMMENT COMMENT "SonarQube code coverage info report saved in ${Coverage_NAME}_sonarqube.xml.") - endif() - - - if(CODE_COVERAGE_VERBOSE) - message(STATUS "Executed command report") - message(STATUS "Command to clean up lcov: ") - string(REPLACE ";" " " LCOV_CLEAN_CMD_SPACED "${LCOV_CLEAN_CMD}") - message(STATUS "${LCOV_CLEAN_CMD_SPACED}") - - message(STATUS "Command to create baseline: ") - string(REPLACE ";" " " LCOV_BASELINE_CMD_SPACED "${LCOV_BASELINE_CMD}") - message(STATUS "${LCOV_BASELINE_CMD_SPACED}") - - message(STATUS "Command to run the tests: ") - string(REPLACE ";" " " LCOV_EXEC_TESTS_CMD_SPACED "${LCOV_EXEC_TESTS_CMD}") - message(STATUS "${LCOV_EXEC_TESTS_CMD_SPACED}") - - message(STATUS "Command to capture counters and generate report: ") - string(REPLACE ";" " " LCOV_CAPTURE_CMD_SPACED "${LCOV_CAPTURE_CMD}") - message(STATUS "${LCOV_CAPTURE_CMD_SPACED}") - - message(STATUS "Command to add baseline counters: ") - string(REPLACE ";" " " LCOV_BASELINE_COUNT_CMD_SPACED "${LCOV_BASELINE_COUNT_CMD}") - message(STATUS "${LCOV_BASELINE_COUNT_CMD_SPACED}") - - message(STATUS "Command to filter collected data: ") - string(REPLACE ";" " " LCOV_FILTER_CMD_SPACED "${LCOV_FILTER_CMD}") - message(STATUS "${LCOV_FILTER_CMD_SPACED}") - - message(STATUS "Command to generate lcov HTML output: ") - string(REPLACE ";" " " LCOV_GEN_HTML_CMD_SPACED "${LCOV_GEN_HTML_CMD}") - message(STATUS "${LCOV_GEN_HTML_CMD_SPACED}") - - if(${Coverage_SONARQUBE}) - message(STATUS "Command to generate SonarQube XML output: ") - string(REPLACE ";" " " GCOVR_XML_CMD_SPACED "${GCOVR_XML_CMD}") - message(STATUS "${GCOVR_XML_CMD_SPACED}") - endif() - endif() - - # Setup target - add_custom_target(${Coverage_NAME} - COMMAND ${LCOV_CLEAN_CMD} - COMMAND ${LCOV_BASELINE_CMD} - COMMAND ${LCOV_EXEC_TESTS_CMD} - COMMAND ${LCOV_CAPTURE_CMD} - COMMAND ${LCOV_BASELINE_COUNT_CMD} - COMMAND ${LCOV_FILTER_CMD} - COMMAND ${LCOV_GEN_HTML_CMD} - ${GCOVR_XML_CMD_COMMAND} - - # Set output files as GENERATED (will be removed on 'make clean') - BYPRODUCTS - ${Coverage_NAME}.base - ${Coverage_NAME}.capture - ${Coverage_NAME}.total - ${Coverage_NAME}.info - ${GCOVR_XML_CMD_BYPRODUCTS} - ${Coverage_NAME}/index.html - WORKING_DIRECTORY ${PROJECT_BINARY_DIR} - DEPENDS ${Coverage_DEPENDENCIES} - VERBATIM # Protect arguments to commands - COMMENT "Resetting code coverage counters to zero.\nProcessing code coverage counters and generating report." - ) - - # Show where to find the lcov info report - add_custom_command(TARGET ${Coverage_NAME} POST_BUILD - COMMAND ; - COMMENT "Lcov code coverage info report saved in ${Coverage_NAME}.info." - ${GCOVR_XML_CMD_COMMENT} - ) - - # Show info where to find the report - add_custom_command(TARGET ${Coverage_NAME} POST_BUILD - COMMAND ; - COMMENT "Open ./${Coverage_NAME}/index.html in your browser to view the coverage report." - ) - -endfunction() # setup_target_for_coverage_lcov - -# Defines a target for running and collection code coverage information -# Builds dependencies, runs the given executable and outputs reports. -# NOTE! The executable should always have a ZERO as exit code otherwise -# the coverage generation will not complete. -# -# setup_target_for_coverage_gcovr_xml( -# NAME ctest_coverage # New target name -# EXECUTABLE ctest -j ${PROCESSOR_COUNT} # Executable in PROJECT_BINARY_DIR -# DEPENDENCIES executable_target # Dependencies to build first -# BASE_DIRECTORY "../" # Base directory for report -# # (defaults to PROJECT_SOURCE_DIR) -# EXCLUDE "src/dir1/*" "src/dir2/*" # Patterns to exclude (can be relative -# # to BASE_DIRECTORY, with CMake 3.4+) -# ) -# The user can set the variable GCOVR_ADDITIONAL_ARGS to supply additional flags to the -# GCVOR command. -function(setup_target_for_coverage_gcovr_xml) - - set(options NONE) - set(oneValueArgs BASE_DIRECTORY NAME) - set(multiValueArgs EXCLUDE EXECUTABLE EXECUTABLE_ARGS DEPENDENCIES) - cmake_parse_arguments(Coverage "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) - - if(NOT GCOVR_PATH) - message(FATAL_ERROR "gcovr not found! Aborting...") - endif() # NOT GCOVR_PATH - - # Set base directory (as absolute path), or default to PROJECT_SOURCE_DIR - if(DEFINED Coverage_BASE_DIRECTORY) - get_filename_component(BASEDIR ${Coverage_BASE_DIRECTORY} ABSOLUTE) - else() - set(BASEDIR ${PROJECT_SOURCE_DIR}) - endif() - - # Collect excludes (CMake 3.4+: Also compute absolute paths) - set(GCOVR_EXCLUDES "") - foreach(EXCLUDE ${Coverage_EXCLUDE} ${COVERAGE_EXCLUDES} ${COVERAGE_GCOVR_EXCLUDES}) - if(CMAKE_VERSION VERSION_GREATER 3.4) - get_filename_component(EXCLUDE ${EXCLUDE} ABSOLUTE BASE_DIR ${BASEDIR}) - endif() - list(APPEND GCOVR_EXCLUDES "${EXCLUDE}") - endforeach() - list(REMOVE_DUPLICATES GCOVR_EXCLUDES) - - # Combine excludes to several -e arguments - set(GCOVR_EXCLUDE_ARGS "") - foreach(EXCLUDE ${GCOVR_EXCLUDES}) - list(APPEND GCOVR_EXCLUDE_ARGS "-e") - list(APPEND GCOVR_EXCLUDE_ARGS "${EXCLUDE}") - endforeach() - - # Set up commands which will be run to generate coverage data - # Run tests - set(GCOVR_XML_EXEC_TESTS_CMD - ${Coverage_EXECUTABLE} ${Coverage_EXECUTABLE_ARGS} - ) - # Running gcovr - set(GCOVR_XML_CMD - ${GCOVR_PATH} --xml ${Coverage_NAME}.xml -r ${BASEDIR} ${GCOVR_ADDITIONAL_ARGS} - ${GCOVR_EXCLUDE_ARGS} --object-directory=${PROJECT_BINARY_DIR} - ) - - if(CODE_COVERAGE_VERBOSE) - message(STATUS "Executed command report") - - message(STATUS "Command to run tests: ") - string(REPLACE ";" " " GCOVR_XML_EXEC_TESTS_CMD_SPACED "${GCOVR_XML_EXEC_TESTS_CMD}") - message(STATUS "${GCOVR_XML_EXEC_TESTS_CMD_SPACED}") - - message(STATUS "Command to generate gcovr XML coverage data: ") - string(REPLACE ";" " " GCOVR_XML_CMD_SPACED "${GCOVR_XML_CMD}") - message(STATUS "${GCOVR_XML_CMD_SPACED}") - endif() - - add_custom_target(${Coverage_NAME} - COMMAND ${GCOVR_XML_EXEC_TESTS_CMD} - COMMAND ${GCOVR_XML_CMD} - - BYPRODUCTS ${Coverage_NAME}.xml - WORKING_DIRECTORY ${PROJECT_BINARY_DIR} - DEPENDS ${Coverage_DEPENDENCIES} - VERBATIM # Protect arguments to commands - COMMENT "Running gcovr to produce Cobertura code coverage report." - ) - - # Show info where to find the report - add_custom_command(TARGET ${Coverage_NAME} POST_BUILD - COMMAND ; - COMMENT "Cobertura code coverage report saved in ${Coverage_NAME}.xml." - ) -endfunction() # setup_target_for_coverage_gcovr_xml - -# Defines a target for running and collection code coverage information -# Builds dependencies, runs the given executable and outputs reports. -# NOTE! The executable should always have a ZERO as exit code otherwise -# the coverage generation will not complete. -# -# setup_target_for_coverage_gcovr_html( -# NAME ctest_coverage # New target name -# EXECUTABLE ctest -j ${PROCESSOR_COUNT} # Executable in PROJECT_BINARY_DIR -# DEPENDENCIES executable_target # Dependencies to build first -# BASE_DIRECTORY "../" # Base directory for report -# # (defaults to PROJECT_SOURCE_DIR) -# EXCLUDE "src/dir1/*" "src/dir2/*" # Patterns to exclude (can be relative -# # to BASE_DIRECTORY, with CMake 3.4+) -# ) -# The user can set the variable GCOVR_ADDITIONAL_ARGS to supply additional flags to the -# GCVOR command. -function(setup_target_for_coverage_gcovr_html) - - set(options NONE) - set(oneValueArgs BASE_DIRECTORY NAME) - set(multiValueArgs EXCLUDE EXECUTABLE EXECUTABLE_ARGS DEPENDENCIES) - cmake_parse_arguments(Coverage "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) - - if(NOT GCOVR_PATH) - message(FATAL_ERROR "gcovr not found! Aborting...") - endif() # NOT GCOVR_PATH - - # Set base directory (as absolute path), or default to PROJECT_SOURCE_DIR - if(DEFINED Coverage_BASE_DIRECTORY) - get_filename_component(BASEDIR ${Coverage_BASE_DIRECTORY} ABSOLUTE) - else() - set(BASEDIR ${PROJECT_SOURCE_DIR}) - endif() - - # Collect excludes (CMake 3.4+: Also compute absolute paths) - set(GCOVR_EXCLUDES "") - foreach(EXCLUDE ${Coverage_EXCLUDE} ${COVERAGE_EXCLUDES} ${COVERAGE_GCOVR_EXCLUDES}) - if(CMAKE_VERSION VERSION_GREATER 3.4) - get_filename_component(EXCLUDE ${EXCLUDE} ABSOLUTE BASE_DIR ${BASEDIR}) - endif() - list(APPEND GCOVR_EXCLUDES "${EXCLUDE}") - endforeach() - list(REMOVE_DUPLICATES GCOVR_EXCLUDES) - - # Combine excludes to several -e arguments - set(GCOVR_EXCLUDE_ARGS "") - foreach(EXCLUDE ${GCOVR_EXCLUDES}) - list(APPEND GCOVR_EXCLUDE_ARGS "-e") - list(APPEND GCOVR_EXCLUDE_ARGS "${EXCLUDE}") - endforeach() - - # Set up commands which will be run to generate coverage data - # Run tests - set(GCOVR_HTML_EXEC_TESTS_CMD - ${Coverage_EXECUTABLE} ${Coverage_EXECUTABLE_ARGS} - ) - # Create folder - set(GCOVR_HTML_FOLDER_CMD - ${CMAKE_COMMAND} -E make_directory ${PROJECT_BINARY_DIR}/${Coverage_NAME} - ) - # Running gcovr - set(GCOVR_HTML_CMD - ${GCOVR_PATH} --html ${Coverage_NAME}/index.html --html-details -r ${BASEDIR} ${GCOVR_ADDITIONAL_ARGS} - ${GCOVR_EXCLUDE_ARGS} --object-directory=${PROJECT_BINARY_DIR} - ) - - if(CODE_COVERAGE_VERBOSE) - message(STATUS "Executed command report") - - message(STATUS "Command to run tests: ") - string(REPLACE ";" " " GCOVR_HTML_EXEC_TESTS_CMD_SPACED "${GCOVR_HTML_EXEC_TESTS_CMD}") - message(STATUS "${GCOVR_HTML_EXEC_TESTS_CMD_SPACED}") - - message(STATUS "Command to create a folder: ") - string(REPLACE ";" " " GCOVR_HTML_FOLDER_CMD_SPACED "${GCOVR_HTML_FOLDER_CMD}") - message(STATUS "${GCOVR_HTML_FOLDER_CMD_SPACED}") - - message(STATUS "Command to generate gcovr HTML coverage data: ") - string(REPLACE ";" " " GCOVR_HTML_CMD_SPACED "${GCOVR_HTML_CMD}") - message(STATUS "${GCOVR_HTML_CMD_SPACED}") - endif() - - add_custom_target(${Coverage_NAME} - COMMAND ${GCOVR_HTML_EXEC_TESTS_CMD} - COMMAND ${GCOVR_HTML_FOLDER_CMD} - COMMAND ${GCOVR_HTML_CMD} - - BYPRODUCTS ${PROJECT_BINARY_DIR}/${Coverage_NAME}/index.html # report directory - WORKING_DIRECTORY ${PROJECT_BINARY_DIR} - DEPENDS ${Coverage_DEPENDENCIES} - VERBATIM # Protect arguments to commands - COMMENT "Running gcovr to produce HTML code coverage report." - ) - - # Show info where to find the report - add_custom_command(TARGET ${Coverage_NAME} POST_BUILD - COMMAND ; - COMMENT "Open ./${Coverage_NAME}/index.html in your browser to view the coverage report." - ) - -endfunction() # setup_target_for_coverage_gcovr_html - -# Defines a target for running and collection code coverage information -# Builds dependencies, runs the given executable and outputs reports. -# NOTE! The executable should always have a ZERO as exit code otherwise -# the coverage generation will not complete. -# -# setup_target_for_coverage_fastcov( -# NAME testrunner_coverage # New target name -# EXECUTABLE testrunner -j ${PROCESSOR_COUNT} # Executable in PROJECT_BINARY_DIR -# DEPENDENCIES testrunner # Dependencies to build first -# BASE_DIRECTORY "../" # Base directory for report -# # (defaults to PROJECT_SOURCE_DIR) -# EXCLUDE "src/dir1/" "src/dir2/" # Patterns to exclude. -# NO_DEMANGLE # Don't demangle C++ symbols -# # even if c++filt is found -# SKIP_HTML # Don't create html report -# POST_CMD perl -i -pe s!${PROJECT_SOURCE_DIR}/!!g ctest_coverage.json # E.g. for stripping source dir from file paths -# ) -function(setup_target_for_coverage_fastcov) - - set(options NO_DEMANGLE SKIP_HTML) - set(oneValueArgs BASE_DIRECTORY NAME) - set(multiValueArgs EXCLUDE EXECUTABLE EXECUTABLE_ARGS DEPENDENCIES FASTCOV_ARGS GENHTML_ARGS POST_CMD) - cmake_parse_arguments(Coverage "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) - - if(NOT FASTCOV_PATH) - message(FATAL_ERROR "fastcov not found! Aborting...") - endif() - - if(NOT Coverage_SKIP_HTML AND NOT GENHTML_PATH) - message(FATAL_ERROR "genhtml not found! Aborting...") - endif() - - # Set base directory (as absolute path), or default to PROJECT_SOURCE_DIR - if(Coverage_BASE_DIRECTORY) - get_filename_component(BASEDIR ${Coverage_BASE_DIRECTORY} ABSOLUTE) - else() - set(BASEDIR ${PROJECT_SOURCE_DIR}) - endif() - - # Collect excludes (Patterns, not paths, for fastcov) - set(FASTCOV_EXCLUDES "") - foreach(EXCLUDE ${Coverage_EXCLUDE} ${COVERAGE_EXCLUDES} ${COVERAGE_FASTCOV_EXCLUDES}) - list(APPEND FASTCOV_EXCLUDES "${EXCLUDE}") - endforeach() - list(REMOVE_DUPLICATES FASTCOV_EXCLUDES) - - # Conditional arguments - if(CPPFILT_PATH AND NOT ${Coverage_NO_DEMANGLE}) - set(GENHTML_EXTRA_ARGS "--demangle-cpp") - endif() - - # Set up commands which will be run to generate coverage data - set(FASTCOV_EXEC_TESTS_CMD ${Coverage_EXECUTABLE} ${Coverage_EXECUTABLE_ARGS}) - - set(FASTCOV_CAPTURE_CMD ${FASTCOV_PATH} ${Coverage_FASTCOV_ARGS} --gcov ${GCOV_PATH} - --search-directory ${BASEDIR} - --process-gcno - --output ${Coverage_NAME}.json - --exclude ${FASTCOV_EXCLUDES} - ) - - set(FASTCOV_CONVERT_CMD ${FASTCOV_PATH} - -C ${Coverage_NAME}.json --lcov --output ${Coverage_NAME}.info - ) - - if(Coverage_SKIP_HTML) - set(FASTCOV_HTML_CMD ";") - else() - set(FASTCOV_HTML_CMD ${GENHTML_PATH} ${GENHTML_EXTRA_ARGS} ${Coverage_GENHTML_ARGS} - -o ${Coverage_NAME} ${Coverage_NAME}.info - ) - endif() - - set(FASTCOV_POST_CMD ";") - if(Coverage_POST_CMD) - set(FASTCOV_POST_CMD ${Coverage_POST_CMD}) - endif() - - if(CODE_COVERAGE_VERBOSE) - message(STATUS "Code coverage commands for target ${Coverage_NAME} (fastcov):") - - message(" Running tests:") - string(REPLACE ";" " " FASTCOV_EXEC_TESTS_CMD_SPACED "${FASTCOV_EXEC_TESTS_CMD}") - message(" ${FASTCOV_EXEC_TESTS_CMD_SPACED}") - - message(" Capturing fastcov counters and generating report:") - string(REPLACE ";" " " FASTCOV_CAPTURE_CMD_SPACED "${FASTCOV_CAPTURE_CMD}") - message(" ${FASTCOV_CAPTURE_CMD_SPACED}") - - message(" Converting fastcov .json to lcov .info:") - string(REPLACE ";" " " FASTCOV_CONVERT_CMD_SPACED "${FASTCOV_CONVERT_CMD}") - message(" ${FASTCOV_CONVERT_CMD_SPACED}") - - if(NOT Coverage_SKIP_HTML) - message(" Generating HTML report: ") - string(REPLACE ";" " " FASTCOV_HTML_CMD_SPACED "${FASTCOV_HTML_CMD}") - message(" ${FASTCOV_HTML_CMD_SPACED}") - endif() - if(Coverage_POST_CMD) - message(" Running post command: ") - string(REPLACE ";" " " FASTCOV_POST_CMD_SPACED "${FASTCOV_POST_CMD}") - message(" ${FASTCOV_POST_CMD_SPACED}") - endif() - endif() - - # Setup target - add_custom_target(${Coverage_NAME} - - # Cleanup fastcov - COMMAND ${FASTCOV_PATH} ${Coverage_FASTCOV_ARGS} --gcov ${GCOV_PATH} - --search-directory ${BASEDIR} - --zerocounters - - COMMAND ${FASTCOV_EXEC_TESTS_CMD} - COMMAND ${FASTCOV_CAPTURE_CMD} - COMMAND ${FASTCOV_CONVERT_CMD} - COMMAND ${FASTCOV_HTML_CMD} - COMMAND ${FASTCOV_POST_CMD} - - # Set output files as GENERATED (will be removed on 'make clean') - BYPRODUCTS - ${Coverage_NAME}.info - ${Coverage_NAME}.json - ${Coverage_NAME}/index.html # report directory - - WORKING_DIRECTORY ${PROJECT_BINARY_DIR} - DEPENDS ${Coverage_DEPENDENCIES} - VERBATIM # Protect arguments to commands - COMMENT "Resetting code coverage counters to zero. Processing code coverage counters and generating report." - ) - - set(INFO_MSG "fastcov code coverage info report saved in ${Coverage_NAME}.info and ${Coverage_NAME}.json.") - if(NOT Coverage_SKIP_HTML) - string(APPEND INFO_MSG " Open ${PROJECT_BINARY_DIR}/${Coverage_NAME}/index.html in your browser to view the coverage report.") - endif() - # Show where to find the fastcov info report - add_custom_command(TARGET ${Coverage_NAME} POST_BUILD - COMMAND ${CMAKE_COMMAND} -E echo ${INFO_MSG} - ) - -endfunction() # setup_target_for_coverage_fastcov - -function(append_coverage_compiler_flags) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${COVERAGE_COMPILER_FLAGS}" PARENT_SCOPE) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COVERAGE_COMPILER_FLAGS}" PARENT_SCOPE) - set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} ${COVERAGE_COMPILER_FLAGS}" PARENT_SCOPE) - message(STATUS "Appending code coverage compiler flags: ${COVERAGE_COMPILER_FLAGS}") -endfunction() # append_coverage_compiler_flags - -# Setup coverage for specific library -function(append_coverage_compiler_flags_to_target name) - separate_arguments(_flag_list NATIVE_COMMAND "${COVERAGE_COMPILER_FLAGS}") - target_compile_options(${name} PRIVATE ${_flag_list}) - if(CMAKE_C_COMPILER_ID STREQUAL "GNU" OR CMAKE_Fortran_COMPILER_ID STREQUAL "GNU") - target_link_libraries(${name} PRIVATE gcov) - endif() -endfunction() diff --git a/cmake/modules/StaticAnalyzers.cmake b/cmake/modules/StaticAnalyzers.cmake deleted file mode 100644 index 8a15aed..0000000 --- a/cmake/modules/StaticAnalyzers.cmake +++ /dev/null @@ -1,22 +0,0 @@ -if(ENABLE_CLANG_TIDY) - find_program(CLANG_TIDY_COMMAND NAMES clang-tidy) - - if(NOT CLANG_TIDY_COMMAND) - message(WARNING "🔴 CMake_RUN_CLANG_TIDY is ON but clang-tidy is not found!") - set(CMAKE_CXX_CLANG_TIDY "" CACHE STRING "" FORCE) - else() - - message(STATUS "🟢 CMake_RUN_CLANG_TIDY is ON") - set(CLANGTIDY_EXTRA_ARGS - "-extra-arg=-Wno-unknown-warning-option" - ) - set(CMAKE_CXX_CLANG_TIDY "${CLANG_TIDY_COMMAND};-p=${CMAKE_BINARY_DIR};${CLANGTIDY_EXTRA_ARGS}" CACHE STRING "" FORCE) - - add_custom_target(clang-tidy - COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} --target ${CMAKE_PROJECT_NAME} - COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} --target clang-tidy - COMMENT "Running clang-tidy..." - ) - set(CMAKE_EXPORT_COMPILE_COMMANDS ON) - endif() -endif(ENABLE_CLANG_TIDY) From 32d231cdafdec39e18ce1bec3b7dce2f82b78ac7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Monta=C3=B1ana=20G=C3=B3mez?= Date: Tue, 1 Jul 2025 09:59:29 +0200 Subject: [PATCH 5/9] Update Makefile --- Makefile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 6d16eeb..d107382 100644 --- a/Makefile +++ b/Makefile @@ -44,7 +44,7 @@ setup: ## Install dependencies for tests and coverage clean: ## Clean the project @echo ">>> Cleaning the project..." - @if test -f CMakeCache.txt ; then echo "- Deleting CMakeCache.txt"; rm -f CMakeCache.txt; fi + @if test -f CMakeCache.txt ; then echo "- Deleting CMakeCache.txt"; rm -f CMakeCache.txt; fimake @for folder in $(f_release) $(f_debug) vpcpkg_installed install_test ; do \ if test -d "$$folder" ; then \ echo "- Deleting $$folder folder" ; \ @@ -58,10 +58,10 @@ clean: ## Clean the project # ============= buildd: ## Build the debug targets - cmake --build $(f_debug) -t $(app_targets) --parallel $(CMAKE_BUILD_PARALLEL_LEVEL) + cmake --build $(f_debug) --config Debug -t $(app_targets) --parallel $(CMAKE_BUILD_PARALLEL_LEVEL) buildr: ## Build the release targets - cmake --build $(f_release) -t $(app_targets) --parallel $(CMAKE_BUILD_PARALLEL_LEVEL) + cmake --build $(f_release) --config Release -t $(app_targets) --parallel $(CMAKE_BUILD_PARALLEL_LEVEL) # Install targets From 3178bcbda92fe5e9f07a89a5e1312ed8e4c785ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Monta=C3=B1ana=20G=C3=B3mez?= Date: Tue, 1 Jul 2025 12:24:29 +0200 Subject: [PATCH 6/9] Fix conan build --- CMakeUserPresets.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CMakeUserPresets.json b/CMakeUserPresets.json index 94f9b4d..3c99d3e 100644 --- a/CMakeUserPresets.json +++ b/CMakeUserPresets.json @@ -6,6 +6,7 @@ "include": [ "build/Release/generators/CMakePresets.json", "build_Release/build/Release/generators/CMakePresets.json", - "build_Debug/build/Debug/generators/CMakePresets.json" + "build_Debug/build/Debug/generators/CMakePresets.json", + "build_Debug/build/Release/generators/CMakePresets.json" ] } \ No newline at end of file From 3cb454d4aa22e0876016b68afa8c0c193039b627 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Monta=C3=B1ana=20G=C3=B3mez?= Date: Tue, 1 Jul 2025 13:56:28 +0200 Subject: [PATCH 7/9] Fix conan build and remove vcpkg --- CHANGELOG.md | 1 + CMakeLists.txt | 21 +--- CMakeUserPresets.json | 4 +- CONAN_README.md | 19 +-- Makefile | 56 ++------- README.md | 118 +++++++++--------- conanfile.py | 22 +++- sample/CMakeLists.txt | 19 --- test_package/CMakeLists.txt | 9 -- .../generators/conanbuild.sh | 1 - .../conanbuildenv-release-x86_64.sh | 16 --- .../generators/conanrun.sh | 1 - .../generators/conanrunenv-release-x86_64.sh | 17 --- .../generators/deactivate_conanbuild.sh | 1 - .../generators/deactivate_conanrun.sh | 1 - test_package/conanfile.py | 26 ---- test_package/test_bayesnet.cpp | 26 ---- tests/TestBayesModels.cc | 2 +- vcpkg-configuration.json | 21 ---- vcpkg.json | 40 ------ 20 files changed, 101 insertions(+), 320 deletions(-) delete mode 100644 test_package/CMakeLists.txt delete mode 100644 test_package/build/gcc-14-x86_64-gnu17-release/generators/conanbuild.sh delete mode 100644 test_package/build/gcc-14-x86_64-gnu17-release/generators/conanbuildenv-release-x86_64.sh delete mode 100644 test_package/build/gcc-14-x86_64-gnu17-release/generators/conanrun.sh delete mode 100644 test_package/build/gcc-14-x86_64-gnu17-release/generators/conanrunenv-release-x86_64.sh delete mode 100644 test_package/build/gcc-14-x86_64-gnu17-release/generators/deactivate_conanbuild.sh delete mode 100644 test_package/build/gcc-14-x86_64-gnu17-release/generators/deactivate_conanrun.sh delete mode 100644 test_package/conanfile.py delete mode 100644 test_package/test_bayesnet.cpp delete mode 100644 vcpkg-configuration.json delete mode 100644 vcpkg.json diff --git a/CHANGELOG.md b/CHANGELOG.md index f4f63ba..daa5cbf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - *ld_proposed_cuts*: number of cut points to return. - *mdlp_min_length*: minimum length of a partition in MDLP algorithm to be evaluated for partition. - *mdlp_max_depth*: maximum level of recursion in MDLP algorithm. +- Remove vcpkg as a dependency manager, now the library is built with Conan package manager and CMake. ## [1.1.1] - 2025-05-20 diff --git a/CMakeLists.txt b/CMakeLists.txt index be82a49..0699ff5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,7 @@ cmake_minimum_required(VERSION 3.27) project(bayesnet - VERSION 1.1.2 + VERSION 1.2.0 DESCRIPTION "Bayesian Network and basic classifiers Library." HOMEPAGE_URL "https://github.com/rmontanana/bayesnet" LANGUAGES CXX @@ -28,18 +28,11 @@ endif() # ------- option(ENABLE_TESTING "Unit testing build" OFF) option(CODE_COVERAGE "Collect coverage from test library" OFF) -option(USING_CONAN "Use Conan package manager" OFF) -if(USING_CONAN) - message(STATUS "Using Conan package manager") -else(USING_CONAN) - message(STATUS "Using vcpkg package manager") -endif(USING_CONAN) find_package(Torch CONFIG REQUIRED) if(NOT TARGET torch::torch) add_library(torch::torch INTERFACE IMPORTED GLOBAL) - # expose include paths and libraries that the find-module discovered set_target_properties(torch::torch PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${TORCH_INCLUDE_DIRS}" @@ -81,17 +74,7 @@ endif (CMAKE_BUILD_TYPE STREQUAL "Debug") if (ENABLE_TESTING) MESSAGE(STATUS "Testing enabled") find_package(Catch2 CONFIG REQUIRED) - - # Handle arff-files conditionally for different package managers - if(NOT USING_CONAN) - find_package(arff-files CONFIG REQUIRED) - else() - find_package(arff-files CONFIG QUIET) - if(NOT arff-files_FOUND) - message(WARNING "arff-files not found - you may need to create a custom Conan recipe") - endif() - endif() - + find_package(arff-files CONFIG REQUIRED) enable_testing() include(CTest) add_subdirectory(tests) diff --git a/CMakeUserPresets.json b/CMakeUserPresets.json index 3c99d3e..c461df0 100644 --- a/CMakeUserPresets.json +++ b/CMakeUserPresets.json @@ -5,8 +5,8 @@ }, "include": [ "build/Release/generators/CMakePresets.json", - "build_Release/build/Release/generators/CMakePresets.json", "build_Debug/build/Debug/generators/CMakePresets.json", - "build_Debug/build/Release/generators/CMakePresets.json" + "build_Debug/build/Release/generators/CMakePresets.json", + "build_Release/build/Release/generators/CMakePresets.json" ] } \ No newline at end of file diff --git a/CONAN_README.md b/CONAN_README.md index 3c272c1..a563cdd 100644 --- a/CONAN_README.md +++ b/CONAN_README.md @@ -6,6 +6,8 @@ This document explains how to use Conan as an alternative package manager for Ba ```bash pip install conan +conan remote add Cimmeria https://conan.rmontanana.es/artifactory/api/conan/Cimmeria +conan profile new default --detect ``` ## Quick Start @@ -13,25 +15,26 @@ pip install conan ### As a Consumer 1. Create a `conanfile.txt` in your project: + ```ini [requires] -bayesnet/1.1.2@user/channel +libtorch/2.7.0 +bayesnet/1.2.0 [generators] CMakeDeps CMakeToolchain -[options] - -[imports] ``` 2. Install dependencies: + ```bash conan install . --build=missing ``` 3. In your CMakeLists.txt: + ```cmake find_package(bayesnet REQUIRED) target_link_libraries(your_target bayesnet::bayesnet) @@ -44,11 +47,11 @@ target_link_libraries(your_target bayesnet::bayesnet) make conan-init # Build debug version -make conan-debug +make debug make buildd # Build release version -make conan-release +make release make buildr # Create package @@ -80,5 +83,5 @@ Once custom dependencies are resolved: make conan-create # Upload to your remote -conan upload bayesnet/1.1.2@user/channel -r myremote -``` \ No newline at end of file +conan upload bayesnet/1.2.0 -r myremote +``` diff --git a/Makefile b/Makefile index d107382..3da1d2e 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ SHELL := /bin/bash .DEFAULT_GOAL := help -.PHONY: viewcoverage coverage setup help install uninstall diagrams buildr buildd test clean vcpkg-debug vcpkg-release vcpkg-sample updatebadge doc doc-install init clean-test conan-debug conan-release conan-create conan-upload conan-clean conan-sample +.PHONY: viewcoverage coverage setup help install uninstall diagrams buildr buildd test clean updatebadge doc doc-install init clean-test conan-debug conan-release conan-create conan-upload conan-clean conan-sample f_release = build_Release f_debug = build_Debug @@ -189,14 +189,7 @@ doc-install: ## Install documentation # Conan package manager targets # ============================= -# conan-debug: ## Build debug version using Conan -# @echo ">>> Building Debug BayesNet with Conan..." -# @if [ -d ./$(f_debug) ]; then rm -rf ./$(f_debug); fi -# @mkdir $(f_debug) -# @conan install . -s build_type=Debug --build=missing -of $(f_debug) -# @cmake -S . -B $(f_debug) -D CMAKE_BUILD_TYPE=Debug -D ENABLE_TESTING=ON -D CODE_COVERAGE=ON -D USING_CONAN=ON -DCMAKE_TOOLCHAIN_FILE=$(f_debug)/build/Debug/generators/conan_toolchain.cmake -# @echo ">>> Done" -conan-debug: ## Build debug version using Conan +debug: ## Build debug version using Conan @echo ">>> Building *Debug* BayesNet with Conan..." @rm -rf $(f_debug) # wipe previous tree @conan install . \ @@ -208,11 +201,10 @@ conan-debug: ## Build debug version using Conan -DCMAKE_BUILD_TYPE=Debug \ -DENABLE_TESTING=ON \ -DCODE_COVERAGE=ON \ - -DUSING_CONAN=ON \ -DCMAKE_TOOLCHAIN_FILE=$(f_debug)/build/Debug/generators/conan_toolchain.cmake @echo ">>> Done" -conan-release: ## Build release version using Conan +release: ## Build release version using Conan @echo ">>> Building Release BayesNet with Conan..." @conan install . \ -s build_type=Release \ @@ -222,18 +214,18 @@ conan-release: ## Build release version using Conan @if [ -d ./$(f_release) ]; then rm -rf ./$(f_release); fi @mkdir $(f_release) @conan install . -s build_type=Release --build=missing -of $(f_release) - @cmake -S . -B $(f_release) -D CMAKE_BUILD_TYPE=Release -D USING_CONAN=ON -DCMAKE_TOOLCHAIN_FILE=$(f_release)/build/Release/generators/conan_toolchain.cmake + @cmake -S . -B $(f_release) -D CMAKE_BUILD_TYPE=Release -DCMAKE_TOOLCHAIN_FILE=$(f_release)/build/Release/generators/conan_toolchain.cmake @echo ">>> Done" conan-create: ## Create Conan package @echo ">>> Creating Conan package..." - @conan create . --build=missing -tf "" --profile=release + @conan create . --build=missing -tf "" --profile=release -tf "" @conan create . --build=missing -tf "" --profile=debug @echo ">>> Done" -profile ?= default +profile ?= release remote ?= Cimmeria -conan-upload: ## Upload package to Conan remote (profile=default remote=conancenter) +conan-upload: ## Upload package to Conan remote (profile=release remote=Cimmeria) @echo ">>> Uploading to Conan remote $(remote) with profile $(profile)..." @conan upload bayesnet/$(grep version conanfile.py | cut -d'"' -f2) -r $(remote) --confirm @echo ">>> Done" @@ -247,7 +239,7 @@ conan-clean: ## Clean Conan cache and build folders fname = "tests/data/iris.arff" model = "TANLd" -conan-sample: ## Build sample with Conan +sample: ## Build sample with Conan @echo ">>> Building Sample with Conan..."; @if [ -d ./sample/build ]; then rm -rf ./sample/build; fi @cd sample && conan install . --output-folder=build --build=missing @@ -256,38 +248,6 @@ conan-sample: ## Build sample with Conan sample/build/bayesnet_sample $(fname) $(model) @echo ">>> Done"; -# vcpkg package manager targets -# ============================= - -vcpkg-init: ## Initialize the project installing dependencies using vcpkg - @echo ">>> Installing dependencies with vcpkg" - @vcpkg install - @echo ">>> Done"; - -vcpkg-debug: ## Build a debug version of the project using vcpkg - @echo ">>> Building Debug BayesNet with vcpkg..."; - @if [ -d ./$(f_debug) ]; then rm -rf ./$(f_debug); fi - @mkdir $(f_debug); - @cmake -S . -B $(f_debug) -D CMAKE_BUILD_TYPE=Debug -D ENABLE_TESTING=ON -D CODE_COVERAGE=ON -DCMAKE_TOOLCHAIN_FILE=${VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake - @echo ">>> Done"; - -vcpkg-release: ## Build a Release version of the project using vcpkg - @echo ">>> Building Release BayesNet with vcpkg..."; - @if [ -d ./$(f_release) ]; then rm -rf ./$(f_release); fi - @mkdir $(f_release); - @cmake -S . -B $(f_release) -D CMAKE_BUILD_TYPE=Release -DCMAKE_TOOLCHAIN_FILE=${VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake - @echo ">>> Done"; - -fname = "tests/data/iris.arff" -model = "TANLd" -vcpkg-sample: ## Build sample with vcpkg - @echo ">>> Building Sample with vcpkg..."; - @if [ -d ./sample/build ]; then rm -rf ./sample/build; fi - @cd sample && cmake -B build -S . -D CMAKE_BUILD_TYPE=Release -DUSING_VCPKG=ON -DCMAKE_TOOLCHAIN_FILE=${VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake && \ - cmake --build build -t bayesnet_sample - sample/build/bayesnet_sample $(fname) $(model) - @echo ">>> Done"; - # Help target # =========== diff --git a/README.md b/README.md index 0115ec4..631d6a9 100644 --- a/README.md +++ b/README.md @@ -13,114 +13,114 @@ Bayesian Network Classifiers library -## Setup +## Using the Library -### Using the vcpkg library +### Using Conan Package Manager -You can use the library with the vcpkg library manager. In your project you have to add the following files: +You can use the library with the [Conan](https://conan.io/) package manager. In your project you need to add the following files: -#### vcpkg.json +#### conanfile.txt -```json -{ - "name": "sample-project", - "version-string": "0.1.0", - "dependencies": [ - "bayesnet" - ] -} -``` +```txt +[requires] +bayesnet/1.1.2 -#### vcpkg-configuration.json - -```json -{ - "registries": [ - { - "kind": "git", - "repository": "https://github.com/rmontanana/vcpkg-stash", - "baseline": "393efa4e74e053b6f02c4ab03738c8fe796b28e5", - "packages": [ - "folding", - "bayesnet", - "arff-files", - "fimdlp", - "libtorch-bin" - ] - } - ], - "default-registry": { - "kind": "git", - "repository": "https://github.com/microsoft/vcpkg", - "baseline": "760bfd0c8d7c89ec640aec4df89418b7c2745605" - } -} +[generators] +CMakeDeps +CMakeToolchain ``` #### CMakeLists.txt -You have to include the following lines in your `CMakeLists.txt` file: +Include the following lines in your `CMakeLists.txt` file: ```cmake -find_package(bayesnet CONFIG REQUIRED) +find_package(bayesnet REQUIRED) add_executable(myapp main.cpp) target_link_libraries(myapp PRIVATE bayesnet::bayesnet) ``` -After that, you can use the `vcpkg` command to install the dependencies: +Then install the dependencies and build your project: ```bash -vcpkg install +conan install . --output-folder=build --build=missing +cmake -B build -S . -DCMAKE_BUILD_TYPE=Release -DCMAKE_TOOLCHAIN_FILE=build/conan_toolchain.cmake +cmake --build build ``` **Note: In the `sample` folder you can find a sample application that uses the library. You can use it as a reference to create your own application.** -## Playing with the library +## Building and Testing -The dependencies are managed with [vcpkg](https://vcpkg.io/) and supported by a private vcpkg repository in [https://github.com/rmontanana/vcpkg-stash](https://github.com/rmontanana/vcpkg-stash). +The project uses [Conan](https://conan.io/) for dependency management and provides convenient Makefile targets for common tasks. + +### Prerequisites + +- [Conan](https://conan.io/) package manager (`pip install conan`) +- CMake 3.27+ +- C++17 compatible compiler ### Getting the code ```bash git clone https://github.com/doctorado-ml/bayesnet +cd bayesnet ``` -Once you have the code, you can use the `make` command to build the project. The `Makefile` is used to manage the build process and it will automatically download and install the dependencies. +### Build Commands -### Release +#### Release Build ```bash -make init # Install dependencies -make release # Build the release version -make buildr # compile and link the release version +make release # Configure release build with Conan +make buildr # Build the release version ``` -### Debug & Tests +#### Debug Build & Tests ```bash -make init # Install dependencies -make debug # Build the debug version -make test # Run the tests +make debug # Configure debug build with Conan +make buildd # Build the debug version +make test # Run the tests ``` -### Coverage +#### Coverage Analysis ```bash -make coverage # Run the tests with coverage -make viewcoverage # View the coverage report in the browser +make coverage # Run tests with coverage analysis +make viewcoverage # View coverage report in browser ``` -### Sample app +#### Sample Application -After building and installing the release version, you can run the sample app with the following commands: +Run the sample application with different datasets and models: ```bash -make sample -make sample fname=tests/data/glass.arff +make sample # Run with default settings +make sample fname=tests/data/glass.arff # Use glass dataset +make sample fname=tests/data/iris.arff model=AODE # Use specific model ``` +### Available Makefile Targets + +- `debug` - Configure debug build using Conan +- `release` - Configure release build using Conan +- `buildd` - Build debug targets +- `buildr` - Build release targets +- `test` - Run all tests (use `opt="-s"` for verbose output) +- `coverage` - Generate test coverage report +- `viewcoverage` - Open coverage report in browser +- `sample` - Build and run sample application +- `conan-create` - Create Conan package +- `conan-upload` - Upload package to Conan remote +- `conan-clean` - Clean Conan cache and build folders +- `clean` - Clean all build artifacts +- `doc` - Generate documentation +- `diagrams` - Generate UML diagrams +- `help` - Show all available targets + ## Models #### - TAN diff --git a/conanfile.py b/conanfile.py index dbb2236..9821866 100644 --- a/conanfile.py +++ b/conanfile.py @@ -1,13 +1,10 @@ +import os, re, pathlib from conan import ConanFile from conan.tools.cmake import CMakeToolchain, CMake, cmake_layout, CMakeDeps -from conan.tools.files import copy, save -import os +from conan.tools.files import copy class BayesNetConan(ConanFile): name = "bayesnet" - version = "1.2.0" - - # Binary configuration settings = "os", "compiler", "build_type", "arch" options = { "shared": [True, False], @@ -25,6 +22,21 @@ class BayesNetConan(ConanFile): # Sources are located in the same place as this recipe, copy them to the recipe exports_sources = "CMakeLists.txt", "bayesnet/*", "config/*", "cmake/*", "docs/*", "tests/*", "bayesnetConfig.cmake.in" + def set_version(self) -> None: + cmake = pathlib.Path(self.recipe_folder) / "CMakeLists.txt" + text = cmake.read_text(encoding="utf-8") + + # Accept either: project(foo VERSION 1.2.3) or set(foo_VERSION 1.2.3) + match = re.search( + r"""project\s*\([^\)]*VERSION\s+([0-9]+\.[0-9]+\.[0-9]+)""", + text, re.IGNORECASE | re.VERBOSE + ) + if match: + self.version = match.group(1) + else: + raise Exception("Version not found in CMakeLists.txt") + self.version = match.group(1) + def config_options(self): if self.settings.os == "Windows": del self.options.fPIC diff --git a/sample/CMakeLists.txt b/sample/CMakeLists.txt index d19b6e7..4bf858a 100644 --- a/sample/CMakeLists.txt +++ b/sample/CMakeLists.txt @@ -11,25 +11,6 @@ find_package(arff-files CONFIG REQUIRED) find_package(nlohmann_json REQUIRED) find_package(bayesnet CONFIG REQUIRED) -# option(USING_VCPKG "Use vcpkg config for BayesNet" OFF) -# option(USING_CONAN "Use Conan config for BayesNet" OFF) - -# if (USING_VCPKG OR USING_CONAN) -# message(STATUS "Using BayesNet vcpkg config") -# find_package(bayesnet CONFIG REQUIRED) -# set(BayesNet_LIBRARIES bayesnet::bayesnet) -# else(USING_VCPKG) -# message(STATUS "Using BayesNet local library config") -# find_library(bayesnet NAMES libbayesnet bayesnet libbayesnet.a PATHS ${Platform_SOURCE_DIR}/../lib/lib REQUIRED) -# find_path(Bayesnet_INCLUDE_DIRS REQUIRED NAMES bayesnet PATHS ${Platform_SOURCE_DIR}/../lib/include) -# add_library(bayesnet::bayesnet UNKNOWN IMPORTED) -# set_target_properties(bayesnet::bayesnet PROPERTIES -# IMPORTED_LOCATION ${bayesnet} -# INTERFACE_INCLUDE_DIRECTORIES ${Bayesnet_INCLUDE_DIRS} -# ) -# endif(USING_VCPKG) -# message(STATUS "BayesNet: ${bayesnet}") - add_executable(bayesnet_sample sample.cc) target_link_libraries(bayesnet_sample PRIVATE fimdlp::fimdlp diff --git a/test_package/CMakeLists.txt b/test_package/CMakeLists.txt deleted file mode 100644 index 242e7df..0000000 --- a/test_package/CMakeLists.txt +++ /dev/null @@ -1,9 +0,0 @@ -cmake_minimum_required(VERSION 3.27) -project(test_bayesnet) - -set(CMAKE_CXX_STANDARD 17) - -find_package(bayesnet REQUIRED) - -add_executable(test_bayesnet test_bayesnet.cpp) -target_link_libraries(test_bayesnet bayesnet::bayesnet) \ No newline at end of file diff --git a/test_package/build/gcc-14-x86_64-gnu17-release/generators/conanbuild.sh b/test_package/build/gcc-14-x86_64-gnu17-release/generators/conanbuild.sh deleted file mode 100644 index 11b22e2..0000000 --- a/test_package/build/gcc-14-x86_64-gnu17-release/generators/conanbuild.sh +++ /dev/null @@ -1 +0,0 @@ -. "/home/rmontanana/Code/BayesNet/test_package/build/gcc-14-x86_64-gnu17-release/generators/conanbuildenv-release-x86_64.sh" \ No newline at end of file diff --git a/test_package/build/gcc-14-x86_64-gnu17-release/generators/conanbuildenv-release-x86_64.sh b/test_package/build/gcc-14-x86_64-gnu17-release/generators/conanbuildenv-release-x86_64.sh deleted file mode 100644 index 7a52af9..0000000 --- a/test_package/build/gcc-14-x86_64-gnu17-release/generators/conanbuildenv-release-x86_64.sh +++ /dev/null @@ -1,16 +0,0 @@ -script_folder="/home/rmontanana/Code/BayesNet/test_package/build/gcc-14-x86_64-gnu17-release/generators" -echo "echo Restoring environment" > "$script_folder/deactivate_conanbuildenv-release-x86_64.sh" -for v in PATH -do - is_defined="true" - value=$(printenv $v) || is_defined="" || true - if [ -n "$value" ] || [ -n "$is_defined" ] - then - echo export "$v='$value'" >> "$script_folder/deactivate_conanbuildenv-release-x86_64.sh" - else - echo unset $v >> "$script_folder/deactivate_conanbuildenv-release-x86_64.sh" - fi -done - - -export PATH="/home/rmontanana/.conan2/p/cmakeab16c849c207b/p/bin:$PATH" \ No newline at end of file diff --git a/test_package/build/gcc-14-x86_64-gnu17-release/generators/conanrun.sh b/test_package/build/gcc-14-x86_64-gnu17-release/generators/conanrun.sh deleted file mode 100644 index ef2fa60..0000000 --- a/test_package/build/gcc-14-x86_64-gnu17-release/generators/conanrun.sh +++ /dev/null @@ -1 +0,0 @@ -. "/home/rmontanana/Code/BayesNet/test_package/build/gcc-14-x86_64-gnu17-release/generators/conanrunenv-release-x86_64.sh" \ No newline at end of file diff --git a/test_package/build/gcc-14-x86_64-gnu17-release/generators/conanrunenv-release-x86_64.sh b/test_package/build/gcc-14-x86_64-gnu17-release/generators/conanrunenv-release-x86_64.sh deleted file mode 100644 index 746a4be..0000000 --- a/test_package/build/gcc-14-x86_64-gnu17-release/generators/conanrunenv-release-x86_64.sh +++ /dev/null @@ -1,17 +0,0 @@ -script_folder="/home/rmontanana/Code/BayesNet/test_package/build/gcc-14-x86_64-gnu17-release/generators" -echo "echo Restoring environment" > "$script_folder/deactivate_conanrunenv-release-x86_64.sh" -for v in LD_LIBRARY_PATH DYLD_LIBRARY_PATH -do - is_defined="true" - value=$(printenv $v) || is_defined="" || true - if [ -n "$value" ] || [ -n "$is_defined" ] - then - echo export "$v='$value'" >> "$script_folder/deactivate_conanrunenv-release-x86_64.sh" - else - echo unset $v >> "$script_folder/deactivate_conanrunenv-release-x86_64.sh" - fi -done - - -export LD_LIBRARY_PATH="/home/rmontanana/.conan2/p/libto33fc3f5110c64/p/lib:$LD_LIBRARY_PATH" -export DYLD_LIBRARY_PATH="/home/rmontanana/.conan2/p/libto33fc3f5110c64/p/lib:$DYLD_LIBRARY_PATH" \ No newline at end of file diff --git a/test_package/build/gcc-14-x86_64-gnu17-release/generators/deactivate_conanbuild.sh b/test_package/build/gcc-14-x86_64-gnu17-release/generators/deactivate_conanbuild.sh deleted file mode 100644 index 56f8845..0000000 --- a/test_package/build/gcc-14-x86_64-gnu17-release/generators/deactivate_conanbuild.sh +++ /dev/null @@ -1 +0,0 @@ -. "/home/rmontanana/Code/BayesNet/test_package/build/gcc-14-x86_64-gnu17-release/generators/deactivate_conanbuildenv-release-x86_64.sh" \ No newline at end of file diff --git a/test_package/build/gcc-14-x86_64-gnu17-release/generators/deactivate_conanrun.sh b/test_package/build/gcc-14-x86_64-gnu17-release/generators/deactivate_conanrun.sh deleted file mode 100644 index c2dc2d7..0000000 --- a/test_package/build/gcc-14-x86_64-gnu17-release/generators/deactivate_conanrun.sh +++ /dev/null @@ -1 +0,0 @@ -. "/home/rmontanana/Code/BayesNet/test_package/build/gcc-14-x86_64-gnu17-release/generators/deactivate_conanrunenv-release-x86_64.sh" \ No newline at end of file diff --git a/test_package/conanfile.py b/test_package/conanfile.py deleted file mode 100644 index 916ccd4..0000000 --- a/test_package/conanfile.py +++ /dev/null @@ -1,26 +0,0 @@ -from conan import ConanFile -from conan.tools.cmake import CMake, cmake_layout -from conan.tools.build import can_run -import os - -class BayesNetTestConan(ConanFile): - settings = "os", "compiler", "build_type", "arch" - - def requirements(self): - self.requires(self.tested_reference_str) - - def build_requirements(self): - self.build_requires("cmake/[>=3.27]") - - def layout(self): - cmake_layout(self) - - def build(self): - cmake = CMake(self) - cmake.configure() - cmake.build() - - def test(self): - if can_run(self): - cmd = os.path.join(self.cpp.build.bindirs[0], "test_bayesnet") - self.run(cmd, env="conanrun") \ No newline at end of file diff --git a/test_package/test_bayesnet.cpp b/test_package/test_bayesnet.cpp deleted file mode 100644 index b7e9585..0000000 --- a/test_package/test_bayesnet.cpp +++ /dev/null @@ -1,26 +0,0 @@ -#include -#include -#include -#include - -int main() { - std::cout << "Testing BayesNet library integration..." << std::endl; - - try { - // Test basic instantiation - bayesnet::Network network; - std::cout << "✓ Network class instantiated successfully" << std::endl; - - // Test TAN classifier instantiation - bayesnet::TAN tan; - std::cout << "✓ TAN classifier instantiated successfully" << std::endl; - - std::cout << "✓ All basic tests passed!" << std::endl; - std::cout << "BayesNet library is working correctly." << std::endl; - - return 0; - } catch (const std::exception& e) { - std::cerr << "✗ Test failed: " << e.what() << std::endl; - return 1; - } -} \ No newline at end of file diff --git a/tests/TestBayesModels.cc b/tests/TestBayesModels.cc index cdf3f25..f22eabc 100644 --- a/tests/TestBayesModels.cc +++ b/tests/TestBayesModels.cc @@ -20,7 +20,7 @@ #include "bayesnet/ensembles/AODELd.h" #include "bayesnet/ensembles/BoostAODE.h" -const std::string ACTUAL_VERSION = "1.1.2"; +const std::string ACTUAL_VERSION = "1.2.0"; TEST_CASE("Test Bayesian Classifiers score & version", "[Models]") { diff --git a/vcpkg-configuration.json b/vcpkg-configuration.json deleted file mode 100644 index 99ad7d9..0000000 --- a/vcpkg-configuration.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "default-registry": { - "kind": "git", - "baseline": "760bfd0c8d7c89ec640aec4df89418b7c2745605", - "repository": "https://github.com/microsoft/vcpkg" - }, - "registries": [ - { - "kind": "git", - "repository": "https://github.com/rmontanana/vcpkg-stash", - "baseline": "1ea69243c0e8b0de77c9d1dd6e1d7593ae7f3627", - "packages": [ - "arff-files", - "fimdlp", - "libtorch-bin", - "bayesnet", - "folding" - ] - } - ] -} \ No newline at end of file diff --git a/vcpkg.json b/vcpkg.json deleted file mode 100644 index ec3f709..0000000 --- a/vcpkg.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "name": "bayesnet", - "version": "1.0.7", - "description": "Bayesian Network C++ Library", - "license": "MIT", - "dependencies": [ - "arff-files", - "folding", - "fimdlp", - "libtorch-bin", - "nlohmann-json", - "catch2" - ], - "overrides": [ - { - "name": "arff-files", - "version": "1.1.0" - }, - { - "name": "fimdlp", - "version": "2.0.1" - }, - { - "name": "libtorch-bin", - "version": "2.7.0" - }, - { - "name": "folding", - "version": "1.1.1" - }, - { - "name": "nlohmann-json", - "version": "3.11.3" - }, - { - "name": "catch2", - "version": "3.8.1" - } - ] -} From b1e25a7d05923cfbc88367a9c708cb3dc3ff4a7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Monta=C3=B1ana=20G=C3=B3mez?= Date: Tue, 1 Jul 2025 14:13:45 +0200 Subject: [PATCH 8/9] Update Coverage Makefile --- CMakeUserPresets.json | 12 ------------ Makefile | 1 + README.md | 2 +- 3 files changed, 2 insertions(+), 13 deletions(-) delete mode 100644 CMakeUserPresets.json diff --git a/CMakeUserPresets.json b/CMakeUserPresets.json deleted file mode 100644 index c461df0..0000000 --- a/CMakeUserPresets.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "version": 4, - "vendor": { - "conan": {} - }, - "include": [ - "build/Release/generators/CMakePresets.json", - "build_Debug/build/Debug/generators/CMakePresets.json", - "build_Debug/build/Release/generators/CMakePresets.json", - "build_Release/build/Release/generators/CMakePresets.json" - ] -} \ No newline at end of file diff --git a/Makefile b/Makefile index 3da1d2e..72d140a 100644 --- a/Makefile +++ b/Makefile @@ -116,6 +116,7 @@ coverage: ## Run tests and generate coverage report (build/index.html) $(lcov) --remove coverage.info 'tests/*' --output-file coverage.info >/dev/null 2>&1; \ $(lcov) --remove coverage.info 'bayesnet/utils/loguru.*' --ignore-errors unused --output-file coverage.info >/dev/null 2>&1; \ $(lcov) --remove coverage.info '/opt/miniconda/*' --ignore-errors unused --output-file coverage.info >/dev/null 2>&1; \ + $(lcov) --remove coverage.info '*/.conan2/*' --ignore-errors unused --output-file coverage.info >/dev/null 2>&1; \ $(lcov) --summary coverage.info @$(MAKE) updatebadge @echo ">>> Done"; diff --git a/README.md b/README.md index 631d6a9..2ca0195 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ [![Reliability Rating](https://sonarcloud.io/api/project_badges/measure?project=rmontanana_BayesNet&metric=reliability_rating)](https://sonarcloud.io/summary/new_code?id=rmontanana_BayesNet) [![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/Doctorado-ML/BayesNet) ![Gitea Last Commit](https://img.shields.io/gitea/last-commit/rmontanana/bayesnet?gitea_url=https://gitea.rmontanana.es&logo=gitea) -[![Coverage Badge](https://img.shields.io/badge/Coverage-99,2%25-green)](https://gitea.rmontanana.es/rmontanana/BayesNet) +[![Coverage Badge](https://img.shields.io/badge/Coverage-98,0%25-green)](https://gitea.rmontanana.es/rmontanana/BayesNet) [![DOI](https://zenodo.org/badge/667782806.svg)](https://doi.org/10.5281/zenodo.14210344) Bayesian Network Classifiers library From 8ccc7e263ce42a79fcf4b39ad99fce281beaf25d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Monta=C3=B1ana=20G=C3=B3mez?= Date: Tue, 1 Jul 2025 14:14:38 +0200 Subject: [PATCH 9/9] Update .gitignore --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 2da8b45..f3d9489 100644 --- a/.gitignore +++ b/.gitignore @@ -45,4 +45,5 @@ docs/man3 docs/man docs/Doxyfile .cache -vcpkg_installed \ No newline at end of file +vcpkg_installed +CMakeUserPresets.json