From dade1ed1723333f01601d63ebd13437add3e563c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tomasz=20=C5=BBelawski?= <tzelawski@gmail.com>
Date: Thu, 12 Dec 2024 11:49:59 +0100
Subject: [PATCH] chore: add cmake formatting and linting

---
 .../android/CMakeLists.txt                    |  34 ++--
 .../src/main/cpp/reanimated/CMakeLists.txt    |  63 +++----
 .../src/main/cpp/worklets/CMakeLists.txt      | 161 ++++++------------
 packages/react-native-reanimated/package.json |   6 +-
 .../scripts/format-cmake.sh                   |   8 +
 .../scripts/lint-cmake.sh                     |   8 +
 6 files changed, 120 insertions(+), 160 deletions(-)
 create mode 100755 packages/react-native-reanimated/scripts/format-cmake.sh
 create mode 100755 packages/react-native-reanimated/scripts/lint-cmake.sh

diff --git a/packages/react-native-reanimated/android/CMakeLists.txt b/packages/react-native-reanimated/android/CMakeLists.txt
index 2fcb8790d61..feb7987876d 100644
--- a/packages/react-native-reanimated/android/CMakeLists.txt
+++ b/packages/react-native-reanimated/android/CMakeLists.txt
@@ -2,38 +2,50 @@ project(Reanimated)
 cmake_minimum_required(VERSION 3.8)
 
 set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
-set(CMAKE_EXPORT_COMPILE_COMMANDS ON CACHE INTERNAL "")
+set(CMAKE_EXPORT_COMPILE_COMMANDS
+    ON
+    CACHE INTERNAL "")
 
 set(CMAKE_CXX_STANDARD 20)
 
-# default CMAKE_CXX_FLAGS: "-g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fstack-protector-all"
+# default CMAKE_CXX_FLAGS: "-g -DANDROID -fdata-sections -ffunction-sections
+# -funwind-tables -fstack-protector-strong -no-canonical-prefixes
+# -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fstack-protector-all"
 include("${REACT_NATIVE_DIR}/ReactAndroid/cmake-utils/folly-flags.cmake")
 add_compile_options(${folly_FLAGS})
 
-string(APPEND CMAKE_CXX_FLAGS " -DREACT_NATIVE_MINOR_VERSION=${REACT_NATIVE_MINOR_VERSION} -DREANIMATED_VERSION=${REANIMATED_VERSION} -DHERMES_ENABLE_DEBUGGER=${HERMES_ENABLE_DEBUGGER}")
+string(
+  APPEND
+  CMAKE_CXX_FLAGS
+  " -DREACT_NATIVE_MINOR_VERSION=${REACT_NATIVE_MINOR_VERSION} -DREANIMATED_VERSION=${REANIMATED_VERSION} -DHERMES_ENABLE_DEBUGGER=${HERMES_ENABLE_DEBUGGER}"
+)
 
-string(APPEND CMAKE_CXX_FLAGS " -fexceptions -fno-omit-frame-pointer -frtti -fstack-protector-all -std=c++${CMAKE_CXX_STANDARD} -Wall -Werror")
+string(
+  APPEND
+  CMAKE_CXX_FLAGS
+  " -fexceptions -fno-omit-frame-pointer -frtti -fstack-protector-all -std=c++${CMAKE_CXX_STANDARD} -Wall -Werror"
+)
 
 if(${IS_NEW_ARCHITECTURE_ENABLED})
-    string(APPEND CMAKE_CXX_FLAGS " -DRCT_NEW_ARCH_ENABLED")
+  string(APPEND CMAKE_CXX_FLAGS " -DRCT_NEW_ARCH_ENABLED")
 endif()
 
 if(${IS_REANIMATED_EXAMPLE_APP})
-    string(APPEND CMAKE_CXX_FLAGS " -DIS_REANIMATED_EXAMPLE_APP -Wpedantic")
+  string(APPEND CMAKE_CXX_FLAGS " -DIS_REANIMATED_EXAMPLE_APP -Wpedantic")
 endif()
 
 if(NOT ${CMAKE_BUILD_TYPE} MATCHES "Debug")
-    string(APPEND CMAKE_CXX_FLAGS " -DNDEBUG")
+  string(APPEND CMAKE_CXX_FLAGS " -DNDEBUG")
 endif()
 
 if(${JS_RUNTIME} STREQUAL "hermes")
