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;
|
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
|
bool
|
||||||
ProjectBuilderMakefileGenerator::writeMakeParts(QTextStream &t)
|
ProjectBuilderMakefileGenerator::writeMakeParts(QTextStream &t)
|
||||||
{
|
{
|
||||||
@ -832,6 +882,7 @@ ProjectBuilderMakefileGenerator::writeMakeParts(QTextStream &t)
|
|||||||
for (int i = 0; libs[i]; i++) {
|
for (int i = 0; libs[i]; i++) {
|
||||||
tmp = project->values(libs[i]);
|
tmp = project->values(libs[i]);
|
||||||
for(int x = 0; x < tmp.count();) {
|
for(int x = 0; x < tmp.count();) {
|
||||||
|
bool libSuffixReplaced = false;
|
||||||
bool remove = false;
|
bool remove = false;
|
||||||
QString library, name;
|
QString library, name;
|
||||||
ProString opt = tmp[x];
|
ProString opt = tmp[x];
|
||||||
@ -844,49 +895,12 @@ ProjectBuilderMakefileGenerator::writeMakeParts(QTextStream &t)
|
|||||||
QString lib("lib" + name);
|
QString lib("lib" + name);
|
||||||
for (ProStringList::Iterator lit = libdirs.begin(); lit != libdirs.end(); ++lit) {
|
for (ProStringList::Iterator lit = libdirs.begin(); lit != libdirs.end(); ++lit) {
|
||||||
if(project->isActiveConfig("link_prl")) {
|
if(project->isActiveConfig("link_prl")) {
|
||||||
/* This isn't real nice, but it is real useful. This looks in a prl
|
const QString prlFilePath = QMakeMetaInfo::checkLib(
|
||||||
for what the library will ultimately be called so we can stick it
|
Option::normalizePath((*lit) + Option::dir_sep + lib
|
||||||
in the ProjectFile. If the prl format ever changes (not likely) then
|
+ Option::prl_ext));
|
||||||
this will not really work. However, more concerning is that it will
|
if (replaceLibrarySuffix(prlFilePath, opt, name, library))
|
||||||
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());
|
|
||||||
remove = true;
|
remove = true;
|
||||||
|
libSuffixReplaced = 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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if(!remove) {
|
if(!remove) {
|
||||||
QString extns[] = { ".dylib", ".so", ".a", QString() };
|
QString extns[] = { ".dylib", ".so", ".a", QString() };
|
||||||
@ -936,6 +950,16 @@ ProjectBuilderMakefileGenerator::writeMakeParts(QTextStream &t)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(!library.isEmpty()) {
|
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);
|
const int slsh = library.lastIndexOf(Option::dir_sep);
|
||||||
if(name.isEmpty()) {
|
if(name.isEmpty()) {
|
||||||
if(slsh != -1)
|
if(slsh != -1)
|
||||||
|
@ -41,6 +41,8 @@ class ProjectBuilderMakefileGenerator : public UnixMakefileGenerator
|
|||||||
bool writeSubDirs(QTextStream &);
|
bool writeSubDirs(QTextStream &);
|
||||||
bool writeMakeParts(QTextStream &);
|
bool writeMakeParts(QTextStream &);
|
||||||
bool writeMakefile(QTextStream &) override;
|
bool writeMakefile(QTextStream &) override;
|
||||||
|
bool replaceLibrarySuffix(const QString &lib_file, const ProString &opt, QString &name,
|
||||||
|
QString &library);
|
||||||
|
|
||||||
QString pbxbuild();
|
QString pbxbuild();
|
||||||
QHash<QString, QString> keys;
|
QHash<QString, QString> keys;
|
||||||
|
Loading…
Reference in New Issue
Block a user