Как запустить несколько команд с дополнительной целью в QMake

Я делаю дополнительные цели с помощью qmake, и я пытаюсь сделать две вещи одновременно: создать новую папку и скопировать dll в эту папку. Оба действия работают отлично, но оба вместе не работают.

something.target = this

# This works:
# something.commands =   mkdir newFolder
# This works too (if newFolder exists)
# something.commands =   copy /Y someFolder\\file.dll newFolder

# This doesn't work:
something.commands = mkdir newFolder; \
                     copy /Y someFolder\\file.dll newFolder

QMAKE_EXTRA_TARGETS += something
PRE_TARGETDEPS += this

Я думал, что это правильный синтаксис (я нашел похожие примеры, например здесь и здесь), но я получаю следующую ошибку:

> mkdir newFolder; copy /Y someFolder\\file.dll newFolder
> The syntax of the command is incorrect.

Является ли синтаксис другим на разных платформах или чем-то еще? Я работаю над Windows 7 с Qt 5.0.1.

Ответ 1

Значение переменной .commands вставляется в место целевых команд в Makefile с помощью qmake как есть. qmake удаляет любые пробелы из значений и изменяет их на отдельные пространства, поэтому невозможно создать многострочное значение без специального инструмента. И есть инструмент: function escape_expand. Попробуй это:

something.commands = mkdir newFolder $$escape_expand(\n\t) copy /Y someFolder\\file.dll newFolder

$$escape_expand(\n\t) добавляет новый символ линии (заканчивает предыдущую команду) и запускает следующую команду с символом табуляции, который диктует синтаксис Makefile.

Ответ 2

Оператор и работает также для меня в Linux и странных окнах.

something.commands = mkdir newFolder && copy /Y someFolder\\file.dll newFolder