-    string(APPEND CMAKE_CXX_FLAGS " -DJS_RUNTIME_HERMES=1")
+  string(APPEND CMAKE_CXX_FLAGS " -DJS_RUNTIME_HERMES=1")
 elseif(${JS_RUNTIME} STREQUAL "jsc")
-    string(APPEND CMAKE_CXX_FLAGS " -DJS_RUNTIME_JSC=1")
+  string(APPEND CMAKE_CXX_FLAGS " -DJS_RUNTIME_JSC=1")
 elseif(${JS_RUNTIME} STREQUAL "v8")
-    string(APPEND CMAKE_CXX_FLAGS " -DJS_RUNTIME_V8=1")
+  string(APPEND CMAKE_CXX_FLAGS " -DJS_RUNTIME_V8=1")
 else()
-    message(FATAL_ERROR "Unknown JS runtime ${JS_RUNTIME}.")
+  message(FATAL_ERROR "Unknown JS runtime ${JS_RUNTIME}.")
 endif()
 
 # Resolves "CMake Warning: Manually-specified variables were not used by the
diff --git a/packages/react-native-reanimated/android/src/main/cpp/reanimated/CMakeLists.txt b/packages/react-native-reanimated/android/src/main/cpp/reanimated/CMakeLists.txt
index e8267febb7d..72e77d555b8 100644
--- a/packages/react-native-reanimated/android/src/main/cpp/reanimated/CMakeLists.txt
+++ b/packages/react-native-reanimated/android/src/main/cpp/reanimated/CMakeLists.txt
@@ -1,57 +1,38 @@
 cmake_minimum_required(VERSION 3.8)
 
-file(GLOB_RECURSE REANIMATED_COMMON_CPP_SOURCES CONFIGURE_DEPENDS "${COMMON_CPP_DIR}/reanimated/*.cpp")
-file(GLOB_RECURSE REANIMATED_ANDROID_CPP_SOURCES CONFIGURE_DEPENDS "${ANDROID_CPP_DIR}/reanimated/*.cpp")
+file(GLOB_RECURSE REANIMATED_COMMON_CPP_SOURCES CONFIGURE_DEPENDS
+     "${COMMON_CPP_DIR}/reanimated/*.cpp")
+file(GLOB_RECURSE REANIMATED_ANDROID_CPP_SOURCES CONFIGURE_DEPENDS
+     "${ANDROID_CPP_DIR}/reanimated/*.cpp")
 
 find_package(ReactAndroid REQUIRED CONFIG)
 
-add_library(
-    reanimated
-    SHARED
-    ${REANIMATED_COMMON_CPP_SOURCES}
-    ${REANIMATED_ANDROID_CPP_SOURCES}
-)
+add_library(reanimated SHARED ${REANIMATED_COMMON_CPP_SOURCES}
+                              ${REANIMATED_ANDROID_CPP_SOURCES})
 
 target_include_directories(
-    reanimated
-    PRIVATE
-    "${COMMON_CPP_DIR}"
-    "${ANDROID_CPP_DIR}"
-    "${REACT_NATIVE_DIR}/ReactCommon"
-    "${REACT_NATIVE_DIR}/ReactAndroid/src/main/jni/react/turbomodule"
-    "${REACT_NATIVE_DIR}/ReactCommon/callinvoker"
-    "${REACT_NATIVE_DIR}/ReactCommon/runtimeexecutor"
-)
+  reanimated
+  PRIVATE "${COMMON_CPP_DIR}"
+          "${ANDROID_CPP_DIR}"
+          "${REACT_NATIVE_DIR}/ReactCommon"
+          "${REACT_NATIVE_DIR}/ReactAndroid/src/main/jni/react/turbomodule"
+          "${REACT_NATIVE_DIR}/ReactCommon/callinvoker"
+          "${REACT_NATIVE_DIR}/ReactCommon/runtimeexecutor")
 
 if(${IS_NEW_ARCHITECTURE_ENABLED})
-    target_include_directories(
-        reanimated
-        PRIVATE
-        "${REACT_NATIVE_DIR}/ReactCommon/yoga"
-        "${REACT_NATIVE_DIR}/ReactCommon/react/renderer/graphics/platform/cxx"
-    )
+  target_include_directories(
+    reanimated
+    PRIVATE
+      "${REACT_NATIVE_DIR}/ReactCommon/yoga"
+      "${REACT_NATIVE_DIR}/ReactCommon/react/renderer/graphics/platform/cxx")
 endif()
 
