Дублирование кода в целях makefile, как избежать?

ubrige: 
 make -j5 TARGET=unwired BOARD=$(BOARD)/$(CPU) -f makefiles/Makefile.$@
 ../bootloader/generate-metadata/generate-metadata $@.bin 0x0 0x01A00001 1
 srec_cat firmware-metadata.bin -binary $@.bin -binary -offset 0x100 -o $@-ota-image.bin -binary
 rm $@.hex

ubrige-fb: ubrige-CLEAN
  ../../tools/backdoor-bootloader.py -e -w -v ubrige-firmware.hex

ubrige-f: ubrige-CLEAN
 /Applications/ti/Uniflash/flash_cc1310.sh ubrige-firmware.hex 

ubrige-ota: ubrige
 scp ubrige-ota-image.bin root@192.168.20.187:/root/unwired_smarthome


Нетрудно заметить, что там часто повторяется имя цели(в данном случае ubrige). Это имя проекта. Если я создаю новый проект, то мне приходится копировать эти четыре цели, а потом заменять ubrige на новое имя проекта. Шут бы с заменой, но мне не нравится, что в файле куча одинакового кода.

Для первой цели я нашел $@, перестало требоваться заменять все названия проекта в командах.
Но она не уменьшает количество кода — все равно для каждого проекта надо скопировать несколько целей. В примере выше содержимое ubrige, ubrige-fb, ubrige-f, ubrige-ota будет одно и то же для всех проектов, отличатся только названием ubrige.

Как мне избавится от дублирования кода, который одинаковый для нескольких целей, однако, отличается именами файлов(пусть имена файлов совпадают с названием целей)?
  • Вопрос задан
  • 1091 просмотр
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Как мне избавится от дублирования кода, который одинаковый для нескольких целей, однако, отличается именами файлов(пусть имена файлов совпадают с названием целей)?

Можно написать макрос-генератор целей. Изменяющиеся параметры можно передать как параметры макроса, внутри на них можно ссылаться по номеру. Например так:

define generate-targets
$(1): 
 make -j5 TARGET=unwired BOARD=$$(BOARD)/$$(CPU) -f makefiles/Makefile.$$@
 ../bootloader/generate-metadata/generate-metadata $$@.bin 0x0 0x01A00001 1
 srec_cat firmware-metadata.bin -binary $$@.bin -binary -offset 0x100 -o $$@-ota-image.bin -binary
 rm $$@.hex

$(1)-fb: $(1)-CLEAN
  ../../tools/backdoor-bootloader.py -e -w -v $(1)-firmware.hex

$(1)-f: $(1)-CLEAN
 /Applications/ti/Uniflash/flash_cc1310.sh $(1)-firmware.hex 

$(1)-ota: $(1)
 scp $(1)-ota-image.bin root@192.168.20.187:/root/unwired_smarthome

endef


Внутри макроса нужно экранировать $ заменяя его на $$.
Этот макрос можно вызывать в нужном месте следующим образом:

$(eval $(call generate-targets,ubrige))

Сгенерированный в этом месте код будет эквивалентен коду из вопроса.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@res2001
Developer, ex-admin
Используйте переменные:
PROJECT=ubridge

$(PROJECT)-fb: $(PROJECT)e-CLEAN
  ../../tools/backdoor-bootloader.py -e -w -v $(PROJECT)-firmware.hex

$(PROJECT)-f: $(PROJECT)-CLEAN
 /Applications/ti/Uniflash/flash_cc1310.sh $(PROJECT)-firmware.hex
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы