Russian Qt Forum

Qt => Установка, сборка, отладка, тестирование => Тема начата: QCasper от Сентябрь 06, 2007, 08:22



Название: Собственный дистрибутив Qt.
Отправлено: QCasper от Сентябрь 06, 2007, 08:22
У меня возникло желание создать собственный дистр Qt. То есть собрать один раз где-нить на одном компе, проинсталлить, запихнуть инсталляцию в NSIS, и потом когда я прихожу в другое место, и мне там позарез надо Qt (ну бывает :) ), то не собирать все это заново 4 часа, а взять с флэшки мой 20-ти метровый дистр и все это дело быстренько установить. Я значит собрал, при сборке указав -prefix, чтобы потом оно мне установилось туда, и запихнул в NSIS. Но оказалось, что при сборке, в qmake жестко зашиваются пути к либам, плагинам и еще наверное к чему-нибудь. И причем не какой-нибудь путь, а тот, что был указан в -prefix. То есть если я на другой машине разверну этот дистрибутив по другому пути, он естественно работать не будет. По крайней мере от qmake точно придется отказаться. Поэтому, если вдруг кто знает, у меня вопрос, как тролли делают дистры, как их дистр при установке патчит qmake путями, которые юзер указал в инсталлере?


Название: Re: Собственный дистрибутив Qt.
Отправлено: Вячеслав от Сентябрь 06, 2007, 09:09
Ну речь похоже о форточках идет ;) А там subst никто не отменял ;)

cd :
md xxxQT
subst q: xxxQT

ну и убрать subst /d q:

Ы ?


Название: Re: Собственный дистрибутив Qt.
Отправлено: QCasper от Сентябрь 06, 2007, 10:22
Ну теоретически то может и выход, только не думаю, что тролли пользуются именно таким подходом.


Название: Re: Собственный дистрибутив Qt.
Отправлено: vaprele07 от Сентябрь 06, 2007, 10:41
зы:
Цитировать
/*
   1) environment variable QMAKEFEATURES (as separated by colons)
   2) property variable QMAKEFEATURES (as separated by colons)
   3) <project_root> (where .qmake.cache lives) + FEATURES_DIR
   4) environment variable QMAKEPATH (as separated by colons) + /mkspecs/FEATURES_DIR
   5) your QMAKESPEC/features dir
   6) your data_install/mkspecs/FEATURES_DIR
   7) your QMAKESPEC/../FEATURES_DIR dir

   FEATURES_DIR is defined as:

   1) features/(unix|win32|macx)/
   2) features/
*/


Название: Re: Собственный дистрибутив Qt.
Отправлено: Tonal от Сентябрь 06, 2007, 12:57
Почитай про qt.conf


Название: Re: Собственный дистрибутив Qt.
Отправлено: QCasper от Сентябрь 27, 2007, 13:02
зы:
Цитировать
/*
   1) environment variable QMAKEFEATURES (as separated by colons)
   2) property variable QMAKEFEATURES (as separated by colons)
   3) <project_root> (where .qmake.cache lives) + FEATURES_DIR
   4) environment variable QMAKEPATH (as separated by colons) + /mkspecs/FEATURES_DIR
   5) your QMAKESPEC/features dir
   6) your data_install/mkspecs/FEATURES_DIR
   7) your QMAKESPEC/../FEATURES_DIR dir

   FEATURES_DIR is defined as:

   1) features/(unix|win32|macx)/
   2) features/
*/

Не понятно, что Вы этим хотите сказать...

Почитай про qt.conf

Не думаю, что это как-то мне поможет. qt.conf помогает в том случае, когда я распространяю свою прогу и хочу перегрузить пути к либам, которые прошиты в хардкоде. Если Вы внимательно читали мой пост мне не это нужно.

Еще раз повторю. Имеем дистрибутив вида qt-win-opensource-4.3.1-mingw.exe. Берем и устанавливаем его, туда, куда хотим, например в d:\qt\4.3.1-opensource. После чего идем в d:\qt\4.3.1-opensource\bin и запускаем qmake с опцией -v. Вот что мы видим на выходе:

Цитировать
QMake version 2.01a
Using Qt version 4.3.1 in d:\qt\4.3.1-opensource\lib

Вся фишка в том, что путь d:\qt\4.3.1-opensource прошит прямо в qmake.exe. И сделано это на этапе инсталляции, т.к. заранее этого сделано быть не могло ввиду того, что откуда троллям знать куда мне все это взбредет проинсталлить? Вот вопрос именно в этом и заключается, что же там такое происходит на этапе инсталляции, что путь который я руками ввел при установке, оказывается прошитым в qmake.exe?


