diff --git a/llvm/cmake/modules/HandleLLVMOptions.cmake b/llvm/cmake/modules/HandleLLVMOptions.cmake --- a/llvm/cmake/modules/HandleLLVMOptions.cmake +++ b/llvm/cmake/modules/HandleLLVMOptions.cmake @@ -277,6 +277,17 @@ endif() endfunction() +function(has_msvc_incremental_no_flag flags incr_no_flag_on) + set(${incr_no_flag_on} OFF PARENT_SCOPE) + string(FIND "${flags}" "/INCREMENTAL" idx REVERSE) + if (${idx} GREATER -1) + string(SUBSTRING "${flags}" ${idx} 15 no_flag) + if (${no_flag} MATCHES "/INCREMENTAL:NO") + set(${incr_no_flag_on} ON PARENT_SCOPE) + endif() + endif() +endfunction() + if( LLVM_ENABLE_LLD ) if ( LLVM_USE_LINKER ) message(FATAL_ERROR "LLVM_ENABLE_LLD and LLVM_USE_LINKER can't be set at the same time") @@ -535,11 +546,13 @@ if (SUPPORTS_BREPRO) # Check if /INCREMENTAL is passed to the linker and complain that it # won't work with /Brepro. - string(FIND "${all_linker_flags_uppercase}" "/INCREMENTAL" linker_flag_idx) - if (${linker_flag_idx} GREATER -1) - message(WARNING "/Brepro not compatible with /INCREMENTAL linking - builds will be non-deterministic") - else() + has_msvc_incremental_no_flag("${CMAKE_EXE_LINKER_FLAGS_${uppercase_CMAKE_BUILD_TYPE}} ${CMAKE_EXE_LINKER_FLAGS}" NO_INCR_EXE) + has_msvc_incremental_no_flag("${CMAKE_MODULE_LINKER_FLAGS_${uppercase_CMAKE_BUILD_TYPE}} ${CMAKE_MODULE_LINKER_FLAGS}" NO_INCR_MODULE) + has_msvc_incremental_no_flag("${CMAKE_SHARED_LINKER_FLAGS_${uppercase_CMAKE_BUILD_TYPE}} ${CMAKE_SHARED_LINKER_FLAGS}" NO_INCR_SHARED) + if (NO_INCR_EXE AND NO_INCR_MODULE AND NO_INCR_SHARED) append("/Brepro" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) + else() + message(WARNING "/Brepro not compatible with /INCREMENTAL linking - builds will be non-deterministic") endif() endif() endif()