⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 metamakefile.cpp

📁 奇趣公司比较新的qt/emd版本
💻 CPP
📖 第 1 页 / 共 2 页
字号:
        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 + -