diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs
new file mode 100644
index 0000000000000000000000000000000000000000..c6add46932a83059e602fd0bedd8b18d6f1de9f8
--- /dev/null
+++ b/.git-blame-ignore-revs
@@ -0,0 +1,2 @@
+# pre-commit run -a (Guilhem Saurel, 2022-07-27)
+4af05ec6781f9da65b81af8e3af8d69213f99e85
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 2bb36edcd2f942159e7bfd930c119c55cb32e6d9..ad550860bf95fad58a4581e1a97437c179401344 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -14,3 +14,7 @@ repos:
     rev: 22.6.0
     hooks:
     -   id: black
+-   repo: https://github.com/cheshirekow/cmake-format-precommit
+    rev: v0.6.13
+    hooks:
+    - id: cmake-format
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 2abe8a6a73824b87e376b59f5bceddc666e82d74..5d54e2c64ceb10d179988672d8ae98dc6cd348e1 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,72 +1,78 @@
 #
-# Copyright (c) 2014-2019 CNRS
-# Copyright (c) 2018-2022 INRIA
+# Copyright (c) 2014-2019 CNRS Copyright (c) 2018-2022 INRIA
 #
 
-CMAKE_MINIMUM_REQUIRED(VERSION 3.1)
+cmake_minimum_required(VERSION 3.1)
 
-SET(PROJECT_NAME eigenpy)
-SET(PROJECT_DESCRIPTION "Bindings between Numpy and Eigen using Boost.Python")
-SET(PROJECT_URL "http://github.com/stack-of-tasks/eigenpy")
-SET(PROJECT_USE_CMAKE_EXPORT TRUE)
-SET(PROJECT_USE_KEYWORD_LINK_LIBRARIES TRUE)
-SET(PROJECT_CUSTOM_HEADER_EXTENSION "hpp")
-SET(PROJECT_COMPATIBILITY_VERSION AnyNewerVersion)
+set(PROJECT_NAME eigenpy)
+set(PROJECT_DESCRIPTION "Bindings between Numpy and Eigen using Boost.Python")
+set(PROJECT_URL "http://github.com/stack-of-tasks/eigenpy")
+set(PROJECT_USE_CMAKE_EXPORT TRUE)
+set(PROJECT_USE_KEYWORD_LINK_LIBRARIES TRUE)
+set(PROJECT_CUSTOM_HEADER_EXTENSION "hpp")
+set(PROJECT_COMPATIBILITY_VERSION AnyNewerVersion)
 
 # Check if the submodule cmake have been initialized
 set(JRL_CMAKE_MODULES "${CMAKE_CURRENT_LIST_DIR}/cmake")
-IF(NOT EXISTS "${CMAKE_SOURCE_DIR}/cmake/base.cmake")
-  IF(${CMAKE_VERSION} VERSION_LESS "3.14.0")
-    MESSAGE(FATAL_ERROR "\nPlease run the following command first:\ngit submodule update --init\n")
-  ELSE()
+if(NOT EXISTS "${CMAKE_SOURCE_DIR}/cmake/base.cmake")
+  if(${CMAKE_VERSION} VERSION_LESS "3.14.0")
+    message(
+      FATAL_ERROR
+        "\nPlease run the following command first:\ngit submodule update --init\n"
+    )
+  else()
     message(STATUS "JRL cmakemodules not found. Let's fetch it.")
     include(FetchContent)
