mirror of
https://github.com/rmontanana/mdlp.git
synced 2025-08-22 19:05:58 +00:00
128 lines
5.3 KiB
Makefile
128 lines
5.3 KiB
Makefile
SHELL := /bin/bash
|
|
.DEFAULT_GOAL := help
|
|
.PHONY: debug release install test conan-create viewcoverage
|
|
lcov := lcov
|
|
|
|
f_debug = build_debug
|
|
f_release = build_release
|
|
genhtml = genhtml
|
|
docscdir = docs
|
|
|
|
# Set the number of parallel jobs to the number of available processors minus 7
|
|
CPUS := $(shell getconf _NPROCESSORS_ONLN 2>/dev/null \
|
|
|| nproc --all 2>/dev/null \
|
|
|| sysctl -n hw.ncpu)
|
|
JOBS := $(shell n=$(CPUS); [ $${n} -gt 7 ] && echo $$((n-7)) || echo 1)
|
|
|
|
# Colors for output
|
|
GREEN = \033[0;32m
|
|
YELLOW = \033[1;33m
|
|
RED = \033[0;31m
|
|
NC = \033[0m # No Color
|
|
|
|
define build_target
|
|
@echo ">>> Building the project for $(1)..."
|
|
@if [ -d $(2) ]; then rm -fr $(2); fi
|
|
@conan install . --build=missing -of $(2) -s build_type=$(1) $(4)
|
|
@cmake -S . -B $(2) -DCMAKE_TOOLCHAIN_FILE=$(2)/build/$(1)/generators/conan_toolchain.cmake -DCMAKE_BUILD_TYPE=$(1) -D$(3)
|
|
@cmake --build $(2) --config $(1) -j 8
|
|
endef
|
|
|
|
define status_file_folder
|
|
@if [ -d $(1) ]; then \
|
|
st1=" ✅ $(GREEN)"; \
|
|
else \
|
|
st1=" ❌ $(RED)"; \
|
|
fi; \
|
|
if [ -f $(1)/libfimdlp.a ]; then \
|
|
st2=" ✅ $(GREEN)"; \
|
|
else \
|
|
st2=" ❌ $(RED)"; \
|
|
fi; \
|
|
printf " $(YELLOW)$(2):$(NC) $$st1 Folder $(NC) $$st2 Library $(NC)\n"
|
|
endef
|
|
|
|
|
|
debug: ## Build Debug version of the library
|
|
@$(call build_target,"Debug","$(f_debug)", "ENABLE_TESTING=ON", "-o enable_testing=True")
|
|
|
|
release: ## Build Release version of the library
|
|
@$(call build_target,"Release","$(f_release)", "ENABLE_TESTING=OFF", "-o enable_testing=False")
|
|
|
|
install: ## Install the library
|
|
@echo ">>> Installing the project..."
|
|
@cmake --build $(f_release) --target install -j 8
|
|
|
|
test: ## Build Debug version and run tests
|
|
@echo ">>> Building Debug version and running tests..."
|
|
@$(MAKE) debug;
|
|
@cp -r tests/datasets $(f_debug)/tests/datasets
|
|
@cd $(f_debug)/tests && ctest --output-on-failure -j 8
|
|
@echo ">>> Generating coverage report..."
|
|
@cd $(f_debug)/tests && $(lcov) --capture --directory ../ --demangle-cpp --ignore-errors source,source --ignore-errors mismatch --ignore-errors inconsistent --output-file coverage.info >/dev/null 2>&1; \
|
|
$(lcov) --remove coverage.info '/usr/*' --output-file coverage.info >/dev/null 2>&1; \
|
|
$(lcov) --remove coverage.info 'lib/*' --output-file coverage.info >/dev/null 2>&1; \
|
|
$(lcov) --remove coverage.info 'libtorch/*' --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 'gtest/*' --output-file coverage.info >/dev/null 2>&1; \
|
|
$(lcov) --remove coverage.info '*/.conan2/*' --ignore-errors unused --output-file coverage.info >/dev/null 2>&1;
|
|
@genhtml $(f_debug)/tests/coverage.info --demangle-cpp --output-directory $(f_debug)/tests/coverage --title "Discretizer mdlp Coverage Report" -s -k -f --legend
|
|
@echo "* Coverage report is generated at $(f_debug)/tests/coverage/index.html"
|
|
@which python || (echo ">>> Please install python"; exit 1)
|
|
@if [ ! -f $(f_debug)/tests/coverage.info ]; then \
|
|
echo ">>> No coverage.info file found!"; \
|
|
exit 1; \
|
|
fi
|
|
@echo ">>> Updating coverage badge..."
|
|
@env python update_coverage.py $(f_debug)/tests
|
|
@echo ">>> Done"
|
|
|
|
viewcoverage: ## View the html coverage report
|
|
@which $(genhtml) >/dev/null || (echo ">>> Please install lcov (genhtml not found)"; exit 1)
|
|
@if [ ! -d $(docscdir)/coverage ]; then mkdir -p $(docscdir)/coverage; fi
|
|
@if [ ! -f $(f_debug)/tests/coverage.info ]; then \
|
|
echo ">>> No coverage.info file found. Run make coverage first!"; \
|
|
exit 1; \
|
|
fi
|
|
@$(genhtml) $(f_debug)/tests/coverage.info --demangle-cpp --output-directory $(docscdir)/coverage --title "FImdlp Coverage Report" -s -k -f --legend >/dev/null 2>&1;
|
|
@xdg-open $(docscdir)/coverage/index.html || open $(docscdir)/coverage/index.html 2>/dev/null
|
|
@echo ">>> Done";
|
|
|
|
info: ## Show project information
|
|
@version=$$(grep -A1 "project(fimdlp" CMakeLists.txt | grep "VERSION" | sed 's/.*VERSION \([0-9.]*\).*/\1/'); \
|
|
printf "$(GREEN)FImdlp Library: $(YELLOW)ver. $$version$(NC)\n"
|
|
@echo ""
|
|
@printf "$(GREEN)Project folders:$(NC)\n"
|
|
$(call status_file_folder, $(f_release), "Build\ Release")
|
|
$(call status_file_folder, $(f_debug), "Build\ Debug\ \ ")
|
|
@echo ""
|
|
@printf "$(GREEN)Build commands:$(NC)\n"
|
|
@printf " $(YELLOW)make release$(NC) - Build library for release\n"
|
|
@printf " $(YELLOW)make debug$(NC) - Build library for debug\n"
|
|
@printf " $(YELLOW)make test$(NC) - Run tests\n"
|
|
@printf " $(YELLOW)Usage:$(NC) make help\n"
|
|
@echo ""
|
|
@printf " $(YELLOW)Parallel Jobs: $(GREEN)$(JOBS)$(NC)\n"
|
|
|
|
conan-create: ## Create the conan package
|
|
@echo ">>> Creating the conan package..."
|
|
conan create . --build=missing -tf "" -s:a build_type=Release
|
|
conan create . --build=missing -tf "" -s:a build_type=Debug -o "&:enable_testing=False"
|
|
@echo ">>> Done"
|
|
|
|
help: ## Show help message
|
|
@IFS=$$'\n' ; \
|
|
help_lines=(`grep -Fh "##" $(MAKEFILE_LIST) | grep -Fv fgrep | sed -e 's/\\$$//' | sed -e 's/##/:/'`); \
|
|
printf "%s\n\n" "Usage: make [task]"; \
|
|
printf "%-20s %s\n" "task" "help" ; \
|
|
printf "%-20s %s\n" "------" "----" ; \
|
|
for help_line in $${help_lines[@]}; do \
|
|
IFS=$$':' ; \
|
|
help_split=($$help_line) ; \
|
|
help_command=`echo $${help_split[0]} | sed -e 's/^ *//' -e 's/ *$$//'` ; \
|
|
help_info=`echo $${help_split[2]} | sed -e 's/^ *//' -e 's/ *$$//'` ; \
|
|
printf '\033[36m'; \
|
|
printf "%-20s %s" $$help_command ; \
|
|
printf '\033[0m'; \
|
|
printf "%s\n" $$help_info; \
|
|
done
|