А здесь, как всегда: в хрустальном захолустье светло -
И здесь нет ничего, что бы могло измениться.
И время течет, но, по-моему, то туда, то сюда,
У меня накопилось куча новостей по LAMB:
- Trolltech Nokia Qt Software зарелизили Qt 4.5.0. В том числе там лежит и новый q3porting.xml. Из интересного в нем - там пофикшена бага с Q3SqlFiledInfo. Но до сих пор осталось большое количество redefine-ов. В связи с тем, что варнинги о них засоряют stderr LAMB-а - к следущему релизу перепешу qt3to4tolamb.pl так, чтобы в LAMB-овский конфиг($lamb_dir/qt-config/qt3-qt4.lamb) записывалось только последнее из изменений из q3porting.xml. Кроме того, добавилось энное(довольно небольшое) количество записей, при обработке которых обнаружилась одна ошибка в LAMB, за что Qt особое спасибо.
- Оказалось, что некоторые из проектов-тестов(из $qt3_dir/doc/examples) по сути состоят из множества маленьких подпроектиков, которые слабо связаны между собой. Поэтому имеет смысл разбивать на тесты не по папкам, а по проектным файлам. Поэтому в 0.1.6 получится немножко отличная от описанной картина:
gark87@linux-rrve:~/lamb/lamb-0.1.6-src> grep OK ./exam/results | grep WRONG
picture[WRONG][WRONG][OK] gridview[WRONG][OK][OK] wizard[WRONG][OK][OK] progressbar[OK][OK][WRONG]
addressbook[WRONG][OK][WRONG] layout[WRONG][OK][OK] qfd[WRONG][OK][OK] tictac[WRONG][OK][OK]
richtext[WRONG][OK][OK] sound[WRONG][OK][OK] server[WRONG][OK][OK] httpd[WRONG][OK][OK]
mail[OK][OK][WRONG] networkprotocol[OK][OK][WRONG] dclock[WRONG][WRONG][OK] statistics[WRONG][OK][OK]
cursor[WRONG][OK][OK] drawdemo[WRONG][OK][WRONG] box[WRONG][WRONG][OK] overlay[WRONG][OK][OK]
sharedbox[WRONG][WRONG][OK] drawlines[WRONG][OK][OK] popup[WRONG][WRONG][OK] application[WRONG][OK][OK]
итого:
"чистый" qt3to4 = 22/130
qt3to4++ (qt3to4 + using namespace Qt;) = 38/130
LAMB = 38/130 - Теперь вместе с $lamb_dir/qt-config/qt3-qt4.lamb(файл, сгенеренный по q3porting.xml и содержащий соответствующие изменения) и $lamb_dir/qt-config/qt-functions.lamb(файл, содержащий изменения которых у qt3to4 нет, а у LAMB в том или ином виде есть) для портирования Qt3->Qt4 есть еще файл $lamb_dir/qt-config/qt-header.patch - это патч, который предлагается наложить на $qt4_dir/include для лучшей работы LAMB. Тут дело вот в чем: некоторые методы поменяли только тип возвращаемого значения, сохранив при этом сигнатуру. А для LAMB было бы проще "считать", что этих функций нет. Поэтому патч содержит некоторое количество конструкций типа
#ifndef LAMB
... some function declaration here ...
#endif
Поэтому для Qt3->Qt4 рекомендуется сначала наложить патч, а только потом запускать LAMB
- И наконец, вышел LAMB 0.1.7 на sf.net
ChangeLog приводить не буду, вот результаты тестирования на $qt3_dir/doc/examples
gark87@linux-rrve:~/lamb/lamb-0.1.7> grep OK ./exam/results | grep WRONG
picture[WRONG][WRONG][OK]
gridview[WRONG][OK][OK]
wizard[WRONG][OK][OK]
progressbar[OK][OK][WRONG]
addressbook[WRONG][OK][WRONG]
layout[WRONG][OK][OK]
qfd[WRONG][OK][OK]
tictac[WRONG][OK][OK]
richtext[WRONG][OK][OK]
sound[WRONG][OK][OK]
server[WRONG][OK][OK]
httpd[WRONG][OK][OK]
mail[OK][OK][WRONG]
networkprotocol[OK][OK][WRONG]
dclock[WRONG][WRONG][OK]
statistics[WRONG][OK][OK]
cursor[WRONG][OK][OK]
drawdemo[WRONG][OK][WRONG]
box[WRONG][WRONG][OK]
overlay[WRONG][OK][OK]
sharedbox[WRONG][WRONG][OK]
scrollview[WRONG][WRONG][OK]
drawlines[WRONG][OK][OK]
popup[WRONG][WRONG][OK]
blob[WRONG][WRONG][OK]
extract[WRONG][WRONG][OK]
custom1[WRONG][WRONG][OK]
subclass1[WRONG][WRONG][OK]
form2[WRONG][WRONG][OK]
connect1[WRONG][WRONG][OK]
table3[WRONG][WRONG][OK]
navigating[WRONG][WRONG][OK]
form1[WRONG][WRONG][OK]
retrieve2[WRONG][WRONG][OK]
application[WRONG][OK][OK]
итого:
"чистый" qt3to4 = 22/130
qt3to4++ (qt3to4 + using namespace Qt;) = 38/130
LAMB = 49/130
- Из особенно забавного: в qt3to4 есть NeedHeader, а в LAMB соответствующий ему ClassNeedsHeader. Это конструкции, позволяющие проинклюдить header. если данный класс используется в файле. Но возможны такие ситуации:
Файл b.h
==================================
class B
{
public:
int b();
};
==================================
Файл a.h
==================================
class B;
class A
{
public:
B* b;
};
==================================
Файл main.cpp
==================================
#include "a.h"
int main()
{
return A().b->b();
}
==================================
А в конфиге config.lamb
==================================
ClassNeedsHeader("b.h") B
==================================
Раньше в предыдущей версии библиотеки определение класса B находилось в файле a.h. qt3to4 с такими ситуациями справиться не может, ибо формально токен B в файле main.cpp не встречается.
А LAMB(из-за GCC) понимает, что идет работа с incomplete type и если надо добавляет header. И это не просто умозрительный пример - в QtSql есть например QSqlError. >