[libc-commits] [libc] [libc] Add compile tests for each public header (PR #122527)
Roland McGrath via libc-commits
libc-commits at lists.llvm.org
Fri Jan 10 13:14:21 PST 2025
https://github.com/frobtech created https://github.com/llvm/llvm-project/pull/122527
This adds a test that consists of compiling `#include <...>`,
pretty much alone, for each public header file in each different
language mode (`-std=...` compiler switch) with -Werror and many
warnings enabled.
There are several headers that have bugs when used alone, and
many more headers that have bugs in certain language modes. So
for now, compiling the new tests is gated on the cmake switch
-DLLVM_LIBC_BUILD_HEADER_TESTS=ON. When all the bugs are fixed,
the switch will be removed so future regressions don't land.
>From cc2061ad48dc1dc90696abfde41fbba94c59332d Mon Sep 17 00:00:00 2001
From: Roland McGrath <mcgrathr at google.com>
Date: Fri, 10 Jan 2025 13:12:21 -0800
Subject: [PATCH] [libc] Add compile tests for each public header
This adds a test that consists of compiling `#include <...>`,
pretty much alone, for each public header file in each different
language mode (`-std=...` compiler switch) with -Werror and many
warnings enabled.
There are several headers that have bugs when used alone, and
many more headers that have bugs in certain language modes. So
for now, compiling the new tests is gated on the cmake switch
-DLLVM_LIBC_BUILD_HEADER_TESTS=ON. When all the bugs are fixed,
the switch will be removed so future regressions don't land.
---
libc/cmake/modules/LLVMLibCHeaderRules.cmake | 2 +
libc/test/include/CMakeLists.txt | 68 +++++++++++++++++++-
2 files changed, 69 insertions(+), 1 deletion(-)
diff --git a/libc/cmake/modules/LLVMLibCHeaderRules.cmake b/libc/cmake/modules/LLVMLibCHeaderRules.cmake
index 288e4dade0b472..ea8b76e0f62351 100644
--- a/libc/cmake/modules/LLVMLibCHeaderRules.cmake
+++ b/libc/cmake/modules/LLVMLibCHeaderRules.cmake
@@ -66,6 +66,7 @@ function(add_header target_name)
set_target_properties(
${fq_target_name}
PROPERTIES
+ HEADER_NAME ${dest_leaf_filename}
HEADER_FILE_PATH ${dest_file}
DEPS "${fq_deps_list}"
)
@@ -164,6 +165,7 @@ function(add_gen_header target_name)
set_target_properties(
${fq_target_name}
PROPERTIES
+ HEADER_NAME ${ADD_GEN_HDR_GEN_HDR}
HEADER_FILE_PATH ${out_file}
DECLS_FILE_PATH "${decl_out_file}"
DEPS "${fq_deps_list}"
diff --git a/libc/test/include/CMakeLists.txt b/libc/test/include/CMakeLists.txt
index ba21a69a31a3b4..ddb69ebc0c166e 100644
--- a/libc/test/include/CMakeLists.txt
+++ b/libc/test/include/CMakeLists.txt
@@ -422,7 +422,7 @@ add_libc_test(
-Werror
DEPENDS
libc.include.llvm-libc-macros.math_function_macros
-)
+)
add_libc_test(
isfinite_c_test
@@ -483,3 +483,69 @@ add_libc_test(
DEPENDS
libc.include.llvm-libc-macros.math_function_macros
)
+
+# Test `#include <...>` of each header in each available language mode.
+# This is gated on -DLLVM_LIBC_BUILD_HEADER_TESTS=ON until all the bugs
+# in headers are fixed so the tests all compile.
+set(TEST_STDC_VERSIONS 89;99;11;17;23)
+set(TEST_STDCXX_VERSIONS 03;11;14;17;20;23;26)
+
+function(add_header_test target_name source_file deps std_mode)
+ if(LLVM_LIBC_BUILD_HEADER_TESTS)
+ add_libc_test(
+ ${target_name}
+ C_TEST
+ UNIT_TEST_ONLY
+ SUITE
+ libc_include_tests
+ SRCS
+ ${source_file}
+ COMPILE_OPTIONS
+ -Werror
+ -Wall
+ -Wextra
+ -std=${std_mode}
+ DEPENDS
+ ${deps}
+ )
+ endif()
+endfunction()
+
+foreach(target ${TARGET_PUBLIC_HEADERS})
+ string(REPLACE "libc.include." "" header ${target})
+ get_target_property(HEADER_NAME ${target} HEADER_NAME)
+
+ set(test_stdc_file "${CMAKE_CURRENT_BINARY_DIR}/${header}_test.c")
+ configure_file(header-test-template.c ${test_stdc_file} @ONLY)
+ foreach(stdc_version ${TEST_STDC_VERSIONS})
+ add_header_test(
+ "${header}_c${stdc_version}_test"
+ ${test_stdc_file}
+ ${target}
+ "c${stdc_version}"
+ )
+ add_header_test(
+ "${header}_gnu${stdc_version}_test"
+ ${test_stdc_file}
+ ${target}
+ "gnu${stdc_version}"
+ )
+ endforeach()
+
+ set(test_stdcxx_file "${CMAKE_CURRENT_BINARY_DIR}/${header}_test.cpp")
+ configure_file(header-test-template.c ${test_stdcxx_file} @ONLY)
+ foreach(stdcxx_version ${TEST_STDCXX_VERSIONS})
+ add_header_test(
+ "${header}_cpp${stdcxx_version}_test"
+ ${test_stdcxx_file}
+ ${target}
+ "c++${stdcxx_version}"
+ )
+ add_header_test(
+ "${header}_gnucpp${stdcxx_version}_test"
+ ${test_stdcxx_file}
+ ${target}
+ "gnu++${stdcxx_version}"
+ )
+ endforeach()
+endforeach()
More information about the libc-commits
mailing list