[#] Как заставить GNU Make исполнить файл многократно с разными аргументами
habrabot(difrex,1) — All
2016-03-15 16:00:03


В современных публикациях, все чаще можно слышать о недостатках утилиты **Make**. Например, в статье [Qt Build System: спасательный круг для сборки][1] приводятся мнения двух экспертов, первым из которых выступает [Peter Miller][2] с критикой рекурсивных возможностей **Make**. Разумеется, обоснованная критика необходима, иначе мы не сможем двигаться дальше. Но все-таки, хочется заступиться за старую, добрую утилиту **Make**. Тем более, что данная утилита используется в миллионах проектов и, ее рано сбрасывать со щетов. Надо просто помнить, что, по сути, **Make** является простой программой, связывающей цели пользователя с действиями, которые необходимо осуществить для достижения этих самых целей. Нельзя требовать от программы того, что она не может делать в принципе, а именно исправлять ошибки пользователя. Она может лишь пожаловаться на то, что ее заставляют делать неприличные вещи. О рекурсивных Make-файлах, параллельной и многопоточной сборке, а также о скорости сборки, мы поговорим позднее, надеюсь у нас еще будет повод, а сейчас хотелось бы представить одну из возможностей, которую предоставляет утилита **GNU Make** Предположим, что нам необходимо собрать программу или отчуждаемый пакет для работы на трех устройствах с именами **ci20**, **bt01** и **dm64**. Первые два устройства **ci20** и **bt01** основаны на архитектуре **MIPS**, третье устройство **dm64** построенно на базе процессора **ARM**. Toolchain-ы, для простоты, назовем **mips** и **arm**, соответственно. Сценарий сборки исходной программы одинаков для всех трех устройств и написан на языке **GNU Make**. Если представить все комбинации вызовов команды **Make**, необходимые для сборки программы на наши устройства, получим:

$ TOOLCHAIN=mips HARDWARE=ci20 make
$ TOOLCHAIN=mips HARDWARE=bt01 make
$ TOOLCHAIN=arm HARDWARE=dm64 make


или, при передаче имен устройств и Toolchain-ов в качестве аргументов:

$ make TOOLCHAIN=mips HARDWARE=ci20
$ make TOOLCHAIN=mips HARDWARE=bt01
$ make TOOLCHAIN=arm HARDWARE=dm64


Таким образом, система сборки должна принимать пары **TOOLCHAIN – HARDWARE**, которые определяют какой именно Toolchain необходимо использовать для того или иного устройства. [Читать дальше →][3]

[1]: https://habrahabr.ru/post/144127/
[2]: http://aegis.sourceforge.net/auug97.pdf
[3]: https://habrahabr.ru/post/279271/#habracut