-set_target_properties(
-    reanimated
-    PROPERTIES
-    LINKER_LANGUAGE
-    CXX
-)
+set_target_properties(reanimated PROPERTIES LINKER_LANGUAGE CXX)
 
-target_link_libraries(
-    reanimated
-    worklets
-)
+target_link_libraries(reanimated worklets)
 
 if(ReactAndroid_VERSION_MINOR GREATER_EQUAL 76)
-    target_link_libraries(
-        reanimated
-        ReactAndroid::reactnative
-    )
+  target_link_libraries(reanimated ReactAndroid::reactnative)
 else()
-    target_link_libraries(
-        reanimated
-        ReactAndroid::react_nativemodule_core
-    )
+  target_link_libraries(reanimated ReactAndroid::react_nativemodule_core)
 endif()
diff --git a/packages/react-native-reanimated/android/src/main/cpp/worklets/CMakeLists.txt b/packages/react-native-reanimated/android/src/main/cpp/worklets/CMakeLists.txt
index 9959ddefc6e..10c65f4d34a 100644
--- a/packages/react-native-reanimated/android/src/main/cpp/worklets/CMakeLists.txt
+++ b/packages/react-native-reanimated/android/src/main/cpp/worklets/CMakeLists.txt
@@ -1,139 +1,88 @@
 cmake_minimum_required(VERSION 3.8)
 
-file(GLOB_RECURSE WORKLETS_COMMON_CPP_SOURCES CONFIGURE_DEPENDS "${COMMON_CPP_DIR}/worklets/*.cpp")
-file(GLOB_RECURSE WORKLETS_ANDROID_CPP_SOURCES CONFIGURE_DEPENDS "${ANDROID_CPP_DIR}/worklets/*.cpp")
+file(GLOB_RECURSE WORKLETS_COMMON_CPP_SOURCES CONFIGURE_DEPENDS
+     "${COMMON_CPP_DIR}/worklets/*.cpp")
+file(GLOB_RECURSE WORKLETS_ANDROID_CPP_SOURCES CONFIGURE_DEPENDS
+     "${ANDROID_CPP_DIR}/worklets/*.cpp")
 
 # Consume shared libraries and headers from prefabs
 find_package(fbjni REQUIRED CONFIG)
 find_package(ReactAndroid REQUIRED CONFIG)
 
 if(${JS_RUNTIME} STREQUAL "hermes")
-    find_package(hermes-engine REQUIRED CONFIG)
+  find_package(hermes-engine REQUIRED CONFIG)
 endif()
 
-add_library(
-    worklets
-    SHARED
-    ${WORKLETS_COMMON_CPP_SOURCES}
-    ${WORKLETS_ANDROID_CPP_SOURCES}
-)
+add_library(worklets SHARED ${WORKLETS_COMMON_CPP_SOURCES}
+                            ${WORKLETS_ANDROID_CPP_SOURCES})
 
 # includes
-target_include_directories(
-    worklets
-    PUBLIC
-    "${COMMON_CPP_DIR}"
-    "${ANDROID_CPP_DIR}"
-)
+target_include_directories(worklets PUBLIC "${COMMON_CPP_DIR}"
+                                           "${ANDROID_CPP_DIR}")
 
 target_include_directories(
-    worklets
-    PRIVATE
-    "${REACT_NATIVE_DIR}/ReactCommon"
-    "${REACT_NATIVE_DIR}/ReactAndroid/src/main/jni/react/turbomodule"
-    "${REACT_NATIVE_DIR}/ReactCommon/react/nativemodule/core/ReactCommon"
-    "${REACT_NATIVE_DIR}/ReactCommon/callinvoker"
-    "${REACT_NATIVE_DIR}/ReactCommon/runtimeexecutor"
-)
+  worklets
+  PRIVATE "${REACT_NATIVE_DIR}/ReactCommon"
+          "${REACT_NATIVE_DIR}/ReactAndroid/src/main/jni/react/turbomodule"
+          "${REACT_NATIVE_DIR}/ReactCommon/react/nativemodule/core/ReactCommon"
+          "${REACT_NATIVE_DIR}/ReactCommon/callinvoker"
+          "${REACT_NATIVE_DIR}/ReactCommon/runtimeexecutor")
 
 if(${IS_NEW_ARCHITECTURE_ENABLED})
