私はいくつかの提案を見てきましたが、私が望むように実際に機能するものはありません。ファイルを目的のディレクトリにコピーするだけです。
たとえば、 this answer から:
install_it.path = %{buildDir}
install_it.files += %{sourceDir}/settings.ini
INSTALLS += install_it
これを機能させるには、変数%{buildDir}
および%{sourceDir}
を定義する必要があります。 OK、%{sourceDir}
に問題はありません:.
だけです。しかし、どのようにして%{buildDir}
を取得できますか?
EDIT1
my_project
というプロジェクトがあります:
/path/to/my_project
したがって、リリースビルドパスは/path/to/my_project-build-Desktop-release
です。
デバッグビルドパスはこれです:/path/to/my_project-build-Desktop-debug
次の宛先ディレクトリにコピーするファイルがあります:/path/to/my_project/copy_to_install_dir
そのため、ビルドをリリースするときに、/path/to/my_project/copy_to_install_dir
のすべてのファイルを/path/to/my_project-build-Desktop-release
にコピーする必要があります。また、デバッグビルドの場合も同じです。
完全な宛先パス、つまりデバッグビルド用の/path/to/my_project-build-Desktop-release
を含む変数が見つかりません。
念のため:私はWindowsを使用していますが、とにかくクロスプラットフォームソリューションを探しています。
EDIT2
将来の読者のための正確なソリューション:
install_it.path = $$OUT_PWD
install_it.files = copy_to_install_dir/*
INSTALLS += \
install_it
これは、QtSerialPortで使用しているものです。
target_headers.files = $$PUBLIC_HEADERS
target_headers.path = $$[QT_INSTALL_HEADERS]/QtSerialPort
INSTALLS += target_headers
mkspecs_features.files = $$QTSERIALPORT_PROJECT_ROOT/src/serialport/qt4support/serialport.prf
mkspecs_features.path = $$[QT_INSTALL_DATA]/mkspecs/features
INSTALLS += mkspecs_features
基本的に、ターゲットのファイルとパスを設定し、INSTALLS
変数に追加します。まだ必要なのは$$OUT_PWD
変数もQtSerialPort
で広範囲に使用しています。これにより、ビルドディレクトリのルートが提供されます。
これは文書化されていないqmake機能の1つですが、非常に便利です。
また、一般的なソースディレクトリについては、「。」を想定しないでください。というのは、「。」が含まれるラッパーアプリケーションを実行すると異なる場合があるためです。あなたが期待するものではなく、それを指します:qmakeソースプロジェクトのルート。これらの場合、ソースを指すPWD
変数を使用するほうが安全ですOUT_PWD
ビルドフォルダーを指します。
実世界のシナリオでのこれら2つの変数の違いについて大まかな例を示すために、ここでQtSerialPortで行っていることを見つけることができます。
system("echo QTSERIALPORT_PROJECT_ROOT = $$PWD >> $$OUT_PWD/.qmake.cache")
system("echo QTSERIALPORT_BUILD_ROOT = $$OUT_PWD >> $$OUT_PWD/.qmake.cache")
前者はソースプロジェクトのルート、後者はビルドディレクトリのルートです。それらは同じかもしれませんが、多くの場合、そうではありません。それらの1つだけのためにQtCreatorを使用してビルドする場合。
選択された答えは正しいですが、make install
を呼び出す必要があります。代わりに、ビルドディレクトリにファイルをコピーするには、次を使用します。
copydata.commands = $(COPY_DIR) $$PWD/required_files $$OUT_PWD
first.depends = $(first) copydata
export(first.depends)
export(copydata.commands)
QMAKE_EXTRA_TARGETS += first copydata
required_files
は正しいパスに置き換える必要があります。 $$PWD
は現在の.pro
ファイルのパスです。これは必要ない場合があります。
注:私はこの解決策を見つけました here 。それがどのように機能するかを説明しているので、記事全体を読むことをお勧めします。
これで数時間を無駄にする喜びがあったので、私はこの問題に関する私の発見を共有したいと思いました。これは、パグリアンの方法の修正版 こちら です。私は(mingwなしで)ウィンドウを使用しているので、その方法は機能しません。変更されたバリアントは次のとおりです。
# using Shell_path() to correct path depending on platform
# escaping quotes and backslashes for file paths
copydata.commands = $(COPY_FILE) \"$$Shell_path($$PWD\\archive.png)\" \"$$Shell_path($$OUT_PWD)\"
first.depends = $(first) copydata
export(first.depends)
export(copydata.commands)
QMAKE_EXTRA_TARGETS += first copydata
これによりクロスプラットフォームになるので、もちろんこの方法をLinux、MacOSなどで使用することもできます。私は単一のファイルをコピーしているので、$(COPY_DIR)
の代わりに$(COPY_FILE)
を使用していることに注意してください。必要に応じて適応します。
バイナリが終わる場所の正確なパスにファイルをコピーしたい場合(バイナリは$$ OUT_PWD(debugまたはrelease、少なくともMSVC 14/cdb.exe/Code :: Blocks Makefiles構成でQt Creatorを使用してビルドする場合、これが必要です:
# adapted from https://stackoverflow.com/a/2581068
CONFIG(debug, debug|release) {
VARIANT = debug
} else {
VARIANT = release
}
バイナリがサブフォルダになったとしても、QtCreatorは$$OUT_PWD
からバイナリを実行するため、debugサブディレクトリではなく、$$OUT_PWD
でファイルリソースを見つけることを期待します。つまり、たとえばQIcon("archive.png")
を実行できず、実行可能ファイル以外でそれを見つけることができないことを意味します。
もちろん、これは次のようにして簡単に修正できます。
QDir exeDir(QCoreApplication::applicationDirPath());
QIcon qIcon(exeDir.filePath("archive.png"));
これがあなたの望むものであると決心した場合、次のように$$(COPY_FILE)
(.pro内)の最後の引数を編集する必要があることは明らかです:\"$$Shell_path($$OUT_PWD)\\$$VARIANT\"
注意すべきもう1つの点は、(私の場合はいずれにせよ)Qt Creator(4.0.1)は構成の変更を検出しないため、常に.proファイルをビルドしないため、上記の変更がMakefileに反映されることです。 (したがって、プロジェクトをビルドするときに実行します)アプリケーションメニューからBuild->run qmake
を実行して、実際に.proを手動でビルドする必要があります。すべてがスムーズに行われるようにするには、Alt + 4を押してコンパイル結果を表示します(とにかくWindowsで)。
DESTDIRおよびPWD qmake変数またはOUT_PWDを使用できます。 http://qt-project.org/doc/qt-5.1/qmake/qmake-variable-reference.html#destdir
次のQMakeコードが出発点として役立つかもしれません。最近ビルドされたバイナリを他のディレクトリ「TARGET_DEST」にコピーします。
TARGET_SRC = $${_PRO_FILE_PWD_}
TARGET_DEST = $${PWD}/src
CONFIG(debug, debug|release) {
TARGET_SRC = $${TARGET_SRC}/debug
} else {
TARGET_SRC = $${TARGET_SRC}/release
}
TARGET_SRC = $${TARGET_SRC}/$${TARGET}
TARGET_DEST = $${TARGET_DEST}/$${TARGET}
linux-g++{
if( equals(TEMPLATE, app) || equals(TEMPLATE, vcapp) ){
# nothing to do here
}
if( equals(TEMPLATE, lib) || equals(TEMPLATE, vclib) ){
TARGET_SRC = $${TARGET_SRC}.so
TARGET_DEST = $${TARGET_DEST}.so
}
QMAKE_POST_LINK += $$quote(cp $${TARGET_SRC} $${TARGET_DEST}$$escape_expand(\n\t))
}
win32 {
if( equals(TEMPLATE, app) || equals(TEMPLATE, vcapp) ){
TARGET_SRC = $${TARGET_SRC}.exe
TARGET_DEST = $${TARGET_DEST}.exe
}
if( equals(TEMPLATE, lib) || equals(TEMPLATE, vclib) ){
TARGET_SRC = $${TARGET_SRC}.dll
TARGET_DEST = $${TARGET_DEST}.dll
}
TARGET_SRC ~= s,/,\\,g # fix slashes
TARGET_DEST ~= s,/,\\,g # fix slashes
QMAKE_POST_LINK +=$$quote(cmd /c copy /y $${TARGET_SRC} $${TARGET_DEST}$$escape_expand(\n\t))
}
message("[INFO] Will copy $${TARGET_SRC} to $${TARGET_DEST}")