QMake: Add ability to link against xcframeworks with Xcode

This adds rudimentary support for linking against xcframeworks. We can
now do
    LIBS += /absolute/path/to/some.xcframework
and this will end up in the frameworks section of the Xcode project.

This is required for linking against the FFmpeg xcframeworks we're
providing for iOS.

Pick-to: 6.8 6.9
Task-number: QTBUG-86387
Task-number: QTBUG-129651
Change-Id: Id212700d3554689160d23eafb26d99ac43b91062
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
This commit is contained in:
Joerg Bornemann 2025-03-13 13:10:18 +01:00
parent 83b6139149
commit 1185f651e3

View File

@ -450,6 +450,8 @@ static QString xcodeFiletypeForFilename(const QString &filename)
return QStringLiteral("sourcecode.c.objc"); return QStringLiteral("sourcecode.c.objc");
if (filename.endsWith(QLatin1String(".framework"))) if (filename.endsWith(QLatin1String(".framework")))
return QStringLiteral("wrapper.framework"); return QStringLiteral("wrapper.framework");
if (filename.endsWith(QLatin1String(".xcframework")))
return QStringLiteral("wrapper.xcframework");
if (filename.endsWith(QLatin1String(".a"))) if (filename.endsWith(QLatin1String(".a")))
return QStringLiteral("archive.ar"); return QStringLiteral("archive.ar");
if (filename.endsWith(QLatin1String(".pro")) || filename.endsWith(QLatin1String(".qrc"))) if (filename.endsWith(QLatin1String(".pro")) || filename.endsWith(QLatin1String(".qrc")))
@ -964,15 +966,18 @@ ProjectBuilderMakefileGenerator::writeMakeParts(QTextStream &t)
library = fileFixify(library, FileFixifyFromOutdir | FileFixifyAbsolute); library = fileFixify(library, FileFixifyFromOutdir | FileFixifyAbsolute);
QString key = keyFor(library); QString key = keyFor(library);
if (!project->values("QMAKE_PBX_LIBRARIES").contains(key)) { if (!project->values("QMAKE_PBX_LIBRARIES").contains(key)) {
bool is_frmwrk = (library.endsWith(".framework")); const QString fileType = xcodeFiletypeForFilename(library);
bool is_frmwrk = fileType.endsWith("framework");
t << "\t\t" << key << " = {\n" t << "\t\t" << key << " = {\n"
<< "\t\t\t" << writeSettings("isa", "PBXFileReference", SettingsNoQuote) << ";\n" << "\t\t\t" << writeSettings("isa", "PBXFileReference", SettingsNoQuote) << ";\n"
<< "\t\t\t" << writeSettings("name", name) << ";\n" << "\t\t\t" << writeSettings("name", name) << ";\n"
<< "\t\t\t" << writeSettings("path", library) << ";\n" << "\t\t\t" << writeSettings("path", library) << ";\n"
<< "\t\t\t" << writeSettings("refType", QString::number(reftypeForFile(library)), SettingsNoQuote) << ";\n" << "\t\t\t" << writeSettings("refType", QString::number(reftypeForFile(library)), SettingsNoQuote) << ";\n"
<< "\t\t\t" << writeSettings("sourceTree", "<absolute>") << ";\n"; << "\t\t\t" << writeSettings("sourceTree", "<absolute>") << ";\n";
if (is_frmwrk) if (is_frmwrk) {
t << "\t\t\t" << writeSettings("lastKnownFileType", "wrapper.framework") << ";\n"; t << "\t\t\t" << writeSettings("lastKnownFileType", fileType)
<< ";\n";
}
t << "\t\t};\n"; t << "\t\t};\n";
project->values("QMAKE_PBX_LIBRARIES").append(key); project->values("QMAKE_PBX_LIBRARIES").append(key);
QString build_key = keyFor(library + ".BUILDABLE"); QString build_key = keyFor(library + ".BUILDABLE");