diff --git a/.cmake-format.py b/.cmake-format.py
new file mode 100644
index 0000000000000000000000000000000000000000..d10da97de1b1cd803b65a1ac46f833340757c9d1
--- /dev/null
+++ b/.cmake-format.py
@@ -0,0 +1,49 @@
+# ICON
+#
+# ---------------------------------------------------------------
+# Copyright (C) 2004-2024, DWD, MPI-M, DKRZ, KIT, ETH, MeteoSwiss
+# Contact information: icon-model.org
+#
+# See AUTHORS.TXT for a list of authors
+# See LICENSES/ for license information
+# SPDX-License-Identifier: CC0-1.0
+# ---------------------------------------------------------------
+
+with section("parse"):
+	additional_commands = {
+	  "check_macro_defined": {
+	  	"pargs": 2,
+	  	"flags": ["QUIET"],
+	  	"kwargs": {
+	  		"LANG": 1
+	  	}
+	  },
+	  "add_icon_c_test": {
+	  	"pargs": 2
+	  },
+	  "list_sources": {
+	  	"pargs": 1,
+	  	"flags": ["EXCLUDE_GENERATED"],
+	  	"kwargs": {
+	  		"DIRECTORY": 1,
+	  		"INCLUDE_REGEX": 1
+	  	}
+	  },
+	  "FortUTF_Find_Tests": {}
+	}
+
+with section("format"):
+	line_width = 80
+	autosort = True
+	keyword_case = 'upper'
+
+with section("markup"):
+	first_comment_is_literal = True
+
+with section("lint"):
+	disabled_codes = ['C0301']
+	function_pattern = '[0-9a-z_]+'
+	macro_pattern = '[0-9a-z_]+'
+	local_var_pattern = '[a-zA-Z][0-9a-zA-z_]+'
+	private_var_pattern = '[a-z][a-z0-9_]+'
+	public_var_pattern = '[A-Z][0-9a-zA-Z_]+'
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index e9e6df2c43e04196398e9fa2747e3151c9f6141e..8531ca1feeee032df7eeeeb2d093eaa7cae47f79 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -42,7 +42,7 @@ nag:
     - ctest --output-on-failure
   tags:
     - levante-fake, hpc, dkrz
-  needs: ["Check Typo", "Check OpenACC Style", "Check Style", "Check License"]
+  needs: ["Check Typo", "Check OpenACC Style", "Check Style", "Check CMake Style", "Check License"]
 
 gcc11:
   stage: build_and_test
@@ -57,7 +57,7 @@ gcc11:
     - ctest --output-on-failure
   tags:
     - levante-fake, hpc, dkrz
-  needs: ["Check Typo", "Check OpenACC Style", "Check Style", "Check License"]
+  needs: ["Check Typo", "Check OpenACC Style", "Check Style", "Check CMake Style", "Check License"]
 
 intel22:
   stage: build_and_test
@@ -72,7 +72,7 @@ intel22:
     - ctest --output-on-failure
   tags:
     - levante-fake, hpc, dkrz
-  needs: ["Check Typo", "Check OpenACC Style", "Check Style", "Check License"]
+  needs: ["Check Typo", "Check OpenACC Style", "Check Style", "Check CMake Style", "Check License"]
 
 nvhpc:
   stage: build_and_test
@@ -87,7 +87,7 @@ nvhpc:
     - ctest --output-on-failure
   tags:
     - levante-fake, hpc, dkrz
-  needs: ["Check Typo", "Check OpenACC Style", "Check Style", "Check License"]
+  needs: ["Check Typo", "Check OpenACC Style", "Check Style", "Check CMake Style", "Check License"]
 
 OpenACC:
   stage: build_OpenACC
@@ -179,6 +179,19 @@ Check Style:
     when: on_failure
   needs: []
 
