Як змусити GNU Make виконати файл багато разів з різними аргументами

В сучасних публікаціях, усе частіше можна чути про недоліки утиліти Make. Наприклад, у статті Qt Build System: рятувальний круг для складання наводяться думки двох експертів, першим з яких виступає Peter Miller з критикою рекурсивних можливостей 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 необхідно використовувати для того або іншого пристрою.


Розглянемо тепер, як на рівні системи збирання, організувати послідовність викликів утиліти Make для нашого сценарію таким чином, щоб користувач міг здійснити ці дії за допомогою лише одного виклику:

$ make

без завдання додаткових аргументів, що відповідають за вибір цільового пристрою і пов'язаного з ним Toolchain-а.

Якщо включити в початок нашого сценарію список допустимих кінцевих пристроїв, наприклад, наступним чином:

COMPONENT_TARGETS = $(HARDWARE_CI20)
COMPONENT_TARGETS += $(HARDWARE_BT01)
COMPONENT_TARGETS += $(HARDWARE_DM64)

система складання зможе автоматично побудувати список можливих для даного сценарію, комбінацій TOOLCHAIN – HARDWARE, який буде виглядати, наприклад, наступним чином:

targets = target_mips_ci20 target_mips_bt01 target_arm_dm64

Маючи такий список, система складання може відновити аргументи, які необхідно передавати при кожному виклику утиліти Make, для нашого сценарію. Зробити це неважко, на мові GNU Make ці дії можна описати так:

target_%: TOOLCHAIN = $(shell echo $(word 2, $(subst _, , $@)))
target_%: HARDWARE = $(shell echo $(word 3, $(subst _, , $@)))
target_%:
$(MAKE) TOOLCHAIN=$(TOOLCHAIN) HARDWARE=$(HARDWARE)

Таким чином, при виклику команди Make без аргументів, змінні TOOLCHAIN та HARDWARE будуть не визначені і, в цьому випадку, система складання займеться створенням списку targets з числа допустимих комбінацій. Коли список буде складений, система складання зможе здійснити виклик

$(MAKE) TOOLCHAIN=$(TOOLCHAIN) HARDWARE=$(HARDWARE)

з дійсними аргументами.

image
Коли ж при черговому виклику, система переконається в тому, що змінні TOOLCHAIN та HARDWARE визначено, що управління буде передано нашим сценарієм без додаткових обчислень.

Зрозуміло, код наведений тут, не повний, але відображає фундаментальний принцип і, при використанні умовних операторів, може бути доведений до робочого.

Описаний тут механізм, безпосередньо випливає з можливостей утиліти Make, а працюючий код, можна детально розглянути вихідному тексті системи збирання Radix.pro.

Надалі, я сподіваюся продовжити серію публікацій на різні теми, що відносяться до таких засобів, як Make, autoconf, automake, зрозуміло без зайвого цитування речей давно відомих, але з метою показу основних принципів, які дозволяють розібратися в суті речей відбуваються.

Питання можна ставити на будь-якій сторінці Radix.pro Контакти або в блогах на Тумблері [build-system, radix-platform], де я намагаюся розповідати про новини проекту.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.