Название: Re: Собственный дистрибутив Qt.
Отправлено: vaprele07 от Сентябрь 27, 2007, 13:24
это переменные среды, которыми пользуется qmake для нахождения mkspecs, в которой как известно лежат настройки для отдельных компилятором + пути к инклудам, либам, етц.


Название: Re: Собственный дистрибутив Qt.
Отправлено: QCasper от Сентябрь 27, 2007, 13:47
это переменные среды, которыми пользуется qmake для нахождения mkspecs, в которой как известно лежат настройки для отдельных компилятором + пути к инклудам, либам, етц.

Понятно. Но все же при создании дистрибутива подобного qt-win-opensource-4.3.1-mingw.exe тролли используют не этот подход.


Название: Re: Собственный дистрибутив Qt.
Отправлено: mks56 от Октябрь 02, 2007, 08:59
To QCasper

Если внимательно посмотреть на детали процесса инсталляции Qt из exe-файла, то Вы увидите, что в конце инсталляции происходит патчинг, в процессе которого в НУЖНЫХ местах правятся пути.


Название: Re: Собственный дистрибутив Qt.
Отправлено: QCasper от Октябрь 02, 2007, 10:04
To QCasper

Если внимательно посмотреть на детали процесса инсталляции Qt из exe-файла, то Вы увидите, что в конце инсталляции происходит патчинг, в процессе которого в НУЖНЫХ местах правятся пути.

Нашел строку "Patching paths in qmake...". В принципе, ничего в этом удивительного нет, понятное дело что оно как-то патчится. Вопрос стоит как?


Название: Re: Собственный дистрибутив Qt.
Отправлено: QCasper от Октябрь 03, 2007, 08:48
Все еще актуально...


Название: Re: Собственный дистрибутив Qt.
Отправлено: mks56 от Октябрь 04, 2007, 07:00
To QCasper

Очевидно, патчатся бинарные файлы. В qmake.exe примерно на 96% от начала файла имеются строки типа qt_prfxpath=... и много других


Название: Re: Собственный дистрибутив Qt.
Отправлено: QCasper от Октябрь 04, 2007, 08:28
To QCasper

Очевидно, патчатся бинарные файлы. В qmake.exe примерно на 96% от начала файла имеются строки типа qt_prfxpath=... и много других

Спасибо, я в курсе. Только это не дает ответа на вопрос, как значения этих строк изменить.
Их там не много, а ровно 10:

qt_prfxpath=F:\qt\4.3.1-g++
qt_docspath=F:\qt\4.3.1-g++\doc
qt_hdrspath=F:\qt\4.3.1-g++\include
qt_libspath=F:\qt\4.3.1-g++\lib
qt_binspath=F:\qt\4.3.1-g++\bin
qt_plugpath=F:\qt\4.3.1-g++\plugins
qt_datapath=F:\qt\4.3.1-g++
qt_trnspath=F:\qt\4.3.1-g++\translations
qt_xmplpath=F:\qt\4.3.1-g++\examples
qt_demopath=F:\qt\4.3.1-g++\demos


Название: Re: Собственный дистрибутив Qt.
Отправлено: mks56 от Октябрь 04, 2007, 08:54
To QCasper

Там эти строки завершаются огромным количеством нулей, поэтому наверное можно написать программку, которая открывает файл qmake.exe в бинарном режиме, ищет нужную сигнатуру и правит информацию после нее на нужную и добаляет нужное число нулей. Может получится...


Название: Re: Собственный дистрибутив Qt.
Отправлено: QCasper от Октябрь 04, 2007, 09:39
To QCasper

Там эти строки завершаются огромным количеством нулей, поэтому наверное можно написать программку, которая открывает файл qmake.exe в бинарном режиме, ищет нужную сигнатуру и правит информацию после нее на нужную и добаляет нужное число нулей. Может получится...

Я писал программу, которая просто заменяет эти строки на нужные мне, qmake после этого вообще вылетал с ошибкой. А Вы стало быть предлагаете, заменить и изменить количество нулей на разницу между строками?


Название: Re: Собственный дистрибутив Qt.
Отправлено: mks56 от Октябрь 04, 2007, 10:12
To QCasper

