Эти технические заметки дают дополнительную информацию по использованию Build Actions в системе программирования IAR Embedded Workbench (перевод Technical Note 99436 [1]).
Подсистема "Build Actions" (действия при сборке, далее сокращенно BA), управляемая через свойства проекта, предназначена для запуска команд и скриптов перед сборкой проекта (действия pre-build) и после его сборки (post-build). Это очень полезная функция, позволяющая осуществлять автоматизацию процесса сборки - например генерацию исходного кода [6], запуск перекодировщиков прошивки (например для шифрования [7]) и т. п.
Совет 1: чтобы посмотреть вывод от запрограммированных действий, связанных со сборкой (build actions) в окне сообщений сборки (Build window), разрешите опцию Tools -> Options... -> IDE Options -> Messages -> Show build messages -> All.
Совет 2: когда код проекта не требует перекомпиляции (т. е. уже скомпилирован, находится в актуальном, обновленном состоянии up-to-date), то команды BA не запустятся, они выполняются только в том случае, когда запускаются какие-либо компиляционные инструменты тулчейна IAR, влияющие на генерацию конечного выходного двоичного кода.
[Командная строка Build Actions]
Вы можете ввести имяприложения.exe в командных строках pre-build и post-build, если переменная окружения PATH включает директорию, где находится этот запускаемый файл имяприложения.exe. Можно проверить значение переменной окружения PATH с помощью команды path, введенной в приглашении интерпретатора командной строки cmd.exe. Однако имейте в виду, что обычные команды MS-DOS не могут быть исполнены в строках pre-build и post-build. Т. е., к примеру, Вы можете запустить через эти строки BA команду calc.exe, однако команда copy не запустится. Для запуска команд наподобие copy, path, set и командных bat-файлов применяйте в строке вызов cmd.exe:
cmd.exe /c "командная строка"
Пример запуска команды path из строк BA:
По умолчанию инсталлятор IAR добавляет путь до папки $TOOLKIT_DIR$\bin в переменную окружения PATH, так что Вы можете запустить приложения IAR Embedded Workbench непосредственно из строк BA (строки команд pre-build и post-build).
Пример командной строки post-build (пример для IAR Embedded Workbench for ARM):
[Перенаправление stdout и stderr]
Чтобы перенаправить вывод stdout и stderr в командной строке Windows, можно ввести следующую командную строку в приглашении интерпретатора cmd.exe:
Чтобы запустить ту же самую команду из строки BA, нужно сделать промежуточный вызов cmd.exe:
cmd /c "path > output.txt 2>&1"
Совет 3: здесь текущей директорией, куда запишется файл output.txt, будет директория, где находится IarIdePm.exe. Если Вы хотите указать другой каталог, то укажите полный путь до него. Например, для сохранения файла output.txt в каталоге проекта введите команду:
cmd /c "path > $PROJ_DIR$\output.txt 2>&1"
Чтобы перенаправить вывод из приложения Windows, Вы можете ввести командную строку наподобие следующей:
имяприложения.exe > output.txt 2>&1
Ожидаемая соответствующая строка BA будет выглядеть следующим образом:
cmd /c "имяприложения.exe > output.txt 2>&1"
Может произойти, что Вы получите пустой файл output.txt. В этом случае нужно применить двойной косвенный вызов команды:
cmd /c "cmd /c "имяприложения.exe > output.txt 2>&1""
Пример строки BA (для IAR Embedded Workbench for ARM):
cmd /c "cmd /c "ielfdumparm > $PROJ_DIR$\output.txt 2>&1""
Совет 4: поскольку подобные строки команд могут выглядеть сложными и запутывающими, лучшим альтернативным решением будет вызов командного bat-файла из строк BA (см. далее).
[Использование скриптов *.bat]
С помощью .bat-файла Вы можете запускать команды MS-DOS как обычно. Внутри .bat-файла можно указать несколько команд друг за другом, и в них можно пропустить вызов "cmd /c", как это требовалось для командной строки BA.
Примечание: если ранее надо было делать двойной вызов "cmd /c", то в .bat-файле можно ввести только первую часть "cmd /c".
Пример запуска команды "path" с помощью .bat-файла, находящегося в директории проекта:
Содержимое файла pre-build.bat:
Пример перенаправления вывода команды "path" с помощью .bat-файла, находящегося в директории проекта:
$PROJ_DIR$\pre-build.bat "$PROJ_DIR$"
Содержимое файла pre-build.bat:
path > %1\output.txt 2>&1
Примечание: Вы не можете внутри скрипта bat-файла использовать переменные аргумента наподобие $PROJ_DIR$, поскольку интерпретатор команд ничего не знает при них (это переменные среды IAR [8]). Вместо этого Вы можете передать переменные аргумента через параметры .bat-файла.
Пример запуска ielfdumparm с помощью .bat-файла, находящегося в директории проекта:
$PROJ_DIR$\post-build.bat
Содержимое файла post-build.bat (пример для IAR Embedded Workbench for ARM):
ielfdumparm
Примечание: эта команда запустится, однако вывод из неё возможно не будет виден в окне сообщений сборки IAR (в окне Build window). В таком случае перенаправьте вывод и дамп файла с помощью команды "type" (см. далее).
Пример перенаправления вывода из ielfdumparm с помощью .bat-файла, находящегося в директории проекта:
$PROJ_DIR$\post-build.bat "$PROJ_DIR$"
Содержимое файла post-build.bat (пример для IAR Embedded Workbench for ARM):
cmd /c "ielfdumparm > "%1\output.txt 2>&1""
Чтобы получить дамп содержимого файла output.txt, добавьте к .bat-файлу следующую строку:
Примечание: если Вы хотите запустить в .bat-файле несколько команд, откройте статью Википедии [2], и прочитайте разделы по перенаправлению, каналам и объединению действий в цепочку (redirection, piping, chaining).
Также см. пример проекта в [3] Common, который использует файл post-build.bat для BA post-build.
[Возвращаемые значения]
Если любая из команд BA (post- или pre-build) вернет код ошибки (результат, не равный 0), то весь процесс выполнения команд Build/Make будет оборван. См. проект примера [4] и его скриншоты ниже.


