在makefile规则中设置一个变量,以便在另一个规则中使用

时间:2014-03-13 01:14:46

标签: compilation makefile avr

我正在尝试设置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) ...

我的意思是,是否有办法在规则中定义一个变量以用于另一个规则?

2 个答案:

答案 0 :(得分:1)

可以使用“make board1 flash”和“make board2 flash”,但你不应该。它违背了Make应该工作的方式。 Make调用中列出的参数应该是独立目标,而不是相互修改的命令。

更好的方法是这样的:

make BOARD=board1 flash

make BOARD=board2 flash

(或等效make flash BOARD=board1make 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

我仍然愿意接受建议和更优雅的方式来实现同样的目标!