]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
cmake: replace `cmakelint` with `cmake-lint` from `cmakelang`, fix issues
authorViktor Szakats <commit@vsz.me>
Tue, 10 Jun 2025 16:25:57 +0000 (18:25 +0200)
committerViktor Szakats <commit@vsz.me>
Wed, 11 Jun 2025 05:07:49 +0000 (07:07 +0200)
This linter detects formatting and naming issues with minimal amount of
noise. It seems to be an improvement over the existing linter which was
only detecting line width overruns.

Also: fix to exclude `CurlTests.c` from linter.

Ref: https://cmake-format.readthedocs.io/en/latest/cmake-lint.html
Ref: https://github.com/cheshirekow/cmake_format

Closes #17576

12 files changed:
.github/workflows/checksrc.yml
CMake/FindGSS.cmake
CMake/FindLibgsasl.cmake
CMake/Macros.cmake
CMake/OtherTests.cmake
CMake/PickyWarnings.cmake
CMakeLists.txt
docs/libcurl/CMakeLists.txt
docs/libcurl/opts/CMakeLists.txt
scripts/cmakelint.sh
tests/CMakeLists.txt
tests/cmake/CMakeLists.txt

index 63ea8b980654b13ab28d3bf59f1fe272fed6422c..c8535e7b8e2979656c2eee95ae7a397523b069d5 100644 (file)
@@ -63,7 +63,7 @@ jobs:
             python3-toml python3-markupsafe python3-jinja2 python3-tabulate \
             python3-typing-extensions python3-libcst python3-impacket \
             python3-websockets python3-pytest python3-filelock python3-pytest-xdist
-          python3 -m pip install --break-system-packages cmakelint==1.4.3 pytype==2024.10.11 ruff==0.11.9
+          python3 -m pip install --break-system-packages cmakelang==0.6.13 pytype==2024.10.11 ruff==0.11.9
 
       - name: spellcheck
         run: |
index c1802ee740f9ac48410a078f88a04bf3f58cf5cd..11206b0f93137801b57c10364c1c4e60287e5d58 100644 (file)
@@ -58,6 +58,7 @@ if(NOT GSS_ROOT_DIR AND NOT "$ENV{GSS_ROOT_DIR}")
     find_package(PkgConfig QUIET)
     pkg_search_module(_GSS ${_gnu_modname} ${_mit_modname} ${_heimdal_modname})
     list(APPEND _gss_root_hints "${_GSS_PREFIX}")
+    set(_gss_version "${_GSS_VERSION}")
   endif()
   if(WIN32)
     list(APPEND _gss_root_hints "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MIT\\Kerberos;InstallDir]")
@@ -135,14 +136,14 @@ if(NOT _GSS_FOUND)  # Not found by pkg-config. Let us take more traditional appr
 
     execute_process(
       COMMAND ${_gss_configure_script} "--version"
-      OUTPUT_VARIABLE _GSS_VERSION
+      OUTPUT_VARIABLE _gss_version
       RESULT_VARIABLE _gss_configure_failed
       OUTPUT_STRIP_TRAILING_WHITESPACE
     )
 
     # Older versions may not have the "--version" parameter. In this case we just do not care.
     if(_gss_configure_failed)
-      set(_GSS_VERSION 0)
+      set(_gss_version 0)
     endif()
 
     execute_process(
@@ -269,23 +270,23 @@ else()
   if(_GSS_MODULE_NAME STREQUAL _gnu_modname OR _GSS_${_gnu_modname}_VERSION)
     set(GSS_FLAVOUR "GNU")
     set(GSS_PC_REQUIRES "gss")
-    if(NOT _GSS_VERSION)  # for old CMake versions?
-      set(_GSS_VERSION ${_GSS_${_gnu_modname}_VERSION})
+    if(NOT _gss_version)  # for old CMake versions?
+      set(_gss_version ${_GSS_${_gnu_modname}_VERSION})
     endif()
   elseif(_GSS_MODULE_NAME STREQUAL _mit_modname OR _GSS_${_mit_modname}_VERSION)
     set(GSS_FLAVOUR "MIT")
     set(GSS_PC_REQUIRES "mit-krb5-gssapi")
-    if(NOT _GSS_VERSION)  # for old CMake versions?
-      set(_GSS_VERSION ${_GSS_${_mit_modname}_VERSION})
+    if(NOT _gss_version)  # for old CMake versions?
+      set(_gss_version ${_GSS_${_mit_modname}_VERSION})
     endif()
   else()
     set(GSS_FLAVOUR "Heimdal")
     set(GSS_PC_REQUIRES "heimdal-gssapi")
-    if(NOT _GSS_VERSION)  # for old CMake versions?
-      set(_GSS_VERSION ${_GSS_${_heimdal_modname}_VERSION})
+    if(NOT _gss_version)  # for old CMake versions?
+      set(_gss_version ${_GSS_${_heimdal_modname}_VERSION})
     endif()
   endif()
-  message(STATUS "Found GSS/${GSS_FLAVOUR} (via pkg-config): ${_GSS_INCLUDE_DIRS} (found version \"${_GSS_VERSION}\")")
+  message(STATUS "Found GSS/${GSS_FLAVOUR} (via pkg-config): ${_GSS_INCLUDE_DIRS} (found version \"${_gss_version}\")")
 endif()
 
 string(REPLACE ";" " " _GSS_CFLAGS "${_GSS_CFLAGS}")
@@ -294,7 +295,7 @@ set(GSS_INCLUDE_DIRS ${_GSS_INCLUDE_DIRS})
 set(GSS_LIBRARIES ${_GSS_LIBRARIES})
 set(GSS_LIBRARY_DIRS ${_GSS_LIBRARY_DIRS})
 set(GSS_CFLAGS ${_GSS_CFLAGS})
-set(GSS_VERSION ${_GSS_VERSION})
+set(GSS_VERSION ${_gss_version})
 
 if(GSS_FLAVOUR)
   if(NOT GSS_VERSION AND GSS_FLAVOUR STREQUAL "Heimdal")
@@ -353,5 +354,5 @@ mark_as_advanced(
   _GSS_LIBRARY_DIRS
   _GSS_MODULE_NAME
   _GSS_PREFIX
-  _GSS_VERSION
+  _gss_version
 )
index c726ce1a49d368a594de58524c4867df36398ad5..878d651883dac89692786838b5e646fdab3562db 100644 (file)
@@ -66,12 +66,12 @@ else()
   endif()
 
   include(FindPackageHandleStandardArgs)
-    find_package_handle_standard_args(Libgsasl
-    REQUIRED_VARS
-      LIBGSASL_INCLUDE_DIR
-      LIBGSASL_LIBRARY
-    VERSION_VAR
-      LIBGSASL_VERSION
+  find_package_handle_standard_args(Libgsasl
+  REQUIRED_VARS
+    LIBGSASL_INCLUDE_DIR
+    LIBGSASL_LIBRARY
+  VERSION_VAR
+    LIBGSASL_VERSION
   )
 
   if(LIBGSASL_FOUND)
index e3a654b5f3698d855c1fa8ce48bf127a99ec052c..dfc0a95d93a9ec0da09807114a06952b575ddea7 100644 (file)
@@ -65,6 +65,7 @@ macro(curl_internal_test _curl_test)
   endif()
 endmacro()
 
+# Option for dependencies that accepts an 'AUTO' value, which enables the dependency if detected.
 macro(curl_dependency_option _option_name _find_name _desc_name)
   set(${_option_name} "AUTO" CACHE STRING "Build curl with ${_desc_name} support (AUTO, ON or OFF)")
   set_property(CACHE ${_option_name} PROPERTY STRINGS "AUTO" "ON" "OFF")
index 26e9d821c2b28918faeb78d17771e347602e5a45..0ccda61de65b22a653703ce79ca1bb3604a414e0 100644 (file)
@@ -25,6 +25,7 @@ include(CheckCSourceCompiles)
 include(CheckCSourceRuns)
 include(CheckTypeSize)
 
+# #include header if condition is true
 macro(curl_add_header_include _check _header)
   if(${_check})
     set(_source_epilogue "${_source_epilogue}
index be26d05cb8be8a9204c70f6d75f7420f2bb68b04..7838f6f8ba9e9e43d53064a2c2b684e1c1a459eb 100644 (file)
@@ -316,8 +316,9 @@ if(PICKY_COMPILER)
     list(APPEND _picky "-wd4668")  # 'M' is not defined as a preprocessor macro, replacing with '0' for '#if/#elif' (in winbase.h)
     list(APPEND _picky "-wd4710")  # 'snprintf': function not inlined
     list(APPEND _picky "-wd4711")  # function 'A' selected for automatic inline expansion
-    list(APPEND _picky "-wd4746")  # volatile access of '<expression>' is subject to /volatile:<iso|ms> setting;
-                                   #   consider using __iso_volatile_load/store intrinsic functions (ARM64)
+    # volatile access of '<expression>' is subject to /volatile:<iso|ms> setting;
+    #   consider using __iso_volatile_load/store intrinsic functions (ARM64)
+    list(APPEND _picky "-wd4746")
     list(APPEND _picky "-wd4774")  # 'snprintf': format string expected in argument 3 is not a string literal
     list(APPEND _picky "-wd4820")  # 'A': 'N' bytes padding added after data member 'B'
     if(MSVC_VERSION GREATER_EQUAL 1900)
@@ -340,7 +341,7 @@ if(CMAKE_C_COMPILER_ID STREQUAL "Clang" AND MSVC)
         list(APPEND _picky_tmp "-clang:${_ccopt}")
       endif()
     endforeach()
-    set("${_wlist}" ${_picky_tmp})
+    set("${_wlist}" ${_picky_tmp})  # cmake-lint: disable=C0103
   endforeach()
 endif()
 
index e8abce38d23316ebf8f4649e02b46534087ceedb..c1584cb13e758a2cf0a9cdc1389afae7a0217afc 100644 (file)
@@ -520,7 +520,7 @@ if(PERL_EXECUTABLE)
     DEPENDS "${PROJECT_SOURCE_DIR}/scripts/mk-ca-bundle.pl"
   )
   add_custom_target(curl-ca-firefox
-    COMMENT "generating a fresh ca-bundle.crt" VERBATIM USES_TERMINAL
+    COMMENT "Generating a fresh ca-bundle.crt" VERBATIM USES_TERMINAL
     COMMAND "${PERL_EXECUTABLE}" "${PROJECT_SOURCE_DIR}/scripts/firefox-db2pem.sh" "lib/ca-bundle.crt"
     DEPENDS "${PROJECT_SOURCE_DIR}/scripts/firefox-db2pem.sh"
   )
@@ -1735,7 +1735,7 @@ foreach(_variable IN ITEMS
     HAVE_SYS_SOCKET_H
     HAVE_SYS_TYPES_H
     HAVE_UNISTD_H
-    )
+)
   if(${_variable})
     string(APPEND CURL_TEST_DEFINES " -D${_variable}")
   endif()
@@ -1900,7 +1900,7 @@ foreach(_curl_test IN ITEMS
     HAVE_BOOL_T
     STDC_HEADERS
     HAVE_ATOMIC
-    )
+)
   curl_internal_test(${_curl_test})
 endforeach()
 
