gnu makefile:shell 配方中的函数执行顺序

gnu makefile: shell function execution order in a recipe

我在 Makefile 配方中使用 $(shell ...) gnu make 函数,它 运行 在前面的行之前。为什么?

一个非常简单的例子:

.PHONY: all
all:
    @echo 1
    @echo $(eval a=$(shell echo 2a 1>&2))2b
    @echo 3 $(a)

输出为:

2a
1
2b
3

首先 运行 是 $(shell ...) 行 (2a),然后是其他行。 当它在食谱中的第 运行 行按此顺序时,我如何设法 运行 $(shell ...) 函数?

1
2a
2b
3

编辑:

没有 $(shell ...) 它按我预期的那样工作:

.PHONY: all
all:
    @echo 1
    $(eval a=a)
    @echo 2 $(a)
    $(eval a=b)
    @echo 3 $(a)

输出:

1
2 a
3 b

编辑 2:

这是原始 Makefile 的一部分。 >>> 中的部分显示了我的问题的本质:我想将 udisksctl 的输出放入一个 make 变量而不是文件 $@.loop(并对 $@.mount 做同样的事情)。

$(HDIMG): $(BOOTBLOCK_MBR_BIN) $(BOOTBLOCK_EXT2_BIN) $(LOADER_BIN) | $(DESTDIR)
        dd if=/dev/zero of=$@.ext2 bs=1 seek=$(PSIZEB) count=0 2>/dev/null
        $(MKFSEXT2) -F $@.ext2 >/dev/null
        dd if=$(word 2,$^) of=$@.ext2 conv=notrunc 2>/dev/null
        cp $< $@
        dd if=/dev/zero of=$@ bs=1 seek=$(HDSIZEB) count=0 2>/dev/null
        echo $(PFDISK) | $(TR) | $(FDISK) $@ >/dev/null
        dd if=$@.ext2 of=$@ bs=512 seek=$(PSTART) conv=sparse,notrunc iflag=fullblock 2>/dev/null
>>>     udisksctl loop-setup --file $@ --offset $(PSTARTB) --size $(PSIZEB) >$@.loop
        sed -i -e 's/.* //;s/\.//' $@.loop
        cat $@.loop
>>>     udisksctl mount --block-device $$(cat $@.loop) >$@.mount
        sed -i -e 's/.* //;s/\.//' $@.mount
        cat $@.mount
        #
        mkdir -p $$(cat $@.mount)/boot/
        cp $(word 2,$^) $$(cat $@.mount)/boot/
        #/sbin/filefrag -b512 -e /
        #
        udisksctl unmount --block-device $$(cat $@.loop)
        udisksctl loop-delete --block-device $$(cat $@.loop)
        rm $@.loop

make运行配方时,它首先展开其中的所有variables/functions,然后然后运行shell 逐行命令。

您可以通过使用 $(shell ...) 执行 every shell 命令来解决这个问题,或者,在您的情况下,改用 $(info ...)echo

.PHONY: all
all:
    $(info 1)
    $(info $(eval a=$(shell echo 2a 1>&2))2b)
    $(info 3 $(a))

输出:

1
2a
2b
3
make: Nothing to be done for 'all'.

Nothing to be done for 'all'.部分是由于扩展功能后,配方实际上是空的(有0个shell命令)。向其添加无操作命令(例如 @true)会删除消息。