我正在尝试设置Makefile,以便我可以执行以下规则:
make board1 flash
或
make board2 flash
board1
编译给定电路板的固件,board2
编译另一个固件。
我知道我可以为每个主板定义一个flash
规则,但我支持很多主板,我想尽可能简单地添加对新主板的支持,使用在规则。
所以我写了以下规则:
board1: MCU=atmega2560
board1: F_CPU=16000000
board1: build/main-board1.o
我可以很好地编译所有内容。然后我得到了flash
命令:
flash:
$(AVRDUDE) -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) -U flash:w:build/*.hex
因此,当我执行make board1 flash
时,我希望将$(MCU)
设置为atmega2560
值。
N.B。:虽然我认为上一个问题是可能的问题,但我还有另一个问题,但我认为这个问题是不可能的:
board1: TARGET=board1
board1: build/main-$(TARGET).o
flash: build/main-$(TARGET).o
$(AVRDUDE) ...
我的意思是,是否有办法在规则中定义一个变量以用于另一个规则?
答案 0 :(得分:1)
你可以使用“make board1 flash”和“make board2 flash”,但你不应该。它违背了Make应该工作的方式。 Make调用中列出的参数应该是独立目标,而不是相互修改的命令。
更好的方法是这样的:
make BOARD=board1 flash
和
make BOARD=board2 flash
(或等效make flash BOARD=board1
和make flash BOARD=board2
,顺序无关紧要),使用此makefile:
ifeq ($(BOARD), board1)
MCU=atmega2560
F_CPU=16000000
endif
ifeq ($(BOARD), board2)
MCU=otherMCU
F_CPU=33333
endif
flash: build/main-$(BOARD).o
$(AVRDUDE) -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) -U flash:w:build/main-$(TARGET).hex
(请注意,TARGET是多余的,它与BOARD相同。)
答案 1 :(得分:0)
AHAH!有时候只需要问一个问题就可以在下面找到答案!
这里是我自己的问题的答案:$(eval VAR=VAL)
魔术可以解决问题。
board1: $(eval MCU=atmega2560)
board1: $(eval F_CPU=16000000)
board1: $(eval TARGET=board1)
board1: build/main-$(TARGET).o
flash: build/main-$(TARGET).o
$(AVRDUDE) -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) -U flash:w:build/main-$(TARGET).hex
我仍然愿意接受建议和更优雅的方式来实现同样的目标!