5 kx
5 kx Фундаментальный принцип работы системы сборки
5 kx =============================================
5 kx
5 kx Предположим, что нам необходимо собрать программу или отчуждаемый пакет для
5 kx работы на трех устройствах с именами ci20, bt01 и dm64. Первые два устройства
5 kx ci20 и bt01 основаны на архитектуре MIPS, третье устройство dm64 построенно
5 kx на базе процессора ARM. Toolchain-ы для сборки программ, для простоты, назовем
5 kx mips и arm, соответственно.
5 kx
5 kx Сценарий сборки исходной программы одинаков для всех трех устройств и написан
5 kx на языке GNU Make.
5 kx
5 kx Если представить все комбинации вызовов команды Make, необходимые для сборки
5 kx программы на наши устройства, получим:
5 kx
5 kx $ TOOLCHAIN=mips HARDWARE=ci20 make
5 kx $ TOOLCHAIN=mips HARDWARE=bt01 make
5 kx $ TOOLCHAIN=arm HARDWARE=dm64 make
5 kx
5 kx или, при передаче имен устройств и Toolchain-ов в качестве аргументов:
5 kx
5 kx $ make TOOLCHAIN=mips HARDWARE=ci20
5 kx $ make TOOLCHAIN=mips HARDWARE=bt01
5 kx $ make TOOLCHAIN=arm HARDWARE=dm64
5 kx
5 kx Таким образом, система сборки должна принимать пары TOOLCHAIN-HARDWARE,
5 kx которые определяют какой именно Toolchain необходимо использовать для того
5 kx или иного устройства.
5 kx
5 kx Рассмотрим теперь, как, на уровне системы сборки, организовать последовательность
5 kx вызовов утилиты Make для нашего сценария таким образом, чтобы пользователь мог
5 kx осуществить данные действия с помощью лишь одного вызова:
5 kx
5 kx $ make
5 kx
5 kx без задания дополнительных аргументов, отвечающих за выбор целевого устройства
5 kx и связанного с ним Toolchain-а.
5 kx
5 kx Если включить в начало нашего сценария список допустимых целевых устройств,
5 kx например, следующим образом:
5 kx
5 kx COMPONENT_TARGETS = $(HARDWARE_CI20)
5 kx COMPONENT_TARGETS += $(HARDWARE_BT01)
5 kx COMPONENT_TARGETS += $(HARDWARE_DM64)
5 kx
5 kx то система сборки сможет автоматически построить список возможных, для данного
5 kx сценария, комбинаций TOOLCHAIN-HARDWARE, который будет выглядеть, например,
5 kx следующим образом:
5 kx
5 kx targets = target_mips_ci20 target_mips_bt01 target_arm_dm64
5 kx
5 kx Имея такой список, система сборки может восстановить аргументы, которые
5 kx необходимо передавать при каждом вызове утилиты Make, для нашего сценария.
5 kx Сделать это нетрудно, на языке GNU Make эти действия можно описать так:
5 kx
5 kx target_%: TOOLCHAIN = $(shell echo $(word 2, $(subst _, , $@)))
5 kx target_%: HARDWARE = $(shell echo $(word 3, $(subst _, , $@)))
5 kx target_%:
5 kx $(MAKE) TOOLCHAIN=$(TOOLCHAIN) HARDWARE=$(HARDWARE)
5 kx
5 kx
5 kx Таким образом, при вызове команды Make без аргументов, переменные TOOLCHAIN и
5 kx HARDWARE будут не определены и, в этом случае, система сборки займется созданием
5 kx списка targets из числа допустимых комбинаций. Когда же список будет составлен,
5 kx система сборки сможет осуществить вызов
5 kx
5 kx $(MAKE) TOOLCHAIN=$(TOOLCHAIN) HARDWARE=$(HARDWARE)
5 kx
5 kx с действительными аргументами.
5 kx
5 kx Когда же, при очередном вызове, система убедится в том, что переменные
5 kx TOOLCHAIN и HARDWARE определены, управление будет передано нашему сценарию
5 kx без дополнительных вычислений.
5 kx
5 kx Описанный здесь механизм, напрямую вытекает из возможностей утилиты Make.
5 kx
5 kx
5 kx References
5 kx ----------
5 kx http://www.gnu.org/software/make/manual/
5 kx http://radix.pro/build-system/
5 kx