diff --git a/cmake/target_delayload.cmake b/cmake/target_delayload.cmake new file mode 100644 index 0000000000..d0c219e1c6 --- /dev/null +++ b/cmake/target_delayload.cmake @@ -0,0 +1,17 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + +# Add delayloaded libraries to a target +function(target_delayload target_name) + if(NOT MSVC) + message(SEND_ERROR "Delayloading is only supported in MSVC") + endif() + foreach(lib ${ARGN}) + target_link_options(${target_name} PRIVATE /DELAYLOAD:"${lib}") + endforeach() + if (onnxruntime_BUILD_FOR_WINDOWS_STORE) + target_link_libraries(${target_name} PRIVATE dloadhelper.lib) + else() + target_link_libraries(${target_name} PRIVATE delayimp.lib) + endif() +endfunction() diff --git a/cmake/winml.cmake b/cmake/winml.cmake index e4e06f40de..d835ed963f 100644 --- a/cmake/winml.cmake +++ b/cmake/winml.cmake @@ -6,6 +6,7 @@ if (NOT WINDOWS_STORE) endif() include(precompiled_header.cmake) +include(target_delayload.cmake) include(winml_sdk_helpers.cmake) include(winml_cppwinrt.cmake) @@ -599,11 +600,11 @@ set_target_properties(winml_dll set(os_component_link_flags_list ${os_component_link_flags}) separate_arguments(os_component_link_flags_list) -target_link_options(winml_dll PRIVATE /DEF:${WINML_DIR}/winml.def ${os_component_link_flags_list} /DELAYLOAD:api-ms-win-core-libraryloader-l1-2-1.dll /DELAYLOAD:api-ms-win-core-threadpool-legacy-l1-1-0.dll /DELAYLOAD:api-ms-win-core-processtopology-obsolete-l1-1-0.dll /DELAYLOAD:api-ms-win-core-kernel32-legacy-l1-1-0.dll /DELAYLOAD:d3d12.dll /DELAYLOAD:d3d11.dll /DELAYLOAD:dxgi.dll /DELAYLOAD:directml.dll) - +target_link_options(winml_dll PRIVATE /DEF:${WINML_DIR}/winml.def ${os_component_link_flags_list}) +target_delayload(winml_dll api-ms-win-core-libraryloader-l1-2-1.dll api-ms-win-core-threadpool-legacy-l1-1-0.dll api-ms-win-core-processtopology-obsolete-l1-1-0.dll api-ms-win-core-kernel32-legacy-l1-1-0.dll d3d12.dll d3d11.dll dxgi.dll directml.dll) if (EXISTS ${dxcore_header}) - target_link_options(winml_dll PRIVATE /DELAYLOAD:ext-ms-win-dxcore-l1-*.dll) + target_delayload(winml_dll ext-ms-win-dxcore-l1-*.dll) endif() set_target_properties(winml_dll @@ -626,14 +627,6 @@ target_link_libraries(winml_dll PRIVATE winml_lib_ort) target_link_libraries(winml_dll PRIVATE winml_lib_telemetry) target_link_libraries(winml_dll PRIVATE RuntimeObject.lib) -target_link_libraries(winml_dll PRIVATE windowsapp.lib) - -if (onnxruntime_BUILD_FOR_WINDOWS_STORE) - target_link_libraries(winml_dll PRIVATE dloadhelper.lib) -else() - target_link_libraries(winml_dll PRIVATE delayimp.lib) -endif() - # Any project that links in debug_alloc.obj needs this lib. # unresolved external symbol __imp_SymSetOptions diff --git a/cmake/winml_unittests.cmake b/cmake/winml_unittests.cmake index 794f51b8c1..84bef98191 100644 --- a/cmake/winml_unittests.cmake +++ b/cmake/winml_unittests.cmake @@ -49,7 +49,7 @@ function(add_winml_test) if (_UT_DEPENDS) add_dependencies(${_UT_TARGET} ${_UT_DEPENDS}) endif() - target_link_libraries(${_UT_TARGET} PRIVATE ${_UT_LIBS} gtest winml_google_test_lib ${onnxruntime_EXTERNAL_LIBRARIES} winml_lib_common onnxruntime windowsapp.lib) + target_link_libraries(${_UT_TARGET} PRIVATE ${_UT_LIBS} gtest winml_google_test_lib ${onnxruntime_EXTERNAL_LIBRARIES} winml_lib_common onnxruntime) add_test(NAME ${_UT_TARGET} COMMAND ${_UT_TARGET} @@ -167,28 +167,28 @@ endif() add_winml_test( TARGET winml_test_api SOURCES ${winml_test_api_src} ${winml_test_api_redist_only_src} - LIBS winml_test_common delayimp.lib + LIBS winml_test_common ) -target_link_options(winml_test_api PRIVATE /DELAYLOAD:d3d11.dll /DELAYLOAD:dxgi.dll /DELAYLOAD:d3d12.dll /DELAYLOAD:api-ms-win-core-file-l1-2-2.dll /DELAYLOAD:api-ms-win-core-synch-l1-2-1.dll) +target_delayload(winml_test_api d3d11.dll dxgi.dll d3d12.dll api-ms-win-core-file-l1-2-2.dll api-ms-win-core-synch-l1-2-1.dll) if (onnxruntime_USE_DML) - target_link_options(winml_test_api PRIVATE /DELAYLOAD:directml.dll) + target_delayload(winml_test_api directml.dll) endif() if (EXISTS ${dxcore_header}) - target_link_options(winml_test_api PRIVATE /DELAYLOAD:ext-ms-win-dxcore-l1-*.dll) + target_delayload(winml_test_api ext-ms-win-dxcore-l1-*.dll) endif() get_winml_test_scenario_src(${WINML_TEST_SRC_DIR} winml_test_scenario_src winml_test_scenario_libs) add_winml_test( TARGET winml_test_scenario SOURCES ${winml_test_scenario_src} - LIBS winml_test_common delayimp.lib ${winml_test_scenario_libs} + LIBS winml_test_common ${winml_test_scenario_libs} ) -target_link_options(winml_test_scenario PRIVATE /DELAYLOAD:d2d1.dll /DELAYLOAD:d3d11.dll /DELAYLOAD:dxgi.dll /DELAYLOAD:d3d12.dll /DELAYLOAD:api-ms-win-core-libraryloader-l1-2-1.dll /DELAYLOAD:api-ms-win-core-file-l1-2-2.dll /DELAYLOAD:api-ms-win-core-synch-l1-2-1.dll) +target_delayload(winml_test_scenario d2d1.dll d3d11.dll dxgi.dll d3d12.dll api-ms-win-core-libraryloader-l1-2-1.dll api-ms-win-core-file-l1-2-2.dll api-ms-win-core-synch-l1-2-1.dll) if (onnxruntime_USE_DML) - target_link_options(winml_test_scenario PRIVATE /DELAYLOAD:directml.dll) + target_delayload(winml_test_scenario directml.dll) endif() if (EXISTS ${dxcore_header}) - target_link_options(winml_test_scenario PRIVATE /DELAYLOAD:ext-ms-win-dxcore-l1-*.dll) + target_delayload(winml_test_scenario ext-ms-win-dxcore-l1-*.dll) endif() # necessary for winml_test_scenario because of a still unknown reason, api-ms-win-core-libraryloader-l1-2-1.dll is linked against @@ -199,13 +199,13 @@ get_winml_test_image_src(${WINML_TEST_SRC_DIR} winml_test_image_src winml_test_i add_winml_test( TARGET winml_test_image SOURCES ${winml_test_image_src} - LIBS winml_test_common delayimp.lib ${winml_test_image_libs} + LIBS winml_test_common ${winml_test_image_libs} ) target_precompiled_header(winml_test_image testPch.h) -target_link_options(winml_test_image PRIVATE /DELAYLOAD:d3d12.dll /DELAYLOAD:api-ms-win-core-file-l1-2-2.dll /DELAYLOAD:api-ms-win-core-synch-l1-2-1.dll) +target_delayload(winml_test_image d3d12.dll api-ms-win-core-file-l1-2-2.dll api-ms-win-core-synch-l1-2-1.dll) if (EXISTS ${dxcore_header}) - target_link_options(winml_test_image PRIVATE /DELAYLOAD:ext-ms-win-dxcore-l1-*.dll) + target_delayload(winml_test_image ext-ms-win-dxcore-l1-*.dll) endif() get_winml_test_concurrency_src(${WINML_TEST_SRC_DIR} winml_test_concurrency_src)