+Check CMake Style:
+  stage: lint
+  before_script:
+    #install the formatting tool
+    - pip install cmake-format
+  script:
+    # check style for CMake files.
+    - cmake-lint CMakeLists.txt src/CMakeLists.txt test/CMakeLists.txt test/c/CMakeLists.txt test/fortran/CMakeLists.txt cmake/check_macro.cmake cmake/gtest_helper.cmake cmake/list_sources.cmake
+  tags:
+    # choose runner
+    - sphinx
+  needs: []
+
 Check License:
   stage: lint
   before_script:
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 1d088f07774cc78381b1f02d6beaba6257b23f30..67f6a8f0616de313768010719b5136dfa1b66c80 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -11,7 +11,10 @@
 
 cmake_minimum_required(VERSION 3.18)
 
-project(fortran-support VERSION 0.1.0 LANGUAGES Fortran C)
+project(
+  fortran-support
+  VERSION 0.1.0
+  LANGUAGES Fortran C)
 
 option(BUILD_SHARED_LIBS "Build shared libraries" ON)
 option(BUILD_TESTING "Build tests" ON)
@@ -22,9 +25,14 @@ option(FS_ENABLE_OPENACC "Build with OpenACC support" OFF)
 option(FS_ENABLE_MIXED_PRECISION "Use mixed precision" OFF)
 
 if(NOT CMAKE_BUILD_TYPE)
-  set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING
-      "Choose the type of build, options are: Debug Release RelWithDebInfo" FORCE)
-  message(STATUS "Setting build type to '${CMAKE_BUILD_TYPE}' as none was specified")
+  set(CMAKE_BUILD_TYPE
+      "RelWithDebInfo"
+      CACHE
+        STRING
+        "Choose the type of build, options are: Debug Release RelWithDebInfo"
+        FORCE)
+  message(
+    STATUS "Setting build type to '${CMAKE_BUILD_TYPE}' as none was specified")
 endif(NOT CMAKE_BUILD_TYPE)
 
 include(GNUInstallDirs)
@@ -37,38 +45,27 @@ if(BUILD_TESTING)
   add_subdirectory(test)
 endif()
 
-export(
-  EXPORT "${PROJECT_NAME}-targets"
-  FILE "${PROJECT_BINARY_DIR}/${PROJECT_NAME}-targets.cmake"
-)
+export(EXPORT "${PROJECT_NAME}-targets"
+       FILE "${PROJECT_BINARY_DIR}/${PROJECT_NAME}-targets.cmake")
 
 include(CMakePackageConfigHelpers)
 configure_package_config_file(
   "${PROJECT_SOURCE_DIR}/cmake/config.cmake.in"
   "${PROJECT_BINARY_DIR}/${PROJECT_NAME}-config.cmake"
   INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake"
-  NO_SET_AND_CHECK_MACRO
-  NO_CHECK_REQUIRED_COMPONENTS_MACRO
-)
+  NO_SET_AND_CHECK_MACRO NO_CHECK_REQUIRED_COMPONENTS_MACRO)
 
 write_basic_package_version_file(
   "${PROJECT_BINARY_DIR}/${PROJECT_NAME}-config-version.cmake"
   VERSION "${${PROJECT_NAME}_VERSION_MAJOR}.${${PROJECT_NAME}_VERSION_MINOR}"
-  COMPATIBILITY AnyNewerVersion
-)
-
-install(
-  EXPORT "${PROJECT_NAME}-targets"
-  DESTINATION "${CMAKE_INSTALL_LIBDIR}/${PROJECT_NAME}/cmake"
-)
-
-install(
-  FILES
-    "${PROJECT_BINARY_DIR}/${PROJECT_NAME}-config.cmake"
-    "${PROJECT_BINARY_DIR}/${PROJECT_NAME}-config-version.cmake"
-  DESTINATION
-    "${CMAKE_INSTALL_LIBDIR}/${PROJECT_NAME}/cmake"
-)
+  COMPATIBILITY AnyNewerVersion)
+
+install(EXPORT "${PROJECT_NAME}-targets"
+        DESTINATION "${CMAKE_INSTALL_LIBDIR}/${PROJECT_NAME}/cmake")
+
+install(FILES "${PROJECT_BINARY_DIR}/${PROJECT_NAME}-config.cmake"
+              "${PROJECT_BINARY_DIR}/${PROJECT_NAME}-config-version.cmake"
+        DESTINATION "${CMAKE_INSTALL_LIBDIR}/${PROJECT_NAME}/cmake")
 
 include("${PROJECT_SOURCE_DIR}/cmake/list_sources.cmake")
 
