diff --git a/.github/workflows/ccpp.yml b/.github/workflows/ccpp.yml index 373d66a08..f8ebd10f2 100644 --- a/.github/workflows/ccpp.yml +++ b/.github/workflows/ccpp.yml @@ -1239,8 +1239,6 @@ jobs: BUILD_TYPE: Release MACOSX_DEPLOYMENT_TARGET: 10.15 PKG_CONFIG_PATH: /usr/local/lib/pkgconfig - Qt5_DIR: /usr/local/opt/qt5/lib/cmake - Qt5LinguistTools_DIR: /usr/local/opt/qt5/lib/cmake/Qt5LinguistTools GIO_EXTRA_MODULES: /usr/local/lib/gio/modules GST_PLUGIN_SCANNER: /usr/local/opt/gstreamer/libexec/gstreamer-1.0/gst-plugin-scanner GST_PLUGIN_PATH: /usr/local/lib/gstreamer-1.0 @@ -1341,8 +1339,6 @@ jobs: BUILD_TYPE: Release MACOSX_DEPLOYMENT_TARGET: 10.15 PKG_CONFIG_PATH: /usr/local/lib/pkgconfig - Qt6_DIR: /usr/local/opt/qt6/lib/cmake - Qt5LinguistTools_DIR: /usr/local/opt/qt6/lib/cmake/Qt6LinguistTools GIO_EXTRA_MODULES: /usr/local/lib/gio/modules GST_PLUGIN_SCANNER: /usr/local/opt/gstreamer/libexec/gstreamer-1.0/gst-plugin-scanner GST_PLUGIN_PATH: /usr/local/lib/gstreamer-1.0 @@ -1358,6 +1354,12 @@ jobs: working-directory: build shell: bash run: make install + - name: Manually copy libbrotlicommon.1.dylib + working-directory: build + shell: bash + run: | + mkdir -p strawberry.app/Contents/Frameworks/ + cp /usr/local/lib/libbrotlicommon.1.dylib strawberry.app/Contents/Frameworks/ - name: Copy sparkle working-directory: build shell: bash diff --git a/3rdparty/macdeployqt/shared.cpp b/3rdparty/macdeployqt/shared.cpp index e0e60d971..f56c5f176 100644 --- a/3rdparty/macdeployqt/shared.cpp +++ b/3rdparty/macdeployqt/shared.cpp @@ -1216,7 +1216,15 @@ void deployPlugins(const ApplicationBundleInfo &appBundleInfo, const QString &pl { QString sourcePath = qgetenv("GIO_EXTRA_MODULES"); if (sourcePath.isEmpty()) { - sourcePath = "/usr/local/lib/gio/modules/libgiognutls.so"; + if (QFileInfo::exists("/usr/local/lib/gio/modules/libgiognutls.so")) { + sourcePath = "/usr/local/lib/gio/modules/libgiognutls.so"; + } + else if (QFileInfo::exists("/opt/local/lib/gio/modules/libgiognutls.so")) { + sourcePath = "/opt/local/lib/gio/modules/libgiognutls.so"; + } + else { + qFatal("Missing GIO_EXTRA_MODULES"); + } } else { sourcePath = sourcePath + "/libgiognutls.so"; @@ -1234,7 +1242,15 @@ void deployPlugins(const ApplicationBundleInfo &appBundleInfo, const QString &pl { QString sourcePath = qgetenv("GST_PLUGIN_SCANNER"); if (sourcePath.isEmpty()) { - sourcePath = "/usr/local/opt/gstreamer/libexec/gstreamer-1.0/gst-plugin-scanner"; + if (QFileInfo::exists("/usr/local/opt/gstreamer/libexec/gstreamer-1.0/gst-plugin-scanner")) { + sourcePath = "/usr/local/opt/gstreamer/libexec/gstreamer-1.0/gst-plugin-scanner"; + } + else if (QFileInfo::exists("/opt/local/libexec/gstreamer-1.0/gst-plugin-scanner")) { + sourcePath = "/opt/local/libexec/gstreamer-1.0/gst-plugin-scanner"; + } + else { + qFatal("Missing GST_PLUGIN_SCANNER."); + } } const QString destinationPath = appBundleInfo.path + "/" + "Contents/PlugIns/gst-plugin-scanner"; QDir dir; @@ -1281,11 +1297,9 @@ void deployPlugins(const ApplicationBundleInfo &appBundleInfo, const QString &pl << "libgstrtsp.dylib" << "libgstflac.dylib" << "libgstwavparse.dylib" - << "libgstfaac.dylib" << "libgstfaad.dylib" << "libgstogg.dylib" << "libgstopus.dylib" - << "libgstopusparse.dylib" << "libgstasf.dylib" << "libgstspeex.dylib" << "libgsttaglib.dylib" @@ -1293,22 +1307,59 @@ void deployPlugins(const ApplicationBundleInfo &appBundleInfo, const QString &pl << "libgstisomp4.dylib" << "libgstlibav.dylib" << "libgstaiff.dylib" - << "libgstlame.dylib" - << "libgstmusepack.dylib"; + << "libgstlame.dylib"; - QString gstreamer_plugins_dir = qgetenv("GST_PLUGIN_PATH"); - if (gstreamer_plugins_dir.isEmpty()) { - gstreamer_plugins_dir = "/usr/local/lib/gstreamer-1.0"; - } + // macports does not have these. + QStringList gstreamer_plugins_optional = QStringList() << "libgstopusparse.dylib" + << "libgstfaac.dylib" + << "libgstmusepack.dylib"; + + QString gstreamer_plugins_dir = qgetenv("GST_PLUGIN_PATH"); + if (gstreamer_plugins_dir.isEmpty()) { + if (QDir().exists("/usr/local/lib/gstreamer-1.0")) { + gstreamer_plugins_dir = "/usr/local/lib/gstreamer-1.0"; + } + else if (QDir().exists("/opt/local/lib/gstreamer-1.0")) { + gstreamer_plugins_dir = "/opt/local/lib/gstreamer-1.0"; + } + else { + qFatal("Missing GST_PLUGIN_PATH."); + } + } for (const QString &plugin : gstreamer_plugins) { - const QString sourcePath = gstreamer_plugins_dir + "/" + plugin; - const QString destinationPath = appBundleInfo.path + "/Contents/PlugIns/gstreamer/" + plugin; - QDir dir; - if (dir.mkpath(QFileInfo(destinationPath).path()) && copyFilePrintStatus(sourcePath, destinationPath)) { - runStrip(destinationPath); - QList frameworks = getQtFrameworks(destinationPath, appBundleInfo.path, deploymentInfo.rpathsUsed, useDebugLibs); - deployQtFrameworks(frameworks, appBundleInfo.path, QStringList() << destinationPath, useDebugLibs, deploymentInfo.useLoaderPath); + QFileInfo info(gstreamer_plugins_dir + "/" + plugin); + if (!info.exists()) { + info.setFile(gstreamer_plugins_dir + "/" + info.baseName() + QString(".so")); + if (!info.exists()) { + LogError() << "Missing gstreamer plugin" << info.baseName(); + qFatal("Missing %s", info.baseName().toUtf8().constData()); + } + } + const QString &sourcePath = info.filePath(); + const QString destinationPath = appBundleInfo.path + "/Contents/PlugIns/gstreamer/" + info.fileName(); + if (QDir().mkpath(QFileInfo(destinationPath).path()) && copyFilePrintStatus(sourcePath, destinationPath)) { + runStrip(destinationPath); + QList frameworks = getQtFrameworks(destinationPath, appBundleInfo.path, deploymentInfo.rpathsUsed, useDebugLibs); + deployQtFrameworks(frameworks, appBundleInfo.path, QStringList() << destinationPath, useDebugLibs, deploymentInfo.useLoaderPath); + } + } + + for (const QString &plugin : gstreamer_plugins_optional) { + QFileInfo info(gstreamer_plugins_dir + "/" + plugin); + if (!info.exists()) { + info.setFile(gstreamer_plugins_dir + "/" + info.baseName() + QString(".so")); + if (!info.exists()) { + LogWarning() << "Skip missing gstreamer plugin" << info.baseName(); + continue; + } + } + const QString &sourcePath = info.filePath(); + const QString destinationPath = appBundleInfo.path + "/Contents/PlugIns/gstreamer/" + info.fileName(); + if (QDir().mkpath(QFileInfo(destinationPath).path()) && copyFilePrintStatus(sourcePath, destinationPath)) { + runStrip(destinationPath); + QList frameworks = getQtFrameworks(destinationPath, appBundleInfo.path, deploymentInfo.rpathsUsed, useDebugLibs); + deployQtFrameworks(frameworks, appBundleInfo.path, QStringList() << destinationPath, useDebugLibs, deploymentInfo.useLoaderPath); } } diff --git a/cmake/Dmg.cmake b/cmake/Dmg.cmake index 54b15dcb6..039f8b5a7 100644 --- a/cmake/Dmg.cmake +++ b/cmake/Dmg.cmake @@ -26,7 +26,6 @@ if(MACDEPLOYQT_EXECUTABLE) COMMAND mkdir -p ${CMAKE_BINARY_DIR}/strawberry.app/Contents/{Frameworks,Resources} COMMAND cp ${CMAKE_SOURCE_DIR}/dist/macos/Info.plist ${CMAKE_BINARY_DIR}/strawberry.app/Contents/ COMMAND cp ${CMAKE_SOURCE_DIR}/dist/macos/strawberry.icns ${CMAKE_BINARY_DIR}/strawberry.app/Contents/Resources/ - COMMAND cp /usr/local/lib/libbrotlicommon.1.dylib ${CMAKE_BINARY_DIR}/strawberry.app/Contents/Frameworks/ COMMAND ${MACDEPLOYQT_EXECUTABLE} strawberry.app -verbose=3 -executable=${CMAKE_BINARY_DIR}/strawberry.app/Contents/PlugIns/strawberry-tagreader WORKING_DIRECTORY ${CMAKE_BINARY_DIR} DEPENDS strawberry strawberry-tagreader macdeployqt