2015-09-17 4 views
2

Я пытаюсь скопировать целевой двоичный файл в несколько папок. На первом этапе я должен создать эти несколько папок. Я последовал за этим example без успеха.Создать каталог и скопировать файлы с qmake

Единственное, что работал был system(mkdir $$OUT_PWD/newFolder), но я пытаюсь использовать QMAKE_EXTRA_TARGETS для $(MKDIR) с последующим $(COPY) от этого example.

Использование Qt 4.8.6 с qmake 2.01a.

Это, как я бегу QMAKE: qmake Server.pro -r -spec linux-g++ CONFIG+=debug CONFIG+=declarative_debug

Update: Это моя текущая реализация, которая создает список каталогов и копий целевой бинарной для выбранных каталогов.

# List all server directories 
DIRS = server-1 \ 
     server-2 \ 
     server-3 \ 
     server-4 

INSTALL_PATH = $$OUT_PWD 
# Shadow build detection 
!equals(PWD, $$OUT_PWD) INSTALL_PATH = $$replace(INSTALL_PATH, build, install) 

# Loop over all given directories and append the 'install' directory to make absolute paths 
for(DIR, DIRS) ABS_DIRS += $$INSTALL_PATH/$$DIR 
# Create 'copy' commands for $DIRS 
for(DIR, ABS_DIRS) CP_CMD += $(COPY) $$OUT_PWD/$$TARGET $$DIR && 

# Ignore last && 
CP_CMD += true 

install.commands = $(MKDIR) $$ABS_DIRS && $$CP_CMD 

QMAKE_EXTRA_TARGETS += install 
QMAKE_POST_LINK += install 

Недостающая часть для меня заключалась в том, что я не выполнил make с правильными аргументами. После вызова make install, который также включает файлы qmake INSTALLS, код выполняет. Однако это не удается с чистой сборкой с заданной ошибкой: install: missing file operand. Если я переименую команду установки, например, с копией, я получаю эту ошибку: make: copy: Команда не найдена. Любые подсказки?

ответ

2

Получил его работу. Некоторые примечания на стороне ... QtCreator по умолчанию создает каталог build-project-kit-debug/release для построения, если включена теневая сборка. Этот код создает каталог install-project-kit-debug/release на том же уровне, что и перечисленные DIRS в качестве подкаталогов. Каталоги создаются после компиляции с помощью команды create. Целевая двоичная система затем копируется в директории DIRS после связывания.

Благодаря macetw для POST_TARGETDEPS, который также ведет меня к QMAKE_POST_LINK. qmake и make запускаются без дополнительных аргументов.

# Sets target destination dir - platform independent 
win32 { 
    build_pass: CONFIG(debug, debug|release) { 
     DESTDIR = $$OUT_PWD/debug 
    } 
    else: build_pass { 
     DESTDIR = $$OUT_PWD/release 
    } 
} 

unix { 
    DESTDIR = $$OUT_PWD 
} 

# List all server directories 
DIRS = server-1 \ 
     server-2 \ 
     server-3 \ 
     server-4 

INSTALL_PATH = $$DESTDIR 
# Shadow build detection 
!equals(PWD, $$DESTDIR) INSTALL_PATH = $$replace(INSTALL_PATH, build, install) 

# Loop over all given directories and append the 'install' directory to make absolute paths 
for(DIR, DIRS) ABS_DIRS += $$INSTALL_PATH/$$DIR 
# Create 'copy' commands for $DIRS 
for(DIR, ABS_DIRS) CP_CMD += $(COPY) $$DESTDIR/$$TARGET $$DIR ; 

create.commands = $(MKDIR) $$ABS_DIRS 

QMAKE_EXTRA_TARGETS += create 
POST_TARGETDEPS += create 

QMAKE_POST_LINK += $$CP_CMD 
2

В этой документации, как представляется, отсутствует использование PRE_TARGETDEPS или POST_TARGETDEPS.

Что это означает, что Makefile имеет инструкции выполнять то, что ему нужно, но эти цели не встроены в цепочку зависимостей, поэтому инструмент «Инструмент» никогда их не делает.

Если проблема состоит в том, чтобы делать 2 вещи (вместо одного), попробуйте поместить 2 команды в одну строку. Как так:

QMAKE_EXTRA_TARGETS += foo 
foo.target = $$OUT_PWD/newFolder 
foo.commands = $(MKDIR) $$OUT_PWD/newFolder ; $(COPY_DIR) $SOURCE $$OUT_PWD/newFolder 

... Вы можете также попробовать «& &» вместо «;», чтобы получить сильные проверки кодов возврата. Вы можете создать 2 QMAKE_EXTRA_TARGETS, которые зависят друг от друга.

QMAKE_EXTRA_TARGETS += foo bar 
foo.target = $$OUT_PWD/newFolder 
foo.commands = $(MKDIR) $$OUT_PWD/newFolder 
bar.target = $$OUT_PWD/newFolder/file 
bar.commands = $(COPY_DIR) $SOURCEOFFILE $$OUT_PWD/newFolder 
bar.depends = foo 
+0

OK Я понял, проблема заключалась в необходимости 'make'' '' аргумент 'foo':' make foo' создает 'newFolder'. Является ли это просто мной или является ссылкой на переменную qmake, описанной очень плохо? – krizajb

+0

Да, документация qmake имеет очень мало примеров. Ничего не стоит использовать COPY_DIR и тому подобное. – macetw

+0

Я начинаю верить, что это ужасно, потому что все отказываются от нее для лучшей системы. В противном случае они не получали жалоб, иначе. В лучшем случае это разочаровывает. –

Смежные вопросы