include_guard(GLOBAL) function(indent_message header content indent_num) if(indent_num GREATER 0) string(REPEAT " " ${indent_num} indentation) string(REPEAT "." ${indent_num} tail) string(REGEX REPLACE "${tail}$" "" header "${header}") endif() message("${indentation}${header} ${content}") endfunction() # Print compiler's flags on best-effort. Include the abstracted # CMake flags that we touch ourselves. function(print_flags_per_config config indent_num) string(STRIP "${CMAKE_CXX_COMPILER_ARG1} ${CMAKE_CXX_FLAGS}" combined_cxx_flags) string(TOUPPER "${config}" config_uppercase) string(STRIP "${combined_cxx_flags} ${CMAKE_CXX_FLAGS_${config_uppercase}}" combined_cxx_flags) string(STRIP "${combined_cxx_flags} ${CMAKE_CXX${CMAKE_CXX_STANDARD}_STANDARD_COMPILE_OPTION}" combined_cxx_flags) if(CMAKE_POSITION_INDEPENDENT_CODE) string(JOIN " " combined_cxx_flags ${combined_cxx_flags} ${CMAKE_CXX_COMPILE_OPTIONS_PIC}) endif() if(CMAKE_CXX_COMPILE_OPTIONS_VISIBILITY AND CMAKE_CXX_VISIBILITY_PRESET) string(JOIN " " combined_cxx_flags ${combined_cxx_flags} ${CMAKE_CXX_COMPILE_OPTIONS_VISIBILITY}${CMAKE_CXX_VISIBILITY_PRESET}) endif() get_directory_property(compile_options COMPILE_OPTIONS) string(JOIN " " combined_cxx_flags ${combined_cxx_flags} ${compile_options}) indent_message("CXXFLAGS .............................." "${combined_cxx_flags}" ${indent_num}) endfunction() function(print_configure_summary) message("") if(PROJECT_IS_TOP_LEVEL) message("Configure summary") message("=================") else() message("minisketch configure summary") message("============================") endif() if(BUILD_SHARED_LIBS) set(library_type "Shared") else() set(library_type "Static") endif() message("Library type .......................... ${library_type}") message("Build options:") if(have_disabled_fields) set(filed_sizes "${MINISKETCH_FIELDS}") else() set(filed_sizes "All") endif() message(" field sizes ........................ ${filed_sizes}") if(HAVE_CLMUL) set(clmul_status "Enabled") else() set(clmul_status "Disabled") endif() message(" clmul fields ........................ ${clmul_status}") if(CMAKE_CXX_STANDARD GREATER_EQUAL 20) set(clz_status "C++20") elseif(HAVE_CLZ) set(clz_status "Compiler builtin") else() set(clz_status "Default") endif() message(" clz implementation .................. ${clz_status}") message("Optional binaries:") message(" benchmark ........................... ${MINISKETCH_BUILD_BENCHMARK}") message(" tests ............................... ${MINISKETCH_BUILD_TESTS}") message("") if(CMAKE_CROSSCOMPILING) set(cross_status "TRUE, for ${CMAKE_SYSTEM_NAME}, ${CMAKE_SYSTEM_PROCESSOR}") else() set(cross_status "FALSE") endif() message("Cross compiling ....................... ${cross_status}") message("C++ compiler .......................... ${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION}, ${CMAKE_CXX_COMPILER}") get_property(_is_multi_config GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) if(_is_multi_config) list(JOIN CMAKE_CONFIGURATION_TYPES ", " configs) message("Available build configurations ........ ${configs}") if(CMAKE_GENERATOR MATCHES "Visual Studio") set(default_config "Debug") else() list(GET CMAKE_CONFIGURATION_TYPES 0 default_config) endif() message("Default build configuration ........... ${default_config}") foreach(config IN LISTS CMAKE_CONFIGURATION_TYPES) message("'${config}' build configuration:") print_flags_per_config("${config}" 2) endforeach() else() message("CMAKE_BUILD_TYPE ...................... ${CMAKE_BUILD_TYPE}") print_flags_per_config("${CMAKE_BUILD_TYPE}" 0) endif() unset(_is_multi_config) message([=[ NOTE: The summary above may not exactly match the final applied build flags if any additional CMAKE_* or environment variables have been modified. To see the exact flags applied, build with the --verbose option.]=] ) if(have_disabled_fields AND PROJECT_IS_TOP_LEVEL) message("") message(WARNING "Only compiling in support for field sizes: ${MINISKETCH_FIELDS}\n" "This means the library will lack support for other field sizes entirely.\n" ) endif() message("") endfunction()