1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
|
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: Apache-2.0.
# This cmake logic verifies that each of our headers is complete, in that it
# #includes any necessary dependencies, and that it builds under C++ as well.
#
# To do so, we generate a single-line C or C++ source file that includes each
# header, and link all of these stub source files into a test executable.
option(PERFORM_HEADER_CHECK "Performs compile-time checks that each header can be included independently. Requires a C++ compiler.")
if (PERFORM_HEADER_CHECK)
enable_language(CXX)
endif()
# Call as: aws_check_headers(${target} HEADERS TO CHECK LIST)
function(aws_check_headers target)
if (PERFORM_HEADER_CHECK)
set(HEADER_CHECKER_ROOT "${CMAKE_CURRENT_BINARY_DIR}/header-checker")
# Write stub main file
set(HEADER_CHECKER_MAIN "${HEADER_CHECKER_ROOT}/stub.c")
file(WRITE ${HEADER_CHECKER_MAIN} "
int main(int argc, char **argv) {
(void)argc;
(void)argv;
return 0;
}")
set(HEADER_CHECKER_LIB ${target}-header-check)
add_executable(${HEADER_CHECKER_LIB} ${HEADER_CHECKER_MAIN})
target_link_libraries(${HEADER_CHECKER_LIB} ${target})
target_compile_definitions(${HEADER_CHECKER_LIB} PRIVATE AWS_UNSTABLE_TESTING_API=1 AWS_HEADER_CHECKER=1)
# We want to be able to verify that the proper C++ header guards are in place, so
# build this target as a C++ application
set_target_properties(${HEADER_CHECKER_LIB} PROPERTIES
LINKER_LANGUAGE CXX
CXX_STANDARD 11
CXX_STANDARD_REQUIRED 0
C_STANDARD 90
)
foreach(header IN LISTS ARGN)
if (NOT ${header} MATCHES "\\.inl$")
file(RELATIVE_PATH rel_header ${CMAKE_HOME_DIRECTORY} ${header})
file(RELATIVE_PATH include_path "${CMAKE_HOME_DIRECTORY}/include" ${header})
set(stub_dir "${HEADER_CHECKER_ROOT}/${rel_header}")
file(MAKE_DIRECTORY "${stub_dir}")
# include header twice to check for include-guards
file(WRITE "${stub_dir}/check.c" "#include <${include_path}>\n#include <${include_path}>\n")
file(WRITE "${stub_dir}/checkcpp.cpp" "#include <${include_path}>\n#include <${include_path}>\n")
target_sources(${HEADER_CHECKER_LIB} PUBLIC "${stub_dir}/check.c" "${stub_dir}/checkcpp.cpp")
endif()
endforeach(header)
endif() # PERFORM_HEADER_CHECK
endfunction()
|