diff --git a/.gitignore b/.gitignore
index 81fde16c8c8788938fa26601506a6b9b12c68217..04377cd5491b091ad64706f05fd11e66229cc921 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,6 +1,7 @@
 # C++ Build
 build*/
 install*/
+include/aidge/backend/opencv_version.h
 
 # VSCode
 .vscode
diff --git a/CHANGELOG b/CHANGELOG
index 55c85a0e44a101f0c6a7e77c589fec02c7de4c7d..97e6a77ec6cf2c6513ab8f4772b0aa6a113e8966 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,9 @@
+# Version 0.1.5 (January 31, 2024)
+
+- Enforce C++14 in 'CMakeLists.txt'
+- Remove scm dependency to check versions compatibility
+- Change 'setup.py' to use more environment variables in its build process
+
 # Version 0.1.4 (December 6, 2024)
 
 # Version 0.0.1 (January 23, 2024)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index bfe4b03222d49c27c0e0c3cd8408126a7c4fbfaa..c96a47079a24f8e975d14f874e72511c64499da3 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,8 +1,26 @@
 cmake_minimum_required(VERSION 3.18)
-set(CXX_STANDARD 14)
+
+set(CMAKE_CXX_STANDARD 14)
+set(CMAKE_CXX_STANDARD_REQUIRED ON)
+set(CMAKE_CXX_EXTENSIONS  OFF)
 
 file(STRINGS "${CMAKE_SOURCE_DIR}/version.txt" version)
 