@@ -2062,6 +2062,7 @@ endif()
 # (= regenerate it).
 function(curl_transform_makefile_inc _input_file _output_file)
   file(READ ${_input_file} _makefile_inc_text)
+  # cmake-lint: disable=W0106
   string(REPLACE "$(top_srcdir)"   "\${PROJECT_SOURCE_DIR}" _makefile_inc_text ${_makefile_inc_text})
   string(REPLACE "$(top_builddir)" "\${PROJECT_BINARY_DIR}" _makefile_inc_text ${_makefile_inc_text})
 
index 53203647aaf62097a3ad99053c00c04e5e0e569a..56992da0deccf5ab7ee05ce3d939f7e876a8c70c 100644 (file)
@@ -25,6 +25,7 @@
 curl_transform_makefile_inc("Makefile.inc" "${CMAKE_CURRENT_BINARY_DIR}/Makefile.inc.cmake")
 include("${CMAKE_CURRENT_BINARY_DIR}/Makefile.inc.cmake")
 
+# Generate man pages
 function(curl_add_manual_pages _listname)
   # Maximum number of files per command to stay within shell/OS limits
   if(CMAKE_HOST_UNIX)
@@ -78,8 +79,8 @@ curl_add_manual_pages(man_MANS)
 add_custom_target(curl-man ALL DEPENDS ${man_MANS})
 if(NOT CURL_DISABLE_INSTALL)
   set(_src "")
-  foreach(_f IN LISTS man_MANS)
-    list(APPEND _src "${CMAKE_CURRENT_BINARY_DIR}/${_f}")
+  foreach(_file IN LISTS man_MANS)
+    list(APPEND _src "${CMAKE_CURRENT_BINARY_DIR}/${_file}")
   endforeach()
   install(FILES ${_src} DESTINATION "${CMAKE_INSTALL_MANDIR}/man3")
   unset(_src)
index 9e4523c1d426f7348cad04438c5880243963619e..f7632c49d5d206b0548904eba8983f53685aaa94 100644 (file)
@@ -30,8 +30,8 @@ add_custom_target(curl-opts-man DEPENDS ${man_MANS})
 add_dependencies(curl-man curl-opts-man)
 if(NOT CURL_DISABLE_INSTALL)
   set(_src "")
-  foreach(_f IN LISTS man_MANS)
-    list(APPEND _src "${CMAKE_CURRENT_BINARY_DIR}/${_f}")
+  foreach(_file IN LISTS man_MANS)
+    list(APPEND _src "${CMAKE_CURRENT_BINARY_DIR}/${_file}")
   endforeach()
   install(FILES ${_src} DESTINATION "${CMAKE_INSTALL_MANDIR}/man3")
 endif()
index 4d28fd45e9070485dbd65515b6e965ea8b1b40c0..5c5fc7040f1ce5a52ba746edd9903f10596303f3 100755 (executable)
@@ -6,7 +6,7 @@
 #                            | (__| |_| |  _ <| |___
 #                             \___|\___/|_| \_\_____|
 #
-# Copyright (C) Dan Fandrich, <dan@coneharvesters.com>, et al.
+# Copyright (C) Dan Fandrich, <dan@coneharvesters.com>, Viktor Szakats, et al.
 #
 # This software is licensed as described in the file COPYING, which
 # you should have received as part of this distribution. The terms
 #
 ###########################################################################
 
+# https://cmake-format.readthedocs.io/en/latest/cmake-lint.html
+# https://cmake-format.readthedocs.io/en/latest/lint-usage.html
+# https://github.com/cheshirekow/cmake_format/blob/master/cmakelang/configuration.py
+
 # Run cmakelint on the curl source code. It will check all files given on the
 # command-line, or else all relevant files in git, or if not in a git
 # repository, all files starting in the tree rooted in the current directory.
 #
-# cmakelint can be installed from PyPi with the command "python3 -m pip install
-# cmakelint".
+# cmake-lint can be installed from PyPi with the command "python3 -m pip
+# install cmakelang".
 #
 # The xargs invocation is portable, but does not preserve spaces in file names.
 # If such a file is ever added, then this can be portably fixed by switching to
     # strip off the leading ./ to make the grep regexes work properly
     find . -type f | sed 's@^\./@@'
   fi
