Index: llvm/cmake/modules/HandleLLVMOptions.cmake =================================================================== --- llvm/cmake/modules/HandleLLVMOptions.cmake +++ llvm/cmake/modules/HandleLLVMOptions.cmake @@ -145,6 +145,25 @@ set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,-flat_namespace -Wl,-undefined -Wl,suppress") endif() +if(${CMAKE_SYSTEM_NAME} MATCHES "Linux") + # RHEL has ar and ranlib being non-deterministic by default. The D flag forces determinism, + # however only GNU version of ar and ranlib have this option + execute_process(COMMAND ${CMAKE_RANLIB} --version + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} RESULT_VARIABLE RANLIB_RESULT OUTPUT_VARIABLE RANLIB_OUTPUT) + if((${RANLIB_RESULT} EQUAL 0) AND ("${RANLIB_OUTPUT}" MATCHES "GNU ranlib") AND ("${RANLIB_OUTPUT}" MATCHES "([0-9]+\\.[0-9]+)")) + # Version 2.23 is the first version of binutils where both ar and ranlib have the D flag + if("${CMAKE_MATCH_0}" VERSION_GREATER "2.22") + set(CMAKE_C_ARCHIVE_CREATE " Dqc ") + set(CMAKE_C_ARCHIVE_APPEND " Dq ") + set(CMAKE_C_ARCHIVE_FINISH " -D ") + + set(CMAKE_CXX_ARCHIVE_CREATE " Dqc ") + set(CMAKE_CXX_ARCHIVE_APPEND " Dq ") + set(CMAKE_CXX_ARCHIVE_FINISH " -D ") + endif() + endif() +endif() + if(${CMAKE_SYSTEM_NAME} MATCHES "AIX") if(NOT LLVM_BUILD_32_BITS) if (CMAKE_CXX_COMPILER_ID MATCHES "XL")