Compilation 在makefile规则中设置要在其他规则中使用的变量

Compilation 在makefile规则中设置要在其他规则中使用的变量,compilation,makefile,avr,Compilation,Makefile,Avr,我正在尝试设置一个Makefile,以便能够解决以下规则: make board1 flash 或 其中,board1为给定的板编译固件,board2为另一个板编译固件 我知道我可以为每个板定义一个flash规则,但我支持很多板,我想使用规则中定义的变量,尽可能简单地添加对新板的支持 所以我写了以下规则: board1: MCU=atmega2560 board1: F_CPU=16000000 board1: build/main-board1.o 我可以把所有的东西都编译得很好。然后我得

我正在尝试设置一个Makefile,以便能够解决以下规则:

make board1 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
因此,当我执行
makeboard1 flash
时,我希望将
$(MCU)
设置为
atmega2560

注:虽然我认为前一个问题是可能的,但我得到了另一个问题,但我认为这是不可能的:

board1: TARGET=board1
board1: build/main-$(TARGET).o

flash: build/main-$(TARGET).o
    $(AVRDUDE) ...

我的意思是,是否有一种方法可以从规则中定义一个变量以用于另一个规则?

啊哈!有时候一个人只需要问一个问题就可以在下一秒找到答案

下面是我自己问题的答案:
$(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
不过,我仍然愿意接受建议,寻求更优雅的方式来实现同样的目标

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

更好的方法是:

make BOARD=board1 flash

(或相当于
make flash BOARD=board1
make flash BOARD=board2
,顺序不重要),使用此生成文件:

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相同。)

作为一个附带问题,在包含另一个makefile并调用其中的规则之前,我定义了变量,是否可以使用主makefile来实现相同的结果?是的,或者您可以将规则放在主makefile中,并包含定义变量的辅助文件——这样您就可以有条件地包含这些文件。这是行不通的。尝试
使board2闪烁
,您将看到相同的变量值。
make BOARD=board2 flash
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