qtdeploy.ps1 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. # This script is based on the implementation of windeployqt for qt5.7.1
  2. #
  3. # Qt's plugin deployment strategy is that each main Qt Module has a hardcoded
  4. # set of plugin subdirectories. Each of these subdirectories is deployed in
  5. # full if that Module is referenced.
  6. #
  7. # This hardcoded list is found inside qttools\src\windeployqt\main.cpp. For
  8. # updating, inspect the symbols qtModuleEntries and qtModuleForPlugin.
  9. # Note: this function signature and behavior is depended upon by applocal.ps1
  10. function deployPluginsIfQt([string]$targetBinaryDir, [string]$QtPluginsDir, [string]$targetBinaryName) {
  11. $baseDir = Split-Path $QtPluginsDir -parent
  12. $binDir = "$baseDir\bin"
  13. function deployPlugins([string]$pluginSubdirName) {
  14. if (Test-Path "$QtPluginsDir\$pluginSubdirName") {
  15. Write-Verbose " Deploying plugins directory '$pluginSubdirName'"
  16. New-Item "$targetBinaryDir\plugins\$pluginSubdirName" -ItemType Directory -ErrorAction SilentlyContinue | Out-Null
  17. Get-ChildItem "$QtPluginsDir\$pluginSubdirName\*.dll" | % {
  18. deployBinary "$targetBinaryDir\plugins\$pluginSubdirName" "$QtPluginsDir\$pluginSubdirName" $_.Name
  19. resolve "$targetBinaryDir\plugins\$pluginSubdirName\$($_.Name)"
  20. }
  21. } else {
  22. Write-Verbose " Skipping plugins directory '$pluginSubdirName': doesn't exist"
  23. }
  24. }
  25. # We detect Qt modules in use via the DLLs themselves. See qtModuleEntries in Qt to find the mapping.
  26. if ($targetBinaryName -match "Qt5Cored?.dll") {
  27. if (!(Test-Path "$targetBinaryDir\qt.conf")) {
  28. "[Paths]" | Out-File -encoding ascii "$targetBinaryDir\qt.conf"
  29. }
  30. } elseif ($targetBinaryName -match "Qt5Guid?.dll") {
  31. Write-Verbose " Deploying platforms"
  32. New-Item "$targetBinaryDir\plugins\platforms" -ItemType Directory -ErrorAction SilentlyContinue | Out-Null
  33. Get-ChildItem "$QtPluginsDir\platforms\qwindows*.dll" | % {
  34. deployBinary "$targetBinaryDir\plugins\platforms" "$QtPluginsDir\platforms" $_.Name
  35. }
  36. deployPlugins "accessible"
  37. deployPlugins "imageformats"
  38. deployPlugins "iconengines"
  39. deployPlugins "platforminputcontexts"
  40. deployPlugins "styles"
  41. } elseif ($targetBinaryName -match "Qt5Networkd?.dll") {
  42. deployPlugins "bearer"
  43. if (Test-Path "$binDir\libcrypto-1_1-x64.dll")
  44. {
  45. deployBinary "$targetBinaryDir" "$binDir" "libcrypto-1_1-x64.dll"
  46. deployBinary "$targetBinaryDir" "$binDir" "libssl-1_1-x64.dll"
  47. }
  48. if (Test-Path "$binDir\libcrypto-1_1.dll")
  49. {
  50. deployBinary "$targetBinaryDir" "$binDir" "libcrypto-1_1.dll"
  51. deployBinary "$targetBinaryDir" "$binDir" "libssl-1_1.dll"
  52. }
  53. } elseif ($targetBinaryName -match "Qt5Sqld?.dll") {
  54. deployPlugins "sqldrivers"
  55. } elseif ($targetBinaryName -match "Qt5Multimediad?.dll") {
  56. deployPlugins "audio"
  57. deployPlugins "mediaservice"
  58. deployPlugins "playlistformats"
  59. } elseif ($targetBinaryName -match "Qt5PrintSupportd?.dll") {
  60. deployPlugins "printsupport"
  61. } elseif ($targetBinaryName -match "Qt5Qmld?.dll") {
  62. if(!(Test-Path "$targetBinaryDir\qml"))
  63. {
  64. if (Test-Path "$binDir\..\qml") {
  65. cp -r "$binDir\..\qml" $targetBinaryDir
  66. } elseif (Test-Path "$binDir\..\..\qml") {
  67. cp -r "$binDir\..\..\qml" $targetBinaryDir
  68. } else {
  69. throw "FAILED"
  70. }
  71. }
  72. } elseif ($targetBinaryName -match "Qt5Quickd?.dll") {
  73. foreach ($a in @("Qt5QuickControls2", "Qt5QuickControls2d", "Qt5QuickShapes", "Qt5QuickShapesd", "Qt5QuickTemplates2", "Qt5QuickTemplates2d", "Qt5QmlWorkerScript", "Qt5QmlWorkerScriptd", "Qt5QuickParticles", "Qt5QuickParticlesd", "Qt5QuickWidgets", "Qt5QuickWidgetsd", "Qt5PositioningQuick", "Qt5PositioningQuickd", "Qt5Multimedia", "Qt5Multimediad", "Qt5MultimediaQuick", "Qt5MultimediaQuickd", "Qt5Charts", "Qt5Chartsd"))
  74. {
  75. if (Test-Path "$binDir\$a.dll")
  76. {
  77. deployBinary "$targetBinaryDir" "$binDir" "$a.dll"
  78. }
  79. }
  80. deployPlugins "scenegraph"
  81. deployPlugins "qmltooling"
  82. } elseif ($targetBinaryName -like "Qt5Declarative*.dll") {
  83. deployPlugins "qml1tooling"
  84. } elseif ($targetBinaryName -like "Qt5Positioning*.dll") {
  85. deployPlugins "position"
  86. } elseif ($targetBinaryName -like "Qt5Location*.dll") {
  87. deployPlugins "geoservices"
  88. } elseif ($targetBinaryName -like "Qt5Sensors*.dll") {
  89. deployPlugins "sensors"
  90. deployPlugins "sensorgestures"
  91. } elseif ($targetBinaryName -like "Qt5WebEngineCore*.dll") {
  92. deployPlugins "qtwebengine"
  93. } elseif ($targetBinaryName -like "Qt53DRenderer*.dll") {
  94. deployPlugins "sceneparsers"
  95. } elseif ($targetBinaryName -like "Qt5TextToSpeech*.dll") {
  96. deployPlugins "texttospeech"
  97. } elseif ($targetBinaryName -like "Qt5SerialBus*.dll") {
  98. deployPlugins "canbus"
  99. }
  100. }