@@ -92,35 +89,28 @@ if("${CMAKE_PROJECT_NAME}" STREQUAL "${PROJECT_NAME}")
   set(c_format_sources "${format_sources}")
   list(FILTER c_format_sources INCLUDE REGEX "\.(c|h|cpp|hpp)$")
 
-  add_custom_target(format-c
-    COMMAND
-      clang-format
-      --style=file
-      -i
-      ${c_format_sources}
-  )
+  add_custom_target(
+    format-c
+    COMMAND clang-format --style=file -i ${c_format_sources}
+    COMMENT "Format C codes")
 
   # Collect Fortran source files:
   set(fortran_format_sources "${format_sources}")
   list(FILTER fortran_format_sources INCLUDE REGEX "\.(f|F|f90|F90)$")
 
-  add_custom_target(format-fortran
-    COMMAND
-      # We do not use a config file but specify the formatting arguments on the
-      # command line because the feature requires an extra Python package and
-      # does not work for certain arguments even in the latest release
-      # (e.g., see https://github.com/pseewald/fprettify/issues/94):
-      fprettify
-      --case 2 2 2 1
-      --indent 2
-      --whitespace 2
-      --strip-comments
-      ${fortran_format_sources}
-  )
-
-  add_custom_target(format
-    DEPENDS
-      format-c
-      format-fortran
-  )
+  add_custom_target(
+    format-fortran
+    COMMAND # We do not use a config file but specify the formatting arguments
+            # on the command line because the feature requires an extra Python
+            # package and does not work for certain arguments even in the latest
+            # release (e.g., see
+            # https://github.com/pseewald/fprettify/issues/94):
+            fprettify --case 2 2 2 1 --indent 2 --whitespace 2 --strip-comments
+            ${fortran_format_sources}
+    COMMENT "Format Fortran codes")
+
+  add_custom_target(
+    format
+    DEPENDS format-c format-fortran
+    COMMENT "Format codes")
 endif()
diff --git a/cmake/check_macro.cmake b/cmake/check_macro.cmake
index b9d9f1d7f165d51a64f77899689250f2a2107b3a..7495b8554a7f7d7fc3547840e631f460850b5705 100644
--- a/cmake/check_macro.cmake
+++ b/cmake/check_macro.cmake
@@ -9,29 +9,27 @@
 # SPDX-License-Identifier: BSD-3-Clause
 # ---------------------------------------------------------------
 
+# cmake-format: off
 # check_macro_defined(<output>
 #                     <macro>
 #                     [LANG] <lang>
 #                     [QUIET])
+# cmake-format: on
 # -----------------------------------------------------------------------------
-# Sets <output> to ON or OFF depending on whether <macro> is already defined
-# via CMAKE_${lang}_FLAGS or not. However, this only works when <lang> is Fortran 
+# Sets <output> to ON or OFF depending on whether <macro> is already defined via
+# CMAKE_${lang}_FLAGS or not. However, this only works when <lang> is Fortran
 # and fails otherwise.
 #
 # <lang> can be set using LANG. <lang> is set as Fortran by default.
 #
 function(check_macro_defined output macro)
 
-  cmake_parse_arguments(PARSE_ARGV 1 ARG
-    "QUIET"
-    "LANG"
-    ""
-  )
+  cmake_parse_arguments(PARSE_ARGV 1 ARG "QUIET" "LANG" "")
 
-  if(NOT ARG_LANG) 
+  if(NOT ARG_LANG)
     set(ARG_LANG "Fortran")
   endif()
-    
+
   if(NOT ARG_LANG STREQUAL "Fortran")
     message(FATAL_ERROR "check_macro_defined supports only LANG Fortran")
   endif()
@@ -41,7 +39,8 @@ function(check_macro_defined output macro)
   endif()
 
   # Write a simple Fortran program that checks for ${macro}
