From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Ryan VanderMeulen Date: Fri, 21 Aug 2026 16:00:00 -0400 Subject: [PATCH 6/6] Separate provider compilation from its archive on MSVC Cherry-picked from https://github.com/microsoft/onnxruntime/pull/32162, which is approved but not yet merged. With onnxruntime_ENABLE_LTO on MSVC the provider objects carry whole-program IR, which pushes onnxruntime_providers.lib past the 4 GiB limit lib.exe enforces on the COFF archive format (LNK1248). A shared-library build only needs the objects for the final link, so no archive is produced there. Reduced from the upstream commit: its hunks for onnxruntime_unittests.cmake, onnxruntime_providers_webgpu.cmake and onnxruntime_providers_pch.cmake are omitted, as they do not apply to the pinned revision and cover code this build does not configure. --- --- a/cmake/onnxruntime.cmake +++ b/cmake/onnxruntime.cmake @@ -227,7 +227,7 @@ ${onnxruntime_INTERNAL_PROVIDER_LIBRARIES} ${onnxruntime_winml} onnxruntime_optimizer - onnxruntime_providers + ${onnxruntime_providers_target} onnxruntime_lora onnxruntime_framework onnxruntime_graph diff -ruN a/cmake/onnxruntime_providers_cpu.cmake b/cmake/onnxruntime_providers_cpu.cmake --- a/cmake/onnxruntime_providers_cpu.cmake +++ b/cmake/onnxruntime_providers_cpu.cmake @@ -140,25 +140,43 @@ if (onnxruntime_REDUCED_OPS_BUILD) substitute_op_reduction_srcs(onnxruntime_providers_src) endif() -onnxruntime_add_static_library(onnxruntime_providers ${onnxruntime_providers_src}) +# Only one of these targets exists per configuration, and consumers link +# ${onnxruntime_providers_target} rather than either name, so the choice lives here alone. +# +# With onnxruntime_ENABLE_LTO on MSVC the objects carry whole-program IR, which pushes the archive +# past the 4 GiB limit lib.exe enforces on the COFF archive format (LNK1248). No lib.exe option +# raises the limit, and a shared-library build only needs the objects for the final link, so no +# archive is produced there. +# +# The archive cannot instead be materialized from $ of an always-present object +# library: the Xcode generator hash-suffixes object filenames when source basenames collide, as +# some of these sources do, while TARGET_OBJECTS expands to the unsuffixed names, so libtool fails +# to find them. +if (MSVC AND onnxruntime_BUILD_SHARED_LIB) + onnxruntime_add_object_library(onnxruntime_providers_obj ${onnxruntime_providers_src}) + set(onnxruntime_providers_target onnxruntime_providers_obj) +else() + onnxruntime_add_static_library(onnxruntime_providers ${onnxruntime_providers_src}) + set(onnxruntime_providers_target onnxruntime_providers) +endif() if (onnxruntime_REDUCED_OPS_BUILD) - add_op_reduction_include_dirs(onnxruntime_providers) + add_op_reduction_include_dirs(${onnxruntime_providers_target}) endif() if (HAS_BITWISE_INSTEAD_OF_LOGICAL) - target_compile_options(onnxruntime_providers PRIVATE "-Wno-bitwise-instead-of-logical") + target_compile_options(${onnxruntime_providers_target} PRIVATE "-Wno-bitwise-instead-of-logical") endif() if (MSVC) - target_compile_options(onnxruntime_providers PRIVATE "/bigobj") + target_compile_options(${onnxruntime_providers_target} PRIVATE "/bigobj") # if(NOT CMAKE_SIZEOF_VOID_P EQUAL 8) -# target_compile_options(onnxruntime_providers PRIVATE "/wd4244") +# target_compile_options(${onnxruntime_providers_target} PRIVATE "/wd4244") # endif() endif() -onnxruntime_add_include_to_target(onnxruntime_providers onnxruntime_common onnxruntime_framework onnx onnx_proto ${PROTOBUF_LIB} flatbuffers::flatbuffers Boost::mp11 safeint_interface) +onnxruntime_add_include_to_target(${onnxruntime_providers_target} onnxruntime_common onnxruntime_framework onnx onnx_proto ${PROTOBUF_LIB} flatbuffers::flatbuffers Boost::mp11 safeint_interface) if (onnxruntime_BUILD_MS_EXPERIMENTAL_OPS) - target_compile_definitions(onnxruntime_providers PRIVATE BUILD_MS_EXPERIMENTAL_OPS=1) + target_compile_definitions(${onnxruntime_providers_target} PRIVATE BUILD_MS_EXPERIMENTAL_OPS=1) endif() if(HAS_DEPRECATED_COPY) @@ -181,40 +199,40 @@ set_source_files_properties(${ORTTRAINING_SOURCE_DIR}/training_ops/cuda/collective/adasum_kernels.cc PROPERTIES COMPILE_FLAGS " -fassociative-math -ffast-math -ftree-vectorize -funsafe-math-optimizations -mf16c -mavx -mfma ") endif() -target_include_directories(onnxruntime_providers PRIVATE ${ONNXRUNTIME_ROOT}) -onnxruntime_add_include_to_target(onnxruntime_providers re2::re2 Eigen3::Eigen) -add_dependencies(onnxruntime_providers onnx ${onnxruntime_EXTERNAL_DEPENDENCIES}) +target_include_directories(${onnxruntime_providers_target} PRIVATE ${ONNXRUNTIME_ROOT}) +onnxruntime_add_include_to_target(${onnxruntime_providers_target} re2::re2 Eigen3::Eigen) +add_dependencies(${onnxruntime_providers_target} onnx ${onnxruntime_EXTERNAL_DEPENDENCIES}) if (onnxruntime_ENABLE_TRAINING_OPS) - target_include_directories(onnxruntime_providers PRIVATE ${ORTTRAINING_ROOT}) + target_include_directories(${onnxruntime_providers_target} PRIVATE ${ORTTRAINING_ROOT}) endif() if (onnxruntime_ENABLE_ATEN) - target_compile_definitions(onnxruntime_providers PRIVATE ENABLE_ATEN) + target_compile_definitions(${onnxruntime_providers_target} PRIVATE ENABLE_ATEN) endif() if (onnxruntime_ENABLE_DLPACK) - target_compile_definitions(onnxruntime_providers PRIVATE ENABLE_DLPACK) + target_compile_definitions(${onnxruntime_providers_target} PRIVATE ENABLE_DLPACK) # DLPack is a header-only dependency - onnxruntime_add_include_to_target(onnxruntime_providers dlpack::dlpack) + onnxruntime_add_include_to_target(${onnxruntime_providers_target} dlpack::dlpack) endif() if (onnxruntime_ENABLE_TRAINING) - add_dependencies(onnxruntime_providers tensorboard) - onnxruntime_add_include_to_target(onnxruntime_providers tensorboard) + add_dependencies(${onnxruntime_providers_target} tensorboard) + onnxruntime_add_include_to_target(${onnxruntime_providers_target} tensorboard) if (onnxruntime_ENABLE_TRAINING_TORCH_INTEROP OR onnxruntime_ENABLE_TRITON) - onnxruntime_add_include_to_target(onnxruntime_providers Python::Module) + onnxruntime_add_include_to_target(${onnxruntime_providers_target} Python::Module) endif() if (onnxruntime_USE_NCCL) - target_include_directories(onnxruntime_providers PUBLIC ${MPI_CXX_INCLUDE_DIRS}) + target_include_directories(${onnxruntime_providers_target} PUBLIC ${MPI_CXX_INCLUDE_DIRS}) endif() endif() install(FILES ${PROJECT_SOURCE_DIR}/../include/onnxruntime/core/providers/cpu/cpu_provider_factory.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/onnxruntime/) install(FILES ${PROJECT_SOURCE_DIR}/../include/onnxruntime/core/providers/resource.h ${PROJECT_SOURCE_DIR}/../include/onnxruntime/core/providers/custom_op_context.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/onnxruntime/core/providers) -set_target_properties(onnxruntime_providers PROPERTIES LINKER_LANGUAGE CXX) -set_target_properties(onnxruntime_providers PROPERTIES FOLDER "ONNXRuntime") +set_target_properties(${onnxruntime_providers_target} PROPERTIES LINKER_LANGUAGE CXX) +set_target_properties(${onnxruntime_providers_target} PROPERTIES FOLDER "ONNXRuntime") if (NOT onnxruntime_MINIMAL_BUILD AND NOT onnxruntime_EXTENDED_MINIMAL_BUILD AND NOT ${CMAKE_SYSTEM_NAME} MATCHES "Darwin|iOS|visionOS|tvOS" diff -ruN a/cmake/onnxruntime_python.cmake b/cmake/onnxruntime_python.cmake --- a/cmake/onnxruntime_python.cmake +++ b/cmake/onnxruntime_python.cmake @@ -195,7 +195,7 @@ ${onnxruntime_libs} ${onnxruntime_pybind11_state_static_providers} onnxruntime_optimizer - onnxruntime_providers + ${onnxruntime_providers_target} onnxruntime_util onnxruntime_lora onnxruntime_framework diff -ruN a/cmake/onnxruntime_training.cmake b/cmake/onnxruntime_training.cmake --- a/cmake/onnxruntime_training.cmake +++ b/cmake/onnxruntime_training.cmake @@ -67,7 +67,7 @@ endif() onnxruntime_add_static_library(onnxruntime_training_runner ${onnxruntime_training_runner_srcs} ${onnxruntime_perf_test_src}) - add_dependencies(onnxruntime_training_runner ${onnxruntime_EXTERNAL_DEPENDENCIES} onnx onnxruntime_providers) + add_dependencies(onnxruntime_training_runner ${onnxruntime_EXTERNAL_DEPENDENCIES} onnx ${onnxruntime_providers_target}) if (onnxruntime_ENABLE_TRAINING_TORCH_INTEROP) target_link_libraries(onnxruntime_training_runner PRIVATE Python::Python) @@ -117,7 +117,7 @@ ${PROVIDERS_MKLDNN} ${PROVIDERS_DML} onnxruntime_optimizer - onnxruntime_providers + ${onnxruntime_providers_target} onnxruntime_util onnxruntime_framework ) diff -ruN a/cmake/onnxruntime_unittests.cmake b/cmake/onnxruntime_unittests.cmake --- a/cmake/onnxruntime_unittests.cmake +++ b/cmake/onnxruntime_unittests.cmake @@ -650,7 +650,7 @@ ${onnxruntime_libs} ${ONNXRUNTIME_TEST_STATIC_PROVIDER_LIBS} onnxruntime_optimizer - onnxruntime_providers + ${onnxruntime_providers_target} onnxruntime_util onnxruntime_lora onnxruntime_framework @@ -1357,7 +1357,7 @@ endif() if (CMAKE_SYSTEM_NAME MATCHES "AIX") - list(APPEND onnxruntime_shared_lib_test_LIBS onnxruntime_graph onnxruntime_session onnxruntime_providers onnxruntime_framework onnxruntime_util onnxruntime_mlas onnxruntime_optimizer onnxruntime_flatbuffers iconv re2 onnx) + list(APPEND onnxruntime_shared_lib_test_LIBS onnxruntime_graph onnxruntime_session ${onnxruntime_providers_target} onnxruntime_framework onnxruntime_util onnxruntime_mlas onnxruntime_optimizer onnxruntime_flatbuffers iconv re2 onnx) endif() AddTest(DYN @@ -1542,7 +1542,7 @@ ${onnxruntime_libs} # CUDA is dynamically loaded at runtime onnxruntime_optimizer - onnxruntime_providers + ${onnxruntime_providers_target} onnxruntime_util onnxruntime_lora onnxruntime_framework @@ -1685,7 +1685,7 @@ list(APPEND onnxruntime_customopregistration_test_LIBS ${TENSORRT_LIBRARY_INFER}) endif() if (CMAKE_SYSTEM_NAME MATCHES "AIX") - list(APPEND onnxruntime_customopregistration_test_LIBS onnxruntime_graph onnxruntime_session onnxruntime_providers onnxruntime_lora onnxruntime_framework onnxruntime_util onnxruntime_mlas onnxruntime_optimizer onnxruntime_flatbuffers iconv re2 ${PROTOBUF_LIB} onnx onnx_proto) + list(APPEND onnxruntime_customopregistration_test_LIBS onnxruntime_graph onnxruntime_session ${onnxruntime_providers_target} onnxruntime_lora onnxruntime_framework onnxruntime_util onnxruntime_mlas onnxruntime_optimizer onnxruntime_flatbuffers iconv re2 ${PROTOBUF_LIB} onnx onnx_proto) endif() AddTest(DYN TARGET onnxruntime_customopregistration_test @@ -1804,7 +1804,7 @@ set(onnxruntime_logging_apis_test_LIBS onnxruntime_common onnxruntime_test_utils) if (CMAKE_SYSTEM_NAME MATCHES "AIX") - list(APPEND onnxruntime_logging_apis_test_LIBS onnxruntime_session onnxruntime_util onnxruntime_lora onnxruntime_framework onnxruntime_common onnxruntime_graph onnxruntime_providers onnxruntime_mlas onnxruntime_optimizer onnxruntime_flatbuffers iconv re2 ${PROTOBUF_LIB} onnx onnx_proto) + list(APPEND onnxruntime_logging_apis_test_LIBS onnxruntime_session onnxruntime_util onnxruntime_lora onnxruntime_framework onnxruntime_common onnxruntime_graph ${onnxruntime_providers_target} onnxruntime_mlas onnxruntime_optimizer onnxruntime_flatbuffers iconv re2 ${PROTOBUF_LIB} onnx onnx_proto) endif() if(NOT WIN32) diff -ruN a/cmake/onnxruntime_webassembly.cmake b/cmake/onnxruntime_webassembly.cmake --- a/cmake/onnxruntime_webassembly.cmake +++ b/cmake/onnxruntime_webassembly.cmake @@ -109,7 +109,7 @@ onnxruntime_graph onnxruntime_mlas onnxruntime_optimizer - onnxruntime_providers + ${onnxruntime_providers_target} ${PROVIDERS_JS} ${PROVIDERS_XNNPACK} ${PROVIDERS_WEBNN} @@ -187,7 +187,7 @@ onnxruntime_graph onnxruntime_mlas onnxruntime_optimizer - onnxruntime_providers + ${onnxruntime_providers_target} ${PROVIDERS_JS} ${PROVIDERS_XNNPACK} ${PROVIDERS_WEBNN}