From ca572a61446ba5cdae523614c874a09347b8e919 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tor=20Arne=20Vestb=C3=B8?= Date: Thu, 24 Nov 2011 16:03:19 +0100 Subject: [PATCH] qmake: Allow extra compilers to have the makefile depend on its inputs And enable this configuration option for the resource compiler. This results in a re-run of qmake whenever you touch a qrc file, which is needed to keep the dependencies up to date. Otherwise you might end up in the situation where you add a file to a qrc, edit the file some time later, but a rebuild does not regenerate a cpp file and compile that, so the final binary is stale. Technically this dependency problem is present for all source files, and qrc files are no different than any cpp file that you add a new header #include to, or adding a Q_OBJECT macro to a header. To pick up these changes we have to re-run qmake, so that qmake can run its internal dependency checking, and any extra compiler dependency commands. The reason we're making this change for rcc files it that conceptually people treat them as a "project" files, and expect them to behave similarly to .pro or .pri files, in that editing the file will invalidate the makefile. In practice this is often what happens when adding new headers, as you touch the project file when changing the HEADERS variable. Task-number: QTBUG-13334 Change-Id: If69149678e7fba6d812d31dcc17877427f9a6122 Reviewed-by: Simon Hausmann Reviewed-by: Kai Koehne --- mkspecs/features/resources.prf | 1 + qmake/generators/makefile.cpp | 13 ++++++++++++- qmake/generators/makefile.h | 9 +++++---- 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/mkspecs/features/resources.prf b/mkspecs/features/resources.prf index a305a4f0eb..47e718807e 100644 --- a/mkspecs/features/resources.prf +++ b/mkspecs/features/resources.prf @@ -22,6 +22,7 @@ resource_combine { } rcc.commands = "$$QMAKE_RCC" $$QMAKE_RESOURCE_FLAGS "${QMAKE_FILE_IN}" -o "${QMAKE_FILE_OUT}" rcc.depend_command = "$$QMAKE_RCC" -list $$QMAKE_RESOURCE_FLAGS "${QMAKE_FILE_IN}" +rcc.CONFIG += add_inputs_as_makefile_deps rcc.input = RESOURCES rcc.variable_out = SOURCES rcc.name = RCC ${QMAKE_FILE_IN} diff --git a/qmake/generators/makefile.cpp b/qmake/generators/makefile.cpp index c7ea592cc0..d08f214c0c 100644 --- a/qmake/generators/makefile.cpp +++ b/qmake/generators/makefile.cpp @@ -604,6 +604,8 @@ MakefileGenerator::init() compiler.flags |= Compiler::CompilerRemoveNoExist; if(v[(*it) + ".CONFIG"].indexOf("no_dependencies") != -1) compiler.flags |= Compiler::CompilerNoCheckDeps; + if(v[(*it) + ".CONFIG"].indexOf("add_inputs_as_makefile_deps") != -1) + compiler.flags |= Compiler::CompilerAddInputsAsMakefileDeps; QString dep_type; if(!project->isEmpty((*it) + ".dependency_type")) @@ -766,9 +768,18 @@ MakefileGenerator::init() //add to dependency engine for(x = 0; x < compilers.count(); ++x) { const MakefileGenerator::Compiler &comp = compilers.at(x); - if(!(comp.flags & Compiler::CompilerNoCheckDeps)) + if(!(comp.flags & Compiler::CompilerNoCheckDeps)) { addSourceFiles(v[comp.variable_in], QMakeSourceFileInfo::SEEK_DEPS, (QMakeSourceFileInfo::SourceFileType)comp.type); + + if (comp.flags & Compiler::CompilerAddInputsAsMakefileDeps) { + QStringList &l = v[comp.variable_in]; + for (int i=0; i < l.size(); ++i) { + if(v["QMAKE_INTERNAL_INCLUDED_FILES"].indexOf(l.at(i)) == -1) + v["QMAKE_INTERNAL_INCLUDED_FILES"].append(l.at(i)); + } + } + } } } diff --git a/qmake/generators/makefile.h b/qmake/generators/makefile.h index df718f9cb4..26b5f0e659 100644 --- a/qmake/generators/makefile.h +++ b/qmake/generators/makefile.h @@ -159,10 +159,11 @@ protected: { QString variable_in; enum CompilerFlag { - CompilerNoFlags = 0x00, - CompilerBuiltin = 0x01, - CompilerNoCheckDeps = 0x02, - CompilerRemoveNoExist = 0x04 + CompilerNoFlags = 0x00, + CompilerBuiltin = 0x01, + CompilerNoCheckDeps = 0x02, + CompilerRemoveNoExist = 0x04, + CompilerAddInputsAsMakefileDeps = 0x08 }; uint flags, type; };