Я поддерживаю довольно сложный makefile for Arduino.Динамические условия в makefile
В make-файле у меня есть цель построить файл *.hex
файла *.cpp
. После создания файла *.hex
я хочу проверить, меньше ли размер шестнадцатеричного файла, чем флэш-память микроконтроллера.
Для этого я добавил еще одну цель под названием verify_size
, которая касается файла *.sizeok
, если размер шестнадцатеричного размера меньше.
Ниже приводится соответствующий код
$(TARGET_HEX).sizeok: $(TARGET_HEX)
ifneq ($(strip $(HEX_MAXIMUM_SIZE)),1)
ifeq ($(shell expr `$(call avr_size,$(TARGET_HEX)) | grep Program | awk '{print $$2}'` '<' $(HEX_MAXIMUM_SIZE)), 1)
touch [email protected]
endif
else
@$(ECHO) Maximum Hex size is not specified. Make sure the hex file that you are going to upload is less than microcontrollers flash memory
endif
verify_size: $(TARGET_HEX) $(TARGET_HEX).sizeok
Проблема я столкнулся в том, что, когда Makefile запускается в первый раз, я получаю ошибку о том, что шестнадцатеричный файл не существует.
После некоторой отладки я обнаружил, что makefile сначала проходит весь файл перед его выполнением. Когда он выполняет этот начальный проход, шестнадцатеричный файл еще не создан, и поэтому инструкции, выполняющие разбор шестнадцатеричного файла, вообще не выполняются.
Есть ли способ, с помощью которого я добавляю динамические условия в make-файле, чтобы я мог найти размер только что сгенерированного шестнадцатеричного файла?
Edit:
на основе предположения @beta «ы я изменил код
$(OBJDIR)/%.hex: $(OBJDIR)/%.elf $(COMMON_DEPS)
$(OBJCOPY) -O ihex -R .eeprom $< [email protected]
@$(ECHO)
$(call avr_size,$<,[email protected])
ifneq ($(strip $(HEX_MAXIMUM_SIZE)),)
if [ `$(SIZE) [email protected] | awk 'FNR == 2 {print $$2}'` -le $(HEX_MAXIMUM_SIZE) ]; then touch [email protected] ; fi
else
@$(ECHO) Maximum Hex size is not specified. Make sure the hex file that you are going to upload is less than microcontrollers flash memory
endif
и она работает. Но есть одна небольшая проблема.
В приведенном выше коде я использую переменную, определенную в make-файле $(SIZE)
. Но когда этот скрипт оболочки выполняется, значение не заменяется. Вместо этого он просто заменяет его пустым значением.
Он работает, если я жестко задал значение, но я не могу использовать значение переменной, определенной в make-файле. Можно ли получить к нему доступ?
Edit2:
Я разместил separate question для переменного вопроса расширения.
Re: ваш последний вопрос: поскольку вы не показываете, как установлен SIZE, мы не можем помочь вам. – MadScientist
@MadScientist Я опубликовал [отдельный вопрос] (http://stackoverflow.com/q/17398980/24949) об этом и дал более подробную информацию о том, как установлена переменная '$ (SIZE). – Sudar