← Commit list

39542f0993

Viktor Szakats
Viktor Szakats
2026-02-25
SUCCESS Duration: 326s

Subject

cmake: add native clang-tidy support for tests, with concatenated sources

Binary

No binary (build failed)

Architecture & Compiler Flags

Architecture: x86_64-linux-gnu Compiler: gcc (Ubuntu 11.4.0-1ubuntu1~22.04.3) 11.4.0

—

Build Log

(log yok)

Commit Diff GitHub →

.github/workflows/windows.yml+2 -2
@@ -704,7 +704,7 @@ jobs:
cmake -B bld -G Ninja \
-DCMAKE_SYSTEM_NAME=Windows \
-DCMAKE_C_COMPILER_TARGET="${TRIPLET}" \
- -DCMAKE_UNITY_BUILD=ON \
+ -DCMAKE_UNITY_BUILD=ON -D_CURL_TESTS_CONCAT=ON \
-DCURL_WERROR=ON \
-DCURL_USE_SCHANNEL=ON -DUSE_WIN32_IDN=ON \
-DCURL_USE_LIBPSL=OFF \
@@ -741,7 +741,7 @@ jobs:
find . \( -name '*.exe' -o -name '*.dll' -o -name '*.a' \) -print0 | grep -z curl | xargs -0 stat -c '%10s bytes: %n' --
- name: 'build tests'
- if: ${{ matrix.build == 'cmake' && matrix.compiler != 'clang-tidy' }} # Save time by skipping this for autotools and clang-tidy
+ if: ${{ matrix.build == 'cmake' }} # Save time by skipping this for autotools and clang-tidy
run: |
if [ "${MATRIX_BUILD}" = 'cmake' ]; then
cmake --build bld --target testdeps
scripts/mk-unity.pl+43 -6
@@ -31,15 +31,23 @@ use strict;
use warnings;
if(!@ARGV) {
- die "Usage: $0 [--test <tests>] [--include <include-c-sources>]\n";
+ die "Usage: $0 [--concat [-I<incdir>]] [--test <tests>] [--include <include-c-sources>]\n";
}
my @src;
my %include;
my $in_include = 0;
my $any_test = 0;
+my $concat = 0;
+my @incpath;
foreach my $src (@ARGV) {
- if($src eq "--test") {
+ if($src eq "--concat") {
+ $concat = 1;
+ }
+ elsif($src =~ "^-I") {
+ push @incpath, substr($src, 2);
+ }
+ elsif($src eq "--test") {
$in_include = 0;
}
elsif($src eq "--include") {
@@ -55,9 +63,35 @@ foreach my $src (@ARGV) {
}
}
+sub include($@) {
+ my $filename = shift;
+ if($concat) {
+ if(! -f $filename) {
+ foreach my $path (@incpath) {
+ my $fullfn = $path . "/" . $filename;
+ if(-f $fullfn) {
+ $filename = $fullfn;
+ last;
+ }
+ }
+ }
+ open(my $fh, '<', $filename) or die "Cannot open '$filename': $!";
+ my $content = do { local $/; <$fh> };
+ close $fh;
+ print "#line 1 \"$filename\"\n$content\n";
+ }
+ else {
+ print "#include \"$filename\"\n";
+ }
+}
+
print "/* !checksrc! disable COPYRIGHT all */\n\n";
if($any_test) {
- print "#include \"first.h\"\n\n";
+ if($concat) {
+ print "/* NOLINTBEGIN(readability-duplicate-include) */\n\n";
+ }
+ include("first.h");
+ print "\n";
}
my $tlist = "";
@@ -65,7 +99,7 @@ my $tlist = "";
foreach my $src (@src) {
if($src =~ /([a-z0-9_]+)\.c$/) {
my $name = $1;
- print "#include \"$src\"\n";
+ include($src);
if(not exists $include{$src}) { # register test entry function
$tlist .= " {\"$name\", test_$name},\n";
}
@@ -73,6 +107,9 @@ foreach my $src (@src) {
}
if($any_test) {
- print "\nconst struct entry_s s_entries[] = {\n$tlist {NULL, NULL}\n};\n";
- print "\n#include \"first.c\"\n";
+ print "\nconst struct entry_s s_entries[] = {\n$tlist {NULL, NULL}\n};\n\n";
+ include("first.c");
+ if($concat) {
+ print "/* NOLINTEND(readability-duplicate-include) */\n";
+ }
}
tests/libtest/CMakeLists.txt+11 -4
@@ -39,12 +39,16 @@ add_custom_command(OUTPUT "lib1521.c"
list(APPEND TESTS_C "lib1521.c")
+if(_CURL_TESTS_CONCAT)
+ set(_mk_unity_extra "--concat" "-I${CMAKE_CURRENT_SOURCE_DIR}")
+endif()
+
add_custom_command(OUTPUT "${BUNDLE}.c"
- COMMAND ${PERL_EXECUTABLE} "${PROJECT_SOURCE_DIR}/scripts/mk-unity.pl"
+ COMMAND ${PERL_EXECUTABLE} "${PROJECT_SOURCE_DIR}/scripts/mk-unity.pl" ${_mk_unity_extra}
--include ${UTILS_C} ${CURLX_C} ${TOOLX_C} --test ${TESTS_C} > "${BUNDLE}.c"
DEPENDS
"${PROJECT_SOURCE_DIR}/scripts/mk-unity.pl" "${CMAKE_CURRENT_SOURCE_DIR}/Makefile.inc"
- ${FIRST_C} ${UTILS_C} ${CURLX_C} ${TOOLX_C} ${TESTS_C}
+ ${FIRST_C} ${FIRST_H} ${UTILS_C} ${CURLX_C} ${TOOLX_C} ${TESTS_C}
VERBATIM)
add_executable(${BUNDLE} EXCLUDE_FROM_ALL "${BUNDLE}.c")
@@ -57,6 +61,9 @@ target_include_directories(${BUNDLE} PRIVATE
"${CMAKE_CURRENT_SOURCE_DIR}" # for the generated bundle source to find included test sources
)
target_compile_definitions(${BUNDLE} PRIVATE ${CURL_DEBUG_MACROS})
-set_target_properties(${BUNDLE} PROPERTIES OUTPUT_NAME "${BUNDLE}" PROJECT_LABEL "Test ${BUNDLE}" UNITY_BUILD OFF C_CLANG_TIDY "")
+set_target_properties(${BUNDLE} PROPERTIES OUTPUT_NAME "${BUNDLE}" PROJECT_LABEL "Test ${BUNDLE}" UNITY_BUILD OFF)
-curl_add_clang_tidy_test_target("${BUNDLE}-clang-tidy" ${BUNDLE} ${FIRST_C} ${UTILS_C} ${TESTS_C})
+if(NOT _CURL_TESTS_CONCAT)
+ set_target_properties(${BUNDLE} PROPERTIES C_CLANG_TIDY "")
+ curl_add_clang_tidy_test_target("${BUNDLE}-clang-tidy" ${BUNDLE} ${FIRST_C} ${UTILS_C} ${TESTS_C})
+endif()
tests/server/CMakeLists.txt+11 -4
@@ -26,12 +26,16 @@
curl_transform_makefile_inc("Makefile.inc" "${CMAKE_CURRENT_BINARY_DIR}/Makefile.inc.cmake")
include("${CMAKE_CURRENT_BINARY_DIR}/Makefile.inc.cmake")
+if(_CURL_TESTS_CONCAT)
+ set(_mk_unity_extra "--concat" "-I${CMAKE_CURRENT_SOURCE_DIR}")
+endif()
+
add_custom_command(OUTPUT "${BUNDLE}.c"
- COMMAND ${PERL_EXECUTABLE} "${PROJECT_SOURCE_DIR}/scripts/mk-unity.pl"
+ COMMAND ${PERL_EXECUTABLE} "${PROJECT_SOURCE_DIR}/scripts/mk-unity.pl" ${_mk_unity_extra}
--include ${UTILS_C} ${CURLX_C} ${TOOLX_C} --test ${TESTS_C} > "${BUNDLE}.c"
DEPENDS
"${PROJECT_SOURCE_DIR}/scripts/mk-unity.pl" "${CMAKE_CURRENT_SOURCE_DIR}/Makefile.inc"
- ${FIRST_C} ${UTILS_C} ${CURLX_C} ${TOOLX_C} ${TESTS_C}
+ ${FIRST_C} ${FIRST_H} ${UTILS_C} ${CURLX_C} ${TOOLX_C} ${TESTS_C}
VERBATIM)
add_executable(${BUNDLE} EXCLUDE_FROM_ALL "${BUNDLE}.c")
@@ -43,6 +47,9 @@ target_include_directories(${BUNDLE} PRIVATE
"${PROJECT_SOURCE_DIR}/src" # for toolx
"${CMAKE_CURRENT_SOURCE_DIR}" # for the generated bundle source to find included test sources
)
-set_target_properties(${BUNDLE} PROPERTIES OUTPUT_NAME "${BUNDLE}" PROJECT_LABEL "Test ${BUNDLE}" UNITY_BUILD OFF C_CLANG_TIDY "")
+set_target_properties(${BUNDLE} PROPERTIES OUTPUT_NAME "${BUNDLE}" PROJECT_LABEL "Test ${BUNDLE}" UNITY_BUILD OFF)
-curl_add_clang_tidy_test_target("${BUNDLE}-clang-tidy" ${BUNDLE} ${FIRST_C} ${UTILS_C} ${TESTS_C})
+if(NOT _CURL_TESTS_CONCAT)
+ set_target_properties(${BUNDLE} PROPERTIES C_CLANG_TIDY "")
+ curl_add_clang_tidy_test_target("${BUNDLE}-clang-tidy" ${BUNDLE} ${FIRST_C} ${UTILS_C} ${TESTS_C})
+endif()
tests/tunit/CMakeLists.txt+11 -4
@@ -26,12 +26,16 @@
curl_transform_makefile_inc("Makefile.inc" "${CMAKE_CURRENT_BINARY_DIR}/Makefile.inc.cmake")
include("${CMAKE_CURRENT_BINARY_DIR}/Makefile.inc.cmake")
+if(_CURL_TESTS_CONCAT)
+ set(_mk_unity_extra "--concat" "-I${CMAKE_CURRENT_SOURCE_DIR}" "-I${PROJECT_SOURCE_DIR}/tests/libtest")
+endif()
+
add_custom_command(OUTPUT "${BUNDLE}.c"
- COMMAND ${PERL_EXECUTABLE} "${PROJECT_SOURCE_DIR}/scripts/mk-unity.pl"
+ COMMAND ${PERL_EXECUTABLE} "${PROJECT_SOURCE_DIR}/scripts/mk-unity.pl" ${_mk_unity_extra}
--test ${TESTS_C} > "${BUNDLE}.c"
DEPENDS
"${PROJECT_SOURCE_DIR}/scripts/mk-unity.pl" "${CMAKE_CURRENT_SOURCE_DIR}/Makefile.inc"
- ${FIRST_C} ${TESTS_C}
+ ${FIRST_C} ${FIRST_H} ${TESTS_C}
VERBATIM)
add_executable(${BUNDLE} EXCLUDE_FROM_ALL "${BUNDLE}.c")
@@ -45,6 +49,9 @@ target_include_directories(${BUNDLE} PRIVATE
"${CMAKE_CURRENT_SOURCE_DIR}" # for the generated bundle source to find included test sources
)
target_compile_definitions(${BUNDLE} PRIVATE ${CURL_DEBUG_MACROS})
-set_target_properties(${BUNDLE} PROPERTIES OUTPUT_NAME "${BUNDLE}" PROJECT_LABEL "Test ${BUNDLE}" UNITY_BUILD OFF C_CLANG_TIDY "")
+set_target_properties(${BUNDLE} PROPERTIES OUTPUT_NAME "${BUNDLE}" PROJECT_LABEL "Test ${BUNDLE}" UNITY_BUILD OFF)
-curl_add_clang_tidy_test_target("${BUNDLE}-clang-tidy" ${BUNDLE} ${FIRST_C} ${TESTS_C})
+if(NOT _CURL_TESTS_CONCAT)
+ set_target_properties(${BUNDLE} PROPERTIES C_CLANG_TIDY "")
+ curl_add_clang_tidy_test_target("${BUNDLE}-clang-tidy" ${BUNDLE} ${FIRST_C} ${TESTS_C})
+endif()
tests/unit/CMakeLists.txt+13 -6
@@ -26,12 +26,16 @@
curl_transform_makefile_inc("Makefile.inc" "${CMAKE_CURRENT_BINARY_DIR}/Makefile.inc.cmake")
include("${CMAKE_CURRENT_BINARY_DIR}/Makefile.inc.cmake")
+if(_CURL_TESTS_CONCAT)
+ set(_mk_unity_extra "--concat" "-I${CMAKE_CURRENT_SOURCE_DIR}" "-I${PROJECT_SOURCE_DIR}/tests/libtest")
+endif()
+
add_custom_command(OUTPUT "${BUNDLE}.c"
- COMMAND ${PERL_EXECUTABLE} "${PROJECT_SOURCE_DIR}/scripts/mk-unity.pl"
+ COMMAND ${PERL_EXECUTABLE} "${PROJECT_SOURCE_DIR}/scripts/mk-unity.pl" ${_mk_unity_extra}
--test ${TESTS_C} > "${BUNDLE}.c"
DEPENDS
"${PROJECT_SOURCE_DIR}/scripts/mk-unity.pl" "${CMAKE_CURRENT_SOURCE_DIR}/Makefile.inc"
- ${FIRST_C} ${TESTS_C}
+ ${FIRST_C} ${FIRST_H} ${TESTS_C}
VERBATIM)
add_executable(${BUNDLE} EXCLUDE_FROM_ALL "${BUNDLE}.c")
@@ -46,9 +50,12 @@ target_include_directories(${BUNDLE} PRIVATE
)
# unit tests are small pretend-libcurl-programs, pass BUILDING_LIBCURL to reflect that
target_compile_definitions(${BUNDLE} PRIVATE ${CURL_DEBUG_MACROS} "BUILDING_LIBCURL")
-set_target_properties(${BUNDLE} PROPERTIES OUTPUT_NAME "${BUNDLE}" PROJECT_LABEL "Test ${BUNDLE}" UNITY_BUILD OFF C_CLANG_TIDY "")
+set_target_properties(${BUNDLE} PROPERTIES OUTPUT_NAME "${BUNDLE}" PROJECT_LABEL "Test ${BUNDLE}" UNITY_BUILD OFF)
-curl_add_clang_tidy_test_target("${BUNDLE}-clang-tidy" ${BUNDLE} ${FIRST_C} ${TESTS_C})
-if(TARGET "${BUNDLE}-clang-tidy")
- add_dependencies("${BUNDLE}-clang-tidy" curlu-unitprotos)
+if(NOT _CURL_TESTS_CONCAT)
+ set_target_properties(${BUNDLE} PROPERTIES C_CLANG_TIDY "")
+ curl_add_clang_tidy_test_target("${BUNDLE}-clang-tidy" ${BUNDLE} ${FIRST_C} ${TESTS_C})
+ if(TARGET "${BUNDLE}-clang-tidy")
+ add_dependencies("${BUNDLE}-clang-tidy" curlu-unitprotos)
+ endif()
endif()