# This checks HeaderTest's in each module. A HeaderTest can be found in the # module 'test' directory in a file itkHeaderTest.cxx. This # contains a null main(), but includes all the classes in the module. The # primary purpose of this test is to make sure there are not missing module # dependencies. # Improve performance of MSVC GUI, by reducing number of header tests. set(MAXIMUM_NUMBER_OF_HEADERS_default 35) if(MSVC) set(MAXIMUM_NUMBER_OF_HEADERS_default 9999) endif() # The maximum number of headers in a test. This helps limit memory issues, # and the cppcheck tests. However, if this is not unity, there is a slight # chance that problems may be hidden. For a complete header check, set to "1". set(MAXIMUM_NUMBER_OF_HEADERS ${MAXIMUM_NUMBER_OF_HEADERS_default} CACHE STRING "The number of headers in a HeaderTest code.") mark_as_advanced(MAXIMUM_NUMBER_OF_HEADERS) if(NOT TARGET ITKHeaderTests) add_custom_target( ITKHeaderTests ${CMAKE_COMMAND} --build ${ITK_BINARY_DIR} COMMENT "Regenerating and building the header tests.") endif() macro(itk_module_headertest _name) if(NOT ${_name}_THIRD_PARTY AND EXISTS ${${_name}_SOURCE_DIR}/include AND Python3_EXECUTABLE AND NOT (${_name} STREQUAL ITKTestKernel) AND NOT (CMAKE_GENERATOR MATCHES "^Visual Studio 10.*")) # Count how many tests we are going to get, and put the source files in # the list _outputs. # WARNING: This code is highly coupled with the BuildHeaderTest.py file # below. Before making any logic changes here, make sure that script is not # effected. set(_include ${${_name}_SOURCE_DIR}/include) file(GLOB _h_files ${_include}/*.h) set(_header_files ${_h_files}) list(LENGTH _h_files _num_headers) set(_outputs ${${_name}_BINARY_DIR}/test/${_name}HeaderTest1.cxx) set(_test_num 1) set(_available_headers "${MAXIMUM_NUMBER_OF_HEADERS}") while(${_num_headers} GREATER ${_available_headers}) math(EXPR _test_num "${_test_num} + 1") math(EXPR _available_headers "${_available_headers} + ${MAXIMUM_NUMBER_OF_HEADERS}") list(APPEND _outputs ${${_name}_BINARY_DIR}/test/${_name}HeaderTest${_test_num}.cxx) endwhile() add_custom_target( ${_name}HeaderTestClean ${CMAKE_COMMAND} -E remove ${_outputs}) add_dependencies(ITKHeaderTests ${_name}HeaderTestClean) # We check to see if the headers are changed. If so, remove the header test # source files so they are regenerated. set(_headers_list_md5 "${${_name}_BINARY_DIR}/test/CMakeFiles/HeadersList.md5") list(SORT _header_files) string(MD5 _new_md5 "${_header_files}") set(_regenerate_sources FALSE) if(NOT EXISTS "${_headers_list_md5}") set(_regenerate_sources TRUE) else() file(READ "${_headers_list_md5}" _old_md5) if(NOT ("${_old_md5}" STREQUAL "${_new_md5}")) set(_regenerate_sources TRUE) endif() endif() file(WRITE "${_headers_list_md5}" "${_new_md5}") if(${_regenerate_sources}) file(REMOVE ${_outputs}) endif() set(_test_num 1) foreach(_header_test_src ${_outputs}) get_filename_component(_test_name ${_header_test_src} NAME_WE) add_custom_command( OUTPUT ${_header_test_src} COMMAND ${Python3_EXECUTABLE} ${ITK_CMAKE_DIR}/../Utilities/Maintenance/BuildHeaderTest.py ${_name} ${${_name}_SOURCE_DIR} ${${_name}_BINARY_DIR} ${MAXIMUM_NUMBER_OF_HEADERS} ${_test_num}) add_executable(${_test_name} ${_header_test_src}) target_link_libraries(${_test_name} PUBLIC ${${_name}_LIBRARIES} itksys) target_link_options(${_test_name} PRIVATE "$<$,$,15.0>>:LINKER:-no_warn_duplicate_libraries>") add_dependencies(${_name}-all ${_test_name}) math(EXPR _test_num "${_test_num} + 1") endforeach() endif() endmacro()