From 2d8b949abda93da41352d9d83569658e8df75567 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Monta=C3=B1ana=20G=C3=B3mez?= Date: Tue, 23 Jul 2024 00:36:31 +0200 Subject: [PATCH] Refactor library version and installation --- CMakeLists.txt | 51 ++++++++++++++++++++++++++++++++++++------- config/CMakeLists.txt | 4 ++++ config/config.h.in | 13 +++++++++++ fimdlpConfig.cmake.in | 2 ++ sample/CMakeLists.txt | 1 + src/Discretizer.h | 3 ++- tests/CMakeLists.txt | 3 ++- 7 files changed, 67 insertions(+), 10 deletions(-) create mode 100644 config/CMakeLists.txt create mode 100644 config/config.h.in create mode 100644 fimdlpConfig.cmake.in diff --git a/CMakeLists.txt b/CMakeLists.txt index 06a336e..d5f6c9c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,35 +1,49 @@ cmake_minimum_required(VERSION 3.20) -project(fimdlp) +project(fimdlp + LANGUAGES CXX + DESCRIPTION "Discretization algorithm based on the paper by Fayyad & Irani Multi-Interval Discretization of Continuous-Valued Attributes for Classification Learning." + HOMEPAGE_URL "https://github.com/rmontanana/mdlp" + VERSION 2.0.1 +) set(CMAKE_CXX_STANDARD 17) cmake_policy(SET CMP0135 NEW) find_package(Torch CONFIG REQUIRED) -set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fno-elide-constructors") +# Options +# ------- +option(ENABLE_TESTING OFF) +option(ENABLE_SAMPLE OFF) +option(COVERAGE OFF) + +add_subdirectory(config) + +set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fno-elide-constructors") set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3") if (NOT ${CMAKE_SYSTEM_NAME} MATCHES "Darwin") set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fno-default-inline") endif() if (ENABLE_TESTING) - MESSAGE("Debug mode") + message("Debug mode") enable_testing() set(CODE_COVERAGE ON) - SET(GCC_COVERAGE_LINK_FLAGS " ${GCC_COVERAGE_LINK_FLAGS} -lgcov --coverage") + set(GCC_COVERAGE_LINK_FLAGS "${GCC_COVERAGE_LINK_FLAGS} -lgcov --coverage") add_subdirectory(tests) -else(ENABLE_TESTING) - MESSAGE("Release mode") -endif(ENABLE_TESTING) +else() + message("Release mode") +endif() if (ENABLE_SAMPLE) message("Building sample") add_subdirectory(sample) -endif(ENABLE_SAMPLE) +endif() include_directories( ${TORCH_INCLUDE_DIRS} ${fimdlp_SOURCE_DIR}/src + ${CMAKE_BINARY_DIR}/configured_files/include ) add_library(fimdlp src/CPPFImdlp.cpp src/Metrics.cpp src/BinDisc.cpp src/Discretizer.cpp) @@ -37,8 +51,29 @@ target_link_libraries(fimdlp "${TORCH_LIBRARIES}") # Installation # ------------ +include(CMakePackageConfigHelpers) +write_basic_package_version_file( + "${CMAKE_CURRENT_BINARY_DIR}/fimdlpConfigVersion.cmake" + VERSION ${PROJECT_VERSION} + COMPATIBILITY AnyNewerVersion +) + install(TARGETS fimdlp + EXPORT fimdlpTargets ARCHIVE DESTINATION lib LIBRARY DESTINATION lib CONFIGURATIONS Release) + install(DIRECTORY src/ DESTINATION include/fimdlp FILES_MATCHING CONFIGURATIONS Release PATTERN "*.h") +install(FILES ${CMAKE_BINARY_DIR}/configured_files/include/config.h DESTINATION include/fimdlp CONFIGURATIONS Release) + +install(EXPORT fimdlpTargets + FILE fimdlpTargets.cmake + NAMESPACE fimdlp:: + DESTINATION lib/cmake/fimdlp) + +configure_file(fimdlpConfig.cmake.in "${CMAKE_CURRENT_BINARY_DIR}/fimdlpConfig.cmake" @ONLY) +install(FILES "${CMAKE_CURRENT_BINARY_DIR}/fimdlpConfig.cmake" + "${CMAKE_CURRENT_BINARY_DIR}/fimdlpConfigVersion.cmake" + DESTINATION lib/cmake/fimdlp) + diff --git a/config/CMakeLists.txt b/config/CMakeLists.txt new file mode 100644 index 0000000..c6c4cde --- /dev/null +++ b/config/CMakeLists.txt @@ -0,0 +1,4 @@ +configure_file( + "config.h.in" + "${CMAKE_BINARY_DIR}/configured_files/include/config.h" ESCAPE_QUOTES +) diff --git a/config/config.h.in b/config/config.h.in new file mode 100644 index 0000000..24ae281 --- /dev/null +++ b/config/config.h.in @@ -0,0 +1,13 @@ +#pragma once + +#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@"; +static constexpr std::string_view git_sha = "@GIT_SHA@"; \ No newline at end of file diff --git a/fimdlpConfig.cmake.in b/fimdlpConfig.cmake.in new file mode 100644 index 0000000..248f3a6 --- /dev/null +++ b/fimdlpConfig.cmake.in @@ -0,0 +1,2 @@ +@PACKAGE_INIT@ +include("${CMAKE_CURRENT_LIST_DIR}/fimdlpTargets.cmake") diff --git a/sample/CMakeLists.txt b/sample/CMakeLists.txt index 13e4798..d159943 100644 --- a/sample/CMakeLists.txt +++ b/sample/CMakeLists.txt @@ -5,6 +5,7 @@ set(CMAKE_BUILD_TYPE Debug) include_directories( ${fimdlp_SOURCE_DIR}/src ${fimdlp_SOURCE_DIR}/tests/lib/Files + ${CMAKE_BINARY_DIR}/configured_files/include ) add_executable(sample sample.cpp ) diff --git a/src/Discretizer.h b/src/Discretizer.h index c46b541..27647f1 100644 --- a/src/Discretizer.h +++ b/src/Discretizer.h @@ -11,6 +11,7 @@ #include #include "typesFImdlp.h" #include +#include "config.h" namespace mdlp { enum class bound_dir_t { @@ -29,7 +30,7 @@ namespace mdlp { void fit_t(const torch::Tensor& X_, const torch::Tensor& y_); torch::Tensor transform_t(const torch::Tensor& X_); torch::Tensor fit_transform_t(const torch::Tensor& X_, const torch::Tensor& y_); - static inline std::string version() { return "2.0.1"; }; + static inline std::string version() { return { project_version.begin(), project_version.end() };; }; protected: labels_t discretizedData = labels_t(); cutPoints_t cutPoints; // At least two cutpoints must be provided, the first and the last will be ignored in transform diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 0d389f1..e9cb697 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -11,7 +11,8 @@ FetchContent_MakeAvailable(googletest) include_directories( ${TORCH_INCLUDE_DIRS} ${fimdlp_SOURCE_DIR}/src - ${fimdlp_SOURCE_DIR}/tests/lib/Files + ${fimdlp_SOURCE_DIR}/tests/lib/Files + ${CMAKE_BINARY_DIR}/configured_files/include ) add_executable(Metrics_unittest ${fimdlp_SOURCE_DIR}/src/Metrics.cpp Metrics_unittest.cpp)