?? configure
字號:
"QT -= gui\n"; proextra += qca_crypto_prf; } else { proextra = "CONFIG += qt crypto\n" "QT -= gui\n"; } QString str = "#include <QtCrypto>\n" "\n" "int main()\n" "{\n" " unsigned long x = QCA_VERSION;\n" " if(x >= 0x020000 && x < 0x030000) return 0; else return 1;\n" "}\n"; if(release) { int ret; if(!conf->doCompileAndLink(str, QStringList(), QString(), proextra + "CONFIG += release\n", &ret)) return false; if(ret != 0) return false; } if(debug) { int ret; if(!conf->doCompileAndLink(str, QStringList(), QString(), proextra + "CONFIG += debug\n", &ret)) return false; if(ret != 0) return false; } if(!qca_prefix.isEmpty()) conf->addExtra(qca_crypto_prf); else conf->addExtra("CONFIG += crypto\n"); return true; }};#line 1 "openssl.qcm"/*-----BEGIN QCMOD-----name: OpenSSLarg: with-openssl-inc=[path],Path to OpenSSL include filesarg: with-openssl-lib=[path],Path to OpenSSL library files-----END QCMOD-----*/class qc_openssl : public ConfObj{public: qc_openssl(Conf *c) : ConfObj(c) {} QString name() const { return "OpenSSL"; } QString shortname() const { return "openssl"; } bool exec() { QString inc, lib; QString s; bool kb = false; QString kbdir = "/usr/kerberos/include"; // Redhat 9? if(QFileInfo(kbdir).exists()) kb = true; s = conf->getenv("QC_WITH_OPENSSL_INC"); if(!s.isEmpty()) { if(!conf->checkHeader(s, "openssl/ssl.h")) return false; inc = s; } else { if(!conf->findHeader("openssl/ssl.h", QStringList(), &s)) return false; inc = s; } s = conf->getenv("QC_WITH_OPENSSL_LIB"); if(!s.isEmpty()) { if(!conf->checkLibrary(s, "ssl")) return false; lib = s; } else { if(!conf->findLibrary("ssl", &s)) return false; lib = s; } // is it at least openssl 0.9.7? QString str = "#include<openssl/opensslv.h>\n" "int main()\n" "{\n" " unsigned long x = OPENSSL_VERSION_NUMBER;\n" " if(x >= 0x00907000) return 0; else return 1;\n" "}\n"; QStringList incs; QString libs; if(!inc.isEmpty()) incs += inc; if(kb) incs += kbdir; if(!lib.isEmpty()) libs += QString("-L") + lib + ' '; libs += "-lssl -lcrypto"; int ret; if(!conf->doCompileAndLink(str, incs, libs, QString(), &ret)) return false; if(ret == 0) conf->addDefine("OSSL_097"); if(!inc.isEmpty()) conf->addIncludePath(inc); if(kb) conf->addIncludePath(kbdir); if(!lib.isEmpty()) conf->addLib(QString("-L") + s); conf->addLib("-lssl -lcrypto"); return true; }};#line 1 "qcapluginpath.qcm"/*-----BEGIN QCMOD-----name: qcapluginpathsection: projectarg: plugins-path=[path],Path to install to. Default: qtdir/plugins-----END QCMOD-----*/class qc_qcapluginpath : public ConfObj{public: qc_qcapluginpath(Conf *c) : ConfObj(c) {} QString name() const { return "qcapluginpath"; } QString shortname() const { return "qcapluginpath"; } // no output QString checkString() const { return QString(); } bool exec() { QString plugins_path = conf->getenv("QC_PLUGINS_PATH"); // default to qtdir if(plugins_path.isEmpty()) plugins_path = QLibraryInfo::location(QLibraryInfo::PluginsPath); // install into plugins path QString str; str += QString( "target.path=%1/crypto\n" "INSTALLS += target\n" ).arg(plugins_path); conf->addExtra(str); return true; }};EOTcat >$1/modules_new.cpp <<EOT o = new qc_buildmode(conf); o->required = true; o->disabled = false; o = new qc_universal(conf); o->required = true; o->disabled = false; o = new qc_qca(conf); o->required = true; o->disabled = false; o = new qc_openssl(conf); o->required = true; o->disabled = false; o = new qc_qcapluginpath(conf); o->required = true; o->disabled = false;EOTcat >$1/conf4.h <<EOT// For license information, see the COPYING file in the qconf base directory.#ifndef QC_CONF4_H#define QC_CONF4_H#include <QtCore>class Conf;enum VersionMode { VersionMin, VersionExact, VersionMax, VersionAny };// ConfObj//// Subclass ConfObj to create a new configuration module.class ConfObj{public: Conf *conf; bool required; bool disabled; bool success; ConfObj(Conf *c); virtual ~ConfObj(); // long or descriptive name of what is being checked/performed // example: "KDE >= 3.3" virtual QString name() const = 0; // short name // example: "kde" virtual QString shortname() const = 0; // string to display during check // default: "Checking for [name] ..." virtual QString checkString() const; // string to display after check // default: "yes" or "no", based on result of exec() virtual QString resultString() const; // this is where the checking code goes virtual bool exec() = 0;};// Conf//// Interact with this class from your ConfObj to perform detection// operations and to output configuration parameters.class Conf{public: bool debug_enabled; QString qmake_path; QString maketool; QString DEFINES; QString INCLUDEPATH; QString LIBS; QString extra; QList<ConfObj*> list; QMap<QString,QString> vars; Conf(); ~Conf(); QString getenv(const QString &var); QString qvar(const QString &s); bool exec(); void debug(const QString &s); QString expandIncludes(const QString &inc); QString expandLibs(const QString &lib); int doCommand(const QString &s, QByteArray *out = 0); int doCommand(const QString &prog, const QStringList &args, QByteArray *out = 0); bool doCompileAndLink(const QString &filedata, const QStringList &incs, const QString &libs, const QString &proextra, int *retcode = 0); bool checkHeader(const QString &path, const QString &h); bool findHeader(const QString &h, const QStringList &ext, QString *inc); bool checkLibrary(const QString &path, const QString &name); bool findLibrary(const QString &name, QString *lib); QString findProgram(const QString &prog); bool findSimpleLibrary(const QString &incvar, const QString &libvar, const QString &incname, const QString &libname, QString *incpath, QString *libs); bool findFooConfig(const QString &path, QString *version, QStringList *incs, QString *libs, QString *otherflags); bool findPkgConfig(const QString &name, VersionMode mode, const QString &req_version, QString *version, QStringList *incs, QString *libs, QString *otherflags); void addDefine(const QString &str); void addLib(const QString &str); void addIncludePath(const QString &str); void addExtra(const QString &str);private: bool first_debug; friend class ConfObj; void added(ConfObj *o);};#endifEOTcat >$1/conf4.cpp <<EOT// For license information, see the COPYING file in the qconf base directory.#include "conf4.h"#include <stdio.h>#include <stdlib.h>class MocTestObject : public QObject{ Q_OBJECTpublic: MocTestObject() {}};QString qc_getenv(const QString &var){ char *p = ::getenv(var.toLatin1().data()); if(!p) return QString(); return QString(p);}QStringList qc_pathlist(){ QStringList list; QString path = qc_getenv("PATH"); if(!path.isEmpty()) list = path.split(':', QString::SkipEmptyParts); return list;}QString qc_findprogram(const QString &prog){ QString out; QStringList list = qc_pathlist(); for(int n = 0; n < list.count(); ++n) { QFileInfo fi(list[n] + '/' + prog); if(fi.exists() && fi.isExecutable()) { out = fi.filePath(); break; } } return out;}QString qc_findself(const QString &argv0){ if(argv0.contains('/')) return argv0; else return qc_findprogram(argv0);}int qc_runcommand(const QString &command, QByteArray *out, bool showOutput){ QString fullcmd = command; if(!showOutput) fullcmd += " 2>/dev/null"; FILE *f = popen(fullcmd.toLatin1().data(), "r"); if(!f) return -1; if(out) out->clear(); while(1) { char c = (char)fgetc(f); if(feof(f)) break; if(out) out->append(c); if(showOutput) fputc(c, stdout); } int ret = pclose(f); if(ret == -1) return -1; return ret;}int qc_runprogram(const QString &prog, const QStringList &args, QByteArray *out, bool showOutput){ QString fullcmd = prog; QString argstr = args.join(" "); if(!argstr.isEmpty()) fullcmd += QString(" ") + argstr; return qc_runcommand(fullcmd, out, showOutput); // TODO: use QProcess once it is fixed /* QProcess process; if(showOutput) process.setReadChannelMode(ForwardedChannels); process.start(prog, args); process.waitForFinished(-1); return process.exitCode(); */}bool qc_removedir(const QString &dirPath){ QDir dir(dirPath); if(!dir.exists()) return false; QStringList list = dir.entryList(); foreach(QString s, list) { if(s == "." || s == "..") continue; QFileInfo fi(dir.filePath(s)); if(fi.isDir()) { if(!qc_removedir(fi.filePath())) return false; } else { if(!dir.remove(s)) return false; } } QString dirName = dir.dirName(); if(!dir.cdUp()) return false; if(!dir.rmdir(dirName)) return false; return true;}void qc_splitcflags(const QString &cflags, QStringList *incs, QStringList *otherflags){ incs->clear(); otherflags->clear(); QStringList cflagsList = cflags.split(" "); for(int n = 0; n < cflagsList.count(); ++n) { QString str = cflagsList[n]; if(str.startsWith("-I")) { // we want everything except the leading "-I" incs->append(str.remove(0, 2)); } else { // we want whatever is left otherflags->append(str); } }}QString qc_escapeArg(const QString &str){ QString out; for(int n = 0; n < (int)str.length(); ++n) { if(str[n] == '-') out += '_'; else out += str[n]; } return out;}//----------------------------------------------------------------------------// ConfObj//----------------------------------------------------------------------------ConfObj::ConfObj(Conf *c){ conf = c; conf->added(this); required = false; disabled = false; success = false;}ConfObj::~ConfObj(){}QString ConfObj::checkString() const{ return QString("Checking for %1 ...").arg(name());}QString ConfObj::resultString() const{ if(success) return "yes"; else return "no";}//----------------------------------------------------------------------------// qc_internal_pkgconfig//----------------------------------------------------------------------------class qc_internal_pkgconfig : public ConfObj{public: QString pkgname, desc; VersionMode mode; QString req_ver; qc_internal_pkgconfig(Conf *c, const QString &_name, const QString &_desc, VersionMode _mode, const QString &_req_ver) : ConfObj(c) { pkgname = _name; desc = _desc; mode = _mode; req_ver = _req_ver; } QString name() const { return desc; } QString shortname() const { return pkgname; } bool exec() { QStringList incs; QString version, libs, other; if(!conf->findPkgConfig(pkgname, mode, req_ver, &version, &incs, &libs, &other)) return false; for(int n = 0; n < incs.count(); ++n) conf->addIncludePath(incs[n]); if(!libs.isEmpty()) conf->addLib(libs); //if(!other.isEmpty()) // conf->addExtra(QString("QMAKE_CFLAGS += %1\n").arg(other)); return true; }};//----------------------------------------------------------------------------// Conf//----------------------------------------------------------------------------Conf::Conf(){ // TODO: no more vars? //vars.insert("QMAKE_INCDIR_X11", new QString(X11_INC)); //vars.insert("QMAKE_LIBDIR_X11", new QString(X11_LIBDIR)); //vars.insert("QMAKE_LIBS_X11", new QString(X11_LIB)); //vars.insert("QMAKE_CC", CC); debug_enabled = false;}Conf::~Conf(){ qDeleteAll(list);}void Conf::added(ConfObj *o){ list.append(o);}QString Conf::getenv(const QString &var){ return qc_getenv(var);}void Conf::debug(const QString &s){ if(debug_enabled) { if(first_debug) printf("\n"); first_debug = false; printf(" * %s\n", qPrintable(s)); }}bool Conf::exec(){ for(int n = 0; n < list.count(); ++n) { ConfObj *o = list[n]; // if this was a disabled-by-default option, check if it was enabled if(o->disabled) { QString v = QString("QC_ENABLE_") + qc_escapeArg(o->shortname()); if(getenv(v) != "Y") continue; } // and the opposite? else { QString v = QString("QC_DISABLE_") + qc_escapeArg(o->shortname()); if(getenv(v) == "Y") continue; } bool output = true; QString check = o->checkString(); if(check.isEmpty()) output = false; if(output) { printf("%s", check.toLatin1().data()); fflush(stdout); } first_debug = true; bool ok = o->exec(); o->success = ok; if(output) { QString result = o->resultString();
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -