Fix library suffix replacement for xcode projects
In xcode projects we replace the _debug part of referenced libraries with the variable $(QT_LIBRARY_SUFFIX). This only worked for libraries passed with -l. Make the library suffix replacement work for libraries passed as absolute paths too. Fixes: QTBUG-77804 Change-Id: Iac2dbd2f67c3fa0f415ac43cbab5a906657164e5 Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
This commit is contained in:
parent
1232205e32
commit
7b82d27429
@ -514,6 +514,56 @@ static QList<QVariantMap> provisioningTeams()
|
||||
return flatTeams;
|
||||
}
|
||||
|
||||
bool ProjectBuilderMakefileGenerator::replaceLibrarySuffix(const QString &lib_file,
|
||||
const ProString &opt,
|
||||
QString &name, QString &library)
|
||||
{
|
||||
/* This isn't real nice, but it is real useful. This looks in a prl
|
||||
for what the library will ultimately be called so we can stick it
|
||||
in the ProjectFile. If the prl format ever changes (not likely) then
|
||||
this will not really work. However, more concerning is that it will
|
||||
encode the version number in the Project file which might be a bad
|
||||
things in days to come? --Sam
|
||||
*/
|
||||
if (lib_file.isEmpty())
|
||||
return false;
|
||||
|
||||
QMakeMetaInfo libinfo;
|
||||
if (!libinfo.readLib(lib_file) || libinfo.isEmpty("QMAKE_PRL_TARGET"))
|
||||
return false;
|
||||
|
||||
const QString libDir = fileInfo(lib_file).absolutePath();
|
||||
library = libDir + Option::dir_sep + libinfo.first("QMAKE_PRL_TARGET");
|
||||
|
||||
debug_msg(1, "pbuilder: Found library (%s) via PRL %s (%s)",
|
||||
opt.toLatin1().constData(), lib_file.toLatin1().constData(), library.toLatin1().constData());
|
||||
|
||||
if (project->isActiveConfig("xcode_dynamic_library_suffix")) {
|
||||
QString suffixSetting = project->first("QMAKE_XCODE_LIBRARY_SUFFIX_SETTING").toQString();
|
||||
if (!suffixSetting.isEmpty()) {
|
||||
QString librarySuffix = project->first("QMAKE_XCODE_LIBRARY_SUFFIX").toQString();
|
||||
suffixSetting = "$(" + suffixSetting + ")";
|
||||
if (!librarySuffix.isEmpty()) {
|
||||
int pos = library.lastIndexOf(librarySuffix + '.');
|
||||
if (pos == -1) {
|
||||
warn_msg(WarnLogic, "Failed to find expected suffix '%s' for library '%s'.",
|
||||
qPrintable(librarySuffix), qPrintable(library));
|
||||
} else {
|
||||
library.replace(pos, librarySuffix.length(), suffixSetting);
|
||||
if (name.endsWith(librarySuffix))
|
||||
name.chop(librarySuffix.length());
|
||||
}
|
||||
} else {
|
||||
int pos = library.lastIndexOf(name);
|
||||
if (pos != -1)
|
||||
library.insert(pos + name.length(), suffixSetting);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
ProjectBuilderMakefileGenerator::writeMakeParts(QTextStream &t)
|
||||
{
|
||||
@ -832,6 +882,7 @@ ProjectBuilderMakefileGenerator::writeMakeParts(QTextStream &t)
|
||||
for (int i = 0; libs[i]; i++) {
|
||||
tmp = project->values(libs[i]);
|
||||
for(int x = 0; x < tmp.count();) {
|
||||
bool libSuffixReplaced = false;
|
||||
bool remove = false;
|
||||
QString library, name;
|
||||
ProString opt = tmp[x];
|
||||
@ -844,49 +895,12 @@ ProjectBuilderMakefileGenerator::writeMakeParts(QTextStream &t)
|
||||
QString lib("lib" + name);
|
||||
for (ProStringList::Iterator lit = libdirs.begin(); lit != libdirs.end(); ++lit) {
|
||||
if(project->isActiveConfig("link_prl")) {
|
||||
/* This isn't real nice, but it is real useful. This looks in a prl
|
||||
for what the library will ultimately be called so we can stick it
|
||||
in the ProjectFile. If the prl format ever changes (not likely) then
|
||||
this will not really work. However, more concerning is that it will
|
||||
encode the version number in the Project file which might be a bad
|
||||
things in days to come? --Sam
|
||||
*/
|
||||
QString lib_file = QMakeMetaInfo::checkLib(Option::normalizePath(
|
||||
(*lit) + Option::dir_sep + lib + Option::prl_ext));
|
||||
if (!lib_file.isEmpty()) {
|
||||
QMakeMetaInfo libinfo;
|
||||
if(libinfo.readLib(lib_file)) {
|
||||
if(!libinfo.isEmpty("QMAKE_PRL_TARGET")) {
|
||||
library = (*lit) + Option::dir_sep + libinfo.first("QMAKE_PRL_TARGET");
|
||||
debug_msg(1, "pbuilder: Found library (%s) via PRL %s (%s)",
|
||||
opt.toLatin1().constData(), lib_file.toLatin1().constData(), library.toLatin1().constData());
|
||||
const QString prlFilePath = QMakeMetaInfo::checkLib(
|
||||
Option::normalizePath((*lit) + Option::dir_sep + lib
|
||||
+ Option::prl_ext));
|
||||
if (replaceLibrarySuffix(prlFilePath, opt, name, library))
|
||||
remove = true;
|
||||
|
||||
if (project->isActiveConfig("xcode_dynamic_library_suffix")) {
|
||||
QString suffixSetting = project->first("QMAKE_XCODE_LIBRARY_SUFFIX_SETTING").toQString();
|
||||
if (!suffixSetting.isEmpty()) {
|
||||
QString librarySuffix = project->first("QMAKE_XCODE_LIBRARY_SUFFIX").toQString();
|
||||
suffixSetting = "$(" + suffixSetting + ")";
|
||||
if (!librarySuffix.isEmpty()) {
|
||||
int pos = library.lastIndexOf(librarySuffix + '.');
|
||||
if (pos == -1) {
|
||||
warn_msg(WarnLogic, "Failed to find expected suffix '%s' for library '%s'.",
|
||||
qPrintable(librarySuffix), qPrintable(library));
|
||||
} else {
|
||||
library.replace(pos, librarySuffix.length(), suffixSetting);
|
||||
if (name.endsWith(librarySuffix))
|
||||
name.chop(librarySuffix.length());
|
||||
}
|
||||
} else {
|
||||
int pos = library.lastIndexOf(name);
|
||||
if (pos != -1)
|
||||
library.insert(pos + name.length(), suffixSetting);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
libSuffixReplaced = true;
|
||||
}
|
||||
if(!remove) {
|
||||
QString extns[] = { ".dylib", ".so", ".a", QString() };
|
||||
@ -936,6 +950,16 @@ ProjectBuilderMakefileGenerator::writeMakeParts(QTextStream &t)
|
||||
}
|
||||
}
|
||||
if(!library.isEmpty()) {
|
||||
if (!libSuffixReplaced) {
|
||||
const QFileInfo fi = fileInfo(library);
|
||||
const QString prlFilePath = QMakeMetaInfo::checkLib(
|
||||
Option::normalizePath(fi.absolutePath() + '/' + fi.completeBaseName()
|
||||
+ Option::prl_ext));
|
||||
if (!prlFilePath.isEmpty()) {
|
||||
name = fi.completeBaseName().mid(3);
|
||||
replaceLibrarySuffix(prlFilePath, opt, name, library);
|
||||
}
|
||||
}
|
||||
const int slsh = library.lastIndexOf(Option::dir_sep);
|
||||
if(name.isEmpty()) {
|
||||
if(slsh != -1)
|
||||
|
@ -41,6 +41,8 @@ class ProjectBuilderMakefileGenerator : public UnixMakefileGenerator
|
||||
bool writeSubDirs(QTextStream &);
|
||||
bool writeMakeParts(QTextStream &);
|
||||
bool writeMakefile(QTextStream &) override;
|
||||
bool replaceLibrarySuffix(const QString &lib_file, const ProString &opt, QString &name,
|
||||
QString &library);
|
||||
|
||||
QString pbxbuild();
|
||||
QHash<QString, QString> keys;
|
||||
|
Loading…
Reference in New Issue
Block a user