-    target_include_directories(
-        worklets
-        PRIVATE
-        "${REACT_NATIVE_DIR}/ReactCommon/yoga"
-        "${REACT_NATIVE_DIR}/ReactCommon/react/renderer/graphics/platform/cxx"
-    )
+  target_include_directories(
+    worklets
+    PRIVATE
+      "${REACT_NATIVE_DIR}/ReactCommon/yoga"
+      "${REACT_NATIVE_DIR}/ReactCommon/react/renderer/graphics/platform/cxx")
 
-    if(ReactAndroid_VERSION_MINOR LESS 76)
-        target_link_libraries(
-            worklets
-            ReactAndroid::fabricjni
-            ReactAndroid::react_debug
-            ReactAndroid::react_render_core
-            ReactAndroid::react_render_componentregistry
-            ReactAndroid::rrc_view
-        )
-    endif()
+  if(ReactAndroid_VERSION_MINOR LESS 76)
+    target_link_libraries(
+      worklets ReactAndroid::fabricjni ReactAndroid::react_debug
+      ReactAndroid::react_render_core
+      ReactAndroid::react_render_componentregistry ReactAndroid::rrc_view)
+  endif()
 endif()
 
 # build shared lib
-set_target_properties(
-    worklets
-    PROPERTIES
-    LINKER_LANGUAGE
-    CXX
-)
+set_target_properties(worklets PROPERTIES LINKER_LANGUAGE CXX)
 
-target_link_libraries(
-    worklets
-    log
-    ReactAndroid::jsi
-    fbjni::fbjni
-)
+target_link_libraries(worklets log ReactAndroid::jsi fbjni::fbjni)
 
 if(ReactAndroid_VERSION_MINOR GREATER_EQUAL 76)
-    target_link_libraries(
-        worklets
-        ReactAndroid::reactnative
-    )
+  target_link_libraries(worklets ReactAndroid::reactnative)
 else()
-    target_link_libraries(
-        worklets
-        ReactAndroid::react_nativemodule_core
-        ReactAndroid::folly_runtime
-        ReactAndroid::glog
-        ReactAndroid::reactnativejni
-    )
+  target_link_libraries(
+    worklets ReactAndroid::react_nativemodule_core ReactAndroid::folly_runtime
+    ReactAndroid::glog ReactAndroid::reactnativejni)
 endif()
 
 if(${JS_RUNTIME} STREQUAL "hermes")
-    target_link_libraries(
-        worklets
-        hermes-engine::libhermes
-    )
+  target_link_libraries(worklets hermes-engine::libhermes)
 
-    if(${HERMES_ENABLE_DEBUGGER})
-        if(ReactAndroid_VERSION_MINOR GREATER_EQUAL 76)
-            target_link_libraries(
-                worklets
-                ReactAndroid::hermestooling
-            )
-        else()
-            target_link_libraries(
-                worklets
-                ReactAndroid::hermes_executor
-            )
-        endif()
-    endif()
-elseif(${JS_RUNTIME} STREQUAL "jsc")
+  if(${HERMES_ENABLE_DEBUGGER})
     if(ReactAndroid_VERSION_MINOR GREATER_EQUAL 76)
-        target_link_libraries(
-            worklets
-            ReactAndroid::jsctooling
-        )
+      target_link_libraries(worklets ReactAndroid::hermestooling)
     else()
-        target_link_libraries(
-            worklets
-            ReactAndroid::jscexecutor
-        )
+      target_link_libraries(worklets ReactAndroid::hermes_executor)
     endif()
+  endif()
+elseif(${JS_RUNTIME} STREQUAL "jsc")
+  if(ReactAndroid_VERSION_MINOR GREATER_EQUAL 76)
+    target_link_libraries(worklets ReactAndroid::jsctooling)
+  else()
+    target_link_libraries(worklets ReactAndroid::jscexecutor)
+  endif()
 elseif(${JS_RUNTIME} STREQUAL "v8")
-    # TODO: Refactor this when adding support for newest V8
-    target_include_directories(
-        worklets
-        PRIVATE
-        "${JS_RUNTIME_DIR}/src"
-    )
-    file(GLOB V8_SO_DIR "${JS_RUNTIME_DIR}/android/build/intermediates/library_jni/**/jni/${ANDROID_ABI}")
-    find_library(
-        V8EXECUTOR_LIB
-        v8executor
-        PATHS ${V8_SO_DIR}
-        NO_DEFAULT_PATH
-        NO_CMAKE_FIND_ROOT_PATH
-    )
-    target_link_libraries(
-        worklets
-        ${V8EXECUTOR_LIB}
-    )
+  # TODO: Refactor this when adding support for newest V8
+  target_include_directories(worklets PRIVATE "${JS_RUNTIME_DIR}/src")
+  file(
+    GLOB
+    V8_SO_DIR
+    "${JS_RUNTIME_DIR}/android/build/intermediates/library_jni/**/jni/${ANDROID_ABI}"
+  )
+  find_library(
+    V8EXECUTOR_LIB v8executor
+    PATHS ${V8_SO_DIR}
+    NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH)
+  target_link_libraries(worklets ${V8EXECUTOR_LIB})
 endif()