-  set(check_source_code "
+  set(check_source_code
+      "
       program main
         implicit none
 #ifdef ${macro}
@@ -56,16 +55,15 @@ function(check_macro_defined output macro)
         b = 2
       end
 ")
-  
+
   # Write the Fortran code to a file
-  file(WRITE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/src.F90" "${check_source_code}")
-  
+  file(WRITE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/src.F90"
+       "${check_source_code}")
+
   # Try to compile the program
-  try_compile(result
-    "${CMAKE_BINARY_DIR}"
-    "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/src.F90"
-  )
-  
+  try_compile(result "${CMAKE_BINARY_DIR}"
+              "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/src.F90")
+
   if(NOT ARG_QUIET)
     if(${result})
       message(CHECK_PASS "yes")
@@ -74,6 +72,8 @@ function(check_macro_defined output macro)
     endif()
   endif()
 
-  set(${output} ${result} PARENT_SCOPE)
+  set(${output}
+      ${result}
+      PARENT_SCOPE)
 
 endfunction()
diff --git a/cmake/gtest_helper.cmake b/cmake/gtest_helper.cmake
index 5a78c7f2a2eb9fcb76d9a9be047a47078df678f7..7daae6ea8cfba241a97a19bb09e4d616524c73c8 100644
--- a/cmake/gtest_helper.cmake
+++ b/cmake/gtest_helper.cmake
@@ -9,10 +9,24 @@
 # SPDX-License-Identifier: BSD-3-Clause
 # ---------------------------------------------------------------
 
-macro(add_icon_c_test test_name file_names)
-    add_executable("CTest_${test_name}" ${file_names})
-    target_link_libraries("CTest_${test_name}" PRIVATE fortran-support::fortran-support GTest::gtest_main stdc++fs)
-    add_test(NAME "CTest_${test_name}" COMMAND "CTest_${test_name}")
-    set_property(TEST "CTest_${test_name}" PROPERTY LABELS C)
-    set_target_properties("CTest_${test_name}" PROPERTIES CXX_STANDARD 17 CXX_STANDARD_REQUIRED ON)
+# cmake-format: off
+# add_icon_c_test(<test>
+#                 <source>)
+# cmake-format: on
+# -----------------------------------------------------------------------------
+# Compiles a test executable with the name <test> using the source code
+# <source>. The googletest and fortran-support libraries will be linked
+# automatically.
+#
+# The C++ standard is set to C++17.
+#
+macro(add_icon_c_test test_name file_name)
+  add_executable("CTest_${test_name}" ${file_name})
+  target_link_libraries(
+    "CTest_${test_name}" PRIVATE fortran-support::fortran-support
+                                 GTest::gtest_main stdc++fs)
+  add_test(NAME "CTest_${test_name}" COMMAND "CTest_${test_name}")
+  set_property(TEST "CTest_${test_name}" PROPERTY LABELS C)
+  set_target_properties("CTest_${test_name}"
+                        PROPERTIES CXX_STANDARD 17 CXX_STANDARD_REQUIRED ON)
 endmacro()
diff --git a/cmake/list_sources.cmake b/cmake/list_sources.cmake
index 3ba5e3246a5d58a5241ed7df5a5a018a9b08fbc1..dd085372363b1b7e6f92612e2b5d28780c70827e 100644
--- a/cmake/list_sources.cmake
+++ b/cmake/list_sources.cmake
@@ -9,10 +9,12 @@
 # SPDX-License-Identifier: BSD-3-Clause
 # ---------------------------------------------------------------
 
+# cmake-format: off
 # list_sources(<var>
 #              [DIRECTORY <dir>]
 #              [INCLUDE_REGEX <include_regex>]
 #              [EXCLUDE_GENERATED])
+# cmake-format: on
 # ------------------------------------------------------------------------------
 # Sets <var> to a list of absolute paths to the source files of all targets in
 # all subdirectories of <dir> (defaults to the current source directory). The
@@ -25,18 +27,22 @@
 # are excluded from the result.
 #
 function(list_sources var)
-  cmake_parse_arguments(PARSE_ARGV 1 ARG
-    "EXCLUDE_GENERATED"
-    "DIRECTORY;INCLUDE_REGEX"
-    ""
-  )
+  cmake_parse_arguments(PARSE_ARGV 1 ARG "EXCLUDE_GENERATED"
+                        "DIRECTORY;INCLUDE_REGEX" "")
 
   if(ARG_EXCLUDE_GENERATED AND "${CMAKE_VERSION}" VERSION_LESS "3.18")
-    message(AUTHOR_WARNING
-      "The generated source files can be automatically excluded only with CMake 3.18 or newer.")
+    message(
+      AUTHOR_WARNING
+        "The generated source files can be automatically excluded only with CMake 3.18 or newer."
+    )
     set(ARG_EXCLUDE_GENERATED FALSE)
   endif()
 
+  # list_sources_recurse(<var> <dir>)
+  # ----------------------------------------------------------------------------
+  # This is a local function that finds the sources recursively. Do not use this
+  # function directly. Use list_sources instead.
+  #
   function(list_sources_recurse var dir)
     get_directory_property(dir_path DIRECTORY ${dir} SOURCE_DIR)
     get_directory_property(targets DIRECTORY ${dir} BUILDSYSTEM_TARGETS)
@@ -54,7 +60,8 @@ function(list_sources var)
       if(sources)
         foreach(source ${sources})
           if(${ARG_EXCLUDE_GENERATED})
-            get_source_file_property(source_generated ${source} DIRECTORY ${dir} GENERATED)
+            get_source_file_property(source_generated ${source} DIRECTORY
+                                     ${dir} GENERATED)
             if(source_generated)
               continue()
             endif()
@@ -69,7 +76,9 @@ function(list_sources var)
       list_sources_recurse(subdir_sources ${subdir} ${ARG_EXCLUDE_GENERATED})
       list(APPEND result ${subdir_sources})
     endforeach()
-    set(${var} ${result} PARENT_SCOPE)
+    set(${var}
+        ${result}
+        PARENT_SCOPE)
   endfunction()
 
   if(NOT ARG_DIRECTORY)
@@ -83,5 +92,7 @@ function(list_sources var)
   endif()
 
   list(REMOVE_DUPLICATES result)
-  set(${var} ${result} PARENT_SCOPE)
+  set(${var}
+      ${result}
+      PARENT_SCOPE)
 endfunction()
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index a1427110ef9a262fc78b3f9c7f516f017b5351c1..8b65d6e7a04f24964648e8d647ab59a65e3ecf81 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -15,16 +15,17 @@ check_include_files("link.h" HAVE_LINK_H)
 check_include_files("unwind.h" HAVE_UNWIND_H)
 check_include_files("sys/resource.h" HAVE_GETRUSAGE)
 
-configure_file(
-  ${CMAKE_CURRENT_SOURCE_DIR}/config.h.in
-  ${CMAKE_CURRENT_BINARY_DIR}/config.h)
+configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.in
+               ${CMAKE_CURRENT_BINARY_DIR}/config.h)
 
-if (FS_ENABLE_OMP)
+if(FS_ENABLE_OMP)
   find_package(OpenMP QUIET)
   set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} ${OpenMP_Fortran_FLAGS}")
-endif ()
+endif()
 
-add_library(fortran-support
+add_library(
+  fortran-support
+  ${CMAKE_CURRENT_BINARY_DIR}/config.h
   mo_exception.F90
   mo_expression.F90
   mo_fortran_tools.F90
@@ -60,72 +61,64 @@ add_library(fortran-support
   util_string_parse.c
   util_sysinfo.c
   util_system.c
-  util_timer.c
-  ${CMAKE_CURRENT_BINARY_DIR}/config.h
-)
+  util_timer.c)
 
 add_library(${PROJECT_NAME}::fortran-support ALIAS fortran-support)
 
 set(Fortran_MODULE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/mod")
-set_target_properties(fortran-support
-  PROPERTIES
-    Fortran_PREPROCESS ON
-    Fortran_MODULE_DIRECTORY "${Fortran_MODULE_DIRECTORY}"
-    C_STANDARD 99
-    C_STANDARD_REQUIRED ON
-    EXPORT_NAME ${PROJECT_NAME}::fortran-support
-)
+set_target_properties(
+  fortran-support
+  PROPERTIES Fortran_PREPROCESS ON
+             Fortran_MODULE_DIRECTORY "${Fortran_MODULE_DIRECTORY}"
+             C_STANDARD 99
+             C_STANDARD_REQUIRED ON
+             EXPORT_NAME ${PROJECT_NAME}::fortran-support)
 
-if (FS_ENABLE_MIXED_PRECISION)
+if(FS_ENABLE_MIXED_PRECISION)
   target_compile_definitions(fortran-support PRIVATE __MIXED_PRECISION)
-endif ()
+endif()
 
 include("${PROJECT_SOURCE_DIR}/cmake/check_macro.cmake")
 check_macro_defined(HAS_OPENACC_MACRO _OPENACC QUIET)
-if (FS_ENABLE_OPENACC)
+if(FS_ENABLE_OPENACC)
   # If _OPENACC is defined, assume that the required compiler flags are already
   # provided, e.g. in CMAKE_Fortran_FLAGS:
-  if (NOT HAS_OPENACC_MACRO)
+  if(NOT HAS_OPENACC_MACRO)
     # On LUMI, we only have OpenACC_Fortran, but no OpenACC_C
     find_package(OpenACC QUIET)
-    if (NOT OpenACC_Fortran_FOUND)
-      message(FATAL_ERROR
-        "Could NOT find OpenACC_Fortran.")
-    endif ()
+    if(NOT OpenACC_Fortran_FOUND)
+      message(FATAL_ERROR "Could NOT find OpenACC_Fortran.")
+    endif()
     target_compile_options(fortran-support PRIVATE ${OpenACC_Fortran_OPTIONS})
     # This make sures that unit tests (FortUTF) compiles without the need of
     # passing OpenACC compile option.
     target_link_libraries(fortran-support PRIVATE OpenACC::OpenACC_Fortran)
-  endif ()
-else ()
+  endif()
+else()
   if(HAS_OPENACC_MACRO)
-    message(FATAL_ERROR
-      "The OpenACC support is disabled but the _OPENACC macro is defined")
-  endif ()
-endif ()
+    message(
+      FATAL_ERROR
+        "The OpenACC support is disabled but the _OPENACC macro is defined")
+  endif()
+endif()
 
-target_include_directories(fortran-support
+target_include_directories(
+  fortran-support
   PUBLIC
-# Path to the Fortran modules:
+    # Path to the Fortran modules:
     $<BUILD_INTERFACE:$<$<COMPILE_LANGUAGE:Fortran>:${Fortran_MODULE_DIRECTORY}>>
     $<INSTALL_INTERFACE:$<$<COMPILE_LANGUAGE:Fortran>:${CMAKE_INSTALL_INCLUDEDIR}>>
   INTERFACE
-# Path to the internal C/C++ headers (for testing):
-# Requires CMake 3.15+ for multiple compile languages https://cmake.org/cmake/help/latest/manual/cmake-generator-expressions.7.html
+    # Path to the internal C/C++ headers (for testing): Requires CMake 3.15+ for
+    # multiple compile languages
+    # https://cmake.org/cmake/help/latest/manual/cmake-generator-expressions.7.html
     $<BUILD_INTERFACE:$<$<COMPILE_LANGUAGE:C,CXX>:${CMAKE_CURRENT_SOURCE_DIR}>>
   PRIVATE
-# Path to config.h (for C and C++ only):
-# Requires CMake 3.15+ for multiple compile languages https://cmake.org/cmake/help/latest/manual/cmake-generator-expressions.7.html
-    $<BUILD_INTERFACE:$<$<COMPILE_LANGUAGE:C,CXX>:${CMAKE_CURRENT_BINARY_DIR}>>
-)
+    # Path to config.h (for C and C++ only): Requires CMake 3.15+ for multiple
+    # compile languages
+    # https://cmake.org/cmake/help/latest/manual/cmake-generator-expressions.7.html
+    $<BUILD_INTERFACE:$<$<COMPILE_LANGUAGE:C,CXX>:${CMAKE_CURRENT_BINARY_DIR}>>)
 
-install(
-  TARGETS fortran-support
-  EXPORT "${PROJECT_NAME}-targets"
-)
+install(TARGETS fortran-support EXPORT "${PROJECT_NAME}-targets")
 
-install(
-  DIRECTORY
-    "${Fortran_MODULE_DIRECTORY}/"
-  TYPE INCLUDE
-)
+install(DIRECTORY "${Fortran_MODULE_DIRECTORY}/" TYPE INCLUDE)
diff --git a/test/c/CMakeLists.txt b/test/c/CMakeLists.txt
index 4c178c23449396b4ab821c554d7d972c4423537f..4b6fc82aea85800778da2ee051e3b5321099094a 100644
--- a/test/c/CMakeLists.txt
+++ b/test/c/CMakeLists.txt
@@ -14,58 +14,63 @@ enable_language(CXX)
 find_package(GTest 1.13)
 if(NOT GTest_FOUND)
   message(CHECK_START "Fetching external GTest")
-  if ("${CMAKE_VERSION}" VERSION_GREATER_EQUAL "3.24")
+  if("${CMAKE_VERSION}" VERSION_GREATER_EQUAL "3.24")
     cmake_policy(SET CMP0135 NEW)
   endif()
   include(FetchContent)
-  FetchContent_Declare(googletest
+  FetchContent_Declare(
+    googletest
     URL https://github.com/google/googletest/archive/refs/tags/v1.13.0.tar.gz
-    URL_HASH MD5=95b29f0038ec84a611df951d74d99897
-  )
-  set(INSTALL_GTEST OFF CACHE BOOL "Disable installation of googletest")
-  set(BUILD_GMOCK OFF CACHE BOOL "Do not build the googlemock subproject")
+    URL_HASH MD5=95b29f0038ec84a611df951d74d99897)
+  set(INSTALL_GTEST
+      OFF
+      CACHE BOOL "Disable installation of googletest")
+  set(BUILD_GMOCK
+      OFF
+      CACHE BOOL "Do not build the googlemock subproject")
   FetchContent_MakeAvailable(googletest)
   # GTest puts its build artifacts to ${CMAKE_BINARY_DIR} instead of
   # ${CMAKE_CURRENT_BINARY_DIR}. Therefore, we have to make it behave:
-  set_target_properties(gtest_main gtest
-    PROPERTIES
-      RUNTIME_OUTPUT_DIRECTORY "${googletest_BINARY_DIR}/bin"
-      LIBRARY_OUTPUT_DIRECTORY "${googletest_BINARY_DIR}/lib"
-      ARCHIVE_OUTPUT_DIRECTORY "${googletest_BINARY_DIR}/lib"
-      PDB_OUTPUT_DIRECTORY "${googletest_BINARY_DIR}/bin"
-      COMPILE_PDB_OUTPUT_DIRECTORY "${googletest_BINARY_DIR}/lib"
-  )
+  set_target_properties(
+    gtest_main gtest
+    PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${googletest_BINARY_DIR}/bin"
+               LIBRARY_OUTPUT_DIRECTORY "${googletest_BINARY_DIR}/lib"
+               ARCHIVE_OUTPUT_DIRECTORY "${googletest_BINARY_DIR}/lib"
+               PDB_OUTPUT_DIRECTORY "${googletest_BINARY_DIR}/bin"
+               COMPILE_PDB_OUTPUT_DIRECTORY "${googletest_BINARY_DIR}/lib")
   message(CHECK_PASS "done")
 endif()
 
 include("${PROJECT_SOURCE_DIR}/cmake/gtest_helper.cmake")
 
-if (FS_ENABLE_BACKTRACE_TEST)
+if(FS_ENABLE_BACKTRACE_TEST)
   add_icon_c_test(UtilBacktraceTest ctest_util_backtrace.cpp)
 endif()
 
-file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/test.namelist"
-     "&info_nml\n"
-     " file_name = 'test.namelist'\n"
-     " keywords  = 'unit test','C language','nml_annotate'\n"
-     "/\n"
-     "&test_nml\n"
-     " numbers         = 0,1,2,3\n"
-     " floating_points = -7.1,1.0,3.7,8.9\n"
-     " booleans        = .TRUE., .FALSE., .true.\n"
-     " chars           = 'unit', 'test'\n"
-     "/\n")
-file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/result.namelist"
-     "\n"
-     "NAMELIST info_nml\n"
-     "    file_name                                   'test.namelist'\n"
-     "    keywords                                    'unit test', 'C language', 'nml_annotate'\n"
-     "\n"
-     "NAMELIST test_nml\n"
-     "    numbers                                     0, 1, 2, 3\n"
-     "    floating_points                             -7.1, 1.0, 3.7, 8.9\n"
-     "    booleans                                    .TRUE., .FALSE., .true.\n"
-     "    chars                                       'unit', 'test'\n")
+file(
+  WRITE "${CMAKE_CURRENT_BINARY_DIR}/test.namelist"
+  "&info_nml\n"
+  " file_name = 'test.namelist'\n"
+  " keywords  = 'unit test','C language','nml_annotate'\n"
+  "/\n"
+  "&test_nml\n"
+  " numbers         = 0,1,2,3\n"
+  " floating_points = -7.1,1.0,3.7,8.9\n"
+  " booleans        = .TRUE., .FALSE., .true.\n"
+  " chars           = 'unit', 'test'\n"
+  "/\n")
+file(
+  WRITE "${CMAKE_CURRENT_BINARY_DIR}/result.namelist"
+  "\n"
+  "NAMELIST info_nml\n"
+  "    file_name                                   'test.namelist'\n"
+  "    keywords                                    'unit test', 'C language', 'nml_annotate'\n"
+  "\n"
+  "NAMELIST test_nml\n"
+  "    numbers                                     0, 1, 2, 3\n"
+  "    floating_points                             -7.1, 1.0, 3.7, 8.9\n"
+  "    booleans                                    .TRUE., .FALSE., .true.\n"
+  "    chars                                       'unit', 'test'\n")
 add_icon_c_test(UtilNmlAnnotateTest ctest_nml_annotate.cpp)
 add_icon_c_test(UtilArithmeticExprTest ctest_util_arithmetic_expr.cpp)
 add_icon_c_test(UtilHashTest ctest_util_hash.cpp)
diff --git a/test/fortran/CMakeLists.txt b/test/fortran/CMakeLists.txt
index 2a60b657acbdf8c82d0d141e9a14a656e063d97a..5381535bc8c2816345f1cb3e392a52f6ca911973 100644
--- a/test/fortran/CMakeLists.txt
+++ b/test/fortran/CMakeLists.txt
@@ -10,14 +10,14 @@
 # ---------------------------------------------------------------
 
 message(CHECK_START "Fetching external FortUTF")
-if ("${CMAKE_VERSION}" VERSION_GREATER_EQUAL "3.24")
+if("${CMAKE_VERSION}" VERSION_GREATER_EQUAL "3.24")
   cmake_policy(SET CMP0135 NEW)
 endif()
 include(FetchContent)
-FetchContent_Declare(fortutf
+FetchContent_Declare(
+  fortutf
   URL https://github.com/artemis-beta/FortUTF/archive/bf749de0f710e0dd7f6d00a4f5104d78fefb94e9.tar.gz
-  URL_HASH MD5=1246c176d0f543acf040facc26d24d54
-)
+  URL_HASH MD5=1246c176d0f543acf040facc26d24d54)
 FetchContent_MakeAvailable(fortutf)
 message(CHECK_PASS "done")
 
@@ -28,9 +28,9 @@ set(FORTUTF_PROJECT_SRC_FILES helpers.f90)
 include("${fortutf_SOURCE_DIR}/cmake/fortutf.cmake")
 
 # We have to prevent FortUTF from generating invalid Fortran code:
-set(project_name ${PROJECT_NAME})
+set(name_holder ${PROJECT_NAME})
 string(REPLACE "-" "_" PROJECT_NAME ${PROJECT_NAME})
 FortUTF_Find_Tests()
-set(PROJECT_NAME ${project_name})
+set(PROJECT_NAME ${name_holder})
 add_test(NAME FortUTF_UnitTest COMMAND fortran_support_Tests)
 set_property(TEST FortUTF_UnitTest PROPERTY LABELS Fortran)