+# Parse version.txt to retrieve Major, Minor and Path
+string(REGEX MATCH "([0-9]+\\.[0-9]+\\.[0-9]+)" _ MATCHES ${version})
+set(PROJECT_VERSION_MAJOR ${CMAKE_MATCH_1})
+set(PROJECT_VERSION_MINOR ${CMAKE_MATCH_2})
+set(PROJECT_VERSION_PATCH ${CMAKE_MATCH_3})
+
+# Retrieve latest git commit
+execute_process(
+    COMMAND git rev-parse --short HEAD
+    WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
+    OUTPUT_VARIABLE GIT_COMMIT_HASH
+    OUTPUT_STRIP_TRAILING_WHITESPACE
+    ERROR_QUIET
+)
+
 project(aidge_backend_opencv
         VERSION ${version}
         DESCRIPTION "Opencv implementations of the operators and tensor of aidge framework"
@@ -10,8 +28,9 @@ project(aidge_backend_opencv
 
 message(STATUS "Project name: ${CMAKE_PROJECT_NAME}")
 message(STATUS "Project version: ${version}")
+message(STATUS "Latest git commit: ${GIT_COMMIT_HASH}")
 
-# Note : project name is {project} and python module name is also {project} 
+# Note : project name is {project} and python module name is also {project}
 set(module_name _${CMAKE_PROJECT_NAME}) # target name
 
 ##############################################
@@ -113,13 +132,19 @@ install(TARGETS ${module_name} EXPORT ${CMAKE_PROJECT_NAME}-targets
 
 install(DIRECTORY include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
 
-#Export the targets to a script
+message(STATUS "Creating ${CMAKE_CURRENT_SOURCE_DIR}/include/aidge/backend/opencv_version.h")
+# Generate version.h file from config file version.h.in
+configure_file(
+    "${CMAKE_CURRENT_SOURCE_DIR}/include/aidge/backend/version.h.in"
+    "${CMAKE_CURRENT_SOURCE_DIR}/include/aidge/backend/opencv_version.h"
+)
 
+#Export the targets to a script
 install(EXPORT ${CMAKE_PROJECT_NAME}-targets
  FILE "${CMAKE_PROJECT_NAME}-targets.cmake"
  DESTINATION ${INSTALL_CONFIGDIR}
- COMPONENT ${module_name} 
-)  
+ COMPONENT ${module_name}
+)
 
 #Create a ConfigVersion.cmake file
 include(CMakePackageConfigHelpers)
diff --git a/aidge_backend_opencv/__init__.py b/aidge_backend_opencv/__init__.py
index 8900ab01c3175b7747471760a61bfe7d40a3dbd1..7ef3077f04fecd5989f9cbdf0e8a3a3a5f40f6ee 100644
--- a/aidge_backend_opencv/__init__.py
+++ b/aidge_backend_opencv/__init__.py
@@ -1,3 +1,3 @@
 # Example 1: import .so generated by PyBind
 import aidge_core
-from aidge_backend_opencv.aidge_backend_opencv import *
+from aidge_backend_opencv.aidge_backend_opencv import * # import so generated by PyBind
diff --git a/include/aidge/backend/opencv.hpp b/include/aidge/backend/opencv.hpp
index 41f01a50c4728b6619f0cafaa11544c2c2748c25..b854b69ceda9b6f35afa96d1c1bdb53b3508bcaa 100644
--- a/include/aidge/backend/opencv.hpp
+++ b/include/aidge/backend/opencv.hpp
@@ -12,10 +12,13 @@
 #ifndef AIDGE_OPENCV_OPENCV_H_
 #define AIDGE_OPENCV_OPENCV_H_
 
+
+#include "aidge/backend/opencv_version.h"
+
 #include "aidge/backend/opencv/data/DataUtils.hpp"
 #include "aidge/backend/opencv/data/TensorImpl.hpp"
 #include "aidge/backend/opencv/database/MNIST.hpp"
 #include "aidge/backend/opencv/stimuli/StimulusImpl_opencv_imread.hpp"
 #include "aidge/backend/opencv/utils/Utils.hpp"
 
-#endif /* AIDGE_OPENCV_OPENCV_H_ */
\ No newline at end of file
+#endif /* AIDGE_OPENCV_OPENCV_H_ */
diff --git a/include/aidge/backend/version.h.in b/include/aidge/backend/version.h.in
new file mode 100644
index 0000000000000000000000000000000000000000..4b876f63002972c1f8f1340b70cdecdace911012
--- /dev/null
+++ b/include/aidge/backend/version.h.in
@@ -0,0 +1,11 @@
+#ifndef VERSION_H
+#define VERSION_H
+
+namespace Aidge {
+static constexpr const int PROJECT_VERSION_MAJOR = @PROJECT_VERSION_MAJOR@;
+static constexpr const int PROJECT_VERSION_MINOR = @PROJECT_VERSION_MINOR@;
+static constexpr const int PROJECT_VERSION_PATCH = @PROJECT_VERSION_PATCH@;
+static constexpr const char * PROJECT_VERSION = "@PROJECT_VERSION_MAJOR@.@PROJECT_VERSION_MINOR@.@PROJECT_VERSION_PATCH@";
+static constexpr const char * PROJECT_GIT_HASH = "@GIT_COMMIT_HASH@";
+}
+#endif // VERSION_H
diff --git a/include/aidge/utils/sys_info/OpencvVersionInfo.hpp b/include/aidge/utils/sys_info/OpencvVersionInfo.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..4146d24913fb5706125ba7f88f0215ebc3ce78bc
--- /dev/null
+++ b/include/aidge/utils/sys_info/OpencvVersionInfo.hpp
@@ -0,0 +1,38 @@
+#ifndef AIDGE_UTILS_SYS_INFO_OPENCV_VERSION_INFO_H
+#define AIDGE_UTILS_SYS_INFO_OPENCV_VERSION_INFO_H
+
+#include "aidge/utils/Log.hpp"
+#include "aidge/backend/opencv_version.h"
+
+namespace Aidge {
+
+constexpr inline const char * getBackendOpencvProjectVersion(){
+    return PROJECT_VERSION;
+}
+
+constexpr inline const char * getBackendOpencvGitHash(){
+    return PROJECT_GIT_HASH;
+}
+
+void showBackendOpencvVersion() {
+    Log::info("Aidge backend OpenCV: {} ({}), {} {}", getBackendOpencvProjectVersion(), getBackendOpencvGitHash(), __DATE__, __TIME__);
+        // Compiler version
+    #if defined(__clang__)
+    /* Clang/LLVM. ---------------------------------------------- */
+        Log::info("Clang/LLVM compiler version: {}.{}.{}\n", __clang_major__ , __clang_minor__, __clang_patchlevel__);
+    #elif defined(__ICC) || defined(__INTEL_COMPILER)
+    /* Intel ICC/ICPC. ------------------------------------------ */
+        Log::info("Intel ICC/ICPC compiler version: {}\n", __INTEL_COMPILER);
+    #elif defined(__GNUC__) || defined(__GNUG__)
+    /* GNU GCC/G++. --------------------------------------------- */
+        Log::info("GNU GCC/G++ compiler version: {}.{}.{}", __GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__);
+    #elif defined(_MSC_VER)
+    /* Microsoft Visual Studio. --------------------------------- */
+        Log::info("Microsoft Visual Studio compiler version: {}\n", _MSC_VER);
+    #else
+        Log::info("Unknown compiler\n");
+    #endif
+
+}
+}  // namespace Aidge
+#endif  // AIDGE_UTILS_SYS_INFO_OPENCV_VERSION_INFO_H
diff --git a/pyproject.toml b/pyproject.toml
index 485d2315edc7dfedbabc826efb1c0dd3a2887db0..d0176c539a996a450b7f25659a42b7af3c1d93c9 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -4,22 +4,29 @@ description="Opencv implementations of the operators and tensor of aidge framewo
 dependencies = [
     "numpy>=1.21.6",
 ]
-requires-python = ">= 3.7"
-dynamic = ["version"] # defined in tool.setuptools_scm
+requires-python = ">= 3.8"
+dynamic = ["version"] # defined by pbr
 readme = "README.md"
 license = { file = "LICENSE" }
-classifiers = [ 
+classifiers = [
     "Development Status :: 2 - Pre-Alpha",
     "Programming Language :: Python :: 3"
     ]
 
+[project.urls]
+Homepage = "https://www.deepgreen.ai/en/platform"
+Documentation = "https://eclipse-aidge.readthedocs.io/en/latest/"
+Repository = "https://gitlab.eclipse.org/eclipse/aidge/aidge_backend_opencv"
+Issues = "https://gitlab.eclipse.org/eclipse/aidge/aidge_backend_opencv/-/issues/"
+Changelog = "https://gitlab.eclipse.org/eclipse/aidge/aidge_backend_opencv/-/releases"
+
 [build-system]
 requires = [
     "setuptools>=64",
-    "setuptools_scm[toml]==7.1.0",
     "cmake>=3.15.3.post1",
     "toml",
     "opencv-python>=4.9.0.80",
+    "pbr"
 ]
 build-backend = "setuptools.build_meta"
 
@@ -31,9 +38,7 @@ where = ["."]  # list of folders that contain the packages (["."] by default)
 include = ["aidge_backend_opencv*"]  # package names should match these glob patterns (["*"] by default)
 exclude = ["aidge_backend_opencv.unit_tests*"]  # exclude packages matching these glob patterns (empty by default)
 namespaces = false  # to disable scanning PEP 420 namespaces (true by default)
-# SETUPTOOLS_SCM
-[tool.setuptools_scm]
-write_to = "aidge_backend_opencv/_version.py"
+
 
 #####################################################
 # CIBUILDWHEEL
diff --git a/python_binding/pybind_opencv.cpp b/python_binding/pybind_opencv.cpp
index 276467d9b87d0a6e6c90b32294748de9a91f7a88..6c6a7c1d61574fccb693258c8fa588786f11d4e2 100644
--- a/python_binding/pybind_opencv.cpp
+++ b/python_binding/pybind_opencv.cpp
@@ -1,14 +1,16 @@
 #include <pybind11/pybind11.h>
 // Need to call this header to register tensorImpl when initializing opencv python module
-#include "aidge/backend/opencv.hpp" 
+#include "aidge/backend/opencv.hpp"
 
 namespace py = pybind11;
 
 namespace Aidge {
 
 void init_MNIST(py::module&);
+void init_OpencvVersionInfo(py::module&);
 
 PYBIND11_MODULE(aidge_backend_opencv, m) {
     init_MNIST(m);
+    init_OpencvVersionInfo(m);
 }
 }
diff --git a/python_binding/utils/sys_info/pybind_OpencvVersionInfo.cpp b/python_binding/utils/sys_info/pybind_OpencvVersionInfo.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..ebd9bfca98c05874fb9fd077243ab19b3c8d62a2
--- /dev/null
+++ b/python_binding/utils/sys_info/pybind_OpencvVersionInfo.cpp
@@ -0,0 +1,11 @@
+#include <pybind11/pybind11.h>
+#include "aidge/utils/sys_info/OpencvVersionInfo.hpp"
+
+namespace py = pybind11;
+namespace Aidge {
+void init_OpencvVersionInfo(py::module& m){
+    m.def("show_version", &showBackendOpencvVersion);
+    m.def("get_project_version", &getBackendOpencvProjectVersion);
+    m.def("get_git_hash", &getBackendOpencvGitHash);
+}
+}
diff --git a/setup.cfg b/setup.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..aa0f227f6688468a5ab93384f7b1670086000035
--- /dev/null
+++ b/setup.cfg
@@ -0,0 +1,3 @@
+# pbr file
+[metadata]
+version = file: version.txt
diff --git a/setup.py b/setup.py
index 1af040be23e6e40b459a4957a5172eab86abf0b1..6e8ed89702873514c0fb53525510ea61eb5a7c5c 100644
--- a/setup.py
+++ b/setup.py
@@ -30,6 +30,7 @@ class CMakeBuild(build_ext):
         # This lists the number of processors available on the machine
         # The compilation will use half of them
         max_jobs = str(ceil(multiprocessing.cpu_count() / 2))
+        max_jobs = os.environ.get("AIDGE_NB_PROC", max_jobs)
 
         cwd = pathlib.Path().absolute()
 
@@ -41,49 +42,61 @@ class CMakeBuild(build_ext):
         if not build_lib.exists():
             build_lib.mkdir(parents=True, exist_ok=True)
 
-        os.chdir(str(build_temp))
-
-        # Impose to use the executable of the python
-        # used to launch setup.py to setup PythonInterp
-        python_executable = sys.executable
-        print(f"python executable :\t{python_executable}")
-        compile_type = (
-            "Release"
-            if "AIDGE_PYTHON_BUILD_TYPE" not in os.environ
-            else os.environ["AIDGE_PYTHON_BUILD_TYPE"]
-        )
-
         install_path = (
             os.path.join(sys.prefix, "lib", "libAidge")
             if "AIDGE_INSTALL" not in os.environ
             else os.environ["AIDGE_INSTALL"]
         )
 
-        build_gen = (
-            ["-G", os.environ["AIDGE_BUILD_GEN"]]
-            if "AIDGE_BUILD_GEN" in os.environ
+        os.chdir(str(build_temp))
+
+        # Impose to use the executable of the python
+        # used to launch setup.py to setup PythonInterp
+        python_executable = sys.executable
+        print(f"python executable :\t{python_executable}")
+        # Read environment variables for CMake options
+        c_compiler = os.environ.get("AIDGE_C_COMPILER", "gcc")
+        cxx_compiler = os.environ.get("AIDGE_CXX_COMPILER", "g++")
+        build_type = os.environ.get("AIDGE_BUILD_TYPE", "Release")
+        asan = os.environ.get("AIDGE_ASAN", "OFF")
+        cmake_arch = os.environ.get("AIDGE_CMAKE_ARCH", "")
+
+        build_gen = os.environ.get("AIDGE_BUILD_GEN", "")
+        build_gen_opts = (
+            ["-G", build_gen]
+            if build_gen
             else []
         )
+        test_onoff = os.environ.get("AIDGE_BUILD_TEST", "OFF")
 
-        self.spawn(
-            [
-                "cmake",
-                *build_gen,
-                str(cwd),
-                "-DTEST=OFF",
-                f"-DCMAKE_INSTALL_PREFIX:PATH={install_path}",
-                f"-DCMAKE_BUILD_TYPE={compile_type}",
-                "-DPYBIND=ON",
-                "-DCMAKE_EXPORT_COMPILE_COMMANDS=ON",
-                "-DCOVERAGE=OFF",
-            ]
-        )
+        os.chdir(str(build_temp))
+
+        cmake_cmd = [
+            "cmake",
+            *build_gen_opts,
+            str(cwd),
+            f"-DTEST={test_onoff}",
+            f"-DCMAKE_INSTALL_PREFIX:PATH={install_path}",
+            f"-DCMAKE_BUILD_TYPE={build_type}",
+            f"-DCMAKE_C_COMPILER={c_compiler}",
+            f"-DCMAKE_CXX_COMPILER={cxx_compiler}",
+            f"-DENABLE_ASAN={asan}",
+            "-DPYBIND=ON",
+            "-DCMAKE_EXPORT_COMPILE_COMMANDS=1",
+            "-DCOVERAGE=OFF",
+        ]
+
+        # Append architecture-specific arguments if provided
+        if cmake_arch:
+            cmake_cmd.append(cmake_arch)
+
+        self.spawn(cmake_cmd)
 
         if not self.dry_run:
             self.spawn(
-                ["cmake", "--build", ".", "--config", compile_type, "-j", max_jobs]
+                ["cmake", "--build", ".", "--config", build_type, "-j", max_jobs]
             )
-            self.spawn(["cmake", "--install", ".", "--config", compile_type])
+            self.spawn(["cmake", "--install", ".", "--config", build_type])
         os.chdir(str(cwd))
 
         aidge_package = build_lib / (get_project_name())
diff --git a/unit_tests/CMakeLists.txt b/unit_tests/CMakeLists.txt
index 91a55dacf4cdea1aa696a33ecc84a878510c33c3..d42626e4dc288d6bdfafed78cbd9c61e17e49c90 100644
--- a/unit_tests/CMakeLists.txt
+++ b/unit_tests/CMakeLists.txt
@@ -1,12 +1,23 @@
-Include(FetchContent)
+# Catch2 configuration
+set(CATCH2_MIN_VERSION 3.3.0)
 
-FetchContent_Declare(
-  Catch2
-  GIT_REPOSITORY https://github.com/catchorg/Catch2.git
-  GIT_TAG        v3.7.1 # or a later release
-)
+# Try to find system installed Catch2
+find_package(Catch2 ${CATCH2_MIN_VERSION} QUIET)
 
-FetchContent_MakeAvailable(Catch2)
+if(NOT Catch2_FOUND)
+    message(STATUS "Catch2 not found in system, retrieving from git")
+    Include(FetchContent)
+
+    FetchContent_Declare(
+      Catch2
+      GIT_REPOSITORY https://github.com/catchorg/Catch2.git
+      GIT_TAG        devel # or a later release
+    )
+    FetchContent_MakeAvailable(Catch2)
+    message(STATUS "Fetched Catch2 version ${Catch2_VERSION}")
+else()
+    message(STATUS "Using system Catch2 version ${Catch2_VERSION}")
+endif()
 
 file(GLOB_RECURSE src_files "*.cpp")
 
@@ -16,7 +27,13 @@ target_link_libraries(tests${module_name} PUBLIC ${module_name})
 
 target_link_libraries(tests${module_name} PRIVATE Catch2::Catch2WithMain)
 
+# Setup testing
 list(APPEND CMAKE_MODULE_PATH ${catch2_SOURCE_DIR}/extras)
 include(CTest)
 include(Catch)
+
+# Discover and add tests
 catch_discover_tests(tests${module_name})
+
+# Set test configuration for CTest
+set(CTEST_CONFIGURATION_TYPE ${CMAKE_BUILD_TYPE})
\ No newline at end of file
diff --git a/version.txt b/version.txt
index 845639eef26c0e95586203ae78369f67552ccb17..9faa1b7a7339db85692f91ad4b922554624a3ef7 100644
--- a/version.txt
+++ b/version.txt
@@ -1 +1 @@
-0.1.4
+0.1.5