Для эксперимента я у себя с помощью Winhex'а заменил букву диска с F на С, а также qt_libspath=F:\Qt\4.2.3\lib на qt_libspath=C:\Qt\4.2.3\liblib, и все нормально, qmake -v сработал с новым C:\Qt\4.2.3\liblib. Существенным здесь является, по-видимому, то, что если Вы производите замену посредством некоей своей программы, то 1. открывать файл нужно в бинарном режиме 2. нужно отследить общую длину блока между строками с тем, чтобы Ваш новый путь гарантированно заканчивался нулевым кодом. Проще всего эту процедуру сделать так: 1. открыть файл, определить его длину, захватить буфер этой длины, всосать в него файл целиком; 2. провести замены в буфере: 3. записать буфер в другой файл опять же в бинарном режиме. После этого у Вас должно все получиться. Успехов...


Название: Re: Собственный дистрибутив Qt.
Отправлено: QCasper от Октябрь 04, 2007, 10:29
To QCasper

Для эксперимента я у себя с помощью Winhex'а заменил букву диска с F на С, а также qt_libspath=F:\Qt\4.2.3\lib на qt_libspath=C:\Qt\4.2.3\liblib, и все нормально, qmake -v сработал с новым C:\Qt\4.2.3\liblib. Существенным здесь является, по-видимому, то, что если Вы производите замену посредством некоей своей программы, то 1. открывать файл нужно в бинарном режиме 2. нужно отследить общую длину блока между строками с тем, чтобы Ваш новый путь гарантированно заканчивался нулевым кодом. Проще всего эту процедуру сделать так: 1. открыть файл, определить его длину, захватить буфер этой длины, всосать в него файл целиком; 2. провести замены в буфере: 3. записать буфер в другой файл опять же в бинарном режиме. После этого у Вас должно все получиться. Успехов...

Угу, после того, как Вы подали идею с нулями в предыдущем посте мне сразу стало все понятно, я написал программу и сейчас, по-крайней мере на qmake -v, она выдает новый путь. Любопытно будет ли это работать в целом. А вообще за идею спасибо! :)


Название: Re: Собственный дистрибутив Qt.
Отправлено: vaprele07 от Октябрь 04, 2007, 10:49
Tonal, прав читай
http://doc.trolltech.com/4.1/qt-conf.html
заодно про environment
http://doc.trolltech.com/qtopia4.2/qmake-environment-reference.html

qt.conf бросается он в директорию с qmake
[paths]
Prefix=c:\MyQt
lib=c:\MyQt\lib
include=c:\MyQt\include
bin=c:\MyQt\bin
plugins=c:\MyQt\plugins
doc=c:\MyQt\doc
translations=c:\MyQt\translations

потом проверяешь:
qmake -query QT_INSTALL_PREFIX


Название: Re: Собственный дистрибутив Qt.
Отправлено: QCasper от Октябрь 05, 2007, 09:18
Tonal, прав читай
http://doc.trolltech.com/4.1/qt-conf.html

Читал.

qt.conf бросается он в директорию с qmake
[paths]
Prefix=c:\MyQt
lib=c:\MyQt\lib
include=c:\MyQt\include
bin=c:\MyQt\bin
plugins=c:\MyQt\plugins
doc=c:\MyQt\doc
translations=c:\MyQt\translations

потом проверяешь:
qmake -query QT_INSTALL_PREFIX

 Тем не менее тролли не используют этот подход при создании своих дистров, а тупо прошивают пути в код.

заодно про environment
http://doc.trolltech.com/qtopia4.2/qmake-environment-reference.html

А с энвайронментом так вообще возни еще больше.



Название: Re: Собственный дистрибутив Qt.
Отправлено: Tonal от Октябрь 05, 2007, 13:05
Кстати, по хорошему патчеть надо не только qmake но и QtCore.
И скорее всего ещё moc, rcc, uic.


Название: Re: Собственный дистрибутив Qt.
Отправлено: QCasper от Октябрь 05, 2007, 15:20
Кстати, по хорошему патчеть надо не только qmake но и QtCore.
Согласен, я так и делаю.

И скорее всего ещё moc, rcc, uic.

Эти не нужно. По крайней мере тролли не патчат - раз, у меня без это патчинга работает - два.


Название: Re: Собственный дистрибутив Qt.
Отправлено: QCasper от Октябрь 05, 2007, 15:26
В принципе с тем патчером, который я написал, воспользовавшись идеей mks56, работает вроде как, но остается одна проблема, которую похоже никак нельзя решить. Причем тролли её тоже не решают.

Если я хочу заниматься отладкой, причем хочу заходить по step into в исходники Qt, я должен хранить исходники Qt именно по тому пути, по которому они лежали во время сборки дебаговых библиотек. Естественно эти пути в QtCored4.dll так просто пропатчить уже не удается, ибо после них нет такого огромного количества нулей.


