diff --git a/CMakeLists.txt b/CMakeLists.txt index 130fbc95af..57d495e899 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -121,6 +121,17 @@ target_link_libraries(scylla-main Snappy::snappy systemd ZLIB::ZLIB) + +option(Scylla_CHECK_HEADERS + "Add check-headers target for checking the self-containness of headers") +if(Scylla_CHECK_HEADERS) + add_custom_target(check-headers) +endif() + +include(check_headers) +check_headers(check-headers scylla-main + GLOB ${CMAKE_CURRENT_SOURCE_DIR}/*.hh) + add_subdirectory(api) add_subdirectory(alternator) add_subdirectory(db) diff --git a/alternator/CMakeLists.txt b/alternator/CMakeLists.txt index ca48f45437..9863d176e1 100644 --- a/alternator/CMakeLists.txt +++ b/alternator/CMakeLists.txt @@ -28,3 +28,6 @@ target_link_libraries(alternator idl Seastar::seastar xxHash::xxhash) + +check_headers(check-headers alternator + GLOB_RECURSE ${CMAKE_CURRENT_SOURCE_DIR}/*.hh) diff --git a/api/CMakeLists.txt b/api/CMakeLists.txt index 9f5ed82f80..01a366bd28 100644 --- a/api/CMakeLists.txt +++ b/api/CMakeLists.txt @@ -67,6 +67,8 @@ target_include_directories(api target_link_libraries(api idl wasmtime_bindings - Seastar::seastar xxHash::xxhash) + +check_headers(check-headers api + GLOB_RECURSE ${CMAKE_CURRENT_SOURCE_DIR}/*.hh) diff --git a/auth/CMakeLists.txt b/auth/CMakeLists.txt index 1ca62374c9..24193783ea 100644 --- a/auth/CMakeLists.txt +++ b/auth/CMakeLists.txt @@ -35,3 +35,6 @@ target_link_libraries(scylla_auth libxcrypt::libxcrypt) add_whole_archive(auth scylla_auth) + +check_headers(check-headers scylla_auth + GLOB_RECURSE ${CMAKE_CURRENT_SOURCE_DIR}/*.hh) diff --git a/cdc/CMakeLists.txt b/cdc/CMakeLists.txt index 9252dc366e..6086889cad 100644 --- a/cdc/CMakeLists.txt +++ b/cdc/CMakeLists.txt @@ -15,3 +15,6 @@ target_link_libraries(cdc xxHash::xxhash PRIVATE replica) + +check_headers(check-headers cdc + GLOB_RECURSE ${CMAKE_CURRENT_SOURCE_DIR}/*.hh) diff --git a/cmake/check_headers.cmake b/cmake/check_headers.cmake new file mode 100644 index 0000000000..45f61e6ad6 --- /dev/null +++ b/cmake/check_headers.cmake @@ -0,0 +1,104 @@ +function (check_headers check_headers_target target) + if(NOT TARGET ${check_headers_target}) + return() + endif() + + # "target" is required, so we can get the compiling options for compiling + # the headers. + cmake_parse_arguments ( + parsed_args + "" + "GLOB;GLOB_RECURSE;EXCLUDE;INCLUDE" + "" + ${ARGN}) + + set(sources "") + if(DEFINED parsed_args_GLOB) + file(GLOB sources + LIST_DIRECTORIES false + RELATIVE ${CMAKE_SOURCE_DIR} + "${parsed_args_GLOB}") + elseif(DEFINED parsed_args_GLOB_RECURSE) + file(GLOB_RECURSE sources + LIST_DIRECTORIES false + RELATIVE ${CMAKE_SOURCE_DIR} + "${parsed_args_RECURSIVE}") + else() + message(FATAL_ERROR "Please specify GLOB or GLOB_RECURSE.") + endif() + if(DEFINED parsed_args_INCLUDE) + list(FILTER sources INCLUDE REGEX "${parsed_args_INCLUDE}") + endif() + if(DEFINED parsed_args_EXCLUDE) + list(FILTER sources EXCLUDE REGEX "${parsed_args_EXCLUDE}") + endif() + + foreach(fn ${sources}) + get_filename_component(file_dir ${fn} DIRECTORY) + list(APPEND includes "${CMAKE_SOURCE_DIR}/${file_dir}") + set(src_dir "${CMAKE_BINARY_DIR}/check-headers/${file_dir}") + file(MAKE_DIRECTORY "${src_dir}") + get_filename_component(file_name ${fn} NAME) + set(src "${src_dir}/${file_name}.cc") + # CMake refuses to compile .hh files, so we need to rename them first. + add_custom_command( + OUTPUT ${src} + DEPENDS ${CMAKE_SOURCE_DIR}/${fn} + # silence "-Wpragma-once-outside-header" + COMMAND sed + -e "s/^#pragma once//" + "${fn}" > "${src}" + WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" + VERBATIM) + list(APPEND srcs "${src}") + endforeach() + + if(NOT srcs) + # not headers to checks + return() + endif() + + set(check_lib "${check_headers_target}-${target}") + add_library(${check_lib} EXCLUDE_FROM_ALL) + target_sources(${check_lib} + PRIVATE ${srcs}) + # use ${target} as an interface library by consuming all of its + # compile time options + get_target_property(libraries ${target} LINK_LIBRARIES) + if (libraries) + target_link_libraries(${check_lib} + PRIVATE ${libraries}) + endif() + + # if header includes other header files with relative path, + # we should satisfy it. + list(REMOVE_DUPLICATES includes) + target_include_directories(${check_lib} + PRIVATE ${includes}) + get_target_property(includes ${target} INCLUDE_DIRECTORIES) + if(includes) + target_include_directories(${check_lib} + PRIVATE ${includes}) + endif() + + get_target_property(compile_options ${target} COMPILE_OPTIONS) + if(compile_options) + target_compile_options(${check_lib} + PRIVATE ${compile_options}) + endif () + # symbols in header file should always be referenced, but these + # are just pure headers, so unused variables should be tolerated. + target_compile_options(${check_lib} + PRIVATE + -Wno-unused-const-variable + -Wno-unused-function + -Wno-unused-variable) + + get_target_property(compile_definitions ${target} COMPILE_DEFINITIONS) + if(compile_definitions) + target_compile_definitions(${check_lib} + PRIVATE ${compile_definitions}) + endif() + + add_dependencies(${check_headers_target} ${check_lib}) +endfunction () diff --git a/compaction/CMakeLists.txt b/compaction/CMakeLists.txt index 2bee50e0ed..6a8802b3b5 100644 --- a/compaction/CMakeLists.txt +++ b/compaction/CMakeLists.txt @@ -18,3 +18,6 @@ target_link_libraries(compaction PRIVATE mutation_writer replica) + +check_headers(check-headers compaction + GLOB_RECURSE ${CMAKE_CURRENT_SOURCE_DIR}/*.hh) diff --git a/cql3/CMakeLists.txt b/cql3/CMakeLists.txt index fde7f8e7c0..104a9565db 100644 --- a/cql3/CMakeLists.txt +++ b/cql3/CMakeLists.txt @@ -135,3 +135,6 @@ target_link_libraries(cql3 PRIVATE lang transport) + +check_headers(check-headers cql3 + GLOB_RECURSE ${CMAKE_CURRENT_SOURCE_DIR}/*.hh) diff --git a/data_dictionary/CMakeLists.txt b/data_dictionary/CMakeLists.txt index f1f3e849f2..65e6a883e3 100644 --- a/data_dictionary/CMakeLists.txt +++ b/data_dictionary/CMakeLists.txt @@ -11,3 +11,6 @@ target_link_libraries(data_dictionary PUBLIC Seastar::seastar xxHash::xxhash) + +check_headers(check-headers data_dictionary + GLOB_RECURSE ${CMAKE_CURRENT_SOURCE_DIR}/*.hh) diff --git a/db/CMakeLists.txt b/db/CMakeLists.txt index 794068ee04..8d2b69812f 100644 --- a/db/CMakeLists.txt +++ b/db/CMakeLists.txt @@ -47,3 +47,6 @@ target_link_libraries(db PRIVATE data_dictionary cql3) + +check_headers(check-headers db + GLOB_RECURSE ${CMAKE_CURRENT_SOURCE_DIR}/*.hh) diff --git a/dht/CMakeLists.txt b/dht/CMakeLists.txt index 445b195c3e..1d4e61c934 100644 --- a/dht/CMakeLists.txt +++ b/dht/CMakeLists.txt @@ -19,3 +19,6 @@ target_link_libraries(scylla_dht replica) add_whole_archive(dht scylla_dht) + +check_headers(check-headers scylla_dht + GLOB_RECURSE ${CMAKE_CURRENT_SOURCE_DIR}/*.hh) diff --git a/gms/CMakeLists.txt b/gms/CMakeLists.txt index fb34828927..9943cfa1de 100644 --- a/gms/CMakeLists.txt +++ b/gms/CMakeLists.txt @@ -21,3 +21,6 @@ target_link_libraries(gms xxHash::xxhash PRIVATE db) + +check_headers(check-headers gms + GLOB_RECURSE ${CMAKE_CURRENT_SOURCE_DIR}/*.hh) diff --git a/idl/CMakeLists.txt b/idl/CMakeLists.txt index 1f7b9e3953..f7e0f787a2 100644 --- a/idl/CMakeLists.txt +++ b/idl/CMakeLists.txt @@ -77,3 +77,7 @@ add_dependencies(idl idl-sources) target_include_directories(idl INTERFACE ${scylla_gen_build_dir}) + +# *.idl.hh headers are not C++ headers but the ones +# to be processed by the idl compiler, so we don't +# check their self-containness. diff --git a/index/CMakeLists.txt b/index/CMakeLists.txt index 08a7eed47c..617fb69ed7 100644 --- a/index/CMakeLists.txt +++ b/index/CMakeLists.txt @@ -14,3 +14,6 @@ target_link_libraries(index xxHash::xxhash PRIVATE cql3) + +check_headers(check-headers index + GLOB_RECURSE ${CMAKE_CURRENT_SOURCE_DIR}/*.hh) diff --git a/lang/CMakeLists.txt b/lang/CMakeLists.txt index 83ad48be25..73c85d56e3 100644 --- a/lang/CMakeLists.txt +++ b/lang/CMakeLists.txt @@ -17,3 +17,6 @@ target_link_libraries(lang xxHash::xxhash PRIVATE ${LUA_LIBRARIES}) + +check_headers(check-headers lang + GLOB_RECURSE ${CMAKE_CURRENT_SOURCE_DIR}/*.hh) diff --git a/locator/CMakeLists.txt b/locator/CMakeLists.txt index e75b572e4e..0461695df1 100644 --- a/locator/CMakeLists.txt +++ b/locator/CMakeLists.txt @@ -32,3 +32,6 @@ target_link_libraries(scylla_locator db) add_whole_archive(locator scylla_locator) + +check_headers(check-headers scylla_locator + GLOB_RECURSE ${CMAKE_CURRENT_SOURCE_DIR}/*.hh) diff --git a/message/CMakeLists.txt b/message/CMakeLists.txt index dfb5a017d7..a92ffa4f2f 100644 --- a/message/CMakeLists.txt +++ b/message/CMakeLists.txt @@ -12,3 +12,6 @@ target_link_libraries(message Seastar::seastar PRIVATE idl) + +check_headers(check-headers message + GLOB_RECURSE ${CMAKE_CURRENT_SOURCE_DIR}/*.hh) diff --git a/mutation/CMakeLists.txt b/mutation/CMakeLists.txt index 7d03f92fb8..090fa20e9e 100644 --- a/mutation/CMakeLists.txt +++ b/mutation/CMakeLists.txt @@ -22,3 +22,6 @@ target_link_libraries(mutation idl Seastar::seastar xxHash::xxhash) + +check_headers(check-headers mutation + GLOB_RECURSE ${CMAKE_CURRENT_SOURCE_DIR}/*.hh) diff --git a/mutation_writer/CMakeLists.txt b/mutation_writer/CMakeLists.txt index 524a52dae0..622453efc1 100644 --- a/mutation_writer/CMakeLists.txt +++ b/mutation_writer/CMakeLists.txt @@ -15,3 +15,6 @@ target_link_libraries(mutation_writer xxHash::xxhash PRIVATE schema) + +check_headers(check-headers mutation_writer + GLOB_RECURSE ${CMAKE_CURRENT_SOURCE_DIR}/*.hh) diff --git a/node_ops/CMakeLists.txt b/node_ops/CMakeLists.txt index 609d728042..efbbc61624 100644 --- a/node_ops/CMakeLists.txt +++ b/node_ops/CMakeLists.txt @@ -11,3 +11,6 @@ target_link_libraries(node_ops Seastar::seastar PRIVATE service) + +check_headers(check-headers api + GLOB_RECURSE ${CMAKE_CURRENT_SOURCE_DIR}/*.hh) diff --git a/raft/CMakeLists.txt b/raft/CMakeLists.txt index f0ef59f8e4..7f84d03aa3 100644 --- a/raft/CMakeLists.txt +++ b/raft/CMakeLists.txt @@ -13,3 +13,6 @@ target_link_libraries(raft PUBLIC Seastar::seastar xxHash::xxhash) + +check_headers(check-headers raft + GLOB_RECURSE ${CMAKE_CURRENT_SOURCE_DIR}/*.hh) diff --git a/readers/CMakeLists.txt b/readers/CMakeLists.txt index 23f2ca5fcf..d474cd2623 100644 --- a/readers/CMakeLists.txt +++ b/readers/CMakeLists.txt @@ -14,3 +14,6 @@ target_link_libraries(readers xxHash::xxhash PRIVATE schema) + +check_headers(check-headers readers + GLOB_RECURSE ${CMAKE_CURRENT_SOURCE_DIR}/*.hh) diff --git a/redis/CMakeLists.txt b/redis/CMakeLists.txt index 949bb15c03..3d638fc105 100644 --- a/redis/CMakeLists.txt +++ b/redis/CMakeLists.txt @@ -33,3 +33,6 @@ target_link_libraries(redis xxHash::xxhash PRIVATE db) + +check_headers(check-headers redis + GLOB_RECURSE ${CMAKE_CURRENT_SOURCE_DIR}/*.hh) diff --git a/repair/CMakeLists.txt b/repair/CMakeLists.txt index 774ebbbd61..c7eeadd664 100644 --- a/repair/CMakeLists.txt +++ b/repair/CMakeLists.txt @@ -11,3 +11,6 @@ target_link_libraries(repair idl Seastar::seastar xxHash::xxhash) + +check_headers(check-headers repair + GLOB_RECURSE ${CMAKE_CURRENT_SOURCE_DIR}/*.hh) diff --git a/replica/CMakeLists.txt b/replica/CMakeLists.txt index 4ec943abdf..f5e0c9c5e0 100644 --- a/replica/CMakeLists.txt +++ b/replica/CMakeLists.txt @@ -21,3 +21,6 @@ target_link_libraries(replica xxHash::xxhash PRIVATE absl::raw_hash_set) + +check_headers(check-headers replica + GLOB_RECURSE ${CMAKE_CURRENT_SOURCE_DIR}/*.hh) diff --git a/schema/CMakeLists.txt b/schema/CMakeLists.txt index 648829ccb2..a7f325969e 100644 --- a/schema/CMakeLists.txt +++ b/schema/CMakeLists.txt @@ -13,3 +13,6 @@ target_link_libraries(schema idl Seastar::seastar xxHash::xxhash) + +check_headers(check-headers schema + GLOB_RECURSE ${CMAKE_CURRENT_SOURCE_DIR}/*.hh) diff --git a/service/CMakeLists.txt b/service/CMakeLists.txt index 1e5125066c..21f6741b3e 100644 --- a/service/CMakeLists.txt +++ b/service/CMakeLists.txt @@ -42,3 +42,6 @@ target_link_libraries(service repair streaming systemd) + +check_headers(check-headers service + GLOB_RECURSE ${CMAKE_CURRENT_SOURCE_DIR}/*.hh) diff --git a/sstables/CMakeLists.txt b/sstables/CMakeLists.txt index 27bd575090..f7a52afd09 100644 --- a/sstables/CMakeLists.txt +++ b/sstables/CMakeLists.txt @@ -33,3 +33,6 @@ target_link_libraries(sstables tracing libdeflate::libdeflate ZLIB::ZLIB) + +check_headers(check-headers streaming + GLOB_RECURSE ${CMAKE_CURRENT_SOURCE_DIR}/*.hh) diff --git a/sstables/sstables.hh b/sstables/sstables.hh index 46866d4107..fed123f750 100644 --- a/sstables/sstables.hh +++ b/sstables/sstables.hh @@ -527,6 +527,7 @@ private: friend class sstable_directory; friend class filesystem_storage; friend class s3_storage; + friend class tiered_storage; size_t sstable_buffer_size; diff --git a/streaming/CMakeLists.txt b/streaming/CMakeLists.txt index 452139e5d7..5a6d3da492 100644 --- a/streaming/CMakeLists.txt +++ b/streaming/CMakeLists.txt @@ -24,3 +24,6 @@ target_link_libraries(streaming xxHash::xxhash PRIVATE replica) + +check_headers(check-headers streaming + GLOB_RECURSE ${CMAKE_CURRENT_SOURCE_DIR}/*.hh) diff --git a/thrift/CMakeLists.txt b/thrift/CMakeLists.txt index 8904f4f66f..3beebf2ff3 100644 --- a/thrift/CMakeLists.txt +++ b/thrift/CMakeLists.txt @@ -15,3 +15,6 @@ target_link_libraries(thrift PRIVATE interface Thrift::thrift) + +check_headers(check-headers thrift + GLOB_RECURSE ${CMAKE_CURRENT_SOURCE_DIR}/*.hh) diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt index bafcce99d6..6a1a012cb5 100644 --- a/tools/CMakeLists.txt +++ b/tools/CMakeLists.txt @@ -47,3 +47,6 @@ build_submodule(python3 python3 "${pip_dependencies}" --pip-symlinks "${pip_symlinks}") + +check_headers(check-headers tools + GLOB_RECURSE ${CMAKE_CURRENT_SOURCE_DIR}/*.hh) diff --git a/tracing/CMakeLists.txt b/tracing/CMakeLists.txt index 19c77d75fa..a79451b538 100644 --- a/tracing/CMakeLists.txt +++ b/tracing/CMakeLists.txt @@ -18,3 +18,6 @@ target_link_libraries(scylla_tracing service) add_whole_archive(tracing scylla_tracing) + +check_headers(check-headers scylla_tracing + GLOB_RECURSE ${CMAKE_CURRENT_SOURCE_DIR}/*.hh) diff --git a/transport/CMakeLists.txt b/transport/CMakeLists.txt index 94609a9f53..66767986cc 100644 --- a/transport/CMakeLists.txt +++ b/transport/CMakeLists.txt @@ -17,3 +17,6 @@ target_link_libraries(transport PRIVATE cql3 Snappy::snappy) + +check_headers(check-headers transport + GLOB_RECURSE ${CMAKE_CURRENT_SOURCE_DIR}/*.hh) diff --git a/types/CMakeLists.txt b/types/CMakeLists.txt index 0ea97534a5..488575cf8a 100644 --- a/types/CMakeLists.txt +++ b/types/CMakeLists.txt @@ -10,3 +10,6 @@ target_link_libraries(types idl Seastar::seastar xxHash::xxhash) + +check_headers(check-headers types + GLOB_RECURSE ${CMAKE_CURRENT_SOURCE_DIR}/*.hh) diff --git a/utils/CMakeLists.txt b/utils/CMakeLists.txt index 11419e644e..537242ec98 100644 --- a/utils/CMakeLists.txt +++ b/utils/CMakeLists.txt @@ -58,3 +58,6 @@ target_link_libraries(utils Boost::regex cryptopp rapidxml::rapidxml) + +check_headers(check-headers utils + GLOB_RECURSE ${CMAKE_CURRENT_SOURCE_DIR}/*.hh)