📄 metamakefile.cpp
字号:
Option::user_configs += basevars["CONFIG"]; build_proj->read(project->projectFile()); Option::after_user_configs = old_after_user_config; Option::user_configs = old_user_config; //done return createMakefileGenerator(build_proj); } return 0;}class SubdirsMetaMakefileGenerator : public MetaMakefileGenerator{ bool init_flag;private: struct Subdir { Subdir() : makefile(0), indent(0) { } ~Subdir() { delete makefile; } QString input_dir; QString output_dir, output_file; MetaMakefileGenerator *makefile; int indent; }; QList<Subdir *> subs; MakefileGenerator *processBuild(const QString &);public: SubdirsMetaMakefileGenerator(QMakeProject *p, const QString &n, bool op) : MetaMakefileGenerator(p, n, op), init_flag(false) { } virtual ~SubdirsMetaMakefileGenerator(); virtual bool init(); virtual int type() const { return SUBDIRSMETATYPE; } virtual bool write(const QString &);};boolSubdirsMetaMakefileGenerator::init(){ if(init_flag) return false; init_flag = true; if(Option::recursive) { QString old_output_dir = QDir::cleanPath(Option::output_dir); if(!old_output_dir.endsWith('/')) old_output_dir += '/'; QString old_output = Option::output.fileName(); QString oldpwd = QDir::cleanPath(qmake_getpwd()); if(!oldpwd.endsWith('/')) oldpwd += '/'; const QStringList &subdirs = project->values("SUBDIRS"); static int recurseDepth = -1; ++recurseDepth; for(int i = 0; i < subdirs.size(); ++i) { Subdir *sub = new Subdir; sub->indent = recurseDepth; QFileInfo subdir(subdirs.at(i)); if(!project->isEmpty(subdirs.at(i) + ".file")) subdir = project->first(subdirs.at(i) + ".file"); else if(!project->isEmpty(subdirs.at(i) + ".subdir")) subdir = project->first(subdirs.at(i) + ".subdir"); QString sub_name; if(subdir.isDir()) subdir = QFileInfo(subdir.filePath() + "/" + subdir.fileName() + Option::pro_ext); else sub_name = subdir.baseName(); if(!subdir.isRelative()) { //we can try to make it relative QString subdir_path = subdir.filePath(); if(subdir_path.startsWith(oldpwd)) subdir = QFileInfo(subdir_path.mid(oldpwd.length())); } //handle sub project QMakeProject *sub_proj = new QMakeProject(project->properties()); for (int ind = 0; ind < sub->indent; ++ind) printf(" "); sub->input_dir = subdir.absolutePath(); if(subdir.isRelative() && old_output_dir != oldpwd) { sub->output_dir = old_output_dir + "/" + subdir.path(); printf("Reading %s [%s]\n", subdir.absoluteFilePath().toLatin1().constData(), sub->output_dir.toLatin1().constData()); } else { //what about shadow builds? sub->output_dir = sub->input_dir; printf("Reading %s\n", subdir.absoluteFilePath().toLatin1().constData()); } qmake_setpwd(sub->input_dir); Option::output_dir = sub->output_dir; if(Option::output_dir.at(Option::output_dir.length()-1) != QLatin1Char('/')) Option::output_dir += QLatin1Char('/'); sub_proj->read(subdir.fileName()); if(!sub_proj->variables()["QMAKE_FAILED_REQUIREMENTS"].isEmpty()) { fprintf(stderr, "Project file(%s) not recursed because all requirements not met:\n\t%s\n", subdir.fileName().toLatin1().constData(), sub_proj->values("QMAKE_FAILED_REQUIREMENTS").join(" ").toLatin1().constData()); delete sub; delete sub_proj; continue; } sub->makefile = MetaMakefileGenerator::createMetaGenerator(sub_proj, sub_name); if(0 && sub->makefile->type() == SUBDIRSMETATYPE) { subs.append(sub); } else { const QString output_name = Option::output.fileName(); Option::output.setFileName(sub->output_file); sub->makefile->write(sub->output_dir); delete sub; qmakeClearCaches(); sub = 0; Option::output.setFileName(output_name); } Option::output_dir = old_output_dir; qmake_setpwd(oldpwd); } --recurseDepth; Option::output.setFileName(old_output); Option::output_dir = old_output_dir; qmake_setpwd(oldpwd); } Subdir *self = new Subdir; self->input_dir = qmake_getpwd(); self->output_dir = Option::output_dir; if(!Option::recursive || (!Option::output.fileName().endsWith(Option::dir_sep) && !QFileInfo(Option::output).isDir())) self->output_file = Option::output.fileName(); self->makefile = new BuildsMetaMakefileGenerator(project, name, false); self->makefile->init(); subs.append(self); return true;}boolSubdirsMetaMakefileGenerator::write(const QString &oldpwd){ bool ret = true; const QString &pwd = qmake_getpwd(); const QString &output_dir = Option::output_dir; const QString &output_name = Option::output.fileName(); for(int i = 0; ret && i < subs.count(); i++) { const Subdir *sub = subs.at(i); qmake_setpwd(subs.at(i)->input_dir); Option::output_dir = QFileInfo(subs.at(i)->output_dir).absoluteFilePath(); if(Option::output_dir.at(Option::output_dir.length()-1) != QLatin1Char('/')) Option::output_dir += QLatin1Char('/'); Option::output.setFileName(subs.at(i)->output_file); if(i != subs.count()-1) { for (int ind = 0; ind < sub->indent; ++ind) printf(" "); printf("Writing %s\n", QDir::cleanPath(Option::output_dir+"/"+ Option::output.fileName()).toLatin1().constData()); } QString writepwd = Option::fixPathToLocalOS(qmake_getpwd()); if(!writepwd.startsWith(Option::fixPathToLocalOS(oldpwd))) writepwd = oldpwd; if(!(ret = subs.at(i)->makefile->write(writepwd))) break; //restore because I'm paranoid qmake_setpwd(pwd); Option::output.setFileName(output_name); Option::output_dir = output_dir; } return ret;}SubdirsMetaMakefileGenerator::~SubdirsMetaMakefileGenerator(){ for(int i = 0; i < subs.count(); i++) delete subs[i]; subs.clear();}//Factory things#include "unixmake.h"#include "mingw_make.h"#include "projectgenerator.h"#include "pbuilder_pbx.h"#include "msvc_nmake.h"#include "borland_bmake.h"#include "msvc_dsp.h"#include "msvc_vcproj.h"MakefileGenerator *MetaMakefileGenerator::createMakefileGenerator(QMakeProject *proj, bool noIO){ MakefileGenerator *mkfile = NULL; if(Option::qmake_mode == Option::QMAKE_GENERATE_PROJECT) { mkfile = new ProjectGenerator; mkfile->setProjectFile(proj); return mkfile; } QString gen = proj->first("MAKEFILE_GENERATOR"); if(gen.isEmpty()) { fprintf(stderr, "No generator specified in config file: %s\n", proj->projectFile().toLatin1().constData()); } else if(gen == "UNIX") { mkfile = new UnixMakefileGenerator; } else if(gen == "MINGW") { mkfile = new MingwMakefileGenerator; } else if(gen == "PROJECTBUILDER" || gen == "XCODE") { mkfile = new ProjectBuilderMakefileGenerator; } else if(gen == "MSVC") { // Visual Studio =< v6.0 if(proj->first("TEMPLATE").indexOf(QRegExp("^vc.*")) != -1) mkfile = new DspMakefileGenerator; else mkfile = new NmakeMakefileGenerator; } else if(gen == "MSVC.NET") { // Visual Studio >= v7.0 if(proj->first("TEMPLATE").indexOf(QRegExp("^vc.*")) != -1) mkfile = new VcprojGenerator; else mkfile = new NmakeMakefileGenerator; } else if(gen == "BMAKE") { mkfile = new BorlandMakefileGenerator; } else { fprintf(stderr, "Unknown generator specified: %s\n", gen.toLatin1().constData()); } if (mkfile) { mkfile->setNoIO(noIO); mkfile->setProjectFile(proj); } return mkfile;}MetaMakefileGenerator *MetaMakefileGenerator::createMetaGenerator(QMakeProject *proj, const QString &name, bool op){ MetaMakefileGenerator *ret = 0; if((Option::qmake_mode == Option::QMAKE_GENERATE_MAKEFILE || Option::qmake_mode == Option::QMAKE_GENERATE_PRL)) { if(proj->first("TEMPLATE").endsWith("subdirs")) ret = new SubdirsMetaMakefileGenerator(proj, name, op); } if(!ret) ret = new BuildsMetaMakefileGenerator(proj, name, op); ret->init(); return ret;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -