mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-01-09 11:27:28 -03:00
cmake: Print compiler and linker flags in summary
This commit is contained in:
parent
70683884c5
commit
fe5cdace5f
3 changed files with 125 additions and 0 deletions
|
@ -78,6 +78,8 @@ message("\n")
|
|||
message("Configure summary")
|
||||
message("=================")
|
||||
message("C++ compiler .......................... ${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION}, ${CMAKE_CXX_COMPILER}")
|
||||
include(FlagsSummary)
|
||||
flags_summary()
|
||||
message("\n")
|
||||
if(configure_warnings)
|
||||
message(" ******\n")
|
||||
|
|
70
cmake/module/FlagsSummary.cmake
Normal file
70
cmake/module/FlagsSummary.cmake
Normal file
|
@ -0,0 +1,70 @@
|
|||
# Copyright (c) 2024-present The Bitcoin Core developers
|
||||
# Distributed under the MIT software license, see the accompanying
|
||||
# file COPYING or https://opensource.org/license/mit/.
|
||||
|
||||
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 tools' flags on best-effort. Include the abstracted
|
||||
# CMake flags that we touch ourselves.
|
||||
function(print_flags_per_config config indent_num)
|
||||
string(TOUPPER "${config}" config_uppercase)
|
||||
|
||||
include(GetTargetInterface)
|
||||
get_target_interface(definitions "${config}" core_interface COMPILE_DEFINITIONS)
|
||||
indent_message("Preprocessor defined macros ..........." "${definitions}" ${indent_num})
|
||||
|
||||
string(STRIP "${CMAKE_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()
|
||||
get_target_interface(core_cxx_flags "${config}" core_interface COMPILE_OPTIONS)
|
||||
string(STRIP "${combined_cxx_flags} ${core_cxx_flags}" combined_cxx_flags)
|
||||
indent_message("C++ compiler flags ...................." "${combined_cxx_flags}" ${indent_num})
|
||||
|
||||
string(STRIP "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_${config_uppercase}}" combined_linker_flags)
|
||||
string(STRIP "${combined_linker_flags} ${CMAKE_EXE_LINKER_FLAGS}" combined_linker_flags)
|
||||
get_target_interface(common_link_options "${config}" core_interface LINK_OPTIONS)
|
||||
string(STRIP "${combined_linker_flags} ${common_link_options}" combined_linker_flags)
|
||||
if(CMAKE_CXX_LINK_PIE_SUPPORTED)
|
||||
string(JOIN " " combined_linker_flags ${combined_linker_flags} ${CMAKE_CXX_LINK_OPTIONS_PIE})
|
||||
endif()
|
||||
indent_message("Linker flags .........................." "${combined_linker_flags}" ${indent_num})
|
||||
endfunction()
|
||||
|
||||
function(flags_summary)
|
||||
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("")
|
||||
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()
|
||||
message("")
|
||||
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.
|
||||
]=])
|
||||
endfunction()
|
53
cmake/module/GetTargetInterface.cmake
Normal file
53
cmake/module/GetTargetInterface.cmake
Normal file
|
@ -0,0 +1,53 @@
|
|||
# Copyright (c) 2023-present The Bitcoin Core developers
|
||||
# Distributed under the MIT software license, see the accompanying
|
||||
# file COPYING or https://opensource.org/license/mit/.
|
||||
|
||||
include_guard(GLOBAL)
|
||||
|
||||
# Evaluates config-specific generator expressions in a list.
|
||||
# Recognizable patterns are:
|
||||
# - $<$<CONFIG:[config]>:[value]>
|
||||
# - $<$<NOT:$<CONFIG:[config]>>:[value]>
|
||||
function(evaluate_generator_expressions list config)
|
||||
set(input ${${list}})
|
||||
set(result)
|
||||
foreach(token IN LISTS input)
|
||||
if(token MATCHES "\\$<\\$<CONFIG:([^>]+)>:([^>]+)>")
|
||||
if(CMAKE_MATCH_1 STREQUAL config)
|
||||
list(APPEND result ${CMAKE_MATCH_2})
|
||||
endif()
|
||||
elseif(token MATCHES "\\$<\\$<NOT:\\$<CONFIG:([^>]+)>>:([^>]+)>")
|
||||
if(NOT CMAKE_MATCH_1 STREQUAL config)
|
||||
list(APPEND result ${CMAKE_MATCH_2})
|
||||
endif()
|
||||
else()
|
||||
list(APPEND result ${token})
|
||||
endif()
|
||||
endforeach()
|
||||
set(${list} ${result} PARENT_SCOPE)
|
||||
endfunction()
|
||||
|
||||
|
||||
# Gets target's interface properties recursively.
|
||||
function(get_target_interface var config target property)
|
||||
get_target_property(result ${target} INTERFACE_${property})
|
||||
if(result)
|
||||
evaluate_generator_expressions(result "${config}")
|
||||
list(JOIN result " " result)
|
||||
else()
|
||||
set(result)
|
||||
endif()
|
||||
|
||||
get_target_property(dependencies ${target} INTERFACE_LINK_LIBRARIES)
|
||||
if(dependencies)
|
||||
evaluate_generator_expressions(dependencies "${config}")
|
||||
foreach(dependency IN LISTS dependencies)
|
||||
if(TARGET ${dependency})
|
||||
get_target_interface(dep_result "${config}" ${dependency} ${property})
|
||||
string(STRIP "${result} ${dep_result}" result)
|
||||
endif()
|
||||
endforeach()
|
||||
endif()
|
||||
|
||||
set(${var} "${result}" PARENT_SCOPE)
|
||||
endfunction()
|
Loading…
Reference in a new issue