mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-27 13:30:05 +00:00
CMake: fix compiler feature detection
add_flag_if_supported() and add_flag_or_print_warning() were effectively no-ops, just returning the value of the first result (usually '-fno-omit-frame-pointer') for all subsequent checks for different flags. Due to the way CMake caches feature detection results, we need to provide symbolic variable names which will persist the cached results. This commit fixes feature detection using these two macros. The feature checks now run and get stored correctly, and the correct output can be observed in configure logs: -- Performing Test C_SUPPORTS_FPIC -- Performing Test C_SUPPORTS_FPIC - Success -- Performing Test CXX_SUPPORTS_FPIC -- Performing Test CXX_SUPPORTS_FPIC - Success git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@212586 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
d0de9868a6
commit
b1d6b8ea7d
@ -107,18 +107,6 @@ if(APPLE)
|
||||
set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,-flat_namespace -Wl,-undefined -Wl,suppress")
|
||||
endif()
|
||||
|
||||
function(add_flag_or_print_warning flag)
|
||||
check_c_compiler_flag(${flag} C_SUPPORTS_FLAG)
|
||||
check_cxx_compiler_flag(${flag} CXX_SUPPORTS_FLAG)
|
||||
if (C_SUPPORTS_FLAG AND CXX_SUPPORTS_FLAG)
|
||||
message(STATUS "Building with ${flag}")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flag}" PARENT_SCOPE)
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${flag}" PARENT_SCOPE)
|
||||
else()
|
||||
message(WARNING "${flag} is not supported.")
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
function(append value)
|
||||
foreach(variable ${ARGN})
|
||||
set(${variable} "${${variable}} ${value}" PARENT_SCOPE)
|
||||
@ -133,13 +121,25 @@ function(append_if condition value)
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
macro(add_flag_if_supported flag)
|
||||
check_c_compiler_flag(${flag} C_SUPPORTS_FLAG)
|
||||
append_if(C_SUPPORTS_FLAG "${flag}" CMAKE_C_FLAGS)
|
||||
check_cxx_compiler_flag(${flag} CXX_SUPPORTS_FLAG)
|
||||
append_if(CXX_SUPPORTS_FLAG "${flag}" CMAKE_CXX_FLAGS)
|
||||
macro(add_flag_if_supported flag name)
|
||||
check_c_compiler_flag("-Werror ${flag}" "C_SUPPORTS_${name}")
|
||||
append_if("C_SUPPORTS_${name}" "${flag}" CMAKE_C_FLAGS)
|
||||
check_cxx_compiler_flag("-Werror ${flag}" "CXX_SUPPORTS_${name}")
|
||||
append_if("CXX_SUPPORTS_${name}" "${flag}" CMAKE_CXX_FLAGS)
|
||||
endmacro()
|
||||
|
||||
function(add_flag_or_print_warning flag name)
|
||||
check_c_compiler_flag("-Werror ${flag}" "C_SUPPORTS_${name}")
|
||||
check_cxx_compiler_flag("-Werror ${flag}" "CXX_SUPPORTS_${name}")
|
||||
if ("C_SUPPORTS_${name}" AND "CXX_SUPPORTS_${name}")
|
||||
message(STATUS "Building with ${flag}")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flag}" PARENT_SCOPE)
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${flag}" PARENT_SCOPE)
|
||||
else()
|
||||
message(WARNING "${flag} is not supported.")
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
if( LLVM_ENABLE_PIC )
|
||||
if( XCODE )
|
||||
# Xcode has -mdynamic-no-pic on by default, which overrides -fPIC. I don't
|
||||
@ -148,7 +148,7 @@ if( LLVM_ENABLE_PIC )
|
||||
elseif( WIN32 OR CYGWIN)
|
||||
# On Windows all code is PIC. MinGW warns if -fPIC is used.
|
||||
else()
|
||||
add_flag_or_print_warning("-fPIC")
|
||||
add_flag_or_print_warning("-fPIC" FPIC)
|
||||
|
||||
if( WIN32 OR CYGWIN)
|
||||
# MinGW warns if -fvisibility-inlines-hidden is used.
|
||||
@ -284,10 +284,7 @@ elseif( LLVM_COMPILER_IS_GCC_COMPATIBLE )
|
||||
endif()
|
||||
|
||||
append_if(LLVM_ENABLE_PEDANTIC "-pedantic -Wno-long-long" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
|
||||
check_cxx_compiler_flag("-Werror -Wcovered-switch-default" CXX_SUPPORTS_COVERED_SWITCH_DEFAULT_FLAG)
|
||||
append_if(CXX_SUPPORTS_COVERED_SWITCH_DEFAULT_FLAG "-Wcovered-switch-default" CMAKE_CXX_FLAGS)
|
||||
check_c_compiler_flag("-Werror -Wcovered-switch-default" C_SUPPORTS_COVERED_SWITCH_DEFAULT_FLAG)
|
||||
append_if(C_SUPPORTS_COVERED_SWITCH_DEFAULT_FLAG "-Wcovered-switch-default" CMAKE_C_FLAGS)
|
||||
add_flag_if_supported("-Wcovered-switch-default" COVERED_SWITCH_DEFAULT_FLAG)
|
||||
append_if(USE_NO_UNINITIALIZED "-Wno-uninitialized" CMAKE_CXX_FLAGS)
|
||||
append_if(USE_NO_MAYBE_UNINITIALIZED "-Wno-maybe-uninitialized" CMAKE_CXX_FLAGS)
|
||||
check_cxx_compiler_flag("-Werror -Wnon-virtual-dtor" CXX_SUPPORTS_NON_VIRTUAL_DTOR_FLAG)
|
||||
@ -327,14 +324,14 @@ endif( MSVC )
|
||||
macro(append_common_sanitizer_flags)
|
||||
# Append -fno-omit-frame-pointer and turn on debug info to get better
|
||||
# stack traces.
|
||||
add_flag_if_supported("-fno-omit-frame-pointer")
|
||||
add_flag_if_supported("-fno-omit-frame-pointer" FNO_OMIT_FRAME_POINTER)
|
||||
if (NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG" AND
|
||||
NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "RELWITHDEBINFO")
|
||||
add_flag_if_supported("-gline-tables-only")
|
||||
add_flag_if_supported("-gline-tables-only" GLINE_TABLES_ONLY)
|
||||
endif()
|
||||
# Use -O1 even in debug mode, otherwise sanitizers slowdown is too large.
|
||||
if (uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG")
|
||||
add_flag_if_supported("-O1")
|
||||
add_flag_if_supported("-O1" O1)
|
||||
endif()
|
||||
endmacro()
|
||||
|
||||
@ -343,12 +340,12 @@ if(LLVM_USE_SANITIZER)
|
||||
if (LLVM_ON_UNIX)
|
||||
if (LLVM_USE_SANITIZER STREQUAL "Address")
|
||||
append_common_sanitizer_flags()
|
||||
add_flag_or_print_warning("-fsanitize=address")
|
||||
add_flag_or_print_warning("-fsanitize=address" FSANITIZE_ADDRESS)
|
||||
elseif (LLVM_USE_SANITIZER MATCHES "Memory(WithOrigins)?")
|
||||
append_common_sanitizer_flags()
|
||||
add_flag_or_print_warning("-fsanitize=memory")
|
||||
add_flag_or_print_warning("-fsanitize=memory" FSANITIZE_MEMORY)
|
||||
if(LLVM_USE_SANITIZER STREQUAL "MemoryWithOrigins")
|
||||
add_flag_or_print_warning("-fsanitize-memory-track-origins")
|
||||
add_flag_or_print_warning("-fsanitize-memory-track-origins" FSANITIZE_MEMORY_TRACK_ORIGINS)
|
||||
endif()
|
||||
else()
|
||||
message(WARNING "Unsupported value of LLVM_USE_SANITIZER: ${LLVM_USE_SANITIZER}")
|
||||
@ -384,15 +381,9 @@ if(NOT CYGWIN AND NOT WIN32)
|
||||
if (C_SUPPORTS_FNO_FUNCTION_SECTIONS)
|
||||
# Don't add -ffunction-section if it can be disabled with -fno-function-sections.
|
||||
# Doing so will break sanitizers.
|
||||
check_c_compiler_flag("-Werror -ffunction-sections" C_SUPPORTS_FFUNCTION_SECTIONS)
|
||||
check_cxx_compiler_flag("-Werror -ffunction-sections" CXX_SUPPORTS_FFUNCTION_SECTIONS)
|
||||
append_if(C_SUPPORTS_FFUNCTION_SECTIONS "-ffunction-sections" CMAKE_C_FLAGS)
|
||||
append_if(CXX_SUPPORTS_FFUNCTION_SECTIONS "-ffunction-sections" CMAKE_CXX_FLAGS)
|
||||
add_flag_if_supported("-ffunction-sections" FFUNCTION_SECTIONS)
|
||||
endif()
|
||||
check_c_compiler_flag("-Werror -fdata-sections" C_SUPPORTS_FDATA_SECTIONS)
|
||||
check_cxx_compiler_flag("-Werror -fdata-sections" CXX_SUPPORTS_FDATA_SECTIONS)
|
||||
append_if(C_SUPPORTS_FDATA_SECTIONS "-fdata-sections" CMAKE_C_FLAGS)
|
||||
append_if(CXX_SUPPORTS_FDATA_SECTIONS "-fdata-sections" CMAKE_CXX_FLAGS)
|
||||
add_flag_if_supported("-fdata-sections" FDATA_SECTIONS)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user