Vi.
Vi.

Reputation: 38694

How to refer to the source directory in qmake?

I added

version.target = version.h
version.commands = bash generate-version.sh

QMAKE_EXTRA_TARGETS += version

PRE_TARGETDEPS += version.h

to the project, but it attempts to run "generate-version.sh" in destination directory:

make: Leaving directory `.../qqq-build-desktop'
make: Entering directory `.../qqq-build-desktop'
Makefile:236: warning: overriding commands for target `version.h'
Makefile:233: warning: ignoring old commands for target `version.h'
bash generate-version.sh
bash: generate-version.sh: No such file or directory
make: Leaving directory `.../qqq-build-desktop'

There is $$DESTDIR, but I don't see $$SRCDIR. How to refer to the project directory in qmake (or how to rewrite this)?

Upvotes: 12

Views: 23481

Answers (5)

Ed of the Mountain
Ed of the Mountain

Reputation: 5459

This works and is easy to understand.

version.commands = ( cd $${PWD}; generate-version.sh )

Upvotes: 0

je suis charlie
je suis charlie

Reputation: 1

I use (Linux and g++)

DEFINES += SVN_VERSION=\\\"\""`svnversion $$PWD`\""\\\"
DEFINES += COMPILE_DATE=\\\"\""`date`\""\\\"
DEFINES += SW_VERSION=\\\"\"0.5\"\\\"

which defines the macro SVNVERSON to be the svn version. To access it from C++:

QString svnVersion = SVN_VERSION;
QString swVersion  = SW_VERSION;

Explanation: On the shell I want to see this call:

-DSVN_VERSION=\""`svnversion /path/to/my/source`"\"

As you see some escapes are necessary on shell level. In the .pro-file it then has to be escaped twice.

Upvotes: 0

Timmmm
Timmmm

Reputation: 96537

PWD

Specifies the full path leading to the directory containing the current file being parsed. This can be useful to refer to files within the source tree when writing project files to support shadow builds.

Upvotes: 1

jwernerny
jwernerny

Reputation: 7048

My first thought is to try to rewrite

version.commands = bash generate-version.sh

so as not to have to invoke a shell script. Perhaps you can combine all of the statements into one line:

version.commands = echo \'char VERSION[]=\"1.0\";\' > version.h && ls && echo Done

If you are stuck with invoking the script, probably PWD or OUT_PWD are what you are looking for. From the qmake Variable Reference

PWD

This variable contains the full path leading to the directory where the qmake project file (project.pro) is located.

OUT_PWD

This variable contains the full path leading to the directory where qmake places the generated Makefile.

The one caveat that is not mentioned in the documentation is that if you are doing a recursive qmake, PWD refers to where the top level .pro file was read from. Thus if you run qmake -r from {proj-root}, when sub/sub/sub/dir-proj.pro is finally read in, PWD will still point to {proj-root}.

Assuming that generate-version.sh is in the same directory as your top level .pro file, you might try:

version.commands = bash $$PWD/generate-version.sh

Upvotes: 15

benjarobin
benjarobin

Reputation: 4478

I found a better and cleaner solution

version.target = version.h
version.commands = bash ${QMAKE_VAR__PRO_FILE_PWD_}/generate-version.sh
QMAKE_EXTRA_TARGETS += version

The variable _PRO_FILE_PWD_ is documented since qt 4.5 and contains the path to the directory containing the project file in use (Contains the .pro file)

But to access this variable for QMAKE_EXTRA_TARGETS, QMAKE_VAR_ must be appended.

Upvotes: 1

Related Questions