I have seen several suggestions, but nothing really worked for me as I want. I just need to copy a file to the desired destination directory.
Say, for example from this answer:
install_it.path = %{buildDir}
install_it.files += %{sourceDir}/settings.ini
INSTALLS += install_it
Variables %{buildDir}
and %{sourceDir}
should be defined, to make this work. Ok, there's no problem with %{sourceDir}
: it is just .
. But how can I get %{buildDir}
?
EDIT1
Say, I have a project my_project
here:
/path/to/my_project
So, release build path is this: /path/to/my_project-build-Desktop-release
,
debug build path is this: /path/to/my_project-build-Desktop-debug
I have files to be copied to destination directory here: /path/to/my_project/copy_to_install_dir
So, I want all files from /path/to/my_project/copy_to_install_dir
to be copied to /path/to/my_project-build-Desktop-release
when I do release build. And, the same way for debug build.
I can't find variable which contain full destination path, i.e. /path/to/my_project-build-Desktop-release
for debug build.
Just in case: I use Windows, but anyway I'm looking for crossplatform solution.
EDIT2
Exact solution, for future readers:
install_it.path = $$OUT_PWD
install_it.files = copy_to_install_dir/*
INSTALLS += \
install_it
Having had the pleasure of wasting a few hours with this, i thought i'd share my findings on the matter. This in a modified variant of Paglian's method here. Since i'm using windows (without mingw) that method doesn't work. So here is the modified variant:
Since this makes it cross platform you could of course also use this method in Linux, MacOS or what have you. Do note that i'm copying a single file, so instead of
$(COPY_DIR)
i'm using$(COPY_FILE)
. Adapt as needed.If you want the file(s) copied to the exact path of where the binary ends up (since the binary will end up in a subfolder of $$OUT_PWD (debug or release, at least when building with Qt Creator with MSVC 14/cdb.exe/Code::Blocks Makefiles configuration) you need this:
Beware that even though the binary ends up in a subfolder, QtCreator executes the binary from
$$OUT_PWD
, so it expects to find file resources in$$OUT_PWD
, and NOT the debug subdir. That means you for example can't doQIcon("archive.png")
and expect it to find it besides the executable.This is of course easy to remedy by doing:
IF you decide this is what you want, you obviously need to edit the last argument of
$$(COPY_FILE)
(in .pro) like this:\"$$shell_path($$OUT_PWD)\\$$VARIANT\"
One other thing to note is that (in my case anyway) Qt Creator (4.0.1) doesn't always build the .pro file, since it's not detecting any changes in the configuration, so to have the above changes reflected in the Makefile (and thus run when you build your project) you have to actually build the .pro manually by running
Build->run qmake
from the application menu. To ensure everything goes smooth, look as the compile output by hitting Alt+4 (on Windows anyway).This is what we are using in QtSerialPort:
Basically, you set the files and path for the target, and then append that into the
INSTALLS
variable. What you still need is the$$OUT_PWD
variable which we are also using extensively inQtSerialPort
. That will provide you the root of the build directory.It is one of those undocumented qmake features, but it is very useful.
Also, for the source directory in general at large, you should not assume "." and so forth because that may be different as you run through a wrapper application in which the "." will point to that and not what you expect: the qmake source project root. In those cases, it is safer to use the
PWD
variable which points to the source as opposedOUT_PWD
which points to the build folder.Just to give a rough example about the difference o those two variables with a real world scenario, here you can find what we are doing in QtSerialPort:
where the former is the root for the source project, and the latter for the build directory. They may be the same, but in many cases they are not, e.g. when building through QtCreator just for one of those.
Maybe the following QMake code helps as a starting point. It copies the recently built binary to some other directory "TARGET_DEST":
The selected answer is correct but it requires to call
make install
, which in my opinion is annoying or error prone. Instead, to copy files to the build directory use:Where
required_files
must be replaced with your correct path.$$PWD
is the path of current.pro
file, you might not require this.Note: I found this solution here. I recommend to read the whole article as it explains how it works.
You can use DESTDIR and PWD qmake variables or OUT_PWD: http://qt-project.org/doc/qt-5.1/qmake/qmake-variable-reference.html#destdir