]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
cmake: fix system include directory position for clang-tidy in tests
authorViktor Szakats <commit@vsz.me>
Fri, 27 Feb 2026 03:08:06 +0000 (04:08 +0100)
committerViktor Szakats <commit@vsz.me>
Fri, 27 Feb 2026 12:40:30 +0000 (13:40 +0100)
To avoid a system include masking a custom directory, and e.g. picking
up system OpenSSL headers from `/usr/include` on Linux, instead of the
correct ones from a custom header directory, move system include
directories to the back of the header path list. Also to match what
CMake seems to be doing for the C compiler command-lines it generates.

CMake seems to use `-I`, while for these invocations we stick with
`-isystem` just in case.

This area remains fragile and likely not the final issue.

Fixing (seen in GHA/linux H3 c-ares):
```
Error while processing bld/tests/libtest/lib1521.c.
/usr/include/openssl/macros.h:147:4: error: "OPENSSL_API_COMPAT expresses an impossible API compatibility level" [clang-diagnostic-error]
Found compiler error(s).
  147 | #  error "OPENSSL_API_COMPAT expresses an impossible API compatibility level"
      |    ^
FAILED: [code=1] tests/libtest/CMakeFiles/libtests-clang-tidy
```
Ref: https://github.com/curl/curl/actions/runs/22468472670/job/65079885471?pr=20751

Bug: https://github.com/curl/curl/pull/20751#issuecomment-3970180687
Cherry-picked from #20751

Closes #20759

CMake/Macros.cmake
scripts/cmakelint.sh

index 8d3458c06efa76d89f5871c595dae1efe471878d..bf0ca1297f41f4af7a0bd7baa9746da7ad1985eb 100644 (file)
@@ -139,6 +139,18 @@ macro(curl_add_clang_tidy_test_target _target_clang_tidy _target)
     set(_incsys "")
     set(_options "")
 
+    # Make a list of known system include directories
+    set(_sys_incdirs "${CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES}")
+    foreach(_inc IN LISTS CMAKE_SYSTEM_PREFIX_PATH)
+      if(NOT _inc MATCHES "/$")
+        string(APPEND _inc "/")
+      endif()
+      string(APPEND _inc "include")
+      if(NOT _inc IN_LIST _sys_incdirs AND IS_DIRECTORY "${_inc}")
+        list(APPEND _sys_incdirs "${_inc}")
+      endif()
+    endforeach()
+
     # Collect macro definitions and header directories applying to the directory
     get_directory_property(_val COMPILE_DEFINITIONS)
     if(_val)
@@ -169,7 +181,12 @@ macro(curl_add_clang_tidy_test_target _target_clang_tidy _target)
     set(_incsys_tmp ${_incsys})
     list(REMOVE_DUPLICATES _incsys_tmp)
     set(_incsys "")
+    set(_incsystop "")
     foreach(_inc IN LISTS _incsys_tmp)
+      if(_inc IN_LIST _sys_incdirs)
+        list(APPEND _incsystop "${_inc}")  # Save system prefixes to re-add them later to the end of list
+        continue()
+      endif()
       # Avoid empty and '$<INSTALL_INTERFACE:include>' items. The latter
       # evaluates to an empty path in this context. Also skip
       # '$<BUILD_INTERFACE:curl-include>', as already present in '_includes'.
@@ -179,6 +196,9 @@ macro(curl_add_clang_tidy_test_target _target_clang_tidy _target)
         list(APPEND _incsys "-isystem" "${_inc}")
       endif()
     endforeach()
+    foreach(_inc IN LISTS _incsystop)
+      list(APPEND _incsys "-isystem" "${_inc}")
+    endforeach()
 
     if(CMAKE_C_COMPILER_ID MATCHES "Clang")
       list(REMOVE_DUPLICATES _options)  # Keep the first of duplicates to imitate CMake
@@ -214,6 +234,7 @@ macro(curl_add_clang_tidy_test_target _target_clang_tidy _target)
       DEPENDS ${_sources})
     add_dependencies(tests-clang-tidy ${_target_clang_tidy})
 
+    unset(_sys_incdirs)
     unset(_cc)
     unset(_definitions)
     unset(_includes)
index adf128556df5b387a9adcc661471caa8d23a06de..09276033751e744258ecf384f1a20052d4c2fc1b 100755 (executable)
@@ -72,8 +72,8 @@ cd "$(dirname "$0")"/..
     --min-statement-spacing 1 \
     --max-statement-spacing 2 \
     --max-returns 6 \
-    --max-branches 12 \
+    --max-branches 15 \
     --max-arguments 5 \
     --max-localvars 15 \
-    --max-statements 65 \
+    --max-statements 85 \
     --