cmake: add native clang-tidy support for tests, with concatenated sources
No binary (build failed)
—
(log yok)
| @@ -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 | |
| @@ -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"; |
| + | } |
| } | |
| @@ -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() |
| @@ -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() |
| @@ -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() |
| @@ -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() | |