web-dev-qa-db-ja.com

Qtでプロジェクトをコンパイルした後、ファイルをビルドディレクトリにコピーします

私はいくつかの提案を見てきましたが、私が望むように実際に機能するものはありません。ファイルを目的のディレクトリにコピーするだけです。

たとえば、 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
29
Dmitry Frank

これは、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を使用してビルドする場合。

13
lpapp

選択された答えは正しいですが、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 。それがどのように機能するかを説明しているので、記事全体を読むことをお勧めします。

31
Paglian

これで数時間を無駄にする喜びがあったので、私はこの問題に関する私の発見を共有したいと思いました。これは、パグリアンの方法の修正版 こちら です。私は(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で)。

14
PKSWE

DESTDIRおよびPWD qmake変数またはOUT_PWDを使用できます。 http://qt-project.org/doc/qt-5.1/qmake/qmake-variable-reference.html#destdir

3
gbdivers

次の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}")