Название: Собственный дистрибутив 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> Код не идеален, проверок на переполнения буфера и прочую дребедень нет, но с 4.3.1 работает точно. Если qmake и QtCore(d)4.dll других версий собраны так же как и в этой версии (с кучей нолей после путей), то и с ними работать должен. Название: Re: Собственный дистрибутив Qt. Отправлено: QCasper от Октябрь 08, 2007, 09:34 Ну а за это уже отвечает компилятор, линкер и отладчик. Отладчикам от MSVC и Borland можно сказать где реально находятся исходники. Скорее всего в gdb тоже есть подобное. И всё же, как же это сделать? Меня интересует MSVC прежде всего. Я так полагаю одного того, что я прописал директорий с исходниками в VC++ Directories - мало (а то и вообще не нужно) ? |