📄 makefile.cpp
字号:
debug_msg(2, "Ignored meta file %s [%s]", real_meta_file.toLatin1().constData(), libinfo.type().toLatin1().constData());
} else {
ret = true;
QMap<QString, QStringList> &vars = libinfo.variables();
for(QMap<QString, QStringList>::Iterator it = vars.begin(); it != vars.end(); ++it)
processPrlVariable(it.key(), it.value());
if(try_replace_file && !libinfo.isEmpty("QMAKE_PRL_TARGET")) {
QString dir;
int slsh = real_meta_file.lastIndexOf(Option::dir_sep);
if(slsh != -1)
dir = real_meta_file.left(slsh+1);
file = libinfo.first("QMAKE_PRL_TARGET");
if(QDir::isRelativePath(file))
file.prepend(dir);
}
}
}
if(ret) {
QString mf = QMakeMetaInfo::findLib(meta_file);
if(project->variables()["QMAKE_PRL_INTERNAL_FILES"].indexOf(mf) == -1)
project->variables()["QMAKE_PRL_INTERNAL_FILES"].append(mf);
if(project->variables()["QMAKE_INTERNAL_INCLUDED_FILES"].indexOf(mf) == -1)
project->variables()["QMAKE_INTERNAL_INCLUDED_FILES"].append(mf);
}
}
if(try_replace_file && file.isEmpty()) {
#if 0
warn_msg(WarnLogic, "Found prl [%s] file with no target [%s]!", meta_file.toLatin1().constData(),
orig_file.toLatin1().constData());
#endif
file = orig_file;
}
return ret;
}
void
MakefileGenerator::filterIncludedFiles(const QString &var)
{
QStringList &inputs = project->variables()[var];
for(QStringList::Iterator input = inputs.begin(); input != inputs.end(); ) {
if(QMakeSourceFileInfo::included((*input)) > 0)
input = inputs.erase(input);
else
++input;
}
}
void
MakefileGenerator::processPrlVariable(const QString &var, const QStringList &l)
{
if(var == "QMAKE_PRL_LIBS") {
QString where = "QMAKE_LIBS";
if(!project->isEmpty("QMAKE_INTERNAL_PRL_LIBS"))
where = project->first("QMAKE_INTERNAL_PRL_LIBS");
QStringList &out = project->variables()[where];
for(QStringList::ConstIterator it = l.begin(); it != l.end(); ++it) {
if(out.indexOf((*it)) == -1)
out.append((*it));
}
} else if(var == "QMAKE_PRL_DEFINES") {
QStringList &out = project->variables()["DEFINES"];
for(QStringList::ConstIterator it = l.begin(); it != l.end(); ++it) {
if(out.indexOf((*it)) == -1 &&
project->variables()["PRL_EXPORT_DEFINES"].indexOf((*it)) == -1)
out.append((*it));
}
}
}
void
MakefileGenerator::processPrlFiles()
{
QHash<QString, bool> processed;
for(bool ret = false; true; ret = false) {
//read in any prl files included..
QStringList l_out;
QString where = "QMAKE_LIBS";
if(!project->isEmpty("QMAKE_INTERNAL_PRL_LIBS"))
where = project->first("QMAKE_INTERNAL_PRL_LIBS");
QStringList &l = project->variables()[where];
for(QStringList::Iterator it = l.begin(); it != l.end(); ++it) {
QString file = (*it);
if(!processed.contains(file) && processPrlFile(file)) {
processed.insert(file, true);
ret = true;
}
if(!file.isEmpty())
l_out.append(file);
}
if(ret)
l = l_out;
else
break;
}
}
void
MakefileGenerator::writePrlFile(QTextStream &t)
{
QString target = project->first("TARGET");
int slsh = target.lastIndexOf(Option::dir_sep);
if(slsh != -1)
target = target.right(target.length() - slsh - 1);
QString bdir = Option::output_dir;
if(bdir.isEmpty())
bdir = qmake_getpwd();
t << "QMAKE_PRL_BUILD_DIR = " << bdir << endl;
if(!project->projectFile().isEmpty() && project->projectFile() != "-")
t << "QMAKE_PRO_INPUT = " << project->projectFile().section('/', -1) << endl;
if(!project->isEmpty("QMAKE_ABSOLUTE_SOURCE_PATH"))
t << "QMAKE_PRL_SOURCE_DIR = " << project->first("QMAKE_ABSOLUTE_SOURCE_PATH") << endl;
t << "QMAKE_PRL_TARGET = " << target << endl;
if(!project->isEmpty("PRL_EXPORT_DEFINES"))
t << "QMAKE_PRL_DEFINES = " << project->variables()["PRL_EXPORT_DEFINES"].join(" ") << endl;
if(!project->isEmpty("PRL_EXPORT_CFLAGS"))
t << "QMAKE_PRL_CFLAGS = " << project->variables()["PRL_EXPORT_CFLAGS"].join(" ") << endl;
if(!project->isEmpty("PRL_EXPORT_CXXFLAGS"))
t << "QMAKE_PRL_CXXFLAGS = " << project->variables()["PRL_EXPORT_CXXFLAGS"].join(" ") << endl;
if(!project->isEmpty("CONFIG"))
t << "QMAKE_PRL_CONFIG = " << project->variables()["CONFIG"].join(" ") << endl;
if(!project->isEmpty("TARGET_VERSION_EXT"))
t << "QMAKE_PRL_VERSION = " << project->first("TARGET_VERSION_EXT") << endl;
else if(!project->isEmpty("VERSION"))
t << "QMAKE_PRL_VERSION = " << project->first("VERSION") << endl;
if(project->isActiveConfig("staticlib") || project->isActiveConfig("explicitlib")) {
QStringList libs;
if(!project->isEmpty("QMAKE_INTERNAL_PRL_LIBS"))
libs = project->variables()["QMAKE_INTERNAL_PRL_LIBS"];
else
libs << "QMAKE_LIBS"; //obvious one
t << "QMAKE_PRL_LIBS = ";
for(QStringList::Iterator it = libs.begin(); it != libs.end(); ++it)
t << project->variables()[(*it)].join(" ") << " ";
t << endl;
}
}
bool
MakefileGenerator::writeProjectMakefile()
{
usePlatformDir();
QTextStream t(&Option::output);
//header
writeHeader(t);
QList<SubTarget*> targets;
{
QStringList builds = project->variables()["BUILDS"];
for(QStringList::Iterator it = builds.begin(); it != builds.end(); ++it) {
SubTarget *st = new SubTarget;
targets.append(st);
st->makefile = "$(MAKEFILE)." + (*it);
st->target = project->isEmpty((*it) + ".target") ? (*it) : project->first((*it) + ".target");
}
}
if(project->isActiveConfig("build_all")) {
t << "first: all" << endl;
QList<SubTarget*>::Iterator it;
//install
t << "install: ";
for(it = targets.begin(); it != targets.end(); ++it)
t << (*it)->target << "-install ";
t << endl;
//uninstall
t << "uninstall: ";
for(it = targets.begin(); it != targets.end(); ++it)
t << (*it)->target << "-uninstall ";
t << endl;
} else {
t << "first: " << targets.first()->target << endl
<< "install: " << targets.first()->target << "-install" << endl
<< "uninstall: " << targets.first()->target << "-uninstall" << endl;
}
writeSubTargets(t, targets, SubTargetsNoFlags);
if(!project->isActiveConfig("no_autoqmake")) {
for(QList<SubTarget*>::Iterator it = targets.begin(); it != targets.end(); ++it)
t << (*it)->makefile << ": " <<
Option::fixPathToTargetOS(fileFixify(Option::output.fileName())) << endl;
}
qDeleteAll(targets);
return true;
}
bool
MakefileGenerator::write()
{
if(!project)
return false;
writePrlFile();
if(Option::qmake_mode == Option::QMAKE_GENERATE_MAKEFILE || //write makefile
Option::qmake_mode == Option::QMAKE_GENERATE_PROJECT) {
QTextStream t(&Option::output);
if(!writeMakefile(t)) {
#if 1
warn_msg(WarnLogic, "Unable to generate output for: %s [TEMPLATE %s]",
Option::output.fileName().toLatin1().constData(),
project->first("TEMPLATE").toLatin1().constData());
if(Option::output.exists())
Option::output.remove();
#endif
}
}
return true;
}
void
MakefileGenerator::writePrlFile()
{
if((Option::qmake_mode == Option::QMAKE_GENERATE_MAKEFILE ||
Option::qmake_mode == Option::QMAKE_GENERATE_PRL)
&& project->variables()["QMAKE_FAILED_REQUIREMENTS"].isEmpty()
&& project->isActiveConfig("create_prl")
&& (project->first("TEMPLATE") == "lib"
|| project->first("TEMPLATE") == "vclib")
&& !project->isActiveConfig("plugin")) { //write prl file
QString prl = project->first("TARGET_PRL");;
if(prl.isEmpty())
prl = project->first("TARGET");
int slsh = prl.lastIndexOf(Option::dir_sep);
if(slsh != -1)
prl = prl.right(prl.length() - slsh);
if(!prl.endsWith(Option::prl_ext)) {
int dot = prl.indexOf('.');
if(dot != -1)
prl = prl.left(dot);
prl += Option::prl_ext;
}
if(!project->isEmpty("QMAKE_BUNDLE_NAME"))
prl.prepend(project->first("QMAKE_BUNDLE_NAME") + Option::dir_sep);
if(!project->isEmpty("DESTDIR"))
prl.prepend(var("DESTDIR"));
QString local_prl = Option::fixPathToLocalOS(fileFixify(prl, qmake_getpwd(), Option::output_dir));
createDir(fileInfo(local_prl).path());
QFile ft(local_prl);
if(ft.open(QIODevice::WriteOnly)) {
project->variables()["ALL_DEPS"].append(prl);
project->variables()["QMAKE_INTERNAL_PRL_FILE"].append(prl);
QTextStream t(&ft);
writePrlFile(t);
}
}
}
// Manipulate directories, so it's possible to build
// several cross-platform targets concurrently
void
MakefileGenerator::usePlatformDir()
{
QString pltDir(project->first("QMAKE_PLATFORM_DIR"));
if(pltDir.isEmpty())
return;
QChar sep = QDir::separator();
QString slashPltDir = sep + pltDir;
QString filePath = project->first("DESTDIR");
project->variables()["DESTDIR"] = QStringList(filePath + (filePath.isEmpty() ? pltDir : slashPltDir));
filePath = project->first("DLLDESTDIR");
project->variables()["DLLDESTDIR"] = QStringList(filePath + (filePath.isEmpty() ? pltDir : slashPltDir));
filePath = project->first("OBJECTS_DIR");
project->variables()["OBJECTS_DIR"] = QStringList(filePath + (filePath.isEmpty() ? pltDir : slashPltDir));
filePath = project->first("QMAKE_LIBDIR_QT");
project->variables()["QMAKE_LIBDIR_QT"] = QStringList(filePath + (filePath.isEmpty() ? pltDir : slashPltDir));
filePath = project->first("QMAKE_LIBS_QT");
int fpi = filePath.lastIndexOf(sep);
if(fpi == -1)
project->variables()["QMAKE_LIBS_QT"].prepend(pltDir + sep);
else
project->variables()["QMAKE_LIBS_QT"] = QStringList(filePath.left(fpi) + slashPltDir + filePath.mid(fpi));
filePath = project->first("QMAKE_LIBS_QT_THREAD");
fpi = filePath.lastIndexOf(sep);
if(fpi == -1)
project->variables()["QMAKE_LIBS_QT_THREAD"].prepend(pltDir + sep);
else
project->variables()["QMAKE_LIBS_QT_THREAD"] = QStringList(filePath.left(fpi) + slashPltDir + filePath.mid(fpi));
filePath = project->first("QMAKE_LIBS_QT_ENTRY");
fpi = filePath.lastIndexOf(sep);
if(fpi == -1)
project->variables()["QMAKE_LIBS_QT_ENTRY"].prepend(pltDir + sep);
else
project->variables()["QMAKE_LIBS_QT_ENTRY"] = QStringList(filePath.left(fpi) + slashPltDir + filePath.mid(fpi));
}
void
MakefileGenerator::writeObj(QTextStream &t, const QString &src)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -