Howto have a pre-build target generated by qmake
-
Hi Forum
Gain:
Let qmake gerenate a Makefile that calls a pre-build process.I would like to have a Makefile generated that contains a rule
all: pre_build_process Makefile.Debug $(TARGET)
pre_build_process could do something with files that $(TARGET) might depend upon, e.g. change a header file that contains the current subversion revision number.
Would be glad to get an answer on this.
-
"QMAKE_EXTRA_TARGETS":http://doc.qt.nokia.com/latest/qmake-variable-reference.html#qmake-extra-targets or "QMAKE_EXTRA_COMPILERS":http://doc.qt.nokia.com/latest/qmake-variable-reference.html#qmake-extra-compilers should help here. The following "blog":http://labs.qt.nokia.com/2008/04/16/the-power-of-qmake/ contains some more details on these variables.
-
[quote author="sigrid" date="1308209643"]"QMAKE_EXTRA_TARGETS":http://doc.qt.nokia.com/latest/qmake-variable-reference.html#qmake-extra-targets or "QMAKE_EXTRA_COMPILERS":http://doc.qt.nokia.com/latest/qmake-variable-reference.html#qmake-extra-compilers should help here. The following "blog":http://labs.qt.nokia.com/2008/04/16/the-power-of-qmake/ contains some more details on these variables.[/quote]
Thanks for your answer, but my problem is, that every time I hit 'make' this pre-build-process should be started.
With the examples in your links you get the extra compiler runs once, but not a second time, because the output files are there in the second run (as long as the input files don't change).
But in my scenario the to be created (output) file might change from 'make' to 'make' with out a dependency on a file, but more on the outcome of svnversion which is used to create the output file.
Any idea on this?
-
If you are using QMAKE_EXTRA_COMPILERS then you can use "depend_command":http://doc.qt.nokia.com/latest/qmake-environment-reference.html#customizing-makefile-output or depends to set an extra dependency on the compiler to force it to build again.
-
[quote author="sigrid" date="1308306646"]If you are using QMAKE_EXTRA_COMPILERS then you can use "depend_command":http://doc.qt.nokia.com/latest/qmake-environment-reference.html#customizing-makefile-output or depends to set an extra dependency on the compiler to force it to build again.[/quote]
Thanks for this hint.
However I ran into deep problem with the different makefile generators:
- make (linux)
- nmake
- jom
- msbuild
It seems to be not possible to trigger an extra build for these for backends with one generic pro file.
I finally ended up in:
@
Rules to update a header file: windows_version_revision.rc with the current svn revision.
Have an qmake extra compiler called for each run of make to update windows_version_revision.rc,
but only if needed, to prevent dependent compiles.
A special script is used: update_svn_revision (for details look into the script)
- replace placeholders in windows_version_revision.rc.SubWCRev with the current svn revision number
- output a temporary file and if this is different to windows_version_revision.rc, then copy it over (updating the time stamp)
It is importand to have the .variable_out set to HEADERS so that the Makefile rules recognize the dependency on the
windows_version_revision.rc
To trigger this conditional update of windows_version_revision.rc we need a dependency with an extra target that is never fullfilled.
This forces make to call this target each time.
.depends on extra target: preprocesssvnrev_check
preprocesssvnrev_check.commands just echos
However under windows everything is different:
have special handling for MS IDE backend
there we need an extra PRE_TAGETDEPS that must not be used under nmake
nmake on the other side does not recognize that the conditional touched file was not touched in each nmake
and fires a relink anyway, while jom does not .... clever jom :-)
create the resource file from a template.
PREPROCESS_FILES = windows_version_revision.rc.SubWCRev
preprocesssvnrev.name = "Update svn revision number in windows_version_revision.rc (if needed)."
preprocesssvnrev.input = PREPROCESS_FILES
preprocesssvnrev.output = ${QMAKE_FILE_BASE}update revision from the current directory
win32:preprocesssvnrev.commands = $${PWD}/update_svn_revision.bat $${PWD} $${PWD}/${QMAKE_FILE_IN} $${PWD}/${QMAKE_FILE_BASE}
unix: preprocesssvnrev.commands = @sh $${PWD}/update_svn_revision.sh $${PWD} $${PWD}/${QMAKE_FILE_IN} $${PWD}/${QMAKE_FILE_BASE}trigger creation when outside MS IDE (part 1)
contains(TEMPLATE,lib) {
preprocesssvnrev.variable_out = HEADERS
preprocesssvnrev.depends = preprocesssvnrev_checkmessage (Creating extra dependencies for nmake/make)
}
QMAKE_EXTRA_COMPILERS += preprocesssvnrev
trigger creation when inside MS IDE
contains(TEMPLATE,vclib) {
message (Creating extra dependencies for MS IDE)
PRE_TARGETDEPS += compiler_preprocesssvnrev_make_all
}trigger creation when outside MS IDE (part 2)
contains(TEMPLATE,lib) {
preprocesssvnrev_check.commands = @echo Trigger conditional svn revision update.
preprocesssvnrev_check.CONFIG += recursive
QMAKE_EXTRA_TARGETS += preprocesssvnrev_checkmessage (Creating extra dependencies for nmake/make)
}
@