diff --git a/libc/cmake/modules/LLVMLibCHeaderRules.cmake b/libc/cmake/modules/LLVMLibCHeaderRules.cmake index 288e4dade0b4..ea8b76e0f623 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 ba21a69a31a3..24935cec048b 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,70 @@ 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 + HERMETIC_TEST_ONLY + SUITE + libc_include_tests + SRCS + ${source_file} + COMPILE_OPTIONS + -Werror + -Wsystem-headers + -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() diff --git a/libc/test/include/header-test-template.c b/libc/test/include/header-test-template.c new file mode 100644 index 000000000000..6905b930f57d --- /dev/null +++ b/libc/test/include/header-test-template.c @@ -0,0 +1,14 @@ +/*===-- Test for <@HEADER_NAME@> ----------------------------------------=== + * + * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. + * See https://llvm.org/LICENSE.txt for license information. + * SPDXList-License-Identifier: Apache-2.0 WITH LLVM-exception + */ + +#include <@HEADER_NAME@> + +int main(int argc, char **argv) { + (void)argc; + (void)argv; + return 0; +}