-} | grep -E '(^CMake|/CMake|\.cmake$)' | grep -v -E '(\.h\.cmake|\.in)$' \
+} | grep -E '(^CMake|/CMake|\.cmake$)' | grep -v -E '(\.h\.cmake|\.in|\.c)$' \
   | xargs \
-  cmakelint \
-    --spaces=2 --linelength=132 \
-    --filter=-whitespace/indent,-convention/filename,-package/stdargs,-readability/wonkycase
+  cmake-lint \
+    --suppress-decorations \
+    --disable \
+    --line-width 132 \
+    --tab-size 2 \
+    --use-tabchars false \
+    --disabled-codes C0113 \
+    --function-pattern 'curl_[0-9a-z_]+' \
+    --macro-pattern '(curl_[0-9a-z_]+|check_include_file_concat_curl)' \
+    --global-var-pattern '[A-Z][0-9A-Z_]+' \
+    --internal-var-pattern '_[a-z][0-9a-z_]+' \
+    --local-var-pattern '_[a-z][0-9a-z_]+' \
+    --private-var-pattern '_[0-9a-z_]+' \
+    --public-var-pattern '([A-Z][0-9A-Z_]+|[A-Z][A-Za-z0-9]+_FOUND|[a-z]+_SOURCES|prefix|exec_prefix|includedir|libdir|ssize_t|_FILE_OFFSET_BITS)' \
+    --argument-var-pattern '_[a-z][0-9a-z_]+' \
+    --keyword-pattern '[A-Z][0-9A-Z_]+' \
+    --max-conditionals-custom-parser 2 \
+    --min-statement-spacing 1 \
+    --max-statement-spacing 2 \
+    --max-returns 6 \
+    --max-branches 12 \
+    --max-arguments 5 \
+    --max-localvars 15 \
+    --max-statements 50
index d04d3de4c21f075dfce690bbd5777718881b2734..0c3474cc387a49d4f935da8eff5912e9e7905ba2 100644 (file)
@@ -42,6 +42,7 @@ add_subdirectory(tunit)
 add_subdirectory(unit)
 add_subdirectory(certs)
 
+# Add a runtests target with customized flags
 function(curl_add_runtests _targetname _test_flags)
   if(NOT BUILD_LIBCURL_DOCS)
     string(APPEND _test_flags " !documentation")
@@ -68,6 +69,7 @@ function(curl_add_runtests _targetname _test_flags)
   )
 endfunction()
 
+# Add a pytests target with customized flags
 function(curl_add_pytests _targetname _test_flags)
   set(_depends "")
   if(NOT _targetname STREQUAL "pytest-ci")
index d7520234644fb10318fe7cbdea2285d2ac56fd25..d40a6b25d9cfef2b05d2312139c42f4cd65c1044 100644 (file)
@@ -47,15 +47,15 @@ if(TEST_INTEGRATION_MODE STREQUAL "find_package" OR
    TEST_INTEGRATION_MODE STREQUAL "ExternalProject")
   find_package(CURL REQUIRED CONFIG)
   find_package(CURL REQUIRED CONFIG)  # Double-inclusion test
-  foreach(result_var IN ITEMS
+  foreach(_result_var IN ITEMS
       CURL_FOUND
       CURL_SUPPORTS_HTTPS
       CURL_SUPPORTS_Largefile
       CURL_VERSION
       CURL_VERSION_STRING
-    )
-    if(NOT ${result_var})
-      message(FATAL_ERROR "'${result_var}' variable expected, but not set by the CURL package.")
+  )
+    if(NOT ${_result_var})
+      message(FATAL_ERROR "'${_result_var}' variable expected, but not set by the CURL package.")
     endif()
   endforeach()
   # Show variables set by find_package()