[Просмотр вывода только от Build Action]
Если Вы считаете, что окно сборки выводит слишком много информации, и очень трудно увидеть вывод от настроенных команд BA, то в качестве альтернативы можно перенаправить вывод в текстовый файл, и запустить блокнот (notepad.exe) чтобы увидеть вывод только сообщений BA.
Командная строка post-build:
$PROJ_DIR$\post-build.bat $PROJ_DIR$
Содержимое файла post-build.bat (пример для ARM):
echo off
cmd /c "ielfdumparm > "%1\output.txt 2>&1""
echo Look in the notepad window and then close
notepad "%1\output.txt"
echo on
Примечание: когда здесь имеются символы пробела в имени файлового пути, то обычный путь избежать проблем с такими путями - заключить их в двойные кавычки. Но если это не работает, например когда запускается notepad, попробуйте использовать путь, который не содержит пробелов или кавычек, или преобразуйте длинное имя пути в короткое типа 8.3.
[Команда touch системы Cygwin]
Вы можете запустить приложение Cygwin (cygwin-application.exe) в строках команд BA, если переменная окружения PATH содержит директорию, где находится cygwin-application.exe.
Вы можете запустить Cygwin-команду "touch" в командной строке pre-build, но если Вы добавите путь до файла, например "touch d:/test.c", то путь до файла не будет воспринят системой Cygwin. Cygwin ожидает путь по стандарту POSIX, наподобие /cygdrive/d/test.c, так что результирующая командная строка должна быть "touch /cygdrive/d/test.c", однако эта команда не может быть выполнена напрямую в командах BA. Вместо этого такая команда запускается косвенно, через вызов cmd.exe:
cmd /c "touch /cygdrive/d/test.c"
Альтернативно файл .bat (находящийся в каталоге проекта) может выглядеть следующим образом (команда pre-build):
Файл pre-build.bat:
Нет никакого смысла передавать переменные аргумента, такие как $PROJ_DIR$, в такой *.bat-файл через параметры, так как Cygwin не сможет их использовать напрямую (Cygwin ожидает путь POSIX).
Если Вы хотите запустить команду touch без внесения изменений, то BA не запустятся, и Вам нужно обратиться к другому способу запуска BA. Конечно, можно сделать предварительную очистку (Clean) и затем запустить сборку как обычно, чтобы привести в действие команды BA. Альтернативно можно сделать отдельный .bat-файл (который нужно запускать вручную), чтобы запустить touch, за которым будет запуск "IarBuild.exe -build" (см. Technical Note 47884 [5] для получения информации об IarBuild.exe).
Альтернатива для запуска команды touch - иметь действие pre-build, которое удаляет какой-нибудь объектный файл проекта:
cmd /c "del "$OBJ_DIR$\test.o""
[Ссылки]
1. Build Actions (pre-build and post-build) site:iar.com. 2. COMMAND.COM site:wikipedia.org. 3. Hiding symbols in a library using isymexport Technical Note 28924 site:iar.com. 4. return-value-example-project-ewarm-6.50.6.zip Return value example project (IAR Embedded Workbench for ARM 6.50.6) site:iar.com. 5. Build from the command line Technical Note 47884 site:iar.com. 6. IAR EW ARM: автоматическая генерация версии прошивки. 7. Безопасная и защищенная реализация бутлоадера. 8. Переменные аргумента IAR ($PROJ_DIR$, $DATE$, и т. п.). |