/ src / minisketch / cmake / PrintConfigureSummary.cmake
PrintConfigureSummary.cmake
  1  include_guard(GLOBAL)
  2  
  3  function(indent_message header content indent_num)
  4    if(indent_num GREATER 0)
  5      string(REPEAT " " ${indent_num} indentation)
  6      string(REPEAT "." ${indent_num} tail)
  7      string(REGEX REPLACE "${tail}$" "" header "${header}")
  8    endif()
  9    message("${indentation}${header} ${content}")
 10  endfunction()
 11  
 12  # Print compiler's flags on best-effort. Include the abstracted
 13  # CMake flags that we touch ourselves.
 14  function(print_flags_per_config config indent_num)
 15    string(STRIP "${CMAKE_CXX_COMPILER_ARG1} ${CMAKE_CXX_FLAGS}" combined_cxx_flags)
 16    string(TOUPPER "${config}" config_uppercase)
 17    string(STRIP "${combined_cxx_flags} ${CMAKE_CXX_FLAGS_${config_uppercase}}" combined_cxx_flags)
 18    string(STRIP "${combined_cxx_flags} ${CMAKE_CXX${CMAKE_CXX_STANDARD}_STANDARD_COMPILE_OPTION}" combined_cxx_flags)
 19    if(CMAKE_POSITION_INDEPENDENT_CODE)
 20      string(JOIN " " combined_cxx_flags ${combined_cxx_flags} ${CMAKE_CXX_COMPILE_OPTIONS_PIC})
 21    endif()
 22    if(CMAKE_CXX_COMPILE_OPTIONS_VISIBILITY AND CMAKE_CXX_VISIBILITY_PRESET)
 23      string(JOIN " " combined_cxx_flags ${combined_cxx_flags} ${CMAKE_CXX_COMPILE_OPTIONS_VISIBILITY}${CMAKE_CXX_VISIBILITY_PRESET})
 24    endif()
 25    get_directory_property(compile_options COMPILE_OPTIONS)
 26    string(JOIN " " combined_cxx_flags ${combined_cxx_flags} ${compile_options})
 27    indent_message("CXXFLAGS .............................." "${combined_cxx_flags}" ${indent_num})
 28  endfunction()
 29  
 30  function(print_configure_summary)
 31    message("")
 32    if(PROJECT_IS_TOP_LEVEL)
 33      message("Configure summary")
 34      message("=================")
 35    else()
 36      message("minisketch configure summary")
 37      message("============================")
 38    endif()
 39    if(BUILD_SHARED_LIBS)
 40      set(library_type "Shared")
 41    else()
 42      set(library_type "Static")
 43    endif()
 44    message("Library type .......................... ${library_type}")
 45    message("Build options:")
 46    if(have_disabled_fields)
 47      set(filed_sizes "${MINISKETCH_FIELDS}")
 48    else()
 49      set(filed_sizes "All")
 50    endif()
 51    message("  field sizes  ........................ ${filed_sizes}")
 52    if(HAVE_CLMUL)
 53      set(clmul_status "Enabled")
 54    else()
 55      set(clmul_status "Disabled")
 56    endif()
 57    message("  clmul fields ........................ ${clmul_status}")
 58    if(CMAKE_CXX_STANDARD GREATER_EQUAL 20)
 59      set(clz_status "C++20")
 60    elseif(HAVE_CLZ)
 61      set(clz_status "Compiler builtin")
 62    else()
 63      set(clz_status "Default")
 64    endif()
 65    message("  clz implementation .................. ${clz_status}")
 66    message("Optional binaries:")
 67    message("  benchmark ........................... ${MINISKETCH_BUILD_BENCHMARK}")
 68    message("  tests ............................... ${MINISKETCH_BUILD_TESTS}")
 69    message("")
 70    if(CMAKE_CROSSCOMPILING)
 71      set(cross_status "TRUE, for ${CMAKE_SYSTEM_NAME}, ${CMAKE_SYSTEM_PROCESSOR}")
 72    else()
 73      set(cross_status "FALSE")
 74    endif()
 75    message("Cross compiling ....................... ${cross_status}")
 76    message("C++ compiler .......................... ${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION}, ${CMAKE_CXX_COMPILER}")
 77    get_property(_is_multi_config GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
 78    if(_is_multi_config)
 79      list(JOIN CMAKE_CONFIGURATION_TYPES ", " configs)
 80      message("Available build configurations ........ ${configs}")
 81      if(CMAKE_GENERATOR MATCHES "Visual Studio")
 82        set(default_config "Debug")
 83      else()
 84        list(GET CMAKE_CONFIGURATION_TYPES 0 default_config)
 85      endif()
 86      message("Default build configuration ........... ${default_config}")
 87      foreach(config IN LISTS CMAKE_CONFIGURATION_TYPES)
 88        message("'${config}' build configuration:")
 89        print_flags_per_config("${config}" 2)
 90      endforeach()
 91    else()
 92      message("CMAKE_BUILD_TYPE ...................... ${CMAKE_BUILD_TYPE}")
 93      print_flags_per_config("${CMAKE_BUILD_TYPE}" 0)
 94    endif()
 95    unset(_is_multi_config)
 96  
 97    message([=[
 98  
 99  NOTE: The summary above may not exactly match the final applied build flags
100        if any additional CMAKE_* or environment variables have been modified.
101        To see the exact flags applied, build with the --verbose option.]=]
102    )
103  
104    if(have_disabled_fields AND PROJECT_IS_TOP_LEVEL)
105      message("")
106      message(WARNING
107        "Only compiling in support for field sizes: ${MINISKETCH_FIELDS}\n"
108        "This means the library will lack support for other field sizes entirely.\n"
109      )
110    endif()
111    message("")
112  endfunction()