nuget.cmake 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. # This file is part of Desktop App Toolkit,
  2. # a set of libraries for developing nice desktop applications.
  3. #
  4. # For license and copyright information please follow this link:
  5. # https://github.com/desktop-app/legal/blob/master/LEGAL
  6. function(nuget_add_package package_name package package_version)
  7. get_property(nuget_exe_defined GLOBAL PROPERTY nuget_exe_path_property SET)
  8. if (NOT nuget_exe_defined)
  9. # Thanks https://github.com/clarkezone/flutter_win_webview/blob/master/webview_popupauth/windows/CMakeLists.txt
  10. find_program(NUGET_EXE NAMES nuget PATHS "${CMAKE_SOURCE_DIR}/../ThirdParty/NuGet")
  11. if (NOT NUGET_EXE)
  12. message("NUGET.EXE not found.")
  13. message(FATAL_ERROR "Please install this executable, and run CMake again.")
  14. endif()
  15. message("Resolved NuGet executable: ${NUGET_EXE}")
  16. set_property(GLOBAL PROPERTY nuget_exe_path_property ${NUGET_EXE})
  17. else()
  18. get_property(NUGET_EXE GLOBAL PROPERTY nuget_exe_path_property)
  19. endif()
  20. set(package_key nuget_${package_name}_version_property)
  21. get_property(package_version_defined GLOBAL PROPERTY ${package_key} SET)
  22. if (NOT package_version_defined)
  23. set(packages_loc ${CMAKE_BINARY_DIR}/packages)
  24. file(MAKE_DIRECTORY ${packages_loc})
  25. set_property(GLOBAL PROPERTY ${package_key} ${package_version})
  26. execute_process(
  27. COMMAND
  28. ${NUGET_EXE}
  29. install
  30. ${package}
  31. -Version ${package_version}
  32. -ExcludeVersion
  33. -OutputDirectory ${packages_loc}
  34. )
  35. else()
  36. get_property(package_version_cached GLOBAL PROPERTY ${package_key})
  37. if (NOT (${package_version_cached} EQUAL ${package_version}))
  38. message(FATAL_ERROR "Package ${package_name} requested with both ${package_version_cached} and ${package_version}")
  39. endif()
  40. endif()
  41. set(${package_name}_loc ${CMAKE_BINARY_DIR}/packages/${package} PARENT_SCOPE)
  42. endfunction()
  43. function(nuget_add_webview target_name)
  44. nuget_add_package(webview2 "Microsoft.Web.WebView2" 1.0.1901.177)
  45. set(webview2_loc_native ${webview2_loc}/build/native)
  46. # target_link_libraries(${target_name}
  47. # PRIVATE
  48. # ${webview2_loc_native}/Microsoft.Web.WebView2.targets
  49. # ${src_loc}/ForceStaticLink.targets
  50. # )
  51. #
  52. # This works, but just to be sure, manually link to static library.
  53. #
  54. target_include_directories(${target_name}
  55. PRIVATE
  56. ${webview2_loc_native}/include
  57. )
  58. if (build_winarm)
  59. set(webview2_lib_folder arm64)
  60. elseif (build_win64)
  61. set(webview2_lib_folder x64)
  62. else()
  63. set(webview2_lib_folder x86)
  64. endif()
  65. target_link_libraries(${target_name}
  66. PRIVATE
  67. ${webview2_loc_native}/${webview2_lib_folder}/WebView2LoaderStatic.lib
  68. )
  69. endfunction()
  70. function(nuget_add_winrt target_name)
  71. return() # Use headers from SDK, because Qt 6 does.
  72. nuget_add_package(winrt "Microsoft.Windows.CppWinRT" 2.0.210505.3)
  73. set(gen_dst ${CMAKE_BINARY_DIR}/packages/gen)
  74. file(MAKE_DIRECTORY ${gen_dst}/winrt)
  75. set(winrt_sdk_version)
  76. if (NOT DEFINED CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION)
  77. set(CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION)
  78. endif()
  79. # https://gitlab.kitware.com/cmake/cmake/-/blob/89cfb90b9c0893133983b4f25896671c4f07497c/Modules/InstallRequiredSystemLibraries.cmake#L381
  80. if (";${CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION};$ENV{UCRTVersion};$ENV{WindowsSDKVersion};" MATCHES [=[;([0-9.]+)[;\]]=])
  81. set(winrt_sdk_version ${CMAKE_MATCH_1})
  82. endif()
  83. set(winrt_version_key ${gen_dst}/winrt/version_key)
  84. set(winrt_version_test ${winrt_version_key}_test)
  85. set(sdk_version_key ${gen_dst}/winrt/sdk_version_key)
  86. set(sdk_version_test ${sdk_version_key}_test)
  87. execute_process(
  88. COMMAND
  89. ${winrt_loc}/bin/cppwinrt
  90. /?
  91. OUTPUT_FILE
  92. ${winrt_version_test}
  93. COMMAND_ERROR_IS_FATAL ANY
  94. )
  95. file(WRITE ${sdk_version_test} ${winrt_sdk_version})
  96. execute_process(
  97. COMMAND
  98. ${CMAKE_COMMAND} -E compare_files ${winrt_version_key} ${winrt_version_test}
  99. RESULT_VARIABLE winrt_version_compare_result
  100. )
  101. execute_process(
  102. COMMAND
  103. ${CMAKE_COMMAND} -E compare_files ${sdk_version_key} ${sdk_version_test}
  104. RESULT_VARIABLE sdk_version_compare_result
  105. )
  106. if (winrt_version_compare_result EQUAL 0 AND sdk_version_compare_result EQUAL 0)
  107. message("Using existing WinRT headers.")
  108. else()
  109. message("Generating new WinRT headers.")
  110. execute_process(
  111. COMMAND
  112. ${winrt_loc}/bin/cppwinrt
  113. -input ${winrt_sdk_version}
  114. -output ${gen_dst}
  115. COMMAND_ERROR_IS_FATAL ANY
  116. )
  117. file(RENAME ${winrt_version_test} ${winrt_version_key})
  118. file(RENAME ${sdk_version_test} ${sdk_version_key})
  119. endif()
  120. target_include_directories(${target_name}
  121. PRIVATE
  122. ${gen_dst}
  123. )
  124. endfunction()