Название: Re: Собственный дистрибутив Qt.
Отправлено: Tonal от Октябрь 05, 2007, 16:10
Ну а за это уже отвечает компилятор, линкер и отладчик.
Отладчикам от MSVC и Borland можно сказать где реально находятся исходники.
Скорее всего в gdb тоже есть подобное.


Название: Re: Собственный дистрибутив Qt.
Отправлено: QCasper от Октябрь 05, 2007, 16:21
Ну а за это уже отвечает компилятор, линкер и отладчик.
Отладчикам от MSVC и Borland можно сказать где реально находятся исходники.
Скорее всего в gdb тоже есть подобное.

Интересно как...


Название: Re: Собственный дистрибутив Qt.
Отправлено: ритт от Октябрь 05, 2007, 23:20
> В принципе с тем патчером, который я написал

дай линку на патчер, если не жалко - будет полезно


Название: Re: Собственный дистрибутив Qt.
Отправлено: QCasper от Октябрь 06, 2007, 00:11
> В принципе с тем патчером, который я написал

дай линку на патчер, если не жалко - будет полезно

Не жалко :) перед компиляцией c_Prefix нужно изменить на то значение, которое прошито в твой qmake (или QtCore(d)4.dll).

Код:
#include <qfile.h>
#include <iostream>
#include <qcoreapplication.h>

const char* c_Usage = "Usage: qtpatcher <file> <new prefix>";
const char* c_Prefix = "d:\\qt\\4.3.1-msvc";

const QList<QByteArray> pp = QList<QByteArray>()
<< QByteArray("qt_prfxpath=") + c_Prefix + QByteArray("")
<< QByteArray("qt_docspath=") + c_Prefix + QByteArray("\\doc")
<< QByteArray("qt_hdrspath=") + c_Prefix + QByteArray("\\include")
<< QByteArray("qt_libspath=") + c_Prefix + QByteArray("\\lib")
<< QByteArray("qt_binspath=") + c_Prefix + QByteArray("\\bin")
<< QByteArray("qt_plugpath=") + c_Prefix + QByteArray("\\plugins")
<< QByteArray("qt_datapath=") + c_Prefix + QByteArray("")
<< QByteArray("qt_trnspath=") + c_Prefix + QByteArray("\\translations")
<< QByteArray("qt_xmplpath=") + c_Prefix + QByteArray("\\examples")
<< QByteArray("qt_demopath=") + c_Prefix + QByteArray("\\demos")
;
int findNonZeroIndex(const QByteArray & ba, int from) {
while(ba[from++] == '\0');
return from - 1;
}

int main(int argc, char *argv[]) {
QCoreApplication a(argc, argv);

if (argc != 3) {
std::cout << c_Usage << std::endl;
return 0;
}

QFile qmake(argv[1]);
if (!qmake.open(QIODevice::ReadOnly)) {
std::cout << "Can't open " << argv[1] << " for reading" << std::endl;
return 0;
}

QByteArray ba = qmake.readAll();
qmake.close();

for (int i=0; i<pp.size(); i++) {
int l = findNonZeroIndex(ba, ba.indexOf(pp[i]) + pp[i].length()) - ba.indexOf(pp[i]);

QByteArray src = pp[i];
while((src += '\0').length() != l);
QByteArray dst = src;

dst.replace(c_Prefix, argv[2]);

if (dst.length() < l)
while((dst += '\0').length() != l);
else if (dst.length() > l)
dst.remove(l, dst.length()-l);

ba.replace(src, dst);
}

if (!qmake.open(QIODevice::WriteOnly)) {
std::cout << "Can't open " << argv[1] << " for writing" << std::endl;
return 0;
}

qmake.write(ba);
qmake.close();

return 0;
}

Код не идеален, проверок на переполнения буфера и прочую дребедень нет, но с 4.3.1 работает точно. Если qmake и QtCore(d)4.dll других версий собраны так же как и в этой версии (с кучей нолей после путей), то и с ними работать должен.


Название: Re: Собственный дистрибутив Qt.
Отправлено: QCasper от Октябрь 08, 2007, 09:34
Ну а за это уже отвечает компилятор, линкер и отладчик.
Отладчикам от MSVC и Borland можно сказать где реально находятся исходники.
Скорее всего в gdb тоже есть подобное.


И всё же, как же это сделать? Меня интересует MSVC прежде всего. Я так полагаю одного того, что я прописал директорий с исходниками в VC++ Directories - мало (а то и вообще не нужно) ?