diff --git a/packages/react-native-reanimated/package.json b/packages/react-native-reanimated/package.json
index 3e99abe0852..a351be6e74c 100644
--- a/packages/react-native-reanimated/package.json
+++ b/packages/react-native-reanimated/package.json
@@ -7,15 +7,17 @@
     "lint": "yarn lint:js && yarn lint:plugin && yarn lint:common && yarn lint:android && yarn lint:apple",
     "lint:js": "eslint --ext '.js,.ts,.tsx' src __tests__ __typetests__ && yarn prettier --check src __tests__ __typetests__",
     "lint:plugin": "cd plugin && yarn lint",
-    "lint:android": "./scripts/validate-android.sh && ./android/gradlew -p android spotlessCheck -q && ./scripts/cpplint.sh android/src && yarn format:android:cpp --dry-run -Werror",
+    "lint:android": "./scripts/validate-android.sh && ./android/gradlew -p android spotlessCheck -q && ./scripts/cpplint.sh android/src && yarn format:android:cpp --dry-run -Werror && yarn lint:cmake",
     "lint:common": "./scripts/validate-common.sh && ./scripts/cpplint.sh Common && yarn format:common --dry-run -Werror",
     "lint:apple": "./scripts/validate-apple.sh && yarn format:apple --dry-run -Werror",
-    "format": "yarn format:js && yarn format:plugin && yarn format:apple && yarn format:android:java && yarn format:android:cpp && yarn format:common",
+    "lint:cmake": "find ./android -type d \\( -name build -o -name .cxx \\) -prune -o -type f -name 'CMakeLists.txt' -print | xargs ./scripts/lint-cmake.sh",
+    "format": "yarn format:js && yarn format:plugin && yarn format:apple && yarn format:android:java && yarn format:android:cpp && yarn format:android:cmake && yarn format:common",
     "format:js": "prettier --write --list-different src __tests__ __typetests__",
     "format:plugin": "cd plugin && yarn format",
     "format:apple": "find apple -iname \"*.h\" -o -iname \"*.m\" -o -iname \"*.mm\" -o -iname \"*.cpp\" | xargs clang-format -i",
     "format:android:java": "node ./scripts/format-java.js",
     "format:android:cpp": "find android/src -iname \"*.h\" -o -iname \"*.cpp\" | xargs clang-format -i",
+    "format:android:cmake": "find ./android -type d \\( -name build -o -name .cxx \\) -prune -o -type f -name 'CMakeLists.txt' -print | xargs ./scripts/format-cmake.sh",
     "format:common": "find Common -iname \"*.h\" -o -iname \"*.cpp\" | xargs clang-format -i",
     "find-unused-code:js": "yarn ts-prune --ignore \"index|.web.\" --error",
     "type:check": "yarn type:check:src && yarn type:check:plugin && ./scripts/test-ts.sh ../../apps/common-app/src/App.tsx __typetests__/common",
diff --git a/packages/react-native-reanimated/scripts/format-cmake.sh b/packages/react-native-reanimated/scripts/format-cmake.sh
new file mode 100755
index 00000000000..a2d8c208364
--- /dev/null
+++ b/packages/react-native-reanimated/scripts/format-cmake.sh
@@ -0,0 +1,8 @@
+#!/bin/bash
+
+if ! which cmake-format >/dev/null; then
+  echo "error: cmake-format is not installed"
+  exit 1
+fi
+
+cmake-format -i "$@"
diff --git a/packages/react-native-reanimated/scripts/lint-cmake.sh b/packages/react-native-reanimated/scripts/lint-cmake.sh
new file mode 100755
index 00000000000..7f0066fb2a9
--- /dev/null
+++ b/packages/react-native-reanimated/scripts/lint-cmake.sh
@@ -0,0 +1,8 @@
+#!/bin/bash
+
+if ! which cmake-lint >/dev/null; then
+  echo "error: cmake-lint is not installed"
+  exit 1
+fi
+
+cmake-lint "$@"