diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 2012a81cb61370bbf51ce1cba517d616c911547e..5b4624a0a8eae2779c200d12860a0b49a86a8d81 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -30,3 +30,7 @@ repos:
     rev: 6.0.0
     hooks:
     -   id: flake8
+-   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 10b18df11818c7b8aa263d9b7fa5f7ffcca46b1a..78be3ae9e9d3c7ff7f5a2baeb3797e057c0715c5 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,51 +1,56 @@
-CMAKE_MINIMUM_REQUIRED(VERSION 3.1)
+cmake_minimum_required(VERSION 3.1)
 
 # Project properties
-SET(PROJECT_ORG gepetto)
-SET(PROJECT_NAME example-robot-data)
-SET(PROJECT_DESCRIPTION "Set of robot URDFs for benchmarking and developed examples.")
-SET(PROJECT_URL https://github.com/${PROJECT_ORG}/${PROJECT_NAME})
+set(PROJECT_ORG gepetto)
+set(PROJECT_NAME example-robot-data)
+set(PROJECT_DESCRIPTION
+    "Set of robot URDFs for benchmarking and developed examples.")
+set(PROJECT_URL https://github.com/${PROJECT_ORG}/${PROJECT_NAME})
 
 # Project options
-OPTION(BUILD_PYTHON_INTERFACE "Build the python unit tests and helpers" ON)
-OPTION(INSTALL_PYTHON_INTERFACE_ONLY "Install *ONLY* the python interface" OFF)
+option(BUILD_PYTHON_INTERFACE "Build the python unit tests and helpers" ON)
+option(INSTALL_PYTHON_INTERFACE_ONLY "Install *ONLY* the python interface" OFF)
 
 # Project configuration
-IF(NOT INSTALL_PYTHON_INTERFACE_ONLY)
-  SET(PROJECT_USE_CMAKE_EXPORT TRUE)
-ENDIF(NOT INSTALL_PYTHON_INTERFACE_ONLY)
-SET(CUSTOM_HEADER_DIR ${PROJECT_NAME})
-SET(PROJECT_COMPATIBILITY_VERSION AnyNewerVersion)
+if(NOT INSTALL_PYTHON_INTERFACE_ONLY)
+  set(PROJECT_USE_CMAKE_EXPORT TRUE)
+endif(NOT INSTALL_PYTHON_INTERFACE_ONLY)
+set(CUSTOM_HEADER_DIR ${PROJECT_NAME})
+set(PROJECT_COMPATIBILITY_VERSION AnyNewerVersion)
 
 # JRL-cmakemodule setup
-INCLUDE(cmake/base.cmake)
+include(cmake/base.cmake)
 
 # Print initial message
-MESSAGE(STATUS "${PROJECT_DESCRIPTION}, version ${PROJECT_VERSION}")
-MESSAGE(STATUS "Copyright (C) 2018-2021 LAAS-CNRS, University of Edinburgh")
-MESSAGE(STATUS "All rights reserved.")
-MESSAGE(STATUS "Released under the BSD 3-Clause License.")
+message(STATUS "${PROJECT_DESCRIPTION}, version ${PROJECT_VERSION}")
+message(STATUS "Copyright (C) 2018-2021 LAAS-CNRS, University of Edinburgh")
+message(STATUS "All rights reserved.")
+message(STATUS "Released under the BSD 3-Clause License.")
 
 # Project definition
-COMPUTE_PROJECT_ARGS(PROJECT_ARGS LANGUAGES CXX)
-PROJECT(${PROJECT_NAME} ${PROJECT_ARGS})
-
-IF(BUILD_PYTHON_INTERFACE)
-  ADD_PROJECT_DEPENDENCY(eigenpy 2.7.11 REQUIRED)
-  ADD_PROJECT_DEPENDENCY(pinocchio REQUIRED)
-  STRING(REGEX REPLACE "-" "_" PY_NAME ${PROJECT_NAME})
-  ADD_SUBDIRECTORY(python)
-  IF(BUILD_TESTING)
-    ADD_SUBDIRECTORY(unittest)
-  ENDIF(BUILD_TESTING)
-ENDIF(BUILD_PYTHON_INTERFACE)
-
-IF(NOT INSTALL_PYTHON_INTERFACE_ONLY)
-  ADD_LIBRARY(${PROJECT_NAME} INTERFACE)
-  TARGET_INCLUDE_DIRECTORIES(${PROJECT_NAME} INTERFACE $<INSTALL_INTERFACE:include>)
-  INSTALL(TARGETS ${PROJECT_NAME} EXPORT ${TARGETS_EXPORT_NAME} DESTINATION lib)
-
-  ADD_SUBDIRECTORY(include/${CUSTOM_HEADER_DIR})
-  INSTALL(DIRECTORY robots DESTINATION share/${PROJECT_NAME})
-  INSTALL(FILES package.xml DESTINATION share/${PROJECT_NAME})
-ENDIF(NOT INSTALL_PYTHON_INTERFACE_ONLY)
+compute_project_args(PROJECT_ARGS LANGUAGES CXX)
+project(${PROJECT_NAME} ${PROJECT_ARGS})
+
+if(BUILD_PYTHON_INTERFACE)
+  add_project_dependency(eigenpy 2.7.11 REQUIRED)
+  add_project_dependency(pinocchio REQUIRED)
+  string(REGEX REPLACE "-" "_" PY_NAME ${PROJECT_NAME})
+  add_subdirectory(python)
+  if(BUILD_TESTING)
+    add_subdirectory(unittest)
+  endif(BUILD_TESTING)
+endif(BUILD_PYTHON_INTERFACE)
+
+if(NOT INSTALL_PYTHON_INTERFACE_ONLY)
+  add_library(${PROJECT_NAME} INTERFACE)
+  target_include_directories(${PROJECT_NAME}
+                             INTERFACE $<INSTALL_INTERFACE:include>)
+  install(
+    TARGETS ${PROJECT_NAME}
+    EXPORT ${TARGETS_EXPORT_NAME}
+    DESTINATION lib)
+
+  add_subdirectory(include/${CUSTOM_HEADER_DIR})
+  install(DIRECTORY robots DESTINATION share/${PROJECT_NAME})
+  install(FILES package.xml DESTINATION share/${PROJECT_NAME})
+endif(NOT INSTALL_PYTHON_INTERFACE_ONLY)
diff --git a/include/example-robot-data/CMakeLists.txt b/include/example-robot-data/CMakeLists.txt
index 34f2f2316501f51577c896bc0b265e51870f08db..c5c41852eb2421acc50a1369cff011d08ea61176 100644
--- a/include/example-robot-data/CMakeLists.txt
+++ b/include/example-robot-data/CMakeLists.txt
@@ -1,2 +1,3 @@
-CONFIGURE_FILE(path.hpp.in path.hpp)
-INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/path.hpp DESTINATION include/${CUSTOM_HEADER_DIR})
+configure_file(path.hpp.in path.hpp)
+install(FILES ${CMAKE_CURRENT_BINARY_DIR}/path.hpp
+        DESTINATION include/${CUSTOM_HEADER_DIR})
diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt
index ce695288afdc4154eaf2ba452e224c850bed1bf3..6f889dc7e89f4f32a97e9af8a091751b1e273ddf 100644
--- a/python/CMakeLists.txt
+++ b/python/CMakeLists.txt
@@ -1,12 +1,9 @@
-SET(${PROJECT_NAME}_PYTHON_FILES
-  robots_loader.py
-  __main__.py
-  __init__.py
-  )
+set(${PROJECT_NAME}_PYTHON_FILES robots_loader.py __main__.py __init__.py)
 
-FOREACH(python ${${PROJECT_NAME}_PYTHON_FILES})
-  PYTHON_INSTALL_ON_SITE(${PY_NAME} ${python})
-ENDFOREACH(python ${${PROJECT_NAME}_PYTHON_FILES})
+foreach(python ${${PROJECT_NAME}_PYTHON_FILES})
+  python_install_on_site(${PY_NAME} ${python})
+endforeach(python ${${PROJECT_NAME}_PYTHON_FILES})
 
-CONFIGURE_FILE(${PY_NAME}/path.py.in ${PY_NAME}/path.py)
-INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PY_NAME}/path.py DESTINATION "${PYTHON_SITELIB}/${PY_NAME}")
+configure_file(${PY_NAME}/path.py.in ${PY_NAME}/path.py)
+install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PY_NAME}/path.py
+        DESTINATION "${PYTHON_SITELIB}/${PY_NAME}")
diff --git a/unittest/CMakeLists.txt b/unittest/CMakeLists.txt
index 18fe801a52de73121dbc6b6cf7e3907f8fd073a4..a157b678517a28f50ff2d19f40a51acb400e0cb7 100644
--- a/unittest/CMakeLists.txt
+++ b/unittest/CMakeLists.txt
@@ -1,12 +1,13 @@
-IF(NOT pinocchio_FOUND)
-  MESSAGE(FATAL_ERROR "Pinocchio is required to build unit tests\n"
-  "please either install Pinocchio or reconfigure without unit tests (-DBUILD_TESTING=OFF)")
-ENDIF(NOT pinocchio_FOUND)
-
-SET(${PROJECT_NAME}_PYTHON_TESTS
-  load
+if(NOT pinocchio_FOUND)
+  message(
+    FATAL_ERROR
+      "Pinocchio is required to build unit tests\n"
+      "please either install Pinocchio or reconfigure without unit tests (-DBUILD_TESTING=OFF)"
   )
+endif(NOT pinocchio_FOUND)
+
+set(${PROJECT_NAME}_PYTHON_TESTS load)
 
-FOREACH(TEST ${${PROJECT_NAME}_PYTHON_TESTS})
-  ADD_PYTHON_UNIT_TEST("py-${TEST}" "unittest/test_${TEST}.py" python)
-ENDFOREACH(TEST ${${PROJECT_NAME}_PYTHON_TESTS})
+foreach(TEST ${${PROJECT_NAME}_PYTHON_TESTS})
+  add_python_unit_test("py-${TEST}" "unittest/test_${TEST}.py" python)
+endforeach(TEST ${${PROJECT_NAME}_PYTHON_TESTS})