-    FetchContent_Declare("jrl-cmakemodules"
+    FetchContent_Declare(
+      "jrl-cmakemodules"
       GIT_REPOSITORY "https://github.com/jrl-umi3218/jrl-cmakemodules.git")
     FetchContent_MakeAvailable("jrl-cmakemodules")
     FetchContent_GetProperties("jrl-cmakemodules" SOURCE_DIR JRL_CMAKE_MODULES)
-  ENDIF()
-ENDIF()
+  endif()
+endif()
 
 # Disable -Werror on Unix for now.
-SET(CXX_DISABLE_WERROR True)
-SET(CMAKE_VERBOSE_MAKEFILE True)
+set(CXX_DISABLE_WERROR True)
+set(CMAKE_VERBOSE_MAKEFILE True)
 
 # ----------------------------------------------------
 # --- OPTIONS  ---------------------------------------
 # Need to be set before including base.cmake
 # ----------------------------------------------------
-OPTION(INSTALL_DOCUMENTATION "Generate and install the documentation" OFF)
-OPTION(SUFFIX_SO_VERSION "Suffix library name with its version" OFF)
+option(INSTALL_DOCUMENTATION "Generate and install the documentation" OFF)
+option(SUFFIX_SO_VERSION "Suffix library name with its version" OFF)
 
-IF(DEFINED BUILD_UNIT_TESTS)
-  MESSAGE(AUTHOR_WARNING "BUILD_UNIT_TESTS is deprecated. Use BUILD_TESTING instead.\
+if(DEFINED BUILD_UNIT_TESTS)
+  message(
+    AUTHOR_WARNING
+      "BUILD_UNIT_TESTS is deprecated. Use BUILD_TESTING instead.\
     If you are manually building EigenPy from source in an existing build folder,\
     we suggest that you delete your build folder and make a new one.")
-  SET(BUILD_TESTING ${BUILD_UNIT_TESTS})
-ENDIF(DEFINED BUILD_UNIT_TESTS)
+  set(BUILD_TESTING ${BUILD_UNIT_TESTS})
+endif(DEFINED BUILD_UNIT_TESTS)
 
-INCLUDE("${JRL_CMAKE_MODULES}/base.cmake")
-COMPUTE_PROJECT_ARGS(PROJECT_ARGS LANGUAGES CXX)
-PROJECT(${PROJECT_NAME} ${PROJECT_ARGS})
+include("${JRL_CMAKE_MODULES}/base.cmake")
+compute_project_args(PROJECT_ARGS LANGUAGES CXX)
+project(${PROJECT_NAME} ${PROJECT_ARGS})
 
-INCLUDE("${JRL_CMAKE_MODULES}/boost.cmake")
-INCLUDE("${JRL_CMAKE_MODULES}/python.cmake")
-INCLUDE("${JRL_CMAKE_MODULES}/ide.cmake")
-INCLUDE("${JRL_CMAKE_MODULES}/apple.cmake")
+include("${JRL_CMAKE_MODULES}/boost.cmake")
+include("${JRL_CMAKE_MODULES}/python.cmake")
+include("${JRL_CMAKE_MODULES}/ide.cmake")
+include("${JRL_CMAKE_MODULES}/apple.cmake")
 
-OPTION(GENERATE_PYTHON_STUBS "Generate the Python stubs associated to the Python library" OFF)
+option(GENERATE_PYTHON_STUBS
+       "Generate the Python stubs associated to the Python library" OFF)
 
-STRING(REPLACE "-pedantic" "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS})
+string(REPLACE "-pedantic" "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS})
 
 # If needed, fix CMake policy for APPLE systems
-APPLY_DEFAULT_APPLE_CONFIGURATION()
+apply_default_apple_configuration()
 
-IF(WIN32)
-  SET(LINK copy_if_different)
-ELSE(WIN32)
-  SET(LINK create_symlink)
-ENDIF(WIN32)
+if(WIN32)
+  set(LINK copy_if_different)
+else(WIN32)
+  set(LINK create_symlink)
+endif(WIN32)
 
 if(CMAKE_CROSSCOMPILING)
   set(PYTHON_COMPONENTS Interpreter NumPy)
@@ -74,95 +80,87 @@ else()
   set(PYTHON_COMPONENTS Interpreter Development.Module NumPy)
 endif()
 set(PYTHON_EXPORT_DEPENDENCY ON)
-FINDPYTHON()
-
-IF(WIN32)
-  LINK_DIRECTORIES(${PYTHON_LIBRARY_DIRS})
-#  # Set default Windows build paths
-#  SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY
-#    ${PROJECT_BINARY_DIR}/Bin
-#    CACHE PATH "Single directory for all libraries")
-#  SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY
-#    ${PROJECT_BINARY_DIR}/Bin
-#    CACHE PATH "Single directory for all executables")
-#  SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY
-#    ${PROJECT_BINARY_DIR}/Bin
-#    CACHE PATH "Sing$le directory for all archives")
-ENDIF(WIN32)
+findpython()
+
+if(WIN32)
+  link_directories(${PYTHON_LIBRARY_DIRS})
+  # # Set default Windows build paths SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY
+  # ${PROJECT_BINARY_DIR}/Bin CACHE PATH "Single directory for all libraries")
+  # SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/Bin CACHE PATH
+  # "Single directory for all executables") SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY
+  # ${PROJECT_BINARY_DIR}/Bin CACHE PATH "Sing$le directory for all archives")
+endif(WIN32)
 
 # ----------------------------------------------------
 # --- DEPENDENCIES -----------------------------------
 # ----------------------------------------------------
-ADD_PROJECT_DEPENDENCY(Eigen3 REQUIRED PKG_CONFIG_REQUIRES "eigen3 >= 3.0.5")
+add_project_dependency(Eigen3 REQUIRED PKG_CONFIG_REQUIRES "eigen3 >= 3.0.5")
 
-SET_BOOST_DEFAULT_OPTIONS()
-EXPORT_BOOST_DEFAULT_OPTIONS()
-FIND_PACKAGE(Boost REQUIRED)
-SEARCH_FOR_BOOST_PYTHON()
+set_boost_default_options()
+export_boost_default_options()
+find_package(Boost REQUIRED)
+search_for_boost_python()
 
 # ----------------------------------------------------
 # --- INCLUDE ----------------------------------------
 # ----------------------------------------------------
-SET(${PROJECT_NAME}_UTILS_HEADERS
-  include/eigenpy/utils/scalar-name.hpp
-  include/eigenpy/utils/is-approx.hpp
-  include/eigenpy/utils/is-aligned.hpp
-  )
-
-SET(${PROJECT_NAME}_SOLVERS_HEADERS
-  include/eigenpy/solvers/solvers.hpp
-  include/eigenpy/solvers/preconditioners.hpp
-  include/eigenpy/solvers/IterativeSolverBase.hpp
-  include/eigenpy/solvers/LeastSquaresConjugateGradient.hpp
-  include/eigenpy/solvers/ConjugateGradient.hpp
-  include/eigenpy/solvers/SparseSolverBase.hpp
-  include/eigenpy/solvers/BasicPreconditioners.hpp
-  include/eigenpy/solvers/BFGSPreconditioners.hpp
-  )
-
-SET(${PROJECT_NAME}_DECOMPOSITIONS_HEADERS
-  include/eigenpy/decompositions/decompositions.hpp
-  include/eigenpy/decompositions/EigenSolver.hpp
-  include/eigenpy/decompositions/LDLT.hpp
-  include/eigenpy/decompositions/LLT.hpp
-  include/eigenpy/decompositions/SelfAdjointEigenSolver.hpp
-  include/eigenpy/decompositions/minres.hpp
-  )
-
-SET(${PROJECT_NAME}_HEADERS
-  ${${PROJECT_NAME}_UTILS_HEADERS}
-  ${${PROJECT_NAME}_SOLVERS_HEADERS}
-  ${${PROJECT_NAME}_DECOMPOSITIONS_HEADERS}
-  include/eigenpy/computation-info.hpp
-  include/eigenpy/eigenpy.hpp
-  include/eigenpy/exception.hpp
-  include/eigenpy/scalar-conversion.hpp
-  include/eigenpy/expose.hpp
-  include/eigenpy/details.hpp
-  include/eigenpy/fwd.hpp
-  include/eigenpy/eigen-allocator.hpp
-  include/eigenpy/eigen-to-python.hpp
-  include/eigenpy/eigen-from-python.hpp
-  include/eigenpy/eigen-typedef.hpp
-  include/eigenpy/numpy-map.hpp
-  include/eigenpy/geometry.hpp
-  include/eigenpy/geometry-conversion.hpp
-  include/eigenpy/memory.hpp
-  include/eigenpy/numpy.hpp
-  include/eigenpy/numpy-allocator.hpp
-  include/eigenpy/numpy-type.hpp
-  include/eigenpy/registration.hpp
-  include/eigenpy/angle-axis.hpp
-  include/eigenpy/quaternion.hpp
-  include/eigenpy/user-type.hpp
-  include/eigenpy/ufunc.hpp
-  include/eigenpy/register.hpp
-  include/eigenpy/stride.hpp
-  include/eigenpy/swig.hpp
-  include/eigenpy/version.hpp
-)
-
-LIST(APPEND ${PROJECT_NAME}_HEADERS
+set(${PROJECT_NAME}_UTILS_HEADERS
+    include/eigenpy/utils/scalar-name.hpp include/eigenpy/utils/is-approx.hpp
+    include/eigenpy/utils/is-aligned.hpp)
+
+set(${PROJECT_NAME}_SOLVERS_HEADERS
+    include/eigenpy/solvers/solvers.hpp
+    include/eigenpy/solvers/preconditioners.hpp
+    include/eigenpy/solvers/IterativeSolverBase.hpp
+    include/eigenpy/solvers/LeastSquaresConjugateGradient.hpp
+    include/eigenpy/solvers/ConjugateGradient.hpp
+    include/eigenpy/solvers/SparseSolverBase.hpp
+    include/eigenpy/solvers/BasicPreconditioners.hpp
+    include/eigenpy/solvers/BFGSPreconditioners.hpp)
+
+set(${PROJECT_NAME}_DECOMPOSITIONS_HEADERS
+    include/eigenpy/decompositions/decompositions.hpp
+    include/eigenpy/decompositions/EigenSolver.hpp
+    include/eigenpy/decompositions/LDLT.hpp
+    include/eigenpy/decompositions/LLT.hpp
+    include/eigenpy/decompositions/SelfAdjointEigenSolver.hpp
+    include/eigenpy/decompositions/minres.hpp)
+
+set(${PROJECT_NAME}_HEADERS
+    ${${PROJECT_NAME}_UTILS_HEADERS}
+    ${${PROJECT_NAME}_SOLVERS_HEADERS}
+    ${${PROJECT_NAME}_DECOMPOSITIONS_HEADERS}
+    include/eigenpy/computation-info.hpp
+    include/eigenpy/eigenpy.hpp
+    include/eigenpy/exception.hpp
+    include/eigenpy/scalar-conversion.hpp
+    include/eigenpy/expose.hpp
+    include/eigenpy/details.hpp
+    include/eigenpy/fwd.hpp
+    include/eigenpy/eigen-allocator.hpp
+    include/eigenpy/eigen-to-python.hpp
+    include/eigenpy/eigen-from-python.hpp
+    include/eigenpy/eigen-typedef.hpp
+    include/eigenpy/numpy-map.hpp
+    include/eigenpy/geometry.hpp
+    include/eigenpy/geometry-conversion.hpp
+    include/eigenpy/memory.hpp
+    include/eigenpy/numpy.hpp
+    include/eigenpy/numpy-allocator.hpp
+    include/eigenpy/numpy-type.hpp
+    include/eigenpy/registration.hpp
+    include/eigenpy/angle-axis.hpp
+    include/eigenpy/quaternion.hpp
+    include/eigenpy/user-type.hpp
+    include/eigenpy/ufunc.hpp
+    include/eigenpy/register.hpp
+    include/eigenpy/stride.hpp
+    include/eigenpy/swig.hpp
+    include/eigenpy/version.hpp)
+
+list(
+  APPEND
+  ${PROJECT_NAME}_HEADERS
   ${${PROJECT_NAME}_BINARY_DIR}/include/${PROJECT_NAME}/config.hpp
   ${${PROJECT_NAME}_BINARY_DIR}/include/${PROJECT_NAME}/deprecated.hpp
   ${${PROJECT_NAME}_BINARY_DIR}/include/${PROJECT_NAME}/warning.hpp)
@@ -170,96 +168,125 @@ LIST(APPEND ${PROJECT_NAME}_HEADERS
 # ----------------------------------------------------
 # --- TARGETS ----------------------------------------
 # ----------------------------------------------------
-SET(${PROJECT_NAME}_SOLVERS_SOURCES
-  src/solvers/preconditioners.cpp
-  src/solvers/solvers.cpp
-  )
-
-SET(${PROJECT_NAME}_DECOMPOSITIONS_SOURCES
-  src/decompositions/decompositions.cpp
-  )
-
-SET(${PROJECT_NAME}_SOURCES
-  ${${PROJECT_NAME}_SOLVERS_SOURCES}
-  ${${PROJECT_NAME}_DECOMPOSITIONS_SOURCES}
-  src/exception.cpp
-  src/eigenpy.cpp
-  src/numpy.cpp
-  src/numpy-type.cpp
-  src/matrix-float.cpp
-  src/matrix-complex-float.cpp
-  src/matrix-complex-double.cpp
-  src/register.cpp
-  src/matrix-double.cpp
-  src/matrix-long-double.cpp
-  src/matrix-complex-long-double.cpp
-  src/matrix-bool.cpp
-  src/matrix-int.cpp
-  src/matrix-long.cpp
-  src/angle-axis.cpp
-  src/quaternion.cpp
-  src/geometry-conversion.cpp
-  src/version.cpp
-)
-
-ADD_LIBRARY(${PROJECT_NAME} SHARED ${${PROJECT_NAME}_SOURCES} ${${PROJECT_NAME}_HEADERS})
-TARGET_INCLUDE_DIRECTORIES(${PROJECT_NAME}
-  SYSTEM PUBLIC
-  $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include>
-  $<INSTALL_INTERFACE:include>)
-
-MODERNIZE_TARGET_LINK_LIBRARIES(${PROJECT_NAME} SCOPE PUBLIC
-  TARGETS Eigen3::Eigen
-  INCLUDE_DIRS ${EIGEN3_INCLUDE_DIR})
-
-MODERNIZE_TARGET_LINK_LIBRARIES(${PROJECT_NAME} SCOPE PUBLIC
-  TARGETS Python3::NumPy
-  INCLUDE_DIRS ${NUMPY_INCLUDE_DIR})
-TARGET_INCLUDE_DIRECTORIES(${PROJECT_NAME} SYSTEM PRIVATE ${PYTHON_INCLUDE_DIRS})
-
-IF(SUFFIX_SO_VERSION)
-  SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES SOVERSION ${PROJECT_VERSION})
-ENDIF(SUFFIX_SO_VERSION)
-
-IF(NOT WIN32)
-  TARGET_COMPILE_OPTIONS(${PROJECT_NAME} PRIVATE $<$<CXX_COMPILER_ID:MSVC>:-bigobj> "-Wno-conversion")
-ELSE()
-  TARGET_COMPILE_OPTIONS(${PROJECT_NAME} PRIVATE $<$<CXX_COMPILER_ID:MSVC>:-bigobj>)
-ENDIF()
-
-TARGET_LINK_BOOST_PYTHON(${PROJECT_NAME} PUBLIC)
-INSTALL(TARGETS ${PROJECT_NAME}
+set(${PROJECT_NAME}_SOLVERS_SOURCES src/solvers/preconditioners.cpp
+                                    src/solvers/solvers.cpp)
+
+set(${PROJECT_NAME}_DECOMPOSITIONS_SOURCES
+    src/decompositions/decompositions.cpp)
+
+set(${PROJECT_NAME}_SOURCES
+    ${${PROJECT_NAME}_SOLVERS_SOURCES}
+    ${${PROJECT_NAME}_DECOMPOSITIONS_SOURCES}
+    src/exception.cpp
+    src/eigenpy.cpp
+    src/numpy.cpp
+    src/numpy-type.cpp
+    src/matrix-float.cpp
+    src/matrix-complex-float.cpp
+    src/matrix-complex-double.cpp
+    src/register.cpp
+    src/matrix-double.cpp
+    src/matrix-long-double.cpp
+    src/matrix-complex-long-double.cpp
+    src/matrix-bool.cpp
+    src/matrix-int.cpp
+    src/matrix-long.cpp
+    src/angle-axis.cpp
+    src/quaternion.cpp
+    src/geometry-conversion.cpp
+    src/version.cpp)
+
+add_library(${PROJECT_NAME} SHARED ${${PROJECT_NAME}_SOURCES}
+                                   ${${PROJECT_NAME}_HEADERS})
+target_include_directories(
+  ${PROJECT_NAME} SYSTEM
+  PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include>
+         $<INSTALL_INTERFACE:include>)
+
+modernize_target_link_libraries(
+  ${PROJECT_NAME}
+  SCOPE
+  PUBLIC
+  TARGETS
+  Eigen3::Eigen
+  INCLUDE_DIRS
+  ${EIGEN3_INCLUDE_DIR})
+
+modernize_target_link_libraries(
+  ${PROJECT_NAME}
+  SCOPE
+  PUBLIC
+  TARGETS
+  Python3::NumPy
+  INCLUDE_DIRS
+  ${NUMPY_INCLUDE_DIR})
+target_include_directories(${PROJECT_NAME} SYSTEM
+                           PRIVATE ${PYTHON_INCLUDE_DIRS})
+
+if(SUFFIX_SO_VERSION)
+  set_target_properties(${PROJECT_NAME} PROPERTIES SOVERSION ${PROJECT_VERSION})
+endif(SUFFIX_SO_VERSION)
+
+if(NOT WIN32)
+  target_compile_options(
+    ${PROJECT_NAME} PRIVATE $<$<CXX_COMPILER_ID:MSVC>:-bigobj>
+                            "-Wno-conversion")
+else()
+  target_compile_options(${PROJECT_NAME}
+                         PRIVATE $<$<CXX_COMPILER_ID:MSVC>:-bigobj>)
+endif()
+
+target_link_boost_python(${PROJECT_NAME} PUBLIC)
+install(
+  TARGETS ${PROJECT_NAME}
   EXPORT ${TARGETS_EXPORT_NAME}
   PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_FULL_INCLUDEDIR}
-  INCLUDES DESTINATION ${CMAKE_INSTALL_FULL_INCLUDEDIR}
+  INCLUDES
+  DESTINATION ${CMAKE_INSTALL_FULL_INCLUDEDIR}
   LIBRARY DESTINATION ${CMAKE_INSTALL_FULL_LIBDIR}
   ARCHIVE DESTINATION ${CMAKE_INSTALL_FULL_LIBDIR}
   RUNTIME DESTINATION ${CMAKE_INSTALL_FULL_BINDIR})
 
-ADD_HEADER_GROUP(${PROJECT_NAME}_HEADERS)
-ADD_SOURCE_GROUP(${PROJECT_NAME}_SOURCES)
+add_header_group(${PROJECT_NAME}_HEADERS)
+add_source_group(${PROJECT_NAME}_SOURCES)
 
 # Install package for ROS
 install(FILES package.xml DESTINATION share/eigenpy)
 # Allows Colcon to find non-Ament packages when using workspace underlays
-file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/share/ament_index/resource_index/packages/${PROJECT_NAME} "")
-install(FILES ${CMAKE_CURRENT_BINARY_DIR}/share/ament_index/resource_index/packages/${PROJECT_NAME} DESTINATION share/ament_index/resource_index/packages)
-file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/share/${PROJECT_NAME}/hook/ament_prefix_path.dsv "prepend-non-duplicate;AMENT_PREFIX_PATH;")
-install(FILES ${CMAKE_CURRENT_BINARY_DIR}/share/${PROJECT_NAME}/hook/ament_prefix_path.dsv DESTINATION share/${PROJECT_NAME}/hook)
-file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/share/${PROJECT_NAME}/hook/python_path.dsv "prepend-non-duplicate;PYTHONPATH;${PYTHON_SITELIB}")
-install(FILES ${CMAKE_CURRENT_BINARY_DIR}/share/${PROJECT_NAME}/hook/python_path.dsv DESTINATION share/${PROJECT_NAME}/hook)
+file(
+  WRITE
+  ${CMAKE_CURRENT_BINARY_DIR}/share/ament_index/resource_index/packages/${PROJECT_NAME}
+  "")
+install(
+  FILES
+    ${CMAKE_CURRENT_BINARY_DIR}/share/ament_index/resource_index/packages/${PROJECT_NAME}
+  DESTINATION share/ament_index/resource_index/packages)
+file(
+  WRITE
+  ${CMAKE_CURRENT_BINARY_DIR}/share/${PROJECT_NAME}/hook/ament_prefix_path.dsv
+  "prepend-non-duplicate;AMENT_PREFIX_PATH;")
+install(
+  FILES
+    ${CMAKE_CURRENT_BINARY_DIR}/share/${PROJECT_NAME}/hook/ament_prefix_path.dsv
+  DESTINATION share/${PROJECT_NAME}/hook)
+file(WRITE
+     ${CMAKE_CURRENT_BINARY_DIR}/share/${PROJECT_NAME}/hook/python_path.dsv
+     "prepend-non-duplicate;PYTHONPATH;${PYTHON_SITELIB}")
+install(
+  FILES ${CMAKE_CURRENT_BINARY_DIR}/share/${PROJECT_NAME}/hook/python_path.dsv
+  DESTINATION share/${PROJECT_NAME}/hook)
 
 # ----------------------------------------------------
 # --- PYTHON LIBRARY ---------------------------------
 # ----------------------------------------------------
-ADD_SUBDIRECTORY(python)
+add_subdirectory(python)
 
 # ----------------------------------------------------
 # --- UNIT TEST --------------------------------------
 # ----------------------------------------------------
-ADD_SUBDIRECTORY(unittest)
+add_subdirectory(unittest)
 
-PKG_CONFIG_APPEND_LIBS(${PROJECT_NAME})
-PKG_CONFIG_APPEND_CFLAGS("-I${PYTHON_INCLUDE_DIRS}")
-PKG_CONFIG_APPEND_CFLAGS("-I${NUMPY_INCLUDE_DIRS}")
-PKG_CONFIG_APPEND_BOOST_LIBS(${BOOST_COMPONENTS})
+pkg_config_append_libs(${PROJECT_NAME})
+pkg_config_append_cflags("-I${PYTHON_INCLUDE_DIRS}")
+pkg_config_append_cflags("-I${NUMPY_INCLUDE_DIRS}")
+pkg_config_append_boost_libs(${BOOST_COMPONENTS})
diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt
index 75faa46f8bdcc9fbad0fc3d8baf99e87eb80811c..10f7d755e6e4a0ecb0ce23e13b166890f7ea4a22 100644
--- a/python/CMakeLists.txt
+++ b/python/CMakeLists.txt
@@ -3,58 +3,59 @@
 #
 
 # --- LIBRARY --- #
-SET(PYWRAP ${PROJECT_NAME}_pywrap)
-SET(PYWRAP ${PYWRAP} PARENT_SCOPE)
+set(PYWRAP ${PROJECT_NAME}_pywrap)
+set(PYWRAP
+    ${PYWRAP}
+    PARENT_SCOPE)
 
-MAKE_DIRECTORY("${${PROJECT_NAME}_BINARY_DIR}/python/${PROJECT_NAME}")
+make_directory("${${PROJECT_NAME}_BINARY_DIR}/python/${PROJECT_NAME}")
 include("${JRL_CMAKE_MODULES}/stubs.cmake")
 
-ADD_CUSTOM_TARGET(python)
-SET_TARGET_PROPERTIES(python PROPERTIES EXCLUDE_FROM_DEFAULT_BUILD True)
-
-ADD_LIBRARY(${PYWRAP} SHARED main.cpp)
-ADD_DEPENDENCIES(python ${PYWRAP})
-TARGET_LINK_LIBRARIES(${PYWRAP} PUBLIC ${PROJECT_NAME})
-# BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS spews conversion warnings from int to long unsigned int.
-# Unfortunately, using literals does not work in a macro. As such, this turns them off for the entire wrapper:
-IF(NOT WIN32)
-  TARGET_COMPILE_OPTIONS(${PYWRAP} PRIVATE "-Wno-conversion")
-ENDIF()
-IF(IS_ABSOLUTE ${PYTHON_SITELIB})
-  SET(ABSOLUTE_PYTHON_SITELIB ${PYTHON_SITELIB})
-ELSE()
-  SET(ABSOLUTE_PYTHON_SITELIB ${CMAKE_INSTALL_PREFIX}/${PYTHON_SITELIB})
-ENDIF()
-SET(${PYWRAP}_INSTALL_DIR ${ABSOLUTE_PYTHON_SITELIB}/${PROJECT_NAME})
-
-SET_TARGET_PROPERTIES(${PYWRAP}
-  PROPERTIES
-  PREFIX ""
-  SUFFIX ${PYTHON_EXT_SUFFIX}
-  LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/python/${PROJECT_NAME}"
-  )
-
-IF(UNIX AND NOT APPLE)
-  SET_TARGET_PROPERTIES(${PYWRAP} PROPERTIES INSTALL_RPATH "\$ORIGIN/../../..")
-ENDIF()
-
-INSTALL(TARGETS ${PYWRAP} DESTINATION ${${PYWRAP}_INSTALL_DIR})
+add_custom_target(python)
+set_target_properties(python PROPERTIES EXCLUDE_FROM_DEFAULT_BUILD True)
+
+add_library(${PYWRAP} SHARED main.cpp)
+add_dependencies(python ${PYWRAP})
+target_link_libraries(${PYWRAP} PUBLIC ${PROJECT_NAME})
+# BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS spews conversion warnings from int to
+# long unsigned int. Unfortunately, using literals does not work in a macro. As
+# such, this turns them off for the entire wrapper:
+if(NOT WIN32)
+  target_compile_options(${PYWRAP} PRIVATE "-Wno-conversion")
+endif()
+if(IS_ABSOLUTE ${PYTHON_SITELIB})
+  set(ABSOLUTE_PYTHON_SITELIB ${PYTHON_SITELIB})
+else()
+  set(ABSOLUTE_PYTHON_SITELIB ${CMAKE_INSTALL_PREFIX}/${PYTHON_SITELIB})
+endif()
+set(${PYWRAP}_INSTALL_DIR ${ABSOLUTE_PYTHON_SITELIB}/${PROJECT_NAME})
+
+set_target_properties(
+  ${PYWRAP}
+  PROPERTIES PREFIX ""
+             SUFFIX ${PYTHON_EXT_SUFFIX}
+             LIBRARY_OUTPUT_DIRECTORY
+             "${CMAKE_BINARY_DIR}/python/${PROJECT_NAME}")
+
+if(UNIX AND NOT APPLE)
+  set_target_properties(${PYWRAP} PROPERTIES INSTALL_RPATH "\$ORIGIN/../../..")
+endif()
+
+install(TARGETS ${PYWRAP} DESTINATION ${${PYWRAP}_INSTALL_DIR})
 
 # --- GENERATE STUBS
-IF(GENERATE_PYTHON_STUBS)
-  LOAD_STUBGEN()
+if(GENERATE_PYTHON_STUBS)
+  load_stubgen()
 
-  GENERATE_STUBS(${CMAKE_CURRENT_BINARY_DIR} ${PROJECT_NAME} ${ABSOLUTE_PYTHON_SITELIB})
-ENDIF(GENERATE_PYTHON_STUBS)
+  generate_stubs(${CMAKE_CURRENT_BINARY_DIR} ${PROJECT_NAME}
+                 ${ABSOLUTE_PYTHON_SITELIB})
+endif(GENERATE_PYTHON_STUBS)
 
 # --- INSTALL SCRIPTS
-SET(PYTHON_FILES
-  __init__.py
-  )
-
-FOREACH(python ${PYTHON_FILES})
-  PYTHON_BUILD(${PROJECT_NAME} ${python})
-  INSTALL(FILES
-    "${CMAKE_CURRENT_SOURCE_DIR}/eigenpy/${python}"
-    DESTINATION ${${PYWRAP}_INSTALL_DIR})
-ENDFOREACH(python)
+set(PYTHON_FILES __init__.py)
+
+foreach(python ${PYTHON_FILES})
+  python_build(${PROJECT_NAME} ${python})
+  install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/eigenpy/${python}"
+          DESTINATION ${${PYWRAP}_INSTALL_DIR})
+endforeach(python)
diff --git a/unittest/CMakeLists.txt b/unittest/CMakeLists.txt
index 80b451e554d84cb576742fbdce390120a82e9a27..55d6b569944d46878c5c08da0a81a0c00b89f6bf 100644
--- a/unittest/CMakeLists.txt
+++ b/unittest/CMakeLists.txt
@@ -1,69 +1,80 @@
 #
-# Copyright (c) 2014-2019 CNRS
-# Copyright (c) 2018-2021 INRIA
+# Copyright (c) 2014-2019 CNRS Copyright (c) 2018-2021 INRIA
 #
 
-MACRO(ADD_LIB_UNIT_TEST test)
-  CREATE_CTEST_BUILD_TESTS_TARGET()
-
-  IF(BUILD_TESTING)
-    ADD_LIBRARY(${test} SHARED "${test}.cpp")
-  ELSE(BUILD_TESTING)
-    ADD_LIBRARY(${test} SHARED EXCLUDE_FROM_ALL "${test}.cpp")
-  ENDIF(BUILD_TESTING)
-
-  TARGET_LINK_LIBRARIES(${test} PUBLIC ${PROJECT_NAME})
-  SET_TARGET_PROPERTIES(${test} PROPERTIES PREFIX "")
-
-  SET_TARGET_PROPERTIES(${test} PROPERTIES SUFFIX ${PYTHON_EXT_SUFFIX})
-
-  ADD_TEST(NAME ${test} COMMAND ${PYTHON_EXECUTABLE} -c "import ${test}")
-
-  ADD_DEPENDENCIES(build_tests ${test})
-  IF(NOT BUILD_TESTING)
-    SET_TESTS_PROPERTIES(${test} PROPERTIES DEPENDS ctest_build_tests)
-  ENDIF(NOT BUILD_TESTING)
-ENDMACRO(ADD_LIB_UNIT_TEST)
-
-ADD_LIB_UNIT_TEST(matrix)
-ADD_LIB_UNIT_TEST(geometry)
-ADD_LIB_UNIT_TEST(complex)
-ADD_LIB_UNIT_TEST(return_by_ref)
-ADD_LIB_UNIT_TEST(include)
-IF(NOT ${EIGEN3_VERSION} VERSION_LESS "3.2.0")
-  ADD_LIB_UNIT_TEST(eigen_ref)
-ENDIF()
-ADD_LIB_UNIT_TEST(user_type)
-
-ADD_PYTHON_UNIT_TEST("py-matrix" "unittest/python/test_matrix.py" "unittest")
-ADD_PYTHON_UNIT_TEST("py-geometry" "unittest/python/test_geometry.py" "unittest")
-ADD_PYTHON_UNIT_TEST("py-complex" "unittest/python/test_complex.py" "unittest")
-ADD_PYTHON_UNIT_TEST("py-return-by-ref" "unittest/python/test_return_by_ref.py" "unittest")
-ADD_PYTHON_UNIT_TEST("py-eigen-ref" "unittest/python/test_eigen_ref.py" "unittest")
-ADD_PYTHON_UNIT_TEST("py-user-type" "unittest/python/test_user_type.py" "unittest")
-
-ADD_PYTHON_UNIT_TEST("py-switch" "unittest/python/test_switch.py" "python;unittest")
-SET_TESTS_PROPERTIES("py-switch" PROPERTIES DEPENDS ${PYWRAP})
-
-ADD_PYTHON_UNIT_TEST("py-dimensions" "unittest/python/test_dimensions.py" "python;unittest")
-SET_TESTS_PROPERTIES("py-dimensions" PROPERTIES DEPENDS ${PYWRAP})
-
-ADD_PYTHON_UNIT_TEST("py-version" "unittest/python/test_version.py" "python;unittest")
-SET_TESTS_PROPERTIES("py-version" PROPERTIES DEPENDS ${PYWRAP})
-
-ADD_PYTHON_UNIT_TEST("py-eigen-solver" "unittest/python/test_eigen_solver.py" "python;unittest")
-SET_TESTS_PROPERTIES("py-eigen-solver" PROPERTIES DEPENDS ${PYWRAP})
-
-ADD_PYTHON_UNIT_TEST("py-self-adjoint-eigen-solver" "unittest/python/test_self_adjoint_eigen_solver.py" "python;unittest")
-SET_TESTS_PROPERTIES("py-self-adjoint-eigen-solver" PROPERTIES DEPENDS ${PYWRAP})
-
-ADD_PYTHON_UNIT_TEST("py-LLT" "unittest/python/test_LLT.py" "python;unittest")
-SET_TESTS_PROPERTIES("py-LLT" PROPERTIES DEPENDS ${PYWRAP})
-
-ADD_PYTHON_UNIT_TEST("py-LDLT" "unittest/python/test_LDLT.py" "python;unittest")
-SET_TESTS_PROPERTIES("py-LDLT" PROPERTIES DEPENDS ${PYWRAP})
-
-IF(NOT WIN32)
-  ADD_PYTHON_UNIT_TEST("py-MINRES" "unittest/python/test_MINRES.py" "python;unittest")
-  SET_TESTS_PROPERTIES("py-MINRES" PROPERTIES DEPENDS ${PYWRAP})
-ENDIF(NOT WIN32)
+macro(ADD_LIB_UNIT_TEST test)
+  create_ctest_build_tests_target()
+
+  if(BUILD_TESTING)
+    add_library(${test} SHARED "${test}.cpp")
+  else(BUILD_TESTING)
+    add_library(${test} SHARED EXCLUDE_FROM_ALL "${test}.cpp")
+  endif(BUILD_TESTING)
+
+  target_link_libraries(${test} PUBLIC ${PROJECT_NAME})
+  set_target_properties(${test} PROPERTIES PREFIX "")
+
+  set_target_properties(${test} PROPERTIES SUFFIX ${PYTHON_EXT_SUFFIX})
+
+  add_test(NAME ${test} COMMAND ${PYTHON_EXECUTABLE} -c "import ${test}")
+
+  add_dependencies(build_tests ${test})
+  if(NOT BUILD_TESTING)
+    set_tests_properties(${test} PROPERTIES DEPENDS ctest_build_tests)
+  endif(NOT BUILD_TESTING)
+endmacro(ADD_LIB_UNIT_TEST)
+
+add_lib_unit_test(matrix)
+add_lib_unit_test(geometry)
+add_lib_unit_test(complex)
+add_lib_unit_test(return_by_ref)
+add_lib_unit_test(include)
+if(NOT ${EIGEN3_VERSION} VERSION_LESS "3.2.0")
+  add_lib_unit_test(eigen_ref)
+endif()
+add_lib_unit_test(user_type)
+
+add_python_unit_test("py-matrix" "unittest/python/test_matrix.py" "unittest")
+add_python_unit_test("py-geometry" "unittest/python/test_geometry.py"
+                     "unittest")
+add_python_unit_test("py-complex" "unittest/python/test_complex.py" "unittest")
+add_python_unit_test("py-return-by-ref" "unittest/python/test_return_by_ref.py"
+                     "unittest")
+add_python_unit_test("py-eigen-ref" "unittest/python/test_eigen_ref.py"
+                     "unittest")
+add_python_unit_test("py-user-type" "unittest/python/test_user_type.py"
+                     "unittest")
+
+add_python_unit_test("py-switch" "unittest/python/test_switch.py"
+                     "python;unittest")
+set_tests_properties("py-switch" PROPERTIES DEPENDS ${PYWRAP})
+
+add_python_unit_test("py-dimensions" "unittest/python/test_dimensions.py"
+                     "python;unittest")
+set_tests_properties("py-dimensions" PROPERTIES DEPENDS ${PYWRAP})
+
+add_python_unit_test("py-version" "unittest/python/test_version.py"
+                     "python;unittest")
+set_tests_properties("py-version" PROPERTIES DEPENDS ${PYWRAP})
+
+add_python_unit_test("py-eigen-solver" "unittest/python/test_eigen_solver.py"
+                     "python;unittest")
+set_tests_properties("py-eigen-solver" PROPERTIES DEPENDS ${PYWRAP})
+
+add_python_unit_test(
+  "py-self-adjoint-eigen-solver"
+  "unittest/python/test_self_adjoint_eigen_solver.py" "python;unittest")
+set_tests_properties("py-self-adjoint-eigen-solver" PROPERTIES DEPENDS
+                                                               ${PYWRAP})
+
+add_python_unit_test("py-LLT" "unittest/python/test_LLT.py" "python;unittest")
+set_tests_properties("py-LLT" PROPERTIES DEPENDS ${PYWRAP})
+
+add_python_unit_test("py-LDLT" "unittest/python/test_LDLT.py" "python;unittest")
+set_tests_properties("py-LDLT" PROPERTIES DEPENDS ${PYWRAP})
+
+if(NOT WIN32)
+  add_python_unit_test("py-MINRES" "unittest/python/test_MINRES.py"
+                       "python;unittest")
+  set_tests_properties("py-MINRES" PROPERTIES DEPENDS ${PYWRAP})
+endif(NOT WIN32)