Compare commits
10 Commits
676637fb1b
...
3b170324f4
Author | SHA1 | Date | |
---|---|---|---|
3b170324f4 | |||
8ccc7e263c
|
|||
b1e25a7d05
|
|||
3cb454d4aa
|
|||
3178bcbda9
|
|||
32d231cdaf
|
|||
526d036d75
|
|||
7a9d4178d9
|
|||
3e94d400e2 | |||
31fa9cd498
|
1
.gitignore
vendored
1
.gitignore
vendored
@@ -46,3 +46,4 @@ docs/man
|
|||||||
docs/Doxyfile
|
docs/Doxyfile
|
||||||
.cache
|
.cache
|
||||||
vcpkg_installed
|
vcpkg_installed
|
||||||
|
CMakeUserPresets.json
|
||||||
|
@@ -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.
|
- *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_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.
|
- *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
|
## [1.1.1] - 2025-05-20
|
||||||
|
|
||||||
|
80
CLAUDE.md
80
CLAUDE.md
@@ -9,11 +9,22 @@ BayesNet is a C++ library implementing Bayesian Network Classifiers. It provides
|
|||||||
## Build System & Dependencies
|
## Build System & Dependencies
|
||||||
|
|
||||||
### Dependency Management
|
### 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
|
- Core dependencies: libtorch, nlohmann-json, folding, fimdlp, arff-files, catch2
|
||||||
- All dependencies defined in `vcpkg.json` with version overrides
|
- 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
|
### Build Commands
|
||||||
|
|
||||||
|
#### Using vcpkg (Default)
|
||||||
```bash
|
```bash
|
||||||
# Initialize dependencies
|
# Initialize dependencies
|
||||||
make init
|
make init
|
||||||
@@ -37,11 +48,38 @@ make viewcoverage
|
|||||||
make clean
|
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
|
### CMake Configuration
|
||||||
- Uses CMake 3.27+ with C++17 standard
|
- Uses CMake 3.27+ with C++17 standard
|
||||||
- Debug builds automatically enable testing and coverage
|
- Debug builds automatically enable testing and coverage
|
||||||
- Release builds optimize with `-Ofast`
|
- 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
|
## Testing Framework
|
||||||
|
|
||||||
@@ -94,9 +132,45 @@ Sample code in `sample/` directory demonstrates library usage:
|
|||||||
make sample fname=tests/data/iris.arff model=TANLd
|
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
|
## Common Development Tasks
|
||||||
|
|
||||||
- **Add new classifier**: Extend BaseClassifier, implement in appropriate subdirectory
|
- **Add new classifier**: Extend BaseClassifier, implement in appropriate subdirectory
|
||||||
- **Add new test**: Update `tests/CMakeLists.txt` and create test in `tests/`
|
- **Add new test**: Update `tests/CMakeLists.txt` and create test in `tests/`
|
||||||
- **Modify build**: Edit main `CMakeLists.txt` or use Makefile targets
|
- **Modify build**: Edit main `CMakeLists.txt` or use Makefile targets
|
||||||
- **Update dependencies**: Modify `vcpkg.json` and run `make init`
|
- **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
|
@@ -1,7 +1,7 @@
|
|||||||
cmake_minimum_required(VERSION 3.27)
|
cmake_minimum_required(VERSION 3.27)
|
||||||
|
|
||||||
project(bayesnet
|
project(bayesnet
|
||||||
VERSION 1.1.2
|
VERSION 1.2.0
|
||||||
DESCRIPTION "Bayesian Network and basic classifiers Library."
|
DESCRIPTION "Bayesian Network and basic classifiers Library."
|
||||||
HOMEPAGE_URL "https://github.com/rmontanana/bayesnet"
|
HOMEPAGE_URL "https://github.com/rmontanana/bayesnet"
|
||||||
LANGUAGES CXX
|
LANGUAGES CXX
|
||||||
@@ -10,11 +10,6 @@ project(bayesnet
|
|||||||
set(CMAKE_CXX_STANDARD 17)
|
set(CMAKE_CXX_STANDARD 17)
|
||||||
cmake_policy(SET CMP0135 NEW)
|
cmake_policy(SET CMP0135 NEW)
|
||||||
|
|
||||||
find_package(Torch CONFIG REQUIRED)
|
|
||||||
find_package(fimdlp CONFIG REQUIRED)
|
|
||||||
find_package(nlohmann_json CONFIG REQUIRED)
|
|
||||||
find_package(folding CONFIG REQUIRED)
|
|
||||||
|
|
||||||
# Global CMake variables
|
# Global CMake variables
|
||||||
# ----------------------
|
# ----------------------
|
||||||
set(CMAKE_CXX_STANDARD 17)
|
set(CMAKE_CXX_STANDARD 17)
|
||||||
@@ -31,17 +26,25 @@ endif()
|
|||||||
|
|
||||||
# Options
|
# Options
|
||||||
# -------
|
# -------
|
||||||
option(ENABLE_CLANG_TIDY "Enable to add clang tidy" OFF)
|
|
||||||
option(ENABLE_TESTING "Unit testing build" OFF)
|
option(ENABLE_TESTING "Unit testing build" OFF)
|
||||||
option(CODE_COVERAGE "Collect coverage from test library" OFF)
|
option(CODE_COVERAGE "Collect coverage from test library" OFF)
|
||||||
option(INSTALL_GTEST "Enable installation of googletest" OFF)
|
|
||||||
|
|
||||||
|
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)
|
add_subdirectory(config)
|
||||||
|
|
||||||
if (ENABLE_CLANG_TIDY)
|
|
||||||
include(StaticAnalyzers) # clang-tidy
|
|
||||||
endif (ENABLE_CLANG_TIDY)
|
|
||||||
|
|
||||||
# Add the library
|
# Add the library
|
||||||
# ---------------
|
# ---------------
|
||||||
include_directories(
|
include_directories(
|
||||||
@@ -52,7 +55,14 @@ include_directories(
|
|||||||
file(GLOB_RECURSE Sources "bayesnet/*.cc")
|
file(GLOB_RECURSE Sources "bayesnet/*.cc")
|
||||||
|
|
||||||
add_library(bayesnet ${Sources})
|
add_library(bayesnet ${Sources})
|
||||||
target_link_libraries(bayesnet fimdlp::fimdlp folding::folding "${TORCH_LIBRARIES}")
|
|
||||||
|
target_link_libraries(bayesnet
|
||||||
|
nlohmann_json::nlohmann_json
|
||||||
|
folding::folding
|
||||||
|
fimdlp::fimdlp
|
||||||
|
torch::torch
|
||||||
|
arff-files::arff-files
|
||||||
|
)
|
||||||
|
|
||||||
# Testing
|
# Testing
|
||||||
# -------
|
# -------
|
||||||
|
87
CONAN_README.md
Normal file
87
CONAN_README.md
Normal file
@@ -0,0 +1,87 @@
|
|||||||
|
# Using BayesNet with Conan
|
||||||
|
|
||||||
|
This document explains how to use Conan as an alternative package manager for BayesNet.
|
||||||
|
|
||||||
|
## Prerequisites
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pip install conan
|
||||||
|
conan remote add Cimmeria https://conan.rmontanana.es/artifactory/api/conan/Cimmeria
|
||||||
|
conan profile new default --detect
|
||||||
|
```
|
||||||
|
|
||||||
|
## Quick Start
|
||||||
|
|
||||||
|
### As a Consumer
|
||||||
|
|
||||||
|
1. Create a `conanfile.txt` in your project:
|
||||||
|
|
||||||
|
```ini
|
||||||
|
[requires]
|
||||||
|
libtorch/2.7.0
|
||||||
|
bayesnet/1.2.0
|
||||||
|
|
||||||
|
[generators]
|
||||||
|
CMakeDeps
|
||||||
|
CMakeToolchain
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
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 debug
|
||||||
|
make buildd
|
||||||
|
|
||||||
|
# Build release version
|
||||||
|
make 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.2.0 -r myremote
|
||||||
|
```
|
174
Makefile
174
Makefile
@@ -1,6 +1,6 @@
|
|||||||
SHELL := /bin/bash
|
SHELL := /bin/bash
|
||||||
.DEFAULT_GOAL := help
|
.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 updatebadge doc doc-install init clean-test conan-debug conan-release conan-create conan-upload conan-clean conan-sample
|
||||||
|
|
||||||
f_release = build_Release
|
f_release = build_Release
|
||||||
f_debug = build_Debug
|
f_debug = build_Debug
|
||||||
@@ -31,7 +31,6 @@ define ClearTests
|
|||||||
fi ;
|
fi ;
|
||||||
endef
|
endef
|
||||||
|
|
||||||
|
|
||||||
setup: ## Install dependencies for tests and coverage
|
setup: ## Install dependencies for tests and coverage
|
||||||
@if [ "$(shell uname)" = "Darwin" ]; then \
|
@if [ "$(shell uname)" = "Darwin" ]; then \
|
||||||
brew install gcovr; \
|
brew install gcovr; \
|
||||||
@@ -43,30 +42,30 @@ setup: ## Install dependencies for tests and coverage
|
|||||||
fi
|
fi
|
||||||
@echo "* You should install plantuml & graphviz for the diagrams"
|
@echo "* You should install plantuml & graphviz for the diagrams"
|
||||||
|
|
||||||
diagrams: ## Create an UML class diagram & dependency of the project (diagrams/BayesNet.png)
|
clean: ## Clean the project
|
||||||
@which $(plantuml) || (echo ">>> Please install plantuml"; exit 1)
|
@echo ">>> Cleaning the project..."
|
||||||
@which $(dot) || (echo ">>> Please install graphviz"; exit 1)
|
@if test -f CMakeCache.txt ; then echo "- Deleting CMakeCache.txt"; rm -f CMakeCache.txt; fimake
|
||||||
@which $(clang-uml) || (echo ">>> Please install clang-uml"; exit 1)
|
@for folder in $(f_release) $(f_debug) vpcpkg_installed install_test ; do \
|
||||||
@export PLANTUML_LIMIT_SIZE=16384
|
if test -d "$$folder" ; then \
|
||||||
@echo ">>> Creating UML class diagram of the project...";
|
echo "- Deleting $$folder folder" ; \
|
||||||
@$(clang-uml) -p
|
rm -rf "$$folder"; \
|
||||||
@cd $(f_diagrams); \
|
fi; \
|
||||||
$(plantuml) -tsvg BayesNet.puml
|
done
|
||||||
@echo ">>> Creating dependency graph diagram of the project...";
|
@$(MAKE) clean-test
|
||||||
$(MAKE) debug
|
@echo ">>> Done";
|
||||||
cd $(f_debug) && cmake .. --graphviz=dependency.dot
|
|
||||||
@$(dot) -Tsvg $(f_debug)/dependency.dot.BayesNet -o $(f_diagrams)/dependency.svg
|
# Build targets
|
||||||
|
# =============
|
||||||
|
|
||||||
buildd: ## Build the debug targets
|
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
|
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)
|
||||||
|
|
||||||
clean-test: ## Clean the tests info
|
|
||||||
@echo ">>> Cleaning Debug BayesNet tests...";
|
# Install targets
|
||||||
$(call ClearTests)
|
# ===============
|
||||||
@echo ">>> Done";
|
|
||||||
|
|
||||||
uninstall: ## Uninstall library
|
uninstall: ## Uninstall library
|
||||||
@echo ">>> Uninstalling BayesNet...";
|
@echo ">>> Uninstalling BayesNet...";
|
||||||
@@ -79,53 +78,13 @@ install: ## Install library
|
|||||||
@cmake --install $(f_release) --prefix $(prefix)
|
@cmake --install $(f_release) --prefix $(prefix)
|
||||||
@echo ">>> Done";
|
@echo ">>> Done";
|
||||||
|
|
||||||
init: ## Initialize the project installing dependencies
|
|
||||||
@echo ">>> Installing dependencies"
|
|
||||||
@vcpkg install
|
|
||||||
@echo ">>> Done";
|
|
||||||
|
|
||||||
clean: ## Clean the project
|
# Test targets
|
||||||
@echo ">>> Cleaning the project..."
|
# ============
|
||||||
@if test -f CMakeCache.txt ; then echo "- Deleting CMakeCache.txt"; rm -f CMakeCache.txt; fi
|
|
||||||
@for folder in $(f_release) $(f_debug) vpcpkg_installed install_test ; do \
|
|
||||||
if test -d "$$folder" ; then \
|
|
||||||
echo "- Deleting $$folder folder" ; \
|
|
||||||
rm -rf "$$folder"; \
|
|
||||||
fi; \
|
|
||||||
done
|
|
||||||
@$(MAKE) clean-test
|
|
||||||
@echo ">>> Done";
|
|
||||||
|
|
||||||
debug: ## Build a debug version of the project
|
clean-test: ## Clean the tests info
|
||||||
@echo ">>> Building Debug BayesNet...";
|
@echo ">>> Cleaning Debug BayesNet tests...";
|
||||||
@if [ -d ./$(f_debug) ]; then rm -rf ./$(f_debug); fi
|
$(call ClearTests)
|
||||||
@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";
|
|
||||||
|
|
||||||
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
|
|
||||||
@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";
|
@echo ">>> Done";
|
||||||
|
|
||||||
opt = ""
|
opt = ""
|
||||||
@@ -157,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 '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 '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 '/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
|
$(lcov) --summary coverage.info
|
||||||
@$(MAKE) updatebadge
|
@$(MAKE) updatebadge
|
||||||
@echo ">>> Done";
|
@echo ">>> Done";
|
||||||
@@ -182,6 +142,9 @@ updatebadge: ## Update the coverage badge in README.md
|
|||||||
@env python update_coverage.py $(f_debug)/tests
|
@env python update_coverage.py $(f_debug)/tests
|
||||||
@echo ">>> Done";
|
@echo ">>> Done";
|
||||||
|
|
||||||
|
# Documentation targets
|
||||||
|
# =====================
|
||||||
|
|
||||||
doc: ## Generate documentation
|
doc: ## Generate documentation
|
||||||
@echo ">>> Generating documentation..."
|
@echo ">>> Generating documentation..."
|
||||||
@cmake --build $(f_release) -t doxygen
|
@cmake --build $(f_release) -t doxygen
|
||||||
@@ -196,6 +159,20 @@ doc: ## Generate documentation
|
|||||||
fi
|
fi
|
||||||
@echo ">>> Done";
|
@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 = ""
|
docdir = ""
|
||||||
doc-install: ## Install documentation
|
doc-install: ## Install documentation
|
||||||
@echo ">>> Installing documentation..."
|
@echo ">>> Installing documentation..."
|
||||||
@@ -210,6 +187,71 @@ doc-install: ## Install documentation
|
|||||||
@sudo cp -rp $(mansrcdir) $(mandestdir)
|
@sudo cp -rp $(mansrcdir) $(mandestdir)
|
||||||
@echo ">>> Done";
|
@echo ">>> Done";
|
||||||
|
|
||||||
|
# Conan package manager targets
|
||||||
|
# =============================
|
||||||
|
|
||||||
|
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 \
|
||||||
|
-DCMAKE_TOOLCHAIN_FILE=$(f_debug)/build/Debug/generators/conan_toolchain.cmake
|
||||||
|
@echo ">>> Done"
|
||||||
|
|
||||||
|
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 -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 -tf ""
|
||||||
|
@conan create . --build=missing -tf "" --profile=debug
|
||||||
|
@echo ">>> Done"
|
||||||
|
|
||||||
|
profile ?= release
|
||||||
|
remote ?= Cimmeria
|
||||||
|
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"
|
||||||
|
|
||||||
|
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"
|
||||||
|
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";
|
||||||
|
|
||||||
|
# Help target
|
||||||
|
# ===========
|
||||||
|
|
||||||
help: ## Show help message
|
help: ## Show help message
|
||||||
@IFS=$$'\n' ; \
|
@IFS=$$'\n' ; \
|
||||||
help_lines=(`fgrep -h "##" $(MAKEFILE_LIST) | fgrep -v fgrep | sed -e 's/\\$$//' | sed -e 's/##/:/'`); \
|
help_lines=(`fgrep -h "##" $(MAKEFILE_LIST) | fgrep -v fgrep | sed -e 's/\\$$//' | sed -e 's/##/:/'`); \
|
||||||
|
118
README.md
118
README.md
@@ -8,119 +8,119 @@
|
|||||||
[](https://sonarcloud.io/summary/new_code?id=rmontanana_BayesNet)
|
[](https://sonarcloud.io/summary/new_code?id=rmontanana_BayesNet)
|
||||||
[](https://deepwiki.com/Doctorado-ML/BayesNet)
|
[](https://deepwiki.com/Doctorado-ML/BayesNet)
|
||||||

|

|
||||||
[](https://gitea.rmontanana.es/rmontanana/BayesNet)
|
[](https://gitea.rmontanana.es/rmontanana/BayesNet)
|
||||||
[](https://doi.org/10.5281/zenodo.14210344)
|
[](https://doi.org/10.5281/zenodo.14210344)
|
||||||
|
|
||||||
Bayesian Network Classifiers library
|
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
|
```txt
|
||||||
{
|
[requires]
|
||||||
"name": "sample-project",
|
bayesnet/1.1.2
|
||||||
"version-string": "0.1.0",
|
|
||||||
"dependencies": [
|
|
||||||
"bayesnet"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
#### vcpkg-configuration.json
|
[generators]
|
||||||
|
CMakeDeps
|
||||||
```json
|
CMakeToolchain
|
||||||
{
|
|
||||||
"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"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
```
|
||||||
|
|
||||||
#### CMakeLists.txt
|
#### CMakeLists.txt
|
||||||
|
|
||||||
You have to include the following lines in your `CMakeLists.txt` file:
|
Include the following lines in your `CMakeLists.txt` file:
|
||||||
|
|
||||||
```cmake
|
```cmake
|
||||||
find_package(bayesnet CONFIG REQUIRED)
|
find_package(bayesnet REQUIRED)
|
||||||
|
|
||||||
add_executable(myapp main.cpp)
|
add_executable(myapp main.cpp)
|
||||||
|
|
||||||
target_link_libraries(myapp PRIVATE bayesnet::bayesnet)
|
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
|
```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.**
|
**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
|
### Getting the code
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
git clone https://github.com/doctorado-ml/bayesnet
|
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
|
```bash
|
||||||
make init # Install dependencies
|
make release # Configure release build with Conan
|
||||||
make release # Build the release version
|
make buildr # Build the release version
|
||||||
make buildr # compile and link the release version
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### Debug & Tests
|
#### Debug Build & Tests
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
make init # Install dependencies
|
make debug # Configure debug build with Conan
|
||||||
make debug # Build the debug version
|
make buildd # Build the debug version
|
||||||
make test # Run the tests
|
make test # Run the tests
|
||||||
```
|
```
|
||||||
|
|
||||||
### Coverage
|
#### Coverage Analysis
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
make coverage # Run the tests with coverage
|
make coverage # Run tests with coverage analysis
|
||||||
make viewcoverage # View the coverage report in the browser
|
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
|
```bash
|
||||||
make sample
|
make sample # Run with default settings
|
||||||
make sample fname=tests/data/glass.arff
|
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
|
## Models
|
||||||
|
|
||||||
#### - TAN
|
#### - TAN
|
||||||
|
@@ -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}")
|
|
@@ -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)
|
|
@@ -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 <filename> for --xml <filename> and --html <filename> 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()
|
|
@@ -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)
|
|
10
conandata.yml
Normal file
10
conandata.yml
Normal file
@@ -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
|
93
conanfile.py
Normal file
93
conanfile.py
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
import os, re, pathlib
|
||||||
|
from conan import ConanFile
|
||||||
|
from conan.tools.cmake import CMakeToolchain, CMake, cmake_layout, CMakeDeps
|
||||||
|
from conan.tools.files import copy
|
||||||
|
|
||||||
|
class BayesNetConan(ConanFile):
|
||||||
|
name = "bayesnet"
|
||||||
|
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/*", "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
|
||||||
|
|
||||||
|
def configure(self):
|
||||||
|
if self.options.shared:
|
||||||
|
self.options.rm_safe("fPIC")
|
||||||
|
|
||||||
|
def requirements(self):
|
||||||
|
# Core dependencies
|
||||||
|
self.requires("libtorch/2.7.0")
|
||||||
|
self.requires("nlohmann_json/3.11.3")
|
||||||
|
self.requires("folding/1.1.1") # Custom package
|
||||||
|
self.requires("fimdlp/2.1.0") # Custom package
|
||||||
|
|
||||||
|
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)
|
||||||
|
|
||||||
|
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"]
|
@@ -3,10 +3,6 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
#include <string_view>
|
#include <string_view>
|
||||||
|
|
||||||
#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_name = "@PROJECT_NAME@";
|
||||||
static constexpr std::string_view project_version = "@PROJECT_VERSION@";
|
static constexpr std::string_view project_version = "@PROJECT_VERSION@";
|
||||||
static constexpr std::string_view project_description = "@PROJECT_DESCRIPTION@";
|
static constexpr std::string_view project_description = "@PROJECT_DESCRIPTION@";
|
||||||
|
@@ -4,37 +4,19 @@ project(bayesnet_sample VERSION 0.1.0 LANGUAGES CXX)
|
|||||||
|
|
||||||
set(CMAKE_CXX_STANDARD 17)
|
set(CMAKE_CXX_STANDARD 17)
|
||||||
|
|
||||||
set(CMAKE_BUILD_TYPE Release)
|
|
||||||
|
|
||||||
find_package(Torch CONFIG REQUIRED)
|
find_package(Torch CONFIG REQUIRED)
|
||||||
find_package(fimdlp CONFIG REQUIRED)
|
find_package(fimdlp CONFIG REQUIRED)
|
||||||
find_package(folding CONFIG REQUIRED)
|
find_package(folding CONFIG REQUIRED)
|
||||||
find_package(arff-files 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)
|
|
||||||
|
|
||||||
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}")
|
|
||||||
|
|
||||||
add_executable(bayesnet_sample sample.cc)
|
add_executable(bayesnet_sample sample.cc)
|
||||||
target_link_libraries(bayesnet_sample PRIVATE
|
target_link_libraries(bayesnet_sample PRIVATE
|
||||||
fimdlp::fimdlp
|
fimdlp::fimdlp
|
||||||
arff-files::arff-files
|
arff-files::arff-files
|
||||||
"${TORCH_LIBRARIES}"
|
torch::torch
|
||||||
bayesnet::bayesnet
|
bayesnet::bayesnet
|
||||||
folding::folding
|
folding::folding
|
||||||
|
nlohmann_json::nlohmann_json
|
||||||
)
|
)
|
||||||
|
9
sample/CMakeUserPresets.json
Normal file
9
sample/CMakeUserPresets.json
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"version": 4,
|
||||||
|
"vendor": {
|
||||||
|
"conan": {}
|
||||||
|
},
|
||||||
|
"include": [
|
||||||
|
"build/CMakePresets.json"
|
||||||
|
]
|
||||||
|
}
|
14
sample/conanfile.txt
Normal file
14
sample/conanfile.txt
Normal file
@@ -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
|
@@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <ArffFiles/ArffFiles.hpp>
|
#include <ArffFiles.hpp>
|
||||||
#include <fimdlp/CPPFImdlp.h>
|
#include <fimdlp/CPPFImdlp.h>
|
||||||
#include <bayesnet/classifiers/TANLd.h>
|
#include <bayesnet/classifiers/TANLd.h>
|
||||||
#include <bayesnet/classifiers/KDBLd.h>
|
#include <bayesnet/classifiers/KDBLd.h>
|
||||||
|
@@ -2,12 +2,13 @@ if(ENABLE_TESTING)
|
|||||||
include_directories(
|
include_directories(
|
||||||
${BayesNet_SOURCE_DIR}
|
${BayesNet_SOURCE_DIR}
|
||||||
${CMAKE_BINARY_DIR}/configured_files/include
|
${CMAKE_BINARY_DIR}/configured_files/include
|
||||||
|
${nlohmann_json_INCLUDE_DIRS}
|
||||||
)
|
)
|
||||||
file(GLOB_RECURSE BayesNet_SOURCES "${bayesnet_SOURCE_DIR}/bayesnet/*.cc")
|
file(GLOB_RECURSE BayesNet_SOURCES "${bayesnet_SOURCE_DIR}/bayesnet/*.cc")
|
||||||
add_executable(TestBayesNet TestBayesNetwork.cc TestBayesNode.cc TestBayesClassifier.cc TestXSPnDE.cc TestXBA2DE.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
|
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})
|
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 BayesNetworkTest COMMAND TestBayesNet)
|
||||||
add_test(NAME A2DE COMMAND TestBayesNet "[A2DE]")
|
add_test(NAME A2DE COMMAND TestBayesNet "[A2DE]")
|
||||||
add_test(NAME BoostA2DE COMMAND TestBayesNet "[BoostA2DE]")
|
add_test(NAME BoostA2DE COMMAND TestBayesNet "[BoostA2DE]")
|
||||||
|
@@ -20,7 +20,7 @@
|
|||||||
#include "bayesnet/ensembles/AODELd.h"
|
#include "bayesnet/ensembles/AODELd.h"
|
||||||
#include "bayesnet/ensembles/BoostAODE.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]")
|
TEST_CASE("Test Bayesian Classifiers score & version", "[Models]")
|
||||||
{
|
{
|
||||||
|
@@ -16,10 +16,10 @@
|
|||||||
#include "TestUtils.h"
|
#include "TestUtils.h"
|
||||||
|
|
||||||
std::map<std::string, std::string> modules = {
|
std::map<std::string, std::string> modules = {
|
||||||
{ "mdlp", "2.0.1" },
|
{ "mdlp", "2.1.0" },
|
||||||
{ "Folding", "1.1.1" },
|
{ "Folding", "1.1.1" },
|
||||||
{ "json", "3.11" },
|
{ "json", "3.11" },
|
||||||
{ "ArffFiles", "1.1.0" }
|
{ "ArffFiles", "1.2.0" }
|
||||||
};
|
};
|
||||||
|
|
||||||
TEST_CASE("MDLP", "[Modules]")
|
TEST_CASE("MDLP", "[Modules]")
|
||||||
|
@@ -11,7 +11,7 @@
|
|||||||
#include <vector>
|
#include <vector>
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <tuple>
|
#include <tuple>
|
||||||
#include <ArffFiles/ArffFiles.hpp>
|
#include <ArffFiles.hpp>
|
||||||
#include <fimdlp/CPPFImdlp.h>
|
#include <fimdlp/CPPFImdlp.h>
|
||||||
#include <folding.hpp>
|
#include <folding.hpp>
|
||||||
#include <bayesnet/network/Network.h>
|
#include <bayesnet/network/Network.h>
|
||||||
|
@@ -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"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
40
vcpkg.json
40
vcpkg.json
@@ -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"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
Reference in New Issue
Block a user