📄 project.cpp
字号:
for(QStringList::Iterator concat_it = concat.begin();
concat_it != concat.end(); ++concat_it)
feature_roots << (specdir.path() + (*concat_it));
break;
}
}
}
for(QStringList::Iterator concat_it = concat.begin();
concat_it != concat.end(); ++concat_it)
feature_roots << (QLibraryInfo::location(QLibraryInfo::PrefixPath) +
mkspecs_concat + (*concat_it));
for(QStringList::Iterator concat_it = concat.begin();
concat_it != concat.end(); ++concat_it)
feature_roots << (QLibraryInfo::location(QLibraryInfo::DataPath) +
mkspecs_concat + (*concat_it));
return feature_roots;
}
QStringList qmake_mkspec_paths()
{
QStringList ret;
const QString concat = QDir::separator() + QString("mkspecs");
QByteArray qmakepath = qgetenv("QMAKEPATH");
if (!qmakepath.isEmpty()) {
const QStringList lst = splitPathList(QString::fromLocal8Bit(qmakepath));
for(QStringList::ConstIterator it = lst.begin(); it != lst.end(); ++it)
ret << ((*it) + concat);
}
ret << QLibraryInfo::location(QLibraryInfo::DataPath) + concat;
return ret;
}
static QString varMap(const QString &x)
{
QString ret(x);
if(ret.startsWith("TMAKE")) //tmake no more!
ret = "QMAKE" + ret.mid(5);
else if(ret == "INTERFACES")
ret = "FORMS";
else if(ret == "QMAKE_POST_BUILD")
ret = "QMAKE_POST_LINK";
else if(ret == "TARGETDEPS")
ret = "POST_TARGETDEPS";
else if(ret == "LIBPATH")
ret = "QMAKE_LIBDIR";
else if(ret == "QMAKE_EXT_MOC")
ret = "QMAKE_EXT_CPP_MOC";
else if(ret == "QMAKE_MOD_MOC")
ret = "QMAKE_H_MOD_MOC";
else if(ret == "QMAKE_LFLAGS_SHAPP")
ret = "QMAKE_LFLAGS_APP";
else if(ret == "PRECOMPH")
ret = "PRECOMPILED_HEADER";
else if(ret == "PRECOMPCPP")
ret = "PRECOMPILED_SOURCE";
else if(ret == "INCPATH")
ret = "INCLUDEPATH";
else if(ret == "QMAKE_EXTRA_WIN_COMPILERS" || ret == "QMAKE_EXTRA_UNIX_COMPILERS")
ret = "QMAKE_EXTRA_COMPILERS";
else if(ret == "QMAKE_EXTRA_WIN_TARGETS" || ret == "QMAKE_EXTRA_UNIX_TARGETS")
ret = "QMAKE_EXTRA_TARGETS";
else if(ret == "QMAKE_EXTRA_UNIX_INCLUDES")
ret = "QMAKE_EXTRA_INCLUDES";
else if(ret == "QMAKE_EXTRA_UNIX_VARIABLES")
ret = "QMAKE_EXTRA_VARIABLES";
else if(ret == "QMAKE_RPATH")
ret = "QMAKE_LFLAGS_RPATH";
return ret;
}
static QStringList split_arg_list(QString params)
{
int quote = 0;
QStringList args;
static bool symbols_init = false;
enum { LPAREN, RPAREN, SINGLEQUOTE, DOUBLEQUOTE, COMMA, SPACE, TAB };
static ushort symbols[7];
if(!symbols_init) {
symbols_init = true;
symbols[LPAREN] = QChar('(').unicode();
symbols[RPAREN] = QChar(')').unicode();
symbols[SINGLEQUOTE] = QChar('\'').unicode();
symbols[DOUBLEQUOTE] = QChar('"').unicode();
symbols[COMMA] = QChar(',').unicode();
symbols[SPACE] = QChar(' ').unicode();
symbols[TAB] = QChar('\t').unicode();
}
ushort unicode;
const QChar *params_data = params.data();
const int params_len = params.length();
int last = 0;
while(last < params_len && ((params_data+last)->unicode() == symbols[SPACE]
/*|| (params_data+last)->unicode() == symbols[TAB]*/))
++last;
for(int x = last, parens = 0; x <= params_len; x++) {
unicode = (params_data+x)->unicode();
if(x == params_len) {
while(x && (params_data+(x-1))->unicode() == symbols[SPACE])
--x;
QString mid(params_data+last, x-last);
if(quote) {
if(mid[0] == quote && mid[(int)mid.length()-1] == quote)
mid = mid.mid(1, mid.length()-2);
quote = 0;
}
args << mid;
break;
}
if(unicode == symbols[LPAREN]) {
--parens;
} else if(unicode == symbols[RPAREN]) {
++parens;
} else if(quote && unicode == quote) {
quote = 0;
} else if(!quote && (unicode == symbols[SINGLEQUOTE] || unicode == symbols[DOUBLEQUOTE])) {
quote = unicode;
} else if(!parens && !quote && unicode == symbols[COMMA]) {
QString mid = params.mid(last, x - last).trimmed();
args << mid;
last = x+1;
while(last < params_len && ((params_data+last)->unicode() == symbols[SPACE]
/*|| (params_data+last)->unicode() == symbols[TAB]*/))
++last;
}
}
for(int i = 0; i < args.count(); i++)
args[i] = remove_quotes(args[i]);
return args;
}
static QStringList split_value_list(const QString &vals, bool do_semicolon=false)
{
QString build;
QStringList ret;
QStack<char> quote;
static bool symbols_init = false;
enum { LPAREN, RPAREN, SINGLEQUOTE, DOUBLEQUOTE, SLASH, SEMICOLON };
static ushort symbols[6];
if(!symbols_init) {
symbols_init = true;
symbols[LPAREN] = QChar('(').unicode();
symbols[RPAREN] = QChar(')').unicode();
symbols[SINGLEQUOTE] = QChar('\'').unicode();
symbols[DOUBLEQUOTE] = QChar('"').unicode();
symbols[SLASH] = QChar('\\').unicode();
symbols[SEMICOLON] = QChar(';').unicode();
}
ushort unicode;
const QChar *vals_data = vals.data();
const int vals_len = vals.length();
for(int x = 0, parens = 0; x < vals_len; x++) {
unicode = (vals_data+x)->unicode();
if(x != (int)vals_len-1 && unicode == symbols[SLASH] &&
((vals_data+(x+1))->unicode() == '\'' || (vals_data+(x+1))->unicode() == symbols[DOUBLEQUOTE])) {
build += *(vals_data+(x++)); //get that 'escape'
} else if(!quote.isEmpty() && unicode == quote.top()) {
quote.pop();
} else if(unicode == symbols[SINGLEQUOTE] || unicode == symbols[DOUBLEQUOTE]) {
quote.push(unicode);
} else if(unicode == symbols[RPAREN]) {
--parens;
} else if(unicode == symbols[LPAREN]) {
++parens;
}
if(!parens && quote.isEmpty() && ((do_semicolon && unicode == symbols[SEMICOLON]) ||
*(vals_data+x) == Option::field_sep)) {
ret << build;
build = "";
} else {
build += *(vals_data+x);
}
}
if(!build.isEmpty())
ret << build;
return ret;
}
class QMakeProjectEnv
{
QStringList envs;
void init(const QMap<QString, QStringList> &values) {
#ifdef Q_OS_UNIX
for(QMap<QString, QStringList>::ConstIterator it = values.begin(); it != values.end(); ++it) {
const QString var = it.key(), val = it.value().join(" ");
if(!var.startsWith(".")) {
const QString env_var = Option::sysenv_mod + var;
if(!putenv(strdup(QString(env_var + "=" + val).toAscii().data())))
envs.append(env_var);
}
}
#endif
}
public:
QMakeProjectEnv(QMakeProject *p) { init(p->variables()); }
QMakeProjectEnv(const QMap<QString, QStringList> &variables) { init(variables); }
~QMakeProjectEnv() {
#ifdef Q_OS_UNIX
for(QStringList::ConstIterator it = envs.begin();it != envs.end(); ++it) {
putenv(strdup(QString(*it + "=").toAscii().data()));
}
#endif
}
};
QMakeProject::~QMakeProject()
{
if(own_prop)
delete prop;
qDeleteAll(replaceFunctions);
qDeleteAll(testFunctions);
}
void
QMakeProject::init(QMakeProperty *p, const QMap<QString, QStringList> *vars)
{
if(vars)
base_vars = *vars;
if(!p) {
prop = new QMakeProperty;
own_prop = true;
} else {
prop = p;
own_prop = false;
}
reset();
}
void
QMakeProject::reset()
{
// scope_blocks starts with one non-ignoring entity
scope_blocks.clear();
scope_blocks.push(ScopeBlock());
iterator = 0;
function = 0;
}
bool
QMakeProject::parse(const QString &t, QMap<QString, QStringList> &place)
{
QString s = t.simplified();
int hash_mark = s.indexOf("#");
if(hash_mark != -1) //good bye comments
s = s.left(hash_mark);
if(s.isEmpty()) // blank_line
return true;
if(scope_blocks.top().ignore) {
bool continue_parsing = false;
// adjust scope for each block which appears on a single line
for(int i = 0; i < s.length(); i++) {
if(s[i] == '{') {
scope_blocks.push(ScopeBlock(true));
} else if(s[i] == '}') {
if(scope_blocks.count() == 1) {
fprintf(stderr, "Braces mismatch %s:%d\n", parser.file.toLatin1().constData(), parser.line_no);
return false;
}
ScopeBlock sb = scope_blocks.pop();
if(sb.iterate) {
sb.iterate->exec(this, place);
delete sb.iterate;
sb.iterate = false;
}
if(!scope_blocks.top().ignore) {
debug_msg(1, "Project Parser: %s:%d : Leaving block %d", parser.file.toLatin1().constData(),
parser.line_no, scope_blocks.count()+1);
s = s.mid(i+1).trimmed();
continue_parsing = !s.isEmpty();
break;
}
}
}
if(!continue_parsing) {
debug_msg(1, "Project Parser: %s:%d : Ignored due to block being false.",
parser.file.toLatin1().constData(), parser.line_no);
return true;
}
}
if(function) {
QString append;
QByteArray dd = s.toLatin1();
const char *d = dd.constData();
bool function_finished = false;
while(*d) {
if((*d) == '}') {
function->scope_level--;
if(!function->scope_level) {
function_finished = true;
break;
}
} else if((*d) == '{') {
function->scope_level++;
}
append += *d;
d++;
}
if(!append.isEmpty())
function->parser.append(IteratorBlock::Parse(append));
if(function_finished) {
function = 0;
s = QString(d);
} else {
return true;
}
} else if(IteratorBlock *it = scope_blocks.top().iterate) {
QString append;
QByteArray dd = s.toLatin1();
const char *d = dd;
bool iterate_finished = false;
while(*d) {
if((*d) == '}') {
it->scope_level--;
if(!it->scope_level) {
iterate_finished = true;
break;
}
} else if((*d) == '{') {
it->scope_level++;
}
append += *d;
d++;
}
if(!append.isEmpty())
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -