From 545f6bf2ce87da7be39f6c818d45df394a5654f5 Mon Sep 17 00:00:00 2001 From: John Preston Date: Tue, 22 Jun 2021 09:50:05 +0400 Subject: [PATCH] Add NuGet functions to add WebView / WinRT packages. --- nuget.cmake | 126 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 nuget.cmake diff --git a/nuget.cmake b/nuget.cmake new file mode 100644 index 0000000..b600d2f --- /dev/null +++ b/nuget.cmake @@ -0,0 +1,126 @@ +# This file is part of Desktop App Toolkit, +# a set of libraries for developing nice desktop applications. +# +# For license and copyright information please follow this link: +# https://github.com/desktop-app/legal/blob/master/LEGAL + +function(nuget_add_package package_name package package_version) + if (NOT DEFINED NUGET_EXE_PATH) + # Thanks https://github.com/clarkezone/flutter_win_webview/blob/master/webview_popupauth/windows/CMakeLists.txt + find_program(NUGET_EXE NAMES nuget) + if (NOT NUGET_EXE) + message("NUGET.EXE not found.") + message(FATAL_ERROR "Please install this executable, and run CMake again.") + endif() + set(NUGET_EXE_PATH ${NUGET_EXE} PARENT_SCOPE) + else() + set(NUGET_EXE ${NUGET_EXE_PATH}) + endif() + + set(package_key NUGET_${package_name}_VERSION) + if (NOT DEFINED ${package_key}) + set(packages_loc ${CMAKE_BINARY_DIR}/packages) + file(MAKE_DIRECTORY ${packages_loc}) + + set(${package_key} ${package_version}) + execute_process( + COMMAND + ${NUGET_EXE} + install + ${package} + -Version ${package_version} + -ExcludeVersion + -OutputDirectory ${packages_loc} + ) + set(${package_name}_loc ${CMAKE_BINARY_DIR}/packages/${package} PARENT_SCOPE) + elseif ("${${package_key}}" != ${package_version}) + message(FATAL_ERROR "Package ${package_name} requested with both ${${package_key}} and ${package_version}") + endif() +endfunction() + +function(nuget_add_webview target_name) + nuget_add_package(webview2 "Microsoft.Web.WebView2" 1.0.864.35) + + set(webview2_loc_native ${webview2_loc}/build/native) + # target_link_libraries(${target_name} + # PRIVATE + # ${webview2_loc_native}/Microsoft.Web.WebView2.targets + # ${src_loc}/ForceStaticLink.targets + # ) + # + # This works, but just to be sure, manually link to static library. + # + target_include_directories(${target_name} + PRIVATE + ${webview2_loc_native}/include + ) + if (build_win64) + set(webview2_lib_folder x64) + else() + set(webview2_lib_folder x86) + endif() + target_link_libraries(${target_name} + PRIVATE + ${webview2_loc_native}/${webview2_lib_folder}/WebView2LoaderStatic.lib + ) + +endfunction() + +function(nuget_add_winrt target_name) + nuget_add_package(winrt "Microsoft.Windows.CppWinRT" 2.0.210505.3) + + set(gen_dst ${CMAKE_BINARY_DIR}/packages/gen) + file(MAKE_DIRECTORY ${gen_dst}/winrt) + + set(winrt_sdk_version ${CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION}) + set(winrt_version_key ${gen_dst}/winrt/version_key) + set(winrt_version_test ${winrt_version_key}_test) + set(sdk_version_key ${gen_dst}/winrt/sdk_version_key) + set(sdk_version_test ${sdk_version_key}_test) + + execute_process( + COMMAND + ${winrt_loc}/bin/cppwinrt + /? + OUTPUT_FILE + ${winrt_version_test} + ) + execute_process( + COMMAND + echo + ${winrt_sdk_version} + OUTPUT_FILE + ${sdk_version_test} + ) + execute_process( + COMMAND + ${CMAKE_COMMAND} -E compare_files ${winrt_version_key} ${winrt_version_test} + RESULT_VARIABLE winrt_version_compare_result + ) + execute_process( + COMMAND + ${CMAKE_COMMAND} -E compare_files ${sdk_version_key} ${sdk_version_test} + RESULT_VARIABLE sdk_version_compare_result + ) + if (winrt_version_compare_result EQUAL 0 AND sdk_version_compare_result EQUAL 0) + message("Using existing WinRT headers.") + else() + message("Generating new WinRT headers.") + + execute_process( + COMMAND + ${winrt_loc}/bin/cppwinrt + -input ${winrt_sdk_version} + -output ${gen_dst} + COMMAND + cp ${winrt_version_test} ${winrt_version_key} + COMMAND + cp ${sdk_version_test} ${sdk_version_key} + ) + endif() + + target_include_directories(${target_name} + PRIVATE + ${gen_dst} + ) +endfunction()