From ac185f7b744738b39232d611f54dff73d70754d4 Mon Sep 17 00:00:00 2001 From: goro <qtc-committer@nokia.com> Date: Thu, 22 Jan 2009 17:09:45 +0100 Subject: [PATCH] Quick-and-dirty Qt Linux binary patching --- src/tools/qtlibspatcher/qtlibspatchermain.cpp | 642 ++++++++++++++++-- 1 file changed, 602 insertions(+), 40 deletions(-) diff --git a/src/tools/qtlibspatcher/qtlibspatchermain.cpp b/src/tools/qtlibspatcher/qtlibspatchermain.cpp index f6b2da18f36..975e58c971a 100644 --- a/src/tools/qtlibspatcher/qtlibspatchermain.cpp +++ b/src/tools/qtlibspatcher/qtlibspatchermain.cpp @@ -32,7 +32,8 @@ ***************************************************************************/ #include "binpatch.h" -#include <stdio.h> +#include <cstdio> +#include <iostream> #include <QFile> #include <QRegExp> @@ -40,6 +41,27 @@ #include <QString> #include <QtCore/QDebug> +#ifdef Q_OS_WIN + const char * const oldInstallBase = "C:/qt-greenhouse/Trolltech/Code_less_create_more/" + "Trolltech/Code_less_create_more/Troll/4.4.3"; +#else + const char * const oldSourceBase = "/home/berlin/dev/qt-4.4.3-temp/qt-x11-opensource-src-4.4.3"; + const char * const oldInstallBase = "/home/berlin/dev/qt-4.4.3-shipping"; +#endif + + +char * allocFileNameCopyAppend(const char * textToCopy, + const char * textToAppend, const char * textToAppend2 = NULL); + +void logFileName(const char *fileName) { + std::cout << "Patching file " << fileName << std::endl; +} + +void logDiff(const char *oldText, const char *newText) { + std::cout << " --- " << oldText << std::endl; + std::cout << " +++ " << newText << std::endl; +} + bool patchBinaryWithQtPathes(const char *fileName, const char *baseQtPath) { bool result = true; @@ -61,16 +83,13 @@ bool patchBinaryWithQtPathes(const char *fileName, const char *baseQtPath) {"qt_demopath=", "/demos"} }; - for (int i = 0; i < sizeof(variables)/sizeof(variables[0]); i++) { - char newStr[256] = ""; - strncpy(newStr, variables[i].variable, sizeof(newStr)); - newStr[sizeof(newStr) - 1] = 0; - strncat(newStr, baseQtPath, sizeof(newStr) - strlen(newStr) - 1); - newStr[sizeof(newStr) - 1] = 0; - strncat(newStr, variables[i].subDirectory, sizeof(newStr) - strlen(newStr) - 1); - newStr[sizeof(newStr) - 1] = 0; + logFileName(fileName); + for (int i = 0; i < (int)(sizeof(variables) / sizeof(variables[0])); i++) { + const char * const newStr = allocFileNameCopyAppend(variables[i].variable, baseQtPath, variables[i].subDirectory); BinPatch binFile(fileName); - if (!binFile.patch(variables[i].variable, newStr)) { + const bool success = binFile.patch(variables[i].variable, newStr); + delete[] newStr; + if (!success) { result = false; break; } @@ -84,18 +103,21 @@ bool patchBinariesWithQtPathes(const char *baseQtPath) bool result = true; static const char *filesToPatch[] = { + #ifdef Q_OS_WIN "/bin/qmake.exe", "/bin/QtCore4.dll", "/bin/QtCored4.dll" + #else + "/bin/qmake", + "/lib/libQtCore.so", + #endif }; - for (int i = 0; i < sizeof(filesToPatch)/sizeof(filesToPatch[0]); i++) { - char fileName[FILENAME_MAX] = ""; - strncpy(fileName, baseQtPath, sizeof(fileName)); - fileName[sizeof(fileName)-1] = '\0'; - strncat(fileName, filesToPatch[i], sizeof(fileName) - strlen(fileName) - 1); - fileName[sizeof(fileName)-1] = '\0'; - if (!patchBinaryWithQtPathes(fileName, baseQtPath)) { + for (int i = 0; i < (int)(sizeof(filesToPatch) / sizeof(filesToPatch[0])); i++) { + const char * const fileName = allocFileNameCopyAppend(baseQtPath, filesToPatch[i]); + const bool success = patchBinaryWithQtPathes(fileName, baseQtPath); + delete[] fileName; + if (!success) { result = false; break; } @@ -104,6 +126,39 @@ bool patchBinariesWithQtPathes(const char *baseQtPath) return result; } +char * allocFileNameCopyAppend(const char * textToCopy, + const char * textToAppend, const char * textToAppend2) +{ + const unsigned int bytesToAllocate = FILENAME_MAX; + Q_ASSERT(bytesToAllocate > 0); + Q_ASSERT(textToCopy != NULL); + Q_ASSERT(textToAppend != NULL); + if (textToAppend2 == NULL) + textToAppend2 = ""; + Q_ASSERT(textToAppend2 != NULL); + + char * const res = new char[bytesToAllocate]; + const size_t textToCopyLen = strlen(textToCopy); + const size_t textToAppendLen = strlen(textToAppend); + const size_t textToAppend2Len = strlen(textToAppend2); + + // Array too small? + if (textToCopyLen + textToAppendLen + textToAppend2Len >= bytesToAllocate) { + res[0] = '\0'; + return res; + } + + strncpy(res, textToCopy, bytesToAllocate - 1); + if (textToAppendLen > 0) + strncpy(res + textToCopyLen, textToAppend, bytesToAllocate - textToCopyLen - 1); + if (textToAppend2Len > 0) + strncpy(res + textToCopyLen + textToAppend2Len, textToAppend2, bytesToAllocate - textToCopyLen - textToAppend2Len - 1); + res[textToCopyLen + textToAppendLen + textToAppend2Len] = '\0'; + res[bytesToAllocate - 1] = '\0'; // Safe is safe + return res; +} + + bool patchDebugLibrariesWithQtPath(const char *baseQtPath) { bool result = true; @@ -113,6 +168,7 @@ bool patchDebugLibrariesWithQtPath(const char *baseQtPath) const char *fileName; const char *sourceLocation; } libraries[] = { +#ifdef Q_OS_WIN {"/bin/Qt3Supportd4.dll", "/src/qt3support/"}, {"/bin/QtCored4.dll", "/src/corelib/"}, {"/bin/QtGuid4.dll", "/src/gui/"}, @@ -140,31 +196,415 @@ bool patchDebugLibrariesWithQtPath(const char *baseQtPath) {"/plugins/imageformats/qtiffd4.dll", "/src/plugins/imageformats/tiff/"}, {"/plugins/sqldrivers/qsqlited4.dll", "/src/plugins/sqldrivers/sqlite/"}, // {"/plugins/sqldrivers/qsqlodbcd4.dll", "/src/plugins/sqldrivers/odbc/"} +#else + {"/examples/tools/plugandpaint/plugins/libpnp_basictools.a", "/examples/tools/plugandpaintplugins/basictools"}, + {"/lib/libQtUiTools.a", "/tools/designer/src/uitools"}, + {"/demos/shared/libdemo_shared.a", "/demos/shared"}, + + {"/plugins/codecs/libqkrcodecs.so.debug", "/plugins/codecs"}, + {"/plugins/codecs/libqtwcodecs.so.debug", "/plugins/codecs"}, + {"/plugins/codecs/libqcncodecs.so.debug", "/plugins/codecs"}, + {"/plugins/codecs/libqjpcodecs.so.debug", "/plugins/codecs"}, + {"/plugins/iconengines/libqsvgicon.so.debug", "/plugins/iconengines"}, + {"/plugins/sqldrivers/libqsqlmysql.so.debug", "/plugins/sqldrivers"}, + {"/plugins/sqldrivers/libqsqlite.so.debug", "/plugins/sqldrivers"}, + {"/plugins/sqldrivers/libqsqlite2.so.debug", "/plugins/sqldrivers"}, + {"/plugins/sqldrivers/libqsqlpsql.so.debug", "/plugins/sqldrivers"}, + {"/plugins/imageformats/libqgif.so.debug", "/plugins/imageformats"}, + {"/plugins/imageformats/libqtiff.so.debug", "/plugins/imageformats"}, + {"/plugins/imageformats/libqsvg.so.debug", "/plugins/imageformats"}, + {"/plugins/imageformats/libqjpeg.so.debug", "/plugins/imageformats"}, + {"/plugins/imageformats/libqico.so.debug", "/plugins/imageformats"}, + {"/plugins/imageformats/libqmng.so.debug", "/plugins/imageformats"}, + {"/plugins/accessible/libqtaccessiblewidgets.so.debug", "/plugins/accessible"}, + {"/plugins/accessible/libqtaccessiblecompatwidgets.so.debug", "/plugins/accessible"}, + {"/plugins/designer/libcontainerextension.so.debug", "/plugins/designer"}, + {"/plugins/designer/libtaskmenuextension.so.debug", "/plugins/designer"}, + {"/plugins/designer/libqwebview.so.debug", "/plugins/designer"}, + {"/plugins/designer/libcustomwidgetplugin.so.debug", "/plugins/designer"}, + {"/plugins/designer/libarthurplugin.so.debug", "/plugins/designer"}, + {"/plugins/designer/libqt3supportwidgets.so.debug", "/plugins/designer"}, + {"/plugins/designer/libworldtimeclockplugin.so.debug", "/plugins/designer"}, + {"/plugins/inputmethods/libqimsw-multi.so.debug", "/plugins/inputmethods"}, + {"/plugins/script/libqtscriptdbus.so.debug", "/plugins/script"}, + {"/examples/draganddrop/puzzle/puzzle.debug", "/examples/draganddrop/puzzle"}, + {"/examples/draganddrop/dropsite/dropsite.debug", "/examples/draganddrop/dropsite"}, + {"/examples/draganddrop/draggabletext/draggabletext.debug", "/examples/draganddrop/draggabletext"}, + {"/examples/draganddrop/draggableicons/draggableicons.debug", "/examples/draganddrop/draggableicons"}, + {"/examples/draganddrop/fridgemagnets/fridgemagnets.debug", "/examples/draganddrop/fridgemagnets"}, + {"/examples/webkit/formextractor/formExtractor.debug", "/examples/webkit/formextractor"}, + {"/examples/webkit/previewer/previewer.debug", "/examples/webkit/previewer"}, + {"/examples/richtext/orderform/orderform.debug", "/examples/richtext/orderform"}, + {"/examples/richtext/calendar/calendar.debug", "/examples/richtext/calendar"}, + {"/examples/richtext/syntaxhighlighter/syntaxhighlighter.debug", "/examples/richtext/syntaxhighlighter"}, + {"/examples/desktop/systray/systray.debug", "/examples/desktop/systray"}, + {"/examples/desktop/screenshot/screenshot.debug", "/examples/desktop/screenshot"}, + {"/examples/linguist/arrowpad/arrowpad.debug", "/examples/linguist/arrowpad"}, + {"/examples/linguist/trollprint/trollprint.debug", "/examples/linguist/trollprint"}, + {"/examples/linguist/hellotr/hellotr.debug", "/examples/linguist/hellotr"}, + {"/examples/ipc/sharedmemory/sharedmemory.debug", "/examples/ipc/sharedmemory"}, + {"/examples/ipc/localfortuneclient/localfortuneclient.debug", "/examples/ipc/localfortuneclient"}, + {"/examples/ipc/localfortuneserver/localfortuneserver.debug", "/examples/ipc/localfortuneserver"}, + {"/examples/threads/waitconditions/waitconditions.debug", "/examples/threads/waitconditions"}, + {"/examples/threads/semaphores/semaphores.debug", "/examples/threads/semaphores"}, + {"/examples/threads/mandelbrot/mandelbrot.debug", "/examples/threads/mandelbrot"}, + {"/examples/dbus/listnames/listnames.debug", "/examples/dbus/listnames"}, + {"/examples/dbus/pingpong/ping.debug", "/examples/dbus/pingpong"}, + {"/examples/dbus/pingpong/pong.debug", "/examples/dbus/pingpong"}, + {"/examples/dbus/complexpingpong/complexping.debug", "/examples/dbus/complexpingpong"}, + {"/examples/dbus/complexpingpong/complexpong.debug", "/examples/dbus/complexpingpong"}, + {"/examples/dbus/chat/dbus-chat.debug", "/examples/dbus/chat"}, + {"/examples/dbus/remotecontrolledcar/car/car.debug", "/examples/dbus/remotecontrolledcar/car"}, + {"/examples/dbus/remotecontrolledcar/controller/controller.debug", "/examples/dbus/remotecontrolledcar/controller"}, + {"/examples/qtconcurrent/wordcount/wordcount.debug", "/examples/qtconcurrent/wordcount"}, + {"/examples/qtconcurrent/runfunction/runfunction.debug", "/examples/qtconcurrent/runfunction"}, + {"/examples/qtconcurrent/progressdialog/progressdialog.debug", "/examples/qtconcurrent/progressdialog"}, + {"/examples/qtconcurrent/map/mapdemo.debug", "/examples/qtconcurrent/map"}, + {"/examples/qtconcurrent/imagescaling/imagescaling.debug", "/examples/qtconcurrent/imagescaling"}, + {"/examples/designer/calculatorform/calculatorform.debug", "/examples/designer/calculatorform"}, + {"/examples/designer/worldtimeclockbuilder/worldtimeclockbuilder.debug", "/examples/designer/worldtimeclockbuilder"}, + {"/examples/designer/calculatorbuilder/calculatorbuilder.debug", "/examples/designer/calculatorbuilder"}, + {"/examples/sql/drilldown/drilldown.debug", "/examples/sql/drilldown"}, + {"/examples/sql/masterdetail/masterdetail.debug", "/examples/sql/masterdetail"}, + {"/examples/sql/tablemodel/tablemodel.debug", "/examples/sql/tablemodel"}, + {"/examples/sql/relationaltablemodel/relationaltablemodel.debug", "/examples/sql/relationaltablemodel"}, + {"/examples/sql/querymodel/querymodel.debug", "/examples/sql/querymodel"}, + {"/examples/sql/cachedtable/cachedtable.debug", "/examples/sql/cachedtable"}, + {"/examples/xmlpatterns/qobjectxmlmodel/qobjectxmlmodel.debug", "/examples/xmlpatterns/qobjectxmlmodel"}, + {"/examples/xmlpatterns/recipes/recipes.debug", "/examples/xmlpatterns/recipes"}, + {"/examples/xmlpatterns/filetree/filetree.debug", "/examples/xmlpatterns/filetree"}, + {"/examples/assistant/simpletextviewer/simpletextviewer.debug", "/examples/assistant/simpletextviewer"}, + {"/examples/help/simpletextviewer/simpletextviewer.debug", "/examples/help/simpletextviewer"}, + {"/examples/help/contextsensitivehelp/contextsensitivehelp.debug", "/examples/help/contextsensitivehelp"}, + {"/examples/help/remotecontrol/remotecontrol.debug", "/examples/help/remotecontrol"}, + {"/examples/opengl/grabber/grabber.debug", "/examples/opengl/grabber"}, + {"/examples/opengl/framebufferobject2/framebufferobject2.debug", "/examples/opengl/framebufferobject2"}, + {"/examples/opengl/hellogl/hellogl.debug", "/examples/opengl/hellogl"}, + {"/examples/opengl/framebufferobject/framebufferobject.debug", "/examples/opengl/framebufferobject"}, + {"/examples/opengl/overpainting/overpainting.debug", "/examples/opengl/overpainting"}, + {"/examples/opengl/pbuffers2/pbuffers2.debug", "/examples/opengl/pbuffers2"}, + {"/examples/opengl/2dpainting/2dpainting.debug", "/examples/opengl/2dpainting"}, + {"/examples/opengl/pbuffers/pbuffers.debug", "/examples/opengl/pbuffers"}, + {"/examples/opengl/samplebuffers/samplebuffers.debug", "/examples/opengl/samplebuffers"}, + {"/examples/opengl/textures/textures.debug", "/examples/opengl/textures"}, + {"/examples/graphicsview/elasticnodes/elasticnodes.debug", "/examples/graphicsview/elasticnodes"}, + {"/examples/graphicsview/collidingmice/collidingmice.debug", "/examples/graphicsview/collidingmice"}, + {"/examples/graphicsview/portedasteroids/portedasteroids.debug", "/examples/graphicsview/portedasteroids"}, + {"/examples/graphicsview/padnavigator/padnavigator.debug", "/examples/graphicsview/padnavigator"}, + {"/examples/graphicsview/portedcanvas/portedcanvas.debug", "/examples/graphicsview/portedcanvas"}, + {"/examples/graphicsview/diagramscene/diagramscene.debug", "/examples/graphicsview/diagramscene"}, + {"/examples/graphicsview/dragdroprobot/dragdroprobot.debug", "/examples/graphicsview/dragdroprobot"}, + {"/examples/mainwindows/menus/menus.debug", "/examples/mainwindows/menus"}, + {"/examples/mainwindows/mdi/mdi.debug", "/examples/mainwindows/mdi"}, + {"/examples/mainwindows/sdi/sdi.debug", "/examples/mainwindows/sdi"}, + {"/examples/mainwindows/recentfiles/recentfiles.debug", "/examples/mainwindows/recentfiles"}, + {"/examples/mainwindows/application/application.debug", "/examples/mainwindows/application"}, + {"/examples/mainwindows/dockwidgets/dockwidgets.debug", "/examples/mainwindows/dockwidgets"}, + {"/examples/widgets/tablet/tablet.debug", "/examples/widgets/tablet"}, + {"/examples/widgets/shapedclock/shapedclock.debug", "/examples/widgets/shapedclock"}, + {"/examples/widgets/styles/styles.debug", "/examples/widgets/styles"}, + {"/examples/widgets/icons/icons.debug", "/examples/widgets/icons"}, + {"/examples/widgets/charactermap/charactermap.debug", "/examples/widgets/charactermap"}, + {"/examples/widgets/sliders/sliders.debug", "/examples/widgets/sliders"}, + {"/examples/widgets/tooltips/tooltips.debug", "/examples/widgets/tooltips"}, + {"/examples/widgets/windowflags/windowflags.debug", "/examples/widgets/windowflags"}, + {"/examples/widgets/stylesheet/stylesheet.debug", "/examples/widgets/stylesheet"}, + {"/examples/widgets/spinboxes/spinboxes.debug", "/examples/widgets/spinboxes"}, + {"/examples/widgets/validators/validators.debug", "/examples/widgets/validators"}, + {"/examples/widgets/calculator/calculator.debug", "/examples/widgets/calculator"}, + {"/examples/widgets/groupbox/groupbox.debug", "/examples/widgets/groupbox"}, + {"/examples/widgets/scribble/scribble.debug", "/examples/widgets/scribble"}, + {"/examples/widgets/imageviewer/imageviewer.debug", "/examples/widgets/imageviewer"}, + {"/examples/widgets/digitalclock/digitalclock.debug", "/examples/widgets/digitalclock"}, + {"/examples/widgets/lineedits/lineedits.debug", "/examples/widgets/lineedits"}, + {"/examples/widgets/movie/movie.debug", "/examples/widgets/movie"}, + {"/examples/widgets/calendarwidget/calendarwidget.debug", "/examples/widgets/calendarwidget"}, + {"/examples/widgets/wiggly/wiggly.debug", "/examples/widgets/wiggly"}, + {"/examples/widgets/analogclock/analogclock.debug", "/examples/widgets/analogclock"}, + {"/examples/widgets/tetrix/tetrix.debug", "/examples/widgets/tetrix"}, + {"/examples/painting/basicdrawing/basicdrawing.debug", "/examples/painting/basicdrawing"}, + {"/examples/painting/svgviewer/svgviewer.debug", "/examples/painting/svgviewer"}, + {"/examples/painting/fontsampler/fontsampler.debug", "/examples/painting/fontsampler"}, + {"/examples/painting/concentriccircles/concentriccircles.debug", "/examples/painting/concentriccircles"}, + {"/examples/painting/painterpaths/painterpaths.debug", "/examples/painting/painterpaths"}, + {"/examples/painting/imagecomposition/imagecomposition.debug", "/examples/painting/imagecomposition"}, + {"/examples/painting/transformations/transformations.debug", "/examples/painting/transformations"}, + {"/examples/tools/customcompleter/customcompleter.debug", "/examples/tools/customcompleter"}, + {"/examples/tools/codecs/codecs.debug", "/examples/tools/codecs"}, + {"/examples/tools/plugandpaint/plugins/libpnp_extrafilters.so.debug", "/examples/tools/plugandpaint/plugins"}, + {"/examples/tools/plugandpaint/plugandpaint.debug", "/examples/tools/plugandpaint"}, + {"/examples/tools/regexp/regexp.debug", "/examples/tools/regexp"}, + {"/examples/tools/undoframework/undoframework.debug", "/examples/tools/undoframework"}, + {"/examples/tools/i18n/i18n.debug", "/examples/tools/i18n"}, + {"/examples/tools/completer/completer.debug", "/examples/tools/completer"}, + {"/examples/tools/echoplugin/plugin/libechoplugin.so.debug", "/examples/tools/echoplugin/plugin"}, + {"/examples/tools/echoplugin/echoplugin.debug", "/examples/tools/echoplugin"}, + {"/examples/tools/styleplugin/styles/libsimplestyleplugin.so.debug", "/examples/tools/styleplugin/styles"}, + {"/examples/tools/styleplugin/styleplugin.debug", "/examples/tools/styleplugin"}, + {"/examples/tools/treemodelcompleter/treemodelcompleter.debug", "/examples/tools/treemodelcompleter"}, + {"/examples/tools/settingseditor/settingseditor.debug", "/examples/tools/settingseditor"}, + {"/examples/network/securesocketclient/securesocketclient.debug", "/examples/network/securesocketclient"}, + {"/examples/network/broadcastreceiver/broadcastreceiver.debug", "/examples/network/broadcastreceiver"}, + {"/examples/network/downloadmanager/downloadmanager.debug", "/examples/network/downloadmanager"}, + {"/examples/network/fortuneserver/fortuneserver.debug", "/examples/network/fortuneserver"}, + {"/examples/network/loopback/loopback.debug", "/examples/network/loopback"}, + {"/examples/network/http/http.debug", "/examples/network/http"}, + {"/examples/network/ftp/ftp.debug", "/examples/network/ftp"}, + {"/examples/network/download/download.debug", "/examples/network/download"}, + {"/examples/network/fortuneclient/fortuneclient.debug", "/examples/network/fortuneclient"}, + {"/examples/network/blockingfortuneclient/blockingfortuneclient.debug", "/examples/network/blockingfortuneclient"}, + {"/examples/network/broadcastsender/broadcastsender.debug", "/examples/network/broadcastsender"}, + {"/examples/network/threadedfortuneserver/threadedfortuneserver.debug", "/examples/network/threadedfortuneserver"}, + {"/examples/network/chat/network-chat.debug", "/examples/network/chat"}, + {"/examples/network/torrent/torrent.debug", "/examples/network/torrent"}, + {"/examples/qtestlib/tutorial4/tutorial4.debug", "/examples/qtestlib/tutorial4"}, + {"/examples/qtestlib/tutorial1/tutorial1.debug", "/examples/qtestlib/tutorial1"}, + {"/examples/qtestlib/tutorial2/tutorial2.debug", "/examples/qtestlib/tutorial2"}, + {"/examples/qtestlib/tutorial3/tutorial3.debug", "/examples/qtestlib/tutorial3"}, + {"/examples/tutorials/tutorial/t3/t3.debug", "/examples/tutorials/tutorial/t3"}, + {"/examples/tutorials/tutorial/t5/t5.debug", "/examples/tutorials/tutorial/t5"}, + {"/examples/tutorials/tutorial/t2/t2.debug", "/examples/tutorials/tutorial/t2"}, + {"/examples/tutorials/tutorial/t11/t11.debug", "/examples/tutorials/tutorial/t11"}, + {"/examples/tutorials/tutorial/t6/t6.debug", "/examples/tutorials/tutorial/t6"}, + {"/examples/tutorials/tutorial/t13/t13.debug", "/examples/tutorials/tutorial/t13"}, + {"/examples/tutorials/tutorial/t12/t12.debug", "/examples/tutorials/tutorial/t12"}, + {"/examples/tutorials/tutorial/t9/t9.debug", "/examples/tutorials/tutorial/t9"}, + {"/examples/tutorials/tutorial/t1/t1.debug", "/examples/tutorials/tutorial/t1"}, + {"/examples/tutorials/tutorial/t4/t4.debug", "/examples/tutorials/tutorial/t4"}, + {"/examples/tutorials/tutorial/t14/t14.debug", "/examples/tutorials/tutorial/t14"}, + {"/examples/tutorials/tutorial/t8/t8.debug", "/examples/tutorials/tutorial/t8"}, + {"/examples/tutorials/tutorial/t7/t7.debug", "/examples/tutorials/tutorial/t7"}, + {"/examples/tutorials/tutorial/t10/t10.debug", "/examples/tutorials/tutorial/t10"}, + {"/examples/tutorials/addressbook/part2/part2.debug", "/examples/tutorials/addressbook/part2"}, + {"/examples/tutorials/addressbook/part5/part5.debug", "/examples/tutorials/addressbook/part5"}, + {"/examples/tutorials/addressbook/part3/part3.debug", "/examples/tutorials/addressbook/part3"}, + {"/examples/tutorials/addressbook/part4/part4.debug", "/examples/tutorials/addressbook/part4"}, + {"/examples/tutorials/addressbook/part7/part7.debug", "/examples/tutorials/addressbook/part7"}, + {"/examples/tutorials/addressbook/part1/part1.debug", "/examples/tutorials/addressbook/part1"}, + {"/examples/tutorials/addressbook/part6/part6.debug", "/examples/tutorials/addressbook/part6"}, + {"/examples/xml/streambookmarks/streambookmarks.debug", "/examples/xml/streambookmarks"}, + {"/examples/xml/saxbookmarks/saxbookmarks.debug", "/examples/xml/saxbookmarks"}, + {"/examples/xml/xmlstreamlint/xmlstreamlint.debug", "/examples/xml/xmlstreamlint"}, + {"/examples/xml/dombookmarks/dombookmarks.debug", "/examples/xml/dombookmarks"}, + {"/examples/xml/rsslisting/rsslisting.debug", "/examples/xml/rsslisting"}, + {"/examples/layouts/dynamiclayouts/dynamiclayouts.debug", "/examples/layouts/dynamiclayouts"}, + {"/examples/layouts/flowlayout/flowlayout.debug", "/examples/layouts/flowlayout"}, + {"/examples/layouts/borderlayout/borderlayout.debug", "/examples/layouts/borderlayout"}, + {"/examples/layouts/basiclayouts/basiclayouts.debug", "/examples/layouts/basiclayouts"}, + {"/examples/dialogs/trivialwizard/trivialwizard.debug", "/examples/dialogs/trivialwizard"}, + {"/examples/dialogs/extension/extension.debug", "/examples/dialogs/extension"}, + {"/examples/dialogs/standarddialogs/standarddialogs.debug", "/examples/dialogs/standarddialogs"}, + {"/examples/dialogs/tabdialog/tabdialog.debug", "/examples/dialogs/tabdialog"}, + {"/examples/dialogs/classwizard/classwizard.debug", "/examples/dialogs/classwizard"}, + {"/examples/dialogs/findfiles/findfiles.debug", "/examples/dialogs/findfiles"}, + {"/examples/dialogs/licensewizard/licensewizard.debug", "/examples/dialogs/licensewizard"}, + {"/examples/dialogs/configdialog/configdialog.debug", "/examples/dialogs/configdialog"}, + {"/examples/itemviews/coloreditorfactory/coloreditorfactory.debug", "/examples/itemviews/coloreditorfactory"}, + {"/examples/itemviews/pixelator/pixelator.debug", "/examples/itemviews/pixelator"}, + {"/examples/itemviews/simplewidgetmapper/simplewidgetmapper.debug", "/examples/itemviews/simplewidgetmapper"}, + {"/examples/itemviews/puzzle/puzzle.debug", "/examples/itemviews/puzzle"}, + {"/examples/itemviews/dirview/dirview.debug", "/examples/itemviews/dirview"}, + {"/examples/itemviews/addressbook/addressbook.debug", "/examples/itemviews/addressbook"}, + {"/examples/itemviews/spinboxdelegate/spinboxdelegate.debug", "/examples/itemviews/spinboxdelegate"}, + {"/examples/itemviews/simpletreemodel/simpletreemodel.debug", "/examples/itemviews/simpletreemodel"}, + {"/examples/itemviews/chart/chart.debug", "/examples/itemviews/chart"}, + {"/examples/itemviews/basicsortfiltermodel/basicsortfiltermodel.debug", "/examples/itemviews/basicsortfiltermodel"}, + {"/examples/itemviews/customsortfiltermodel/customsortfiltermodel.debug", "/examples/itemviews/customsortfiltermodel"}, + {"/examples/itemviews/stardelegate/stardelegate.debug", "/examples/itemviews/stardelegate"}, + {"/examples/itemviews/editabletreemodel/editabletreemodel.debug", "/examples/itemviews/editabletreemodel"}, + {"/examples/itemviews/simpledommodel/simpledommodel.debug", "/examples/itemviews/simpledommodel"}, + {"/examples/uitools/multipleinheritance/multipleinheritance.debug", "/examples/uitools/multipleinheritance"}, + {"/examples/uitools/textfinder/textfinder.debug", "/examples/uitools/textfinder"}, + {"/examples/script/helloscript/helloscript.debug", "/examples/script/helloscript"}, + {"/examples/script/marshal/marshal.debug", "/examples/script/marshal"}, + {"/examples/script/customclass/customclass.debug", "/examples/script/customclass"}, + {"/examples/script/calculator/calculator.debug", "/examples/script/calculator"}, + {"/examples/script/context2d/context2d.debug", "/examples/script/context2d"}, + {"/examples/script/defaultprototypes/defaultprototypes.debug", "/examples/script/defaultprototypes"}, + {"/examples/script/qscript/qscript.debug", "/examples/script/qscript"}, + {"/examples/script/tetrix/tetrix.debug", "/examples/script/tetrix"}, + {"/lib/libQtTest.so.4.4.3.debug", "/lib"}, + {"/lib/libQtDesignerComponents.so.4.4.3.debug", "/lib"}, + {"/lib/libQtScript.so.4.4.3.debug", "/lib"}, + {"/lib/libQtDesigner.so.4.4.3.debug", "/lib"}, + {"/lib/libQtGui.so.4.4.3.debug", "/lib"}, + {"/lib/libQtSvg.so.4.4.3.debug", "/lib"}, + {"/lib/libQtXml.so.4.4.3.debug", "/lib"}, + {"/lib/libQtCLucene.so.4.4.3.debug", "/lib"}, + {"/lib/libQtCore.so.4.4.3.debug", "/lib"}, + {"/lib/libQtDBus.so.4.4.3.debug", "/lib"}, + {"/lib/libQtXmlPatterns.so.4.4.3.debug", "/lib"}, + {"/lib/libQtHelp.so.4.4.3.debug", "/lib"}, + {"/lib/libQtSql.so.4.4.3.debug", "/lib"}, + {"/lib/libQtNetwork.so.4.4.3.debug", "/lib"}, + {"/lib/libQtOpenGL.so.4.4.3.debug", "/lib"}, + {"/lib/libQt3Support.so.4.4.3.debug", "/lib"}, + {"/lib/libQtAssistantClient.so.4.4.3.debug", "/lib"}, + {"/lib/libQtWebKit.so.4.4.3.debug", "/lib"}, + {"/demos/spreadsheet/spreadsheet.debug", "/demos/spreadsheet"}, + {"/demos/composition/composition.debug", "/demos/composition"}, + {"/demos/gradients/gradients.debug", "/demos/gradients"}, + {"/demos/deform/deform.debug", "/demos/deform"}, + {"/demos/embeddeddialogs/embeddeddialogs.debug", "/demos/embeddeddialogs"}, + {"/demos/textedit/textedit.debug", "/demos/textedit"}, + {"/demos/browser/browser.debug", "/demos/browser"}, + {"/demos/interview/interview.debug", "/demos/interview"}, + {"/demos/affine/affine.debug", "/demos/affine"}, + {"/demos/books/books.debug", "/demos/books"}, + {"/demos/chip/chip.debug", "/demos/chip"}, + {"/demos/pathstroke/pathstroke.debug", "/demos/pathstroke"}, + {"/demos/undo/undo.debug", "/demos/undo"}, + {"/demos/sqlbrowser/sqlbrowser.debug", "/demos/sqlbrowser"}, + {"/demos/mainwindow/mainwindow.debug", "/demos/mainwindow"}, + {"/bin/qcollectiongenerator.debug", "/bin"}, + {"/bin/qhelpconverter.debug", "/bin"}, + {"/bin/lupdate.debug", "/bin"}, + {"/bin/moc.debug", "/bin"}, + {"/bin/pixeltool.debug", "/bin"}, + {"/bin/qdbusviewer.debug", "/bin"}, + {"/bin/qtconfig.debug", "/bin"}, + {"/bin/qdbusxml2cpp.debug", "/bin"}, + {"/bin/qdbus.debug", "/bin"}, + {"/bin/uic3.debug", "/bin"}, + {"/bin/qhelpgenerator.debug", "/bin"}, + {"/bin/qt3to4.debug", "/bin"}, + {"/bin/xmlpatterns.debug", "/bin"}, + {"/bin/linguist.debug", "/bin"}, + {"/bin/uic.debug", "/bin"}, + {"/bin/qtdemo.debug", "/bin"}, + {"/bin/lrelease.debug", "/bin"}, + {"/bin/qmake", "/bin"}, + {"/bin/assistant.debug", "/bin"}, + {"/bin/rcc.debug", "/bin"}, + {"/bin/designer.debug", "/bin"}, + {"/bin/assistant_adp.debug", "/bin"}, + {"/bin/qdbuscpp2xml.debug", "/bin"}, + + + {"/plugins/codecs/libqkrcodecs.so.debug", "/src/plugins/codecs/kr"}, + {"/plugins/codecs/libqtwcodecs.so.debug", "/src/plugins/codecs/tw"}, + {"/plugins/codecs/libqcncodecs.so.debug", "/src/plugins/codecs/cn"}, + {"/plugins/codecs/libqjpcodecs.so.debug", "/src/plugins/codecs/jp"}, + {"/plugins/iconengines/libqsvgicon.so.debug", "/src/plugins/iconengines/svgiconengine"}, + {"/plugins/sqldrivers/libqsqlmysql.so.debug", "/src/plugins/sqldrivers/mysql"}, + {"/plugins/sqldrivers/libqsqlite.so.debug", "/src/plugins/sqldrivers/sqlite"}, + {"/plugins/sqldrivers/libqsqlite2.so.debug", "/src/plugins/sqldrivers/sqlite2"}, + {"/plugins/sqldrivers/libqsqlpsql.so.debug", "/src/plugins/sqldrivers/psql"}, + {"/plugins/imageformats/libqgif.so.debug", "/src/plugins/imageformats/gif"}, + {"/plugins/imageformats/libqtiff.so.debug", "/src/plugins/imageformats/tiff"}, + {"/plugins/imageformats/libqsvg.so.debug", "/src/plugins/imageformats/svg"}, + {"/plugins/imageformats/libqjpeg.so.debug", "/src/plugins/imageformats/jpeg"}, + {"/plugins/imageformats/libqico.so.debug", "/src/plugins/imageformats/ico"}, + {"/plugins/imageformats/libqmng.so.debug", "/src/plugins/imageformats/mng"}, + {"/plugins/accessible/libqtaccessiblewidgets.so.debug", "/src/plugins/accessible/widgets"}, + {"/plugins/accessible/libqtaccessiblecompatwidgets.so.debug", "/src/plugins/accessible/compat"}, + {"/plugins/designer/libcontainerextension.so.debug", "/examples/designer/containerextension"}, + {"/plugins/designer/libtaskmenuextension.so.debug", "/examples/designer/taskmenuextension"}, + {"/plugins/designer/libqwebview.so.debug", "/tools/designer/src/plugins/qwebview"}, + {"/plugins/designer/libcustomwidgetplugin.so.debug", "/examples/designer/customwidgetplugin"}, + {"/plugins/designer/libarthurplugin.so.debug", "/demos/arthurplugin"}, + {"/plugins/designer/libarthurplugin.so.debug", "/demos/shared"}, + {"/plugins/designer/libqt3supportwidgets.so.debug", "/tools/designer/src/plugins/widgets"}, + {"/plugins/designer/libworldtimeclockplugin.so.debug", "/examples/designer/worldtimeclockplugin"}, + {"/plugins/inputmethods/libqimsw-multi.so.debug", "/src/plugins/inputmethods/imsw-multi"}, + {"/plugins/script/libqtscriptdbus.so.debug", "/src/plugins/script/qtdbus"}, + + {"/examples/dbus/chat/dbus-chat.debug", "/examples/dbus/dbus-chat"}, + {"/examples/designer/worldtimeclockbuilder/worldtimeclockbuilder.debug", "/tools/designer/src/uitools"}, + {"/examples/designer/calculatorbuilder/calculatorbuilder.debug", "/tools/designer/src/uitools"}, + {"/examples/tools/plugandpaint/plugins/libpnp_extrafilters.so.debug", "/examples/tools/plugandpaintplugins/extrafilters"}, + {"/examples/tools/styleplugin/styles/libsimplestyleplugin.so.debug", "/examples/tools/styleplugin/plugin"}, + {"/examples/network/chat/network-chat.debug", "/examples/network/network-chat"}, + {"/examples/uitools/textfinder/textfinder.debug", "/tools/designer/src/uitools"}, + {"/examples/script/calculator/calculator.debug", "/tools/designer/src/uitools"}, + {"/examples/script/tetrix/tetrix.debug", "/tools/designer/src/uitools"}, + + {"/lib/libQtTest.so.4.4.3.debug", "/src/testlib"}, + {"/lib/libQtDesignerComponents.so.4.4.3.debug", "/tools/designer/src/components"}, + {"/lib/libQtScript.so.4.4.3.debug", "/src/script"}, + {"/lib/libQtDesigner.so.4.4.3.debug", "/tools/designer/src/lib"}, + {"/lib/libQtGui.so.4.4.3.debug", "/src/gui"}, + {"/lib/libQtSvg.so.4.4.3.debug", "/src/svg"}, + {"/lib/libQtXml.so.4.4.3.debug", "/src/xml"}, + {"/lib/libQtCLucene.so.4.4.3.debug", "/tools/assistant/lib/fulltextsearch"}, + {"/lib/libQtCore.so.4.4.3.debug", "/src/corelib"}, + {"/lib/libQtDBus.so.4.4.3.debug", "/src/dbus"}, + {"/lib/libQtXmlPatterns.so.4.4.3.debug", "/src/xmlpatterns"}, + {"/lib/libQtHelp.so.4.4.3.debug", "/tools/assistant/lib"}, + {"/lib/libQtSql.so.4.4.3.debug", "/src/sql"}, + {"/lib/libQtNetwork.so.4.4.3.debug", "/src/network"}, + {"/lib/libQtOpenGL.so.4.4.3.debug", "/src/opengl"}, + {"/lib/libQt3Support.so.4.4.3.debug", "/src/qt3support"}, + {"/lib/libQtAssistantClient.so.4.4.3.debug", "/tools/assistant/compat/lib"}, + {"/lib/libQtWebKit.so.4.4.3.debug", "/src/3rdparty/webkit/WebCore"}, + + {"/demos/composition/composition.debug", "/demos/shared"}, + {"/demos/gradients/gradients.debug", "/demos/shared"}, + {"/demos/deform/deform.debug", "/demos/shared"}, + {"/demos/browser/browser.debug", "/tools/designer/src/uitools"}, + {"/demos/affine/affine.debug", "/demos/shared"}, + {"/demos/pathstroke/pathstroke.debug", "/demos/shared"}, + + {"/bin/qcollectiongenerator.debug", "/tools/assistant/tools/qcollectiongenerator"}, + {"/bin/qhelpconverter.debug", "/tools/assistant/tools/qhelpconverter"}, + {"/bin/lupdate.debug", "/tools/linguist/lupdate"}, + {"/bin/moc.debug", "/src/tools/moc"}, + {"/bin/pixeltool.debug", "/tools/pixeltool"}, + {"/bin/qdbusviewer.debug", "/tools/qdbus/qdbusviewer"}, + {"/bin/qtconfig.debug", "/tools/qtconfig"}, + {"/bin/qdbusxml2cpp.debug", "/tools/qdbus/qdbusxml2cpp"}, + {"/bin/qdbus.debug", "/tools/qdbus/qdbus"}, + {"/bin/uic3.debug", "/src/tools/uic3"}, + {"/bin/qhelpgenerator.debug", "/tools/assistant/tools/qhelpgenerator"}, + {"/bin/qt3to4.debug", "/tools/porting/src"}, + {"/bin/xmlpatterns.debug", "/tools/xmlpatterns"}, + {"/bin/linguist.debug", "/tools/designer/src/uitools"}, + {"/bin/linguist.debug", "/tools/linguist/linguist"}, + {"/bin/uic.debug", "/src/tools/uic"}, + {"/bin/qtdemo.debug", "/demos/qtdemo"}, + {"/bin/lrelease.debug", "/tools/linguist/lrelease"}, + {"/bin/qmake", "/qmake"}, + {"/bin/assistant.debug", "/tools/assistant/tools/assistant"}, + {"/bin/rcc.debug", "/src/tools/rcc"}, + {"/bin/designer.debug", "/tools/designer/src/designer"}, + {"/bin/assistant_adp.debug", "/tools/assistant/compat"}, + {"/bin/qdbuscpp2xml.debug", "/tools/qdbus/qdbuscpp2xml"} +#endif }; - for (int i = 0; i < sizeof(libraries)/sizeof(libraries[0]); i++) { - char fileName[FILENAME_MAX] = ""; - strncpy(fileName, baseQtPath, sizeof(fileName)); - fileName[sizeof(fileName)-1] = '\0'; - strncat(fileName, libraries[i].fileName, sizeof(fileName) - strlen(fileName) - 1); - fileName[sizeof(fileName)-1] = '\0'; - char oldSourcePath[FILENAME_MAX] = - "C:/qt-greenhouse/Trolltech/Code_less_create_more/Trolltech/Code_less_create_more/Troll/4.4.3"; - strncat(oldSourcePath, libraries[i].sourceLocation, sizeof(oldSourcePath) - strlen(oldSourcePath) - 1); - oldSourcePath[sizeof(oldSourcePath)-1] = '\0'; + for (int i = 0; i < (int)(sizeof(libraries) / sizeof(libraries[0])); i++) { + // USAGE NOTE: Don't use FILENAME_MAX as the size of an array in which to store a file name! + // [In some cases] you [may not be able to statically] make an array that big! + // Use dynamic allocation [..] instead. + // From http://www.gnu.org/software/libc/manual/html_mono/libc.html#Limits-for-Files + + // Make filename + char * const fileName = allocFileNameCopyAppend(baseQtPath, libraries[i].fileName); + logFileName(fileName); + + // Make old source path array + char * const oldSourcePath = allocFileNameCopyAppend(oldSourceBase, + libraries[i].sourceLocation); + + // Make new source path array + char * const newSourcePath = allocFileNameCopyAppend(baseQtPath, + libraries[i].sourceLocation); - char newSourcePath[FILENAME_MAX] = ""; - strncpy(newSourcePath, baseQtPath, sizeof(newSourcePath)); - newSourcePath[sizeof(newSourcePath)-1] = '\0'; - strncat(newSourcePath, libraries[i].sourceLocation, sizeof(newSourcePath) - strlen(newSourcePath) - 1); - newSourcePath[sizeof(newSourcePath)-1] = '\0'; + logDiff(oldSourcePath, newSourcePath); + // Patch BinPatch binFile(fileName); if (!binFile.patch(oldSourcePath, newSourcePath)) { result = false; - break; } + + delete[] fileName; + delete[] oldSourcePath; + delete[] newSourcePath; + + if (!result) + break; } return result; @@ -173,7 +613,9 @@ bool patchDebugLibrariesWithQtPath(const char *baseQtPath) void patchQMakeSpec(const char *path) { QString baseQtPath(path); - QFile f(baseQtPath + "/mkspecs/default/qmake.conf"); + const QString fileName(baseQtPath + "/mkspecs/default/qmake.conf"); + QFile f(fileName); + logFileName(qPrintable(fileName)); f.open(QIODevice::ReadOnly); QTextStream in(&f); QString all = in.readAll(); @@ -183,12 +625,129 @@ void patchQMakeSpec(const char *path) // We don't care to match the line end we simply match to the end of the file QRegExp regExp("(QMAKESPEC_ORIGINAL=).*(/mkspecs/.*)"); all.replace(regExp, "\\1"+baseQtPath+"\\2"); - + f.open(QIODevice::WriteOnly); QTextStream out(&f); out << all; } +const char * const textFileFileNames[] = +{ +#ifndef Q_OS_WIN + // *.la + "lib/libQtCore.la", + "lib/libQt3Support.la", + "lib/libQtCLucene.la", + "lib/libQtDBus.la", + "lib/libQtGui.la", + "lib/libQtHelp.la", + "lib/libQtNetwork.la", + "lib/libQtOpenGL.la", + "lib/libQtScript.la", + "lib/libQtSql.la", + "lib/libQtSvg.la", + "lib/libQtTest.la", + "lib/libQtWebKit.la", + "lib/libQtXml.la", + "lib/libQtXmlPatterns.la", + + // *.prl + "demos/shared/libdemo_shared.prl", + "lib/libQt3Support.prl", + "lib/libQtAssistantClient.prl", + "lib/libQtCLucene.prl", + "lib/libQtCore.prl", + "lib/libQtDBus.prl", + "lib/libQtDesignerComponents.prl", + "lib/libQtDesigner.prl", + "lib/libQtGui.prl", + "lib/libQtHelp.prl", + "lib/libQtNetwork.prl", + "lib/libQtOpenGL.prl", + "lib/libQtScript.prl", + "lib/libQtSql.prl", + "lib/libQtSvg.prl", + "lib/libQtTest.prl", + "lib/libQtUiTools.prl", + "lib/libQtWebKit.prl", + "lib/libQtXmlPatterns.prl", + "lib/libQtXml.prl", + + // *.pc + "lib/pkgconfig/Qt3Support.pc", + "lib/pkgconfig/QtAssistantClient.pc", + "lib/pkgconfig/QtCLucene.pc", + "lib/pkgconfig/QtCore.pc", + "lib/pkgconfig/QtDBus.pc", + "lib/pkgconfig/QtDesignerComponents.pc", + "lib/pkgconfig/QtDesigner.pc", + "lib/pkgconfig/QtGui.pc", + "lib/pkgconfig/QtHelp.pc", + "lib/pkgconfig/QtNetwork.pc", + "lib/pkgconfig/QtOpenGL.pc", + "lib/pkgconfig/QtScript.pc", + "lib/pkgconfig/QtSql.pc", + "lib/pkgconfig/QtSvg.pc", + "lib/pkgconfig/QtTest.pc", + "lib/pkgconfig/QtUiTools.pc", + "lib/pkgconfig/QtWebKit.pc", + "lib/pkgconfig/QtXmlPatterns.pc", + "lib/pkgconfig/QtXml.pc", + + // misc + "mkspecs/qconfig.pri" +#endif +}; + +void replaceInTextFile(const char * fileName, + const char * oldText, const char * newText, + const char * oldText2 = NULL, const char * newText2 = NULL) +{ + const QString errorMessage = QString("Could not patch file ") + fileName; + + QFile f(fileName); + if (!f.open(QIODevice::ReadOnly)) { + std::cout << qPrintable(errorMessage) << std::endl; + return; + } + QTextStream in(&f); + QString all = in.readAll(); + f.close(); + + all.replace(QString(oldText), QString(newText), Qt::CaseSensitive); + if ((oldText2 != NULL) && (newText2 != NULL)) { + all = all.replace(QString(oldText2), QString(newText2), Qt::CaseSensitive); + } + + if (!f.open(QIODevice::WriteOnly)) { + std::cout << qPrintable(errorMessage) << std::endl; + return; + } + QTextStream out(&f); + out << all; + f.close(); +} + +void patchTextFiles(const char *newInstallBase) +{ + const char * const newSourceBase = newInstallBase; + const int fileCount = sizeof(textFileFileNames) / sizeof(const char *); + for (int i = 0; i < fileCount; i++) { + logFileName(textFileFileNames[i]); + logDiff(oldSourceBase, newSourceBase); +#ifndef Q_OS_WIN + logDiff(oldInstallBase, newInstallBase); +#endif + replaceInTextFile(textFileFileNames[i], +#ifndef Q_OS_WIN + oldSourceBase, newSourceBase, +#endif + oldInstallBase, newInstallBase); + } + + patchQMakeSpec(newInstallBase); +} + int main(int argc, char *args[]) { if (argc != 2) { @@ -198,14 +757,14 @@ int main(int argc, char *args[]) return 1; } - char baseQtPath[FILENAME_MAX] = ""; - strncpy(baseQtPath, args[1], sizeof(baseQtPath)); - baseQtPath[sizeof(baseQtPath)-1] = '\0'; + char * const baseQtPath = allocFileNameCopyAppend(args[1], ""); +#ifdef Q_OS_WIN // Convert backslash to slash for (char *p = baseQtPath; *p != '\0'; p++) if (*p == '\\') *p = '/'; +#endif // Remove trailing slash(es) for (char *p = baseQtPath + strlen(baseQtPath) - 1; p != baseQtPath; p--) @@ -214,6 +773,9 @@ int main(int argc, char *args[]) else break; - patchQMakeSpec(baseQtPath); - return patchBinariesWithQtPathes(baseQtPath) && patchDebugLibrariesWithQtPath(baseQtPath)?0:1; + patchTextFiles(baseQtPath); + const bool success = patchBinariesWithQtPathes(baseQtPath) + && patchDebugLibrariesWithQtPath(baseQtPath); + delete[] baseQtPath; + return success ? 